Upstream version 11.40.277.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / media / encrypted_media_browsertest.cc
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/command_line.h"
6 #include "base/memory/scoped_ptr.h"
7 #include "base/path_service.h"
8 #include "base/strings/utf_string_conversions.h"
9 #include "base/win/windows_version.h"
10 #include "chrome/browser/media/media_browsertest.h"
11 #include "chrome/browser/media/test_license_server.h"
12 #include "chrome/browser/media/wv_test_license_server_config.h"
13 #include "chrome/browser/ui/browser.h"
14 #include "chrome/browser/ui/tabs/tab_strip_model.h"
15 #include "chrome/common/chrome_switches.h"
16 #include "content/public/test/browser_test_utils.h"
17 #include "testing/gtest/include/gtest/gtest-spi.h"
18 #if defined(OS_ANDROID)
19 #include "base/android/build_info.h"
20 #endif
21
22 #include "widevine_cdm_version.h"  //  In SHARED_INTERMEDIATE_DIR.
23
24 #if defined(ENABLE_PEPPER_CDMS)
25 // Platform-specific filename relative to the chrome executable.
26 const char kClearKeyCdmAdapterFileName[] =
27 #if defined(OS_MACOSX)
28     "clearkeycdmadapter.plugin";
29 #elif defined(OS_WIN)
30     "clearkeycdmadapter.dll";
31 #elif defined(OS_POSIX)
32     "libclearkeycdmadapter.so";
33 #endif
34
35 const char kClearKeyCdmPluginMimeType[] = "application/x-ppapi-clearkey-cdm";
36 #endif  // defined(ENABLE_PEPPER_CDMS)
37
38 // Available key systems.
39 const char kClearKeyKeySystem[] = "org.w3.clearkey";
40 const char kPrefixedClearKeyKeySystem[] = "webkit-org.w3.clearkey";
41 const char kExternalClearKeyKeySystem[] = "org.chromium.externalclearkey";
42 const char kExternalClearKeyDecryptOnlyKeySystem[] =
43     "org.chromium.externalclearkey.decryptonly";
44 const char kExternalClearKeyFileIOTestKeySystem[] =
45     "org.chromium.externalclearkey.fileiotest";
46 const char kExternalClearKeyInitializeFailKeySystem[] =
47     "org.chromium.externalclearkey.initializefail";
48 const char kExternalClearKeyCrashKeySystem[] =
49     "org.chromium.externalclearkey.crash";
50
51 // Supported media types.
52 const char kWebMAudioOnly[] = "audio/webm; codecs=\"vorbis\"";
53 const char kWebMVideoOnly[] = "video/webm; codecs=\"vp8\"";
54 const char kWebMAudioVideo[] = "video/webm; codecs=\"vorbis, vp8\"";
55 // Some tests are disabled in Chrome OS official builds. http://crbug.com/430711
56 #if !(defined(OS_CHROMEOS) && defined(OFFICIAL_BUILD))
57 const char kWebMVP9VideoOnly[] = "video/webm; codecs=\"vp9\"";
58 #if defined(USE_PROPRIETARY_CODECS)
59 const char kMP4AudioOnly[] = "audio/mp4; codecs=\"mp4a.40.2\"";
60 const char kMP4VideoOnly[] = "video/mp4; codecs=\"avc1.4D4041\"";
61 #endif  // defined(USE_PROPRIETARY_CODECS)
62 #endif  // !(defined(OS_CHROMEOS) && defined(OFFICIAL_BUILD))
63
64 // Sessions to load.
65 const char kNoSessionToLoad[] = "";
66 const char kLoadableSession[] = "LoadableSession";
67 const char kUnknownSession[] = "UnknownSession";
68
69 // EME-specific test results and errors.
70 const char kEmeKeyError[] = "KEY_ERROR";
71 const char kEmeNotSupportedError[] = "NOTSUPPORTEDERROR";
72 const char kFileIOTestSuccess[] = "FILE_IO_TEST_SUCCESS";
73
74 const char kDefaultEmePlayer[] = "eme_player.html";
75
76 // The type of video src used to load media.
77 enum SrcType {
78   SRC,
79   MSE
80 };
81
82 // Whether to use prefixed or unprefixed EME.
83 enum EmeVersion {
84   PREFIXED,
85   UNPREFIXED
86 };
87
88 // MSE is available on all desktop platforms and on Android 4.1 and later.
89 static bool IsMSESupported() {
90 #if defined(OS_ANDROID)
91   if (base::android::BuildInfo::GetInstance()->sdk_int() < 16) {
92     DVLOG(0) << "MSE is only supported in Android 4.1 and later.";
93     return false;
94   }
95 #endif  // defined(OS_ANDROID)
96   return true;
97 }
98
99 static bool IsParentKeySystemOf(const std::string& parent_key_system,
100                                 const std::string& key_system) {
101   std::string prefix = parent_key_system + '.';
102   return key_system.substr(0, prefix.size()) == prefix;
103 }
104
105 // Base class for encrypted media tests.
106 class EncryptedMediaTestBase : public MediaBrowserTest {
107  public:
108   EncryptedMediaTestBase() : is_pepper_cdm_registered_(false) {}
109
110   bool IsExternalClearKey(const std::string& key_system) {
111     return key_system == kExternalClearKeyKeySystem ||
112            IsParentKeySystemOf(kExternalClearKeyKeySystem, key_system);
113   }
114
115 #if defined(WIDEVINE_CDM_AVAILABLE)
116   bool IsWidevine(const std::string& key_system) {
117     return key_system == kWidevineKeySystem;
118   }
119 #endif  // defined(WIDEVINE_CDM_AVAILABLE)
120
121   void RunEncryptedMediaTestPage(
122       const std::string& html_page,
123       const std::string& key_system,
124       base::StringPairs& query_params,
125       const std::string& expected_title) {
126     base::StringPairs new_query_params = query_params;
127     StartLicenseServerIfNeeded(key_system, &new_query_params);
128     RunMediaTestPage(html_page, new_query_params, expected_title, true);
129   }
130
131   // Tests |html_page| using |media_file| (with |media_type|) and |key_system|.
132   // When |session_to_load| is not empty, the test will try to load
133   // |session_to_load| with stored keys, instead of creating a new session
134   // and trying to update it with licenses.
135   // When |force_invalid_response| is true, the test will provide invalid
136   // responses, which should trigger errors.
137   // TODO(xhwang): Find an easier way to pass multiple configuration test
138   // options.
139   void RunEncryptedMediaTest(const std::string& html_page,
140                              const std::string& media_file,
141                              const std::string& media_type,
142                              const std::string& key_system,
143                              SrcType src_type,
144                              EmeVersion eme_version,
145                              const std::string& session_to_load,
146                              bool force_invalid_response,
147                              const std::string& expected_title) {
148     if (src_type == MSE && !IsMSESupported()) {
149       DVLOG(0) << "Skipping test - MSE not supported.";
150       return;
151     }
152     base::StringPairs query_params;
153     query_params.push_back(std::make_pair("mediaFile", media_file));
154     query_params.push_back(std::make_pair("mediaType", media_type));
155     query_params.push_back(std::make_pair("keySystem", key_system));
156     if (src_type == MSE)
157       query_params.push_back(std::make_pair("useMSE", "1"));
158     if (eme_version == PREFIXED)
159       query_params.push_back(std::make_pair("usePrefixedEME", "1"));
160     if (force_invalid_response)
161       query_params.push_back(std::make_pair("forceInvalidResponse", "1"));
162     if (!session_to_load.empty())
163       query_params.push_back(std::make_pair("sessionToLoad", session_to_load));
164     RunEncryptedMediaTestPage(html_page, key_system, query_params,
165                               expected_title);
166   }
167
168   void RunSimpleEncryptedMediaTest(const std::string& media_file,
169                                    const std::string& media_type,
170                                    const std::string& key_system,
171                                    SrcType src_type,
172                                    EmeVersion eme_version) {
173     std::string expected_title = kEnded;
174     if (!IsPlayBackPossible(key_system))
175       expected_title = kEmeKeyError;
176
177     RunEncryptedMediaTest(kDefaultEmePlayer,
178                           media_file,
179                           media_type,
180                           key_system,
181                           src_type,
182                           eme_version,
183                           kNoSessionToLoad,
184                           false,
185                           expected_title);
186     // Check KeyMessage received for all key systems.
187     bool receivedKeyMessage = false;
188     EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
189         browser()->tab_strip_model()->GetActiveWebContents(),
190         "window.domAutomationController.send("
191         "document.querySelector('video').receivedKeyMessage);",
192         &receivedKeyMessage));
193     EXPECT_TRUE(receivedKeyMessage);
194   }
195
196   // Starts a license server if available for the |key_system| and adds a
197   // 'licenseServerURL' query parameter to |query_params|.
198   void StartLicenseServerIfNeeded(const std::string& key_system,
199                                   base::StringPairs* query_params) {
200     scoped_ptr<TestLicenseServerConfig> config = GetServerConfig(key_system);
201     if (!config)
202       return;
203     license_server_.reset(new TestLicenseServer(config.Pass()));
204     EXPECT_TRUE(license_server_->Start());
205     query_params->push_back(
206         std::make_pair("licenseServerURL", license_server_->GetServerURL()));
207   }
208
209   bool IsPlayBackPossible(const std::string& key_system) {
210 #if defined(WIDEVINE_CDM_AVAILABLE)
211     if (IsWidevine(key_system) && !GetServerConfig(key_system))
212       return false;
213 #endif  // defined(WIDEVINE_CDM_AVAILABLE)
214     return true;
215   }
216
217   scoped_ptr<TestLicenseServerConfig> GetServerConfig(
218       const std::string& key_system) {
219 #if defined(WIDEVINE_CDM_AVAILABLE)
220     if (IsWidevine(key_system)) {
221       scoped_ptr<TestLicenseServerConfig> config =
222          scoped_ptr<TestLicenseServerConfig>(new WVTestLicenseServerConfig());
223       if (config->IsPlatformSupported())
224         return config.Pass();
225     }
226 #endif  // defined(WIDEVINE_CDM_AVAILABLE)
227     return scoped_ptr<TestLicenseServerConfig>();
228   }
229
230  protected:
231   scoped_ptr<TestLicenseServer> license_server_;
232
233   // We want to fail quickly when a test fails because an error is encountered.
234   void AddWaitForTitles(content::TitleWatcher* title_watcher) override {
235     MediaBrowserTest::AddWaitForTitles(title_watcher);
236     title_watcher->AlsoWaitForTitle(base::ASCIIToUTF16(kEmeNotSupportedError));
237     title_watcher->AlsoWaitForTitle(base::ASCIIToUTF16(kEmeKeyError));
238   }
239
240   void SetUpCommandLine(CommandLine* command_line) override {
241 #if defined(OS_ANDROID)
242     command_line->AppendSwitch(
243         switches::kDisableGestureRequirementForMediaPlayback);
244 #endif  // defined(OS_ANDROID)
245   }
246
247   void SetUpCommandLineForKeySystem(const std::string& key_system,
248                                     CommandLine* command_line) {
249     if (GetServerConfig(key_system))
250       // Since the web and license servers listen on different ports, we need to
251       // disable web-security to send license requests to the license server.
252       // TODO(shadi): Add port forwarding to the test web server configuration.
253       command_line->AppendSwitch(switches::kDisableWebSecurity);
254
255 #if defined(ENABLE_PEPPER_CDMS)
256     if (IsExternalClearKey(key_system)) {
257       RegisterPepperCdm(command_line, kClearKeyCdmAdapterFileName, key_system);
258     }
259 #if defined(WIDEVINE_CDM_AVAILABLE) && defined(WIDEVINE_CDM_IS_COMPONENT)
260     else if (IsWidevine(key_system)) {
261       RegisterPepperCdm(command_line, kWidevineCdmAdapterFileName, key_system);
262     }
263 #endif  // defined(WIDEVINE_CDM_AVAILABLE) && defined(WIDEVINE_CDM_IS_COMPONENT)
264 #endif  // defined(ENABLE_PEPPER_CDMS)
265   }
266
267  private:
268 #if defined(ENABLE_PEPPER_CDMS)
269   void RegisterPepperCdm(CommandLine* command_line,
270                          const std::string& adapter_name,
271                          const std::string& key_system) {
272     DCHECK(!is_pepper_cdm_registered_)
273         << "RegisterPepperCdm() can only be called once.";
274     is_pepper_cdm_registered_ = true;
275
276     // Append the switch to register the Clear Key CDM Adapter.
277     base::FilePath plugin_dir;
278     EXPECT_TRUE(PathService::Get(base::DIR_MODULE, &plugin_dir));
279     base::FilePath plugin_lib = plugin_dir.AppendASCII(adapter_name);
280     EXPECT_TRUE(base::PathExists(plugin_lib)) << plugin_lib.value();
281     base::FilePath::StringType pepper_plugin = plugin_lib.value();
282     pepper_plugin.append(FILE_PATH_LITERAL("#CDM#0.1.0.0;"));
283 #if defined(OS_WIN)
284     pepper_plugin.append(base::ASCIIToWide(GetPepperType(key_system)));
285 #else
286     pepper_plugin.append(GetPepperType(key_system));
287 #endif
288     command_line->AppendSwitchNative(switches::kRegisterPepperPlugins,
289                                      pepper_plugin);
290   }
291
292   // Adapted from key_systems.cc.
293   std::string GetPepperType(const std::string& key_system) {
294     if (IsExternalClearKey(key_system))
295       return kClearKeyCdmPluginMimeType;
296 #if defined(WIDEVINE_CDM_AVAILABLE)
297     if (IsWidevine(key_system))
298       return kWidevineCdmPluginMimeType;
299 #endif  // WIDEVINE_CDM_AVAILABLE
300
301     NOTREACHED();
302     return "";
303   }
304 #endif  // defined(ENABLE_PEPPER_CDMS)
305
306   bool is_pepper_cdm_registered_;
307 };
308
309 #if defined(ENABLE_PEPPER_CDMS)
310 // Tests encrypted media playback using ExternalClearKey key system in
311 // decrypt-and-decode mode.
312 class ECKEncryptedMediaTest : public EncryptedMediaTestBase {
313  public:
314   // We use special |key_system| names to do non-playback related tests, e.g.
315   // kExternalClearKeyFileIOTestKeySystem is used to test file IO.
316   void TestNonPlaybackCases(const std::string& key_system,
317                             const std::string& expected_title) {
318     // Since we do not test playback, arbitrarily choose a test file and source
319     // type.
320     RunEncryptedMediaTest(kDefaultEmePlayer,
321                           "bear-a_enc-a.webm",
322                           kWebMAudioOnly,
323                           key_system,
324                           SRC,
325                           PREFIXED,
326                           kNoSessionToLoad,
327                           false,
328                           expected_title);
329   }
330
331  protected:
332   void SetUpCommandLine(CommandLine* command_line) override {
333     EncryptedMediaTestBase::SetUpCommandLine(command_line);
334     SetUpCommandLineForKeySystem(kExternalClearKeyKeySystem, command_line);
335   }
336 };
337
338 // Tests encrypted media playback using ExternalClearKey key system in
339 // decrypt-and-decode mode for unprefixed EME.
340 // TODO(jrummell): Merge with ECKEncryptedMediaTest once unprefixed is
341 // enabled by default.
342 class ECKUnprefixedEncryptedMediaTest : public EncryptedMediaTestBase {
343  protected:
344   void SetUpCommandLine(CommandLine* command_line) override {
345     EncryptedMediaTestBase::SetUpCommandLine(command_line);
346     command_line->AppendSwitch(switches::kEnableEncryptedMedia);
347     SetUpCommandLineForKeySystem(kExternalClearKeyKeySystem, command_line);
348   }
349 };
350
351 #if defined(WIDEVINE_CDM_AVAILABLE)
352 // Tests encrypted media playback using Widevine key system.
353 class WVEncryptedMediaTest : public EncryptedMediaTestBase {
354  protected:
355   virtual void SetUpCommandLine(CommandLine* command_line) override {
356     EncryptedMediaTestBase::SetUpCommandLine(command_line);
357     command_line->AppendSwitch(switches::kEnableEncryptedMedia);
358     SetUpCommandLineForKeySystem(kWidevineKeySystem, command_line);
359   }
360 };
361
362 #endif  // defined(WIDEVINE_CDM_AVAILABLE)
363 #endif  // defined(ENABLE_PEPPER_CDMS)
364
365 // Tests encrypted media playback with a combination of parameters:
366 // - char*: Key system name.
367 // - bool: True to load media using MSE, otherwise use src.
368 // - bool: True to use unprefixed EME, otherwise use prefixed EME.
369 //
370 // Note: Only parameterized (*_P) tests can be used. Non-parameterized (*_F)
371 // tests will crash at GetParam(). To add non-parameterized tests, use
372 // EncryptedMediaTestBase or one of its subclasses (e.g. WVEncryptedMediaTest).
373 class EncryptedMediaTest
374     : public EncryptedMediaTestBase,
375       public testing::WithParamInterface<
376           std::tr1::tuple<const char*, SrcType, EmeVersion> > {
377  public:
378   std::string CurrentKeySystem() {
379     return std::tr1::get<0>(GetParam());
380   }
381
382   SrcType CurrentSourceType() {
383     return std::tr1::get<1>(GetParam());
384   }
385
386   EmeVersion CurrentEmeVersion() {
387     return std::tr1::get<2>(GetParam());
388   }
389
390   void TestSimplePlayback(const std::string& encrypted_media,
391                           const std::string& media_type) {
392     RunSimpleEncryptedMediaTest(encrypted_media,
393                                 media_type,
394                                 CurrentKeySystem(),
395                                 CurrentSourceType(),
396                                 CurrentEmeVersion());
397   }
398
399   void RunInvalidResponseTest() {
400     RunEncryptedMediaTest(kDefaultEmePlayer,
401                           "bear-320x240-av_enc-av.webm",
402                           kWebMAudioVideo,
403                           CurrentKeySystem(),
404                           CurrentSourceType(),
405                           CurrentEmeVersion(),
406                           kNoSessionToLoad,
407                           true,
408                           kEmeKeyError);
409   }
410
411   void TestFrameSizeChange() {
412     RunEncryptedMediaTest("encrypted_frame_size_change.html",
413                           "frame_size_change-av_enc-v.webm",
414                           kWebMAudioVideo,
415                           CurrentKeySystem(),
416                           CurrentSourceType(),
417                           CurrentEmeVersion(),
418                           kNoSessionToLoad,
419                           false,
420                           kEnded);
421   }
422
423   void TestConfigChange() {
424     DCHECK(IsMSESupported());
425     base::StringPairs query_params;
426     query_params.push_back(std::make_pair("keySystem", CurrentKeySystem()));
427     query_params.push_back(std::make_pair("runEncrypted", "1"));
428     if (CurrentEmeVersion() == PREFIXED)
429       query_params.push_back(std::make_pair("usePrefixedEME", "1"));
430     RunEncryptedMediaTestPage("mse_config_change.html",
431                               CurrentKeySystem(),
432                               query_params,
433                               kEnded);
434   }
435
436  protected:
437   void SetUpCommandLine(CommandLine* command_line) override {
438     EncryptedMediaTestBase::SetUpCommandLine(command_line);
439     SetUpCommandLineForKeySystem(CurrentKeySystem(), command_line);
440
441     if (CurrentEmeVersion() == UNPREFIXED)
442       command_line->AppendSwitch(switches::kEnableEncryptedMedia);
443   }
444 };
445
446 using ::testing::Combine;
447 using ::testing::Values;
448
449 #if !defined(OS_ANDROID)
450 INSTANTIATE_TEST_CASE_P(SRC_ClearKey_Prefixed,
451                         EncryptedMediaTest,
452                         Combine(Values(kPrefixedClearKeyKeySystem),
453                                 Values(SRC),
454                                 Values(PREFIXED)));
455
456 // TODO(jrummell): Enable unprefixed tests before shipping unprefixed EME.
457 // Disabled now as they don't provide much additional coverage, but do take a
458 // bit of time to execute.
459 INSTANTIATE_TEST_CASE_P(DISABLED_SRC_ClearKey,
460                         EncryptedMediaTest,
461                         Combine(Values(kClearKeyKeySystem),
462                                 Values(SRC),
463                                 Values(UNPREFIXED)));
464 #endif  // !defined(OS_ANDROID)
465
466 INSTANTIATE_TEST_CASE_P(MSE_ClearKey_Prefixed,
467                         EncryptedMediaTest,
468                         Combine(Values(kPrefixedClearKeyKeySystem),
469                                 Values(MSE),
470                                 Values(PREFIXED)));
471 INSTANTIATE_TEST_CASE_P(MSE_ClearKey,
472                         EncryptedMediaTest,
473                         Combine(Values(kClearKeyKeySystem),
474                                 Values(MSE),
475                                 Values(UNPREFIXED)));
476
477 // External Clear Key is currently only used on platforms that use Pepper CDMs.
478 #if defined(ENABLE_PEPPER_CDMS)
479 INSTANTIATE_TEST_CASE_P(SRC_ExternalClearKey_Prefixed,
480                         EncryptedMediaTest,
481                         Combine(Values(kExternalClearKeyKeySystem),
482                                 Values(SRC),
483                                 Values(PREFIXED)));
484 INSTANTIATE_TEST_CASE_P(SRC_ExternalClearKey,
485                         EncryptedMediaTest,
486                         Combine(Values(kExternalClearKeyKeySystem),
487                                 Values(SRC),
488                                 Values(UNPREFIXED)));
489 INSTANTIATE_TEST_CASE_P(MSE_ExternalClearKey_Prefixed,
490                         EncryptedMediaTest,
491                         Combine(Values(kExternalClearKeyKeySystem),
492                                 Values(MSE),
493                                 Values(PREFIXED)));
494 INSTANTIATE_TEST_CASE_P(MSE_ExternalClearKey,
495                         EncryptedMediaTest,
496                         Combine(Values(kExternalClearKeyKeySystem),
497                                 Values(MSE),
498                                 Values(UNPREFIXED)));
499 // To reduce test time, only run ExternalClearKeyDecryptOnly with MSE.
500 INSTANTIATE_TEST_CASE_P(MSE_ExternalClearKeyDecryptOnly_Prefixed,
501                         EncryptedMediaTest,
502                         Combine(Values(kExternalClearKeyDecryptOnlyKeySystem),
503                                 Values(MSE),
504                                 Values(PREFIXED)));
505 INSTANTIATE_TEST_CASE_P(MSE_ExternalClearKeyDecryptOnly,
506                         EncryptedMediaTest,
507                         Combine(Values(kExternalClearKeyDecryptOnlyKeySystem),
508                                 Values(MSE),
509                                 Values(UNPREFIXED)));
510 #endif  // defined(ENABLE_PEPPER_CDMS)
511
512 #if defined(WIDEVINE_CDM_AVAILABLE)
513 // This test doesn't fully test playback with Widevine. So we only run Widevine
514 // test with MSE (no SRC) to reduce test time. Also, on Android EME only works
515 // with MSE and we cannot run this test with SRC.
516 INSTANTIATE_TEST_CASE_P(MSE_Widevine_Prefixed,
517                         EncryptedMediaTest,
518                         Combine(Values(kWidevineKeySystem),
519                                 Values(MSE),
520                                 Values(PREFIXED)));
521
522 // Following tests fail if Widevine is loaded as a component, crbug.com/356833.
523 #if !defined(WIDEVINE_CDM_IS_COMPONENT)
524 INSTANTIATE_TEST_CASE_P(MSE_Widevine,
525                         EncryptedMediaTest,
526                         Combine(Values(kWidevineKeySystem),
527                                 Values(MSE),
528                                 Values(UNPREFIXED)));
529 #endif  // !defined(WIDEVINE_CDM_IS_COMPONENT)
530 #endif  // defined(WIDEVINE_CDM_AVAILABLE)
531
532 // These tests time out in Chrome OS official builds. http://crbug.com/430711
533 #if !(defined(OS_CHROMEOS) && defined(OFFICIAL_BUILD))
534 IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_AudioOnly_WebM) {
535   TestSimplePlayback("bear-a_enc-a.webm", kWebMAudioOnly);
536 }
537
538 IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_AudioClearVideo_WebM) {
539   TestSimplePlayback("bear-320x240-av_enc-a.webm", kWebMAudioVideo);
540 }
541
542 IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_VideoAudio_WebM) {
543   TestSimplePlayback("bear-320x240-av_enc-av.webm", kWebMAudioVideo);
544 }
545
546 IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_VideoOnly_WebM) {
547   TestSimplePlayback("bear-320x240-v_enc-v.webm", kWebMVideoOnly);
548 }
549
550 IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_VideoClearAudio_WebM) {
551   TestSimplePlayback("bear-320x240-av_enc-v.webm", kWebMAudioVideo);
552 }
553
554 IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_VP9Video_WebM) {
555   TestSimplePlayback("bear-320x240-v-vp9_enc-v.webm", kWebMVP9VideoOnly);
556 }
557
558 IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, InvalidResponseKeyError) {
559   RunInvalidResponseTest();
560 }
561
562 IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, ConfigChangeVideo) {
563   if (CurrentSourceType() != MSE || !IsMSESupported()) {
564     DVLOG(0) << "Skipping test - ConfigChange test requires MSE.";
565     return;
566   }
567   if (!IsPlayBackPossible(CurrentKeySystem())) {
568     DVLOG(0) << "Skipping test - ConfigChange test requires video playback.";
569     return;
570   }
571   TestConfigChange();
572 }
573
574 IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, FrameSizeChangeVideo) {
575   // Times out on Windows XP. http://crbug.com/171937
576 #if defined(OS_WIN)
577   if (base::win::GetVersion() < base::win::VERSION_VISTA)
578     return;
579 #endif
580   if (!IsPlayBackPossible(CurrentKeySystem())) {
581     DVLOG(0) << "Skipping test - FrameSizeChange test requires video playback.";
582     return;
583   }
584   TestFrameSizeChange();
585 }
586
587 #if defined(USE_PROPRIETARY_CODECS)
588 IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_VideoOnly_MP4) {
589   // MP4 without MSE is not support yet, http://crbug.com/170793.
590   if (CurrentSourceType() != MSE) {
591     DVLOG(0) << "Skipping test; Can only play MP4 encrypted streams by MSE.";
592     return;
593   }
594   TestSimplePlayback("bear-640x360-v_frag-cenc.mp4", kMP4VideoOnly);
595 }
596
597 IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_AudioOnly_MP4) {
598   // MP4 without MSE is not support yet, http://crbug.com/170793.
599   if (CurrentSourceType() != MSE) {
600     DVLOG(0) << "Skipping test; Can only play MP4 encrypted streams by MSE.";
601     return;
602   }
603   TestSimplePlayback("bear-640x360-a_frag-cenc.mp4", kMP4AudioOnly);
604 }
605 #endif  // defined(USE_PROPRIETARY_CODECS)
606 #endif  // !(defined(OS_CHROMEOS) && defined(OFFICIAL_BUILD))
607
608 #if defined(WIDEVINE_CDM_AVAILABLE)
609 // The parent key system cannot be used in generateKeyRequest.
610 IN_PROC_BROWSER_TEST_F(WVEncryptedMediaTest, ParentThrowsException_Prefixed) {
611   RunEncryptedMediaTest(kDefaultEmePlayer,
612                         "bear-a_enc-a.webm",
613                         kWebMAudioOnly,
614                         "com.widevine",
615                         MSE,
616                         PREFIXED,
617                         kNoSessionToLoad,
618                         false,
619                         kEmeNotSupportedError);
620 }
621
622 // TODO(jrummell): http://crbug.com/349181
623 // The parent key system cannot be used when creating MediaKeys.
624 IN_PROC_BROWSER_TEST_F(WVEncryptedMediaTest, ParentThrowsException) {
625   RunEncryptedMediaTest(kDefaultEmePlayer,
626                         "bear-a_enc-a.webm",
627                         kWebMAudioOnly,
628                         "com.widevine",
629                         MSE,
630                         UNPREFIXED,
631                         kNoSessionToLoad,
632                         false,
633                         kEmeNotSupportedError);
634 }
635 #endif  // defined(WIDEVINE_CDM_AVAILABLE)
636
637 #if defined(ENABLE_PEPPER_CDMS)
638 IN_PROC_BROWSER_TEST_F(ECKEncryptedMediaTest, InitializeCDMFail) {
639   TestNonPlaybackCases(kExternalClearKeyInitializeFailKeySystem, kEmeKeyError);
640 }
641
642 // When CDM crashes, we should still get a decode error.
643 // crbug.com/386657
644 IN_PROC_BROWSER_TEST_F(ECKEncryptedMediaTest, DISABLED_CDMCrashDuringDecode) {
645   IgnorePluginCrash();
646   TestNonPlaybackCases(kExternalClearKeyCrashKeySystem, kError);
647 }
648
649 // Testing that the media browser test does fail on plugin crash.
650 // crbug.com/386657
651 IN_PROC_BROWSER_TEST_F(ECKEncryptedMediaTest, DISABLED_CDMExpectedCrash) {
652   // Plugin crash is not ignored by default, the test is expected to fail.
653   EXPECT_NONFATAL_FAILURE(
654       TestNonPlaybackCases(kExternalClearKeyCrashKeySystem, kError),
655       "plugin crash");
656 }
657
658 IN_PROC_BROWSER_TEST_F(ECKEncryptedMediaTest, FileIOTest) {
659   TestNonPlaybackCases(kExternalClearKeyFileIOTestKeySystem,
660                        kFileIOTestSuccess);
661 }
662
663 IN_PROC_BROWSER_TEST_F(ECKEncryptedMediaTest, LoadLoadableSession) {
664   RunEncryptedMediaTest(kDefaultEmePlayer,
665                         "bear-320x240-v_enc-v.webm",
666                         kWebMVideoOnly,
667                         kExternalClearKeyKeySystem,
668                         SRC,
669                         PREFIXED,
670                         kLoadableSession,
671                         false,
672                         kEnded);
673 }
674
675 IN_PROC_BROWSER_TEST_F(ECKEncryptedMediaTest, LoadUnknownSession) {
676   // TODO(xhwang): Add a specific error for this failure, e.g. kSessionNotFound.
677   RunEncryptedMediaTest(kDefaultEmePlayer,
678                         "bear-320x240-v_enc-v.webm",
679                         kWebMVideoOnly,
680                         kExternalClearKeyKeySystem,
681                         SRC,
682                         PREFIXED,
683                         kUnknownSession,
684                         false,
685                         kEmeKeyError);
686 }
687
688 IN_PROC_BROWSER_TEST_F(ECKUnprefixedEncryptedMediaTest, LoadLoadableSession) {
689   RunEncryptedMediaTest(kDefaultEmePlayer,
690                         "bear-320x240-v_enc-v.webm",
691                         kWebMVideoOnly,
692                         kExternalClearKeyKeySystem,
693                         SRC,
694                         UNPREFIXED,
695                         kLoadableSession,
696                         false,
697                         kEnded);
698 }
699
700 IN_PROC_BROWSER_TEST_F(ECKUnprefixedEncryptedMediaTest, LoadUnknownSession) {
701   // TODO(xhwang): Add a specific error for this failure, e.g. kSessionNotFound.
702   RunEncryptedMediaTest(kDefaultEmePlayer,
703                         "bear-320x240-v_enc-v.webm",
704                         kWebMVideoOnly,
705                         kExternalClearKeyKeySystem,
706                         SRC,
707                         UNPREFIXED,
708                         kUnknownSession,
709                         false,
710                         kEmeKeyError);
711 }
712 #endif  // defined(ENABLE_PEPPER_CDMS)