blob: 3eeda511a5cefbd2a2ce39e54e611fae875cf14b [file] [log] [blame]
[email protected]63dc9072013-09-12 06:20:471// 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"
[email protected]df06a3e2014-01-31 21:36:596#include "base/memory/scoped_ptr.h"
[email protected]63dc9072013-09-12 06:20:477#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"
[email protected]df06a3e2014-01-31 21:36:5911#include "chrome/browser/media/test_license_server.h"
12#include "chrome/browser/media/wv_test_license_server_config.h"
[email protected]63dc9072013-09-12 06:20:4713#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"
[email protected]1be9fa072014-03-21 22:50:2917#include "testing/gtest/include/gtest/gtest-spi.h"
[email protected]6479b192013-10-19 18:28:0418#if defined(OS_ANDROID)
19#include "base/android/build_info.h"
20#endif
[email protected]63dc9072013-09-12 06:20:4721
[email protected]df06a3e2014-01-31 21:36:5922#include "widevine_cdm_version.h" // In SHARED_INTERMEDIATE_DIR.
[email protected]63dc9072013-09-12 06:20:4723
[email protected]63dc9072013-09-12 06:20:4724#if defined(ENABLE_PEPPER_CDMS)
25// Platform-specific filename relative to the chrome executable.
[email protected]1825e772013-10-08 06:39:1126const char kClearKeyCdmAdapterFileName[] =
[email protected]63dc9072013-09-12 06:20:4727#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
[email protected]1825e772013-10-08 06:39:1134
35const char kClearKeyCdmPluginMimeType[] = "application/x-ppapi-clearkey-cdm";
[email protected]63dc9072013-09-12 06:20:4736#endif // defined(ENABLE_PEPPER_CDMS)
37
38// Available key systems.
[email protected]a32ef592014-03-07 19:11:1539const char kClearKeyKeySystem[] = "org.w3.clearkey";
40const char kPrefixedClearKeyKeySystem[] = "webkit-org.w3.clearkey";
[email protected]ab998e82013-11-22 20:31:3541const char kExternalClearKeyKeySystem[] = "org.chromium.externalclearkey";
42const char kExternalClearKeyDecryptOnlyKeySystem[] =
43 "org.chromium.externalclearkey.decryptonly";
[email protected]34afd582013-12-20 07:26:1844const char kExternalClearKeyFileIOTestKeySystem[] =
45 "org.chromium.externalclearkey.fileiotest";
[email protected]ab998e82013-11-22 20:31:3546const char kExternalClearKeyInitializeFailKeySystem[] =
47 "org.chromium.externalclearkey.initializefail";
[email protected]a27d34ab2014-01-09 04:23:2948const char kExternalClearKeyCrashKeySystem[] =
49 "org.chromium.externalclearkey.crash";
[email protected]63dc9072013-09-12 06:20:4750
51// Supported media types.
[email protected]095ccbe42013-09-26 00:06:4252const char kWebMAudioOnly[] = "audio/webm; codecs=\"vorbis\"";
53const char kWebMVideoOnly[] = "video/webm; codecs=\"vp8\"";
54const char kWebMAudioVideo[] = "video/webm; codecs=\"vorbis, vp8\"";
jamescook6107ed82014-11-06 06:59:2155// Some tests are disabled in Chrome OS official builds. http://crbug.com/430711
56#if !(defined(OS_CHROMEOS) && defined(OFFICIAL_BUILD))
57const char kWebMVP9VideoOnly[] = "video/webm; codecs=\"vp9\"";
[email protected]095ccbe42013-09-26 00:06:4258#if defined(USE_PROPRIETARY_CODECS)
59const char kMP4AudioOnly[] = "audio/mp4; codecs=\"mp4a.40.2\"";
60const char kMP4VideoOnly[] = "video/mp4; codecs=\"avc1.4D4041\"";
61#endif // defined(USE_PROPRIETARY_CODECS)
jamescook6107ed82014-11-06 06:59:2162#endif // !(defined(OS_CHROMEOS) && defined(OFFICIAL_BUILD))
[email protected]63dc9072013-09-12 06:20:4763
[email protected]0af5dfa2014-02-07 22:33:4464// Sessions to load.
65const char kNoSessionToLoad[] = "";
66const char kLoadableSession[] = "LoadableSession";
67const char kUnknownSession[] = "UnknownSession";
68
[email protected]2e850f12013-09-18 01:27:2969// EME-specific test results and errors.
[email protected]e11d89d2014-06-19 11:36:3170const char kEmeKeyError[] = "KEY_ERROR";
[email protected]297b5a352013-10-18 00:09:1771const char kEmeNotSupportedError[] = "NOTSUPPORTEDERROR";
[email protected]e11d89d2014-06-19 11:36:3172const char kFileIOTestSuccess[] = "FILE_IO_TEST_SUCCESS";
73
74const char kDefaultEmePlayer[] = "eme_player.html";
[email protected]63dc9072013-09-12 06:20:4775
76// The type of video src used to load media.
77enum SrcType {
78 SRC,
79 MSE
80};
81
[email protected]a32ef592014-03-07 19:11:1582// Whether to use prefixed or unprefixed EME.
83enum EmeVersion {
84 PREFIXED,
85 UNPREFIXED
86};
87
[email protected]6479b192013-10-19 18:28:0488// MSE is available on all desktop platforms and on Android 4.1 and later.
89static bool IsMSESupported() {
90#if defined(OS_ANDROID)
91 if (base::android::BuildInfo::GetInstance()->sdk_int() < 16) {
anujk.sharma9da298e12014-11-07 04:48:4392 DVLOG(0) << "MSE is only supported in Android 4.1 and later.";
[email protected]6479b192013-10-19 18:28:0493 return false;
94 }
95#endif // defined(OS_ANDROID)
96 return true;
97}
98
[email protected]ab998e82013-11-22 20:31:3599static 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
[email protected]e6bf64142013-10-18 23:07:54105// Base class for encrypted media tests.
106class EncryptedMediaTestBase : public MediaBrowserTest {
[email protected]63dc9072013-09-12 06:20:47107 public:
[email protected]e6bf64142013-10-18 23:07:54108 EncryptedMediaTestBase() : is_pepper_cdm_registered_(false) {}
[email protected]63dc9072013-09-12 06:20:47109
[email protected]ab998e82013-11-22 20:31:35110 bool IsExternalClearKey(const std::string& key_system) {
111 return key_system == kExternalClearKeyKeySystem ||
112 IsParentKeySystemOf(kExternalClearKeyKeySystem, key_system);
[email protected]63dc9072013-09-12 06:20:47113 }
114
[email protected]1825e772013-10-08 06:39:11115#if defined(WIDEVINE_CDM_AVAILABLE)
[email protected]ab998e82013-11-22 20:31:35116 bool IsWidevine(const std::string& key_system) {
117 return key_system == kWidevineKeySystem;
[email protected]1825e772013-10-08 06:39:11118 }
119#endif // defined(WIDEVINE_CDM_AVAILABLE)
120
[email protected]8a229322014-07-22 23:33:07121 void RunEncryptedMediaTestPage(
122 const std::string& html_page,
123 const std::string& key_system,
anand.ratn2636d972014-09-30 04:06:58124 base::StringPairs& query_params,
[email protected]8a229322014-07-22 23:33:07125 const std::string& expected_title) {
anand.ratn2636d972014-09-30 04:06:58126 base::StringPairs new_query_params = query_params;
[email protected]8a229322014-07-22 23:33:07127 StartLicenseServerIfNeeded(key_system, &new_query_params);
128 RunMediaTestPage(html_page, new_query_params, expected_title, true);
[email protected]df06a3e2014-01-31 21:36:59129 }
130
[email protected]0af5dfa2014-02-07 22:33:44131 // 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.
[email protected]df06a3e2014-01-31 21:36:59139 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,
[email protected]1825e772013-10-08 06:39:11143 SrcType src_type,
[email protected]a32ef592014-03-07 19:11:15144 EmeVersion eme_version,
[email protected]0af5dfa2014-02-07 22:33:44145 const std::string& session_to_load,
[email protected]df06a3e2014-01-31 21:36:59146 bool force_invalid_response,
147 const std::string& expected_title) {
[email protected]6479b192013-10-19 18:28:04148 if (src_type == MSE && !IsMSESupported()) {
anujk.sharma9da298e12014-11-07 04:48:43149 DVLOG(0) << "Skipping test - MSE not supported.";
[email protected]6479b192013-10-19 18:28:04150 return;
151 }
anand.ratn2636d972014-09-30 04:06:58152 base::StringPairs query_params;
[email protected]df06a3e2014-01-31 21:36:59153 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));
[email protected]63dc9072013-09-12 06:20:47156 if (src_type == MSE)
[email protected]df06a3e2014-01-31 21:36:59157 query_params.push_back(std::make_pair("useMSE", "1"));
[email protected]a32ef592014-03-07 19:11:15158 if (eme_version == PREFIXED)
159 query_params.push_back(std::make_pair("usePrefixedEME", "1"));
[email protected]df06a3e2014-01-31 21:36:59160 if (force_invalid_response)
161 query_params.push_back(std::make_pair("forceInvalidResponse", "1"));
[email protected]0af5dfa2014-02-07 22:33:44162 if (!session_to_load.empty())
163 query_params.push_back(std::make_pair("sessionToLoad", session_to_load));
[email protected]8a229322014-07-22 23:33:07164 RunEncryptedMediaTestPage(html_page, key_system, query_params,
[email protected]df06a3e2014-01-31 21:36:59165 expected_title);
[email protected]63dc9072013-09-12 06:20:47166 }
167
[email protected]df06a3e2014-01-31 21:36:59168 void RunSimpleEncryptedMediaTest(const std::string& media_file,
169 const std::string& media_type,
170 const std::string& key_system,
[email protected]a32ef592014-03-07 19:11:15171 SrcType src_type,
172 EmeVersion eme_version) {
[email protected]df06a3e2014-01-31 21:36:59173 std::string expected_title = kEnded;
174 if (!IsPlayBackPossible(key_system))
175 expected_title = kEmeKeyError;
[email protected]1825e772013-10-08 06:39:11176
[email protected]e11d89d2014-06-19 11:36:31177 RunEncryptedMediaTest(kDefaultEmePlayer,
[email protected]a32ef592014-03-07 19:11:15178 media_file,
179 media_type,
180 key_system,
181 src_type,
182 eme_version,
183 kNoSessionToLoad,
184 false,
[email protected]df06a3e2014-01-31 21:36:59185 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(),
[email protected]e11d89d2014-06-19 11:36:31190 "window.domAutomationController.send("
191 "document.querySelector('video').receivedKeyMessage);",
[email protected]df06a3e2014-01-31 21:36:59192 &receivedKeyMessage));
193 EXPECT_TRUE(receivedKeyMessage);
194 }
195
[email protected]8a229322014-07-22 23:33:07196 // Starts a license server if available for the |key_system| and adds a
197 // 'licenseServerURL' query parameter to |query_params|.
[email protected]df06a3e2014-01-31 21:36:59198 void StartLicenseServerIfNeeded(const std::string& key_system,
anand.ratn2636d972014-09-30 04:06:58199 base::StringPairs* query_params) {
[email protected]df06a3e2014-01-31 21:36:59200 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());
[email protected]8a229322014-07-22 23:33:07205 query_params->push_back(
206 std::make_pair("licenseServerURL", license_server_->GetServerURL()));
[email protected]df06a3e2014-01-31 21:36:59207 }
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>();
[email protected]1825e772013-10-08 06:39:11228 }
229
[email protected]63dc9072013-09-12 06:20:47230 protected:
[email protected]df06a3e2014-01-31 21:36:59231 scoped_ptr<TestLicenseServer> license_server_;
232
[email protected]2e850f12013-09-18 01:27:29233 // We want to fail quickly when a test fails because an error is encountered.
dchengd7e84a052014-10-22 00:18:51234 void AddWaitForTitles(content::TitleWatcher* title_watcher) override {
[email protected]2e850f12013-09-18 01:27:29235 MediaBrowserTest::AddWaitForTitles(title_watcher);
[email protected]6778fed2013-12-24 20:09:37236 title_watcher->AlsoWaitForTitle(base::ASCIIToUTF16(kEmeNotSupportedError));
237 title_watcher->AlsoWaitForTitle(base::ASCIIToUTF16(kEmeKeyError));
[email protected]2e850f12013-09-18 01:27:29238 }
239
avi556c05022014-12-22 23:31:43240 void SetUpCommandLine(base::CommandLine* command_line) override {
[email protected]2289b432014-08-08 17:52:11241#if defined(OS_ANDROID)
242 command_line->AppendSwitch(
243 switches::kDisableGestureRequirementForMediaPlayback);
244#endif // defined(OS_ANDROID)
245 }
246
[email protected]df06a3e2014-01-31 21:36:59247 void SetUpCommandLineForKeySystem(const std::string& key_system,
avi556c05022014-12-22 23:31:43248 base::CommandLine* command_line) {
[email protected]df06a3e2014-01-31 21:36:59249 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
[email protected]e6bf64142013-10-18 23:07:54255#if defined(ENABLE_PEPPER_CDMS)
256 if (IsExternalClearKey(key_system)) {
[email protected]ab998e82013-11-22 20:31:35257 RegisterPepperCdm(command_line, kClearKeyCdmAdapterFileName, key_system);
[email protected]e6bf64142013-10-18 23:07:54258 }
259#if defined(WIDEVINE_CDM_AVAILABLE) && defined(WIDEVINE_CDM_IS_COMPONENT)
thestig11bf74d2014-11-24 20:14:42260 else if (IsWidevine(key_system)) { // NOLINT
[email protected]ab998e82013-11-22 20:31:35261 RegisterPepperCdm(command_line, kWidevineCdmAdapterFileName, key_system);
[email protected]e6bf64142013-10-18 23:07:54262 }
263#endif // defined(WIDEVINE_CDM_AVAILABLE) && defined(WIDEVINE_CDM_IS_COMPONENT)
264#endif // defined(ENABLE_PEPPER_CDMS)
265 }
266
267 private:
[email protected]1825e772013-10-08 06:39:11268#if defined(ENABLE_PEPPER_CDMS)
avi556c05022014-12-22 23:31:43269 void RegisterPepperCdm(base::CommandLine* command_line,
[email protected]63dc9072013-09-12 06:20:47270 const std::string& adapter_name,
271 const std::string& key_system) {
[email protected]e6bf64142013-10-18 23:07:54272 DCHECK(!is_pepper_cdm_registered_)
273 << "RegisterPepperCdm() can only be called once.";
274 is_pepper_cdm_registered_ = true;
275
[email protected]63dc9072013-09-12 06:20:47276 // 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);
[email protected]1825e772013-10-08 06:39:11280 EXPECT_TRUE(base::PathExists(plugin_lib)) << plugin_lib.value();
[email protected]63dc9072013-09-12 06:20:47281 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)
thestig11bf74d2014-11-24 20:14:42284 pepper_plugin.append(base::ASCIIToUTF16(GetPepperType(key_system)));
[email protected]63dc9072013-09-12 06:20:47285#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) {
[email protected]ab998e82013-11-22 20:31:35294 if (IsExternalClearKey(key_system))
[email protected]1825e772013-10-08 06:39:11295 return kClearKeyCdmPluginMimeType;
[email protected]63dc9072013-09-12 06:20:47296#if defined(WIDEVINE_CDM_AVAILABLE)
[email protected]ab998e82013-11-22 20:31:35297 if (IsWidevine(key_system))
[email protected]1825e772013-10-08 06:39:11298 return kWidevineCdmPluginMimeType;
[email protected]63dc9072013-09-12 06:20:47299#endif // WIDEVINE_CDM_AVAILABLE
300
301 NOTREACHED();
302 return "";
303 }
304#endif // defined(ENABLE_PEPPER_CDMS)
[email protected]e6bf64142013-10-18 23:07:54305
306 bool is_pepper_cdm_registered_;
307};
308
309#if defined(ENABLE_PEPPER_CDMS)
[email protected]ab998e82013-11-22 20:31:35310// Tests encrypted media playback using ExternalClearKey key system in
311// decrypt-and-decode mode.
[email protected]e6bf64142013-10-18 23:07:54312class ECKEncryptedMediaTest : public EncryptedMediaTestBase {
[email protected]0af5dfa2014-02-07 22:33:44313 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.
jrummell19f2c902015-02-11 01:17:50320 RunEncryptedMediaTest(kDefaultEmePlayer, "bear-a_enc-a.webm",
321 kWebMAudioOnly, key_system, SRC, UNPREFIXED,
322 kNoSessionToLoad, false, expected_title);
323 }
324
325 void TestPlaybackCase(const std::string& session_to_load,
326 const std::string& expected_title) {
327 RunEncryptedMediaTest(kDefaultEmePlayer, "bear-320x240-v_enc-v.webm",
328 kWebMVideoOnly, kExternalClearKeyKeySystem, SRC,
329 UNPREFIXED, session_to_load, false, expected_title);
[email protected]0af5dfa2014-02-07 22:33:44330 }
331
[email protected]e6bf64142013-10-18 23:07:54332 protected:
avi556c05022014-12-22 23:31:43333 void SetUpCommandLine(base::CommandLine* command_line) override {
[email protected]e6bf64142013-10-18 23:07:54334 EncryptedMediaTestBase::SetUpCommandLine(command_line);
335 SetUpCommandLineForKeySystem(kExternalClearKeyKeySystem, command_line);
336 }
337};
338
jrummellc467d232014-10-21 17:55:22339// Tests encrypted media playback using ExternalClearKey key system in
340// decrypt-and-decode mode for unprefixed EME.
jrummell19f2c902015-02-11 01:17:50341class ECKPrefixedEncryptedMediaTest : public EncryptedMediaTestBase {
342 public:
343 // We use special |key_system| names to do non-playback related tests, e.g.
344 // kExternalClearKeyFileIOTestKeySystem is used to test file IO.
345 void TestNonPlaybackCases(const std::string& key_system,
346 const std::string& expected_title) {
347 // Since we do not test playback, arbitrarily choose a test file and source
348 // type.
349 RunEncryptedMediaTest(kDefaultEmePlayer, "bear-a_enc-a.webm",
350 kWebMAudioOnly, key_system, SRC, PREFIXED,
351 kNoSessionToLoad, false, expected_title);
352 }
353
354 void TestPlaybackCase(const std::string& session_to_load,
355 const std::string& expected_title) {
356 RunEncryptedMediaTest(kDefaultEmePlayer, "bear-320x240-v_enc-v.webm",
357 kWebMVideoOnly, kExternalClearKeyKeySystem, SRC,
358 PREFIXED, session_to_load, false, expected_title);
359 }
360
jrummellc467d232014-10-21 17:55:22361 protected:
avi556c05022014-12-22 23:31:43362 void SetUpCommandLine(base::CommandLine* command_line) override {
jrummellc467d232014-10-21 17:55:22363 EncryptedMediaTestBase::SetUpCommandLine(command_line);
jrummellc467d232014-10-21 17:55:22364 SetUpCommandLineForKeySystem(kExternalClearKeyKeySystem, command_line);
365 }
366};
367
[email protected]e6bf64142013-10-18 23:07:54368#if defined(WIDEVINE_CDM_AVAILABLE)
369// Tests encrypted media playback using Widevine key system.
370class WVEncryptedMediaTest : public EncryptedMediaTestBase {
371 protected:
Daniel Cheng43ba4a0122014-12-31 06:30:35372 void SetUpCommandLine(base::CommandLine* command_line) override {
[email protected]e6bf64142013-10-18 23:07:54373 EncryptedMediaTestBase::SetUpCommandLine(command_line);
374 SetUpCommandLineForKeySystem(kWidevineKeySystem, command_line);
375 }
376};
[email protected]df06a3e2014-01-31 21:36:59377
[email protected]e6bf64142013-10-18 23:07:54378#endif // defined(WIDEVINE_CDM_AVAILABLE)
379#endif // defined(ENABLE_PEPPER_CDMS)
380
381// Tests encrypted media playback with a combination of parameters:
382// - char*: Key system name.
jrummell19f2c902015-02-11 01:17:50383// - SrcType: Use MSE or SRC.
384// - EmeVersion: Use PREFIXED or UNPREFIXED EME.
[email protected]e6bf64142013-10-18 23:07:54385//
386// Note: Only parameterized (*_P) tests can be used. Non-parameterized (*_F)
387// tests will crash at GetParam(). To add non-parameterized tests, use
388// EncryptedMediaTestBase or one of its subclasses (e.g. WVEncryptedMediaTest).
[email protected]a32ef592014-03-07 19:11:15389class EncryptedMediaTest
390 : public EncryptedMediaTestBase,
391 public testing::WithParamInterface<
392 std::tr1::tuple<const char*, SrcType, EmeVersion> > {
[email protected]e6bf64142013-10-18 23:07:54393 public:
[email protected]df06a3e2014-01-31 21:36:59394 std::string CurrentKeySystem() {
[email protected]e6bf64142013-10-18 23:07:54395 return std::tr1::get<0>(GetParam());
396 }
397
398 SrcType CurrentSourceType() {
399 return std::tr1::get<1>(GetParam());
400 }
401
[email protected]a32ef592014-03-07 19:11:15402 EmeVersion CurrentEmeVersion() {
403 return std::tr1::get<2>(GetParam());
404 }
405
[email protected]df06a3e2014-01-31 21:36:59406 void TestSimplePlayback(const std::string& encrypted_media,
407 const std::string& media_type) {
[email protected]a32ef592014-03-07 19:11:15408 RunSimpleEncryptedMediaTest(encrypted_media,
409 media_type,
410 CurrentKeySystem(),
411 CurrentSourceType(),
412 CurrentEmeVersion());
[email protected]e6bf64142013-10-18 23:07:54413 }
414
[email protected]df06a3e2014-01-31 21:36:59415 void RunInvalidResponseTest() {
[email protected]e11d89d2014-06-19 11:36:31416 RunEncryptedMediaTest(kDefaultEmePlayer,
[email protected]8a229322014-07-22 23:33:07417 "bear-320x240-av_enc-av.webm",
[email protected]df06a3e2014-01-31 21:36:59418 kWebMAudioVideo,
419 CurrentKeySystem(),
420 CurrentSourceType(),
[email protected]a32ef592014-03-07 19:11:15421 CurrentEmeVersion(),
[email protected]0af5dfa2014-02-07 22:33:44422 kNoSessionToLoad,
[email protected]df06a3e2014-01-31 21:36:59423 true,
424 kEmeKeyError);
425 }
426
[email protected]e6bf64142013-10-18 23:07:54427 void TestFrameSizeChange() {
[email protected]e6bf64142013-10-18 23:07:54428 RunEncryptedMediaTest("encrypted_frame_size_change.html",
[email protected]8a229322014-07-22 23:33:07429 "frame_size_change-av_enc-v.webm",
[email protected]df06a3e2014-01-31 21:36:59430 kWebMAudioVideo,
431 CurrentKeySystem(),
432 CurrentSourceType(),
[email protected]a32ef592014-03-07 19:11:15433 CurrentEmeVersion(),
[email protected]0af5dfa2014-02-07 22:33:44434 kNoSessionToLoad,
[email protected]df06a3e2014-01-31 21:36:59435 false,
436 kEnded);
[email protected]e6bf64142013-10-18 23:07:54437 }
438
439 void TestConfigChange() {
[email protected]df06a3e2014-01-31 21:36:59440 DCHECK(IsMSESupported());
anand.ratn2636d972014-09-30 04:06:58441 base::StringPairs query_params;
[email protected]df06a3e2014-01-31 21:36:59442 query_params.push_back(std::make_pair("keySystem", CurrentKeySystem()));
443 query_params.push_back(std::make_pair("runEncrypted", "1"));
[email protected]a32ef592014-03-07 19:11:15444 if (CurrentEmeVersion() == PREFIXED)
445 query_params.push_back(std::make_pair("usePrefixedEME", "1"));
[email protected]df06a3e2014-01-31 21:36:59446 RunEncryptedMediaTestPage("mse_config_change.html",
447 CurrentKeySystem(),
[email protected]8a229322014-07-22 23:33:07448 query_params,
[email protected]df06a3e2014-01-31 21:36:59449 kEnded);
[email protected]e6bf64142013-10-18 23:07:54450 }
451
452 protected:
avi556c05022014-12-22 23:31:43453 void SetUpCommandLine(base::CommandLine* command_line) override {
[email protected]e6bf64142013-10-18 23:07:54454 EncryptedMediaTestBase::SetUpCommandLine(command_line);
455 SetUpCommandLineForKeySystem(CurrentKeySystem(), command_line);
456 }
[email protected]63dc9072013-09-12 06:20:47457};
458
[email protected]6479b192013-10-19 18:28:04459using ::testing::Combine;
460using ::testing::Values;
461
462#if !defined(OS_ANDROID)
[email protected]a32ef592014-03-07 19:11:15463INSTANTIATE_TEST_CASE_P(SRC_ClearKey_Prefixed,
464 EncryptedMediaTest,
465 Combine(Values(kPrefixedClearKeyKeySystem),
466 Values(SRC),
467 Values(PREFIXED)));
468
jrummell19f2c902015-02-11 01:17:50469INSTANTIATE_TEST_CASE_P(SRC_ClearKey,
[email protected]a32ef592014-03-07 19:11:15470 EncryptedMediaTest,
471 Combine(Values(kClearKeyKeySystem),
472 Values(SRC),
473 Values(UNPREFIXED)));
[email protected]6479b192013-10-19 18:28:04474#endif // !defined(OS_ANDROID)
475
[email protected]a32ef592014-03-07 19:11:15476INSTANTIATE_TEST_CASE_P(MSE_ClearKey_Prefixed,
477 EncryptedMediaTest,
478 Combine(Values(kPrefixedClearKeyKeySystem),
479 Values(MSE),
480 Values(PREFIXED)));
jrummell77419192014-10-31 21:40:44481INSTANTIATE_TEST_CASE_P(MSE_ClearKey,
[email protected]a32ef592014-03-07 19:11:15482 EncryptedMediaTest,
483 Combine(Values(kClearKeyKeySystem),
484 Values(MSE),
485 Values(UNPREFIXED)));
[email protected]63dc9072013-09-12 06:20:47486
487// External Clear Key is currently only used on platforms that use Pepper CDMs.
488#if defined(ENABLE_PEPPER_CDMS)
[email protected]a32ef592014-03-07 19:11:15489INSTANTIATE_TEST_CASE_P(SRC_ExternalClearKey_Prefixed,
490 EncryptedMediaTest,
491 Combine(Values(kExternalClearKeyKeySystem),
492 Values(SRC),
493 Values(PREFIXED)));
[email protected]1ab297a2014-03-26 04:52:12494INSTANTIATE_TEST_CASE_P(SRC_ExternalClearKey,
[email protected]a32ef592014-03-07 19:11:15495 EncryptedMediaTest,
496 Combine(Values(kExternalClearKeyKeySystem),
497 Values(SRC),
498 Values(UNPREFIXED)));
499INSTANTIATE_TEST_CASE_P(MSE_ExternalClearKey_Prefixed,
500 EncryptedMediaTest,
501 Combine(Values(kExternalClearKeyKeySystem),
502 Values(MSE),
503 Values(PREFIXED)));
[email protected]1ab297a2014-03-26 04:52:12504INSTANTIATE_TEST_CASE_P(MSE_ExternalClearKey,
[email protected]a32ef592014-03-07 19:11:15505 EncryptedMediaTest,
506 Combine(Values(kExternalClearKeyKeySystem),
507 Values(MSE),
508 Values(UNPREFIXED)));
[email protected]ab998e82013-11-22 20:31:35509// To reduce test time, only run ExternalClearKeyDecryptOnly with MSE.
[email protected]a32ef592014-03-07 19:11:15510INSTANTIATE_TEST_CASE_P(MSE_ExternalClearKeyDecryptOnly_Prefixed,
511 EncryptedMediaTest,
512 Combine(Values(kExternalClearKeyDecryptOnlyKeySystem),
513 Values(MSE),
514 Values(PREFIXED)));
[email protected]1ab297a2014-03-26 04:52:12515INSTANTIATE_TEST_CASE_P(MSE_ExternalClearKeyDecryptOnly,
[email protected]a32ef592014-03-07 19:11:15516 EncryptedMediaTest,
517 Combine(Values(kExternalClearKeyDecryptOnlyKeySystem),
518 Values(MSE),
519 Values(UNPREFIXED)));
[email protected]8a229322014-07-22 23:33:07520#endif // defined(ENABLE_PEPPER_CDMS)
[email protected]63dc9072013-09-12 06:20:47521
[email protected]1825e772013-10-08 06:39:11522#if defined(WIDEVINE_CDM_AVAILABLE)
523// This test doesn't fully test playback with Widevine. So we only run Widevine
[email protected]6479b192013-10-19 18:28:04524// test with MSE (no SRC) to reduce test time. Also, on Android EME only works
525// with MSE and we cannot run this test with SRC.
[email protected]a32ef592014-03-07 19:11:15526INSTANTIATE_TEST_CASE_P(MSE_Widevine_Prefixed,
527 EncryptedMediaTest,
528 Combine(Values(kWidevineKeySystem),
529 Values(MSE),
530 Values(PREFIXED)));
[email protected]78d96542014-03-27 11:45:47531
[email protected]1ab297a2014-03-26 04:52:12532INSTANTIATE_TEST_CASE_P(MSE_Widevine,
[email protected]a32ef592014-03-07 19:11:15533 EncryptedMediaTest,
534 Combine(Values(kWidevineKeySystem),
535 Values(MSE),
536 Values(UNPREFIXED)));
[email protected]1825e772013-10-08 06:39:11537#endif // defined(WIDEVINE_CDM_AVAILABLE)
[email protected]63dc9072013-09-12 06:20:47538
jamescook6107ed82014-11-06 06:59:21539// These tests time out in Chrome OS official builds. http://crbug.com/430711
540#if !(defined(OS_CHROMEOS) && defined(OFFICIAL_BUILD))
[email protected]626e517c2014-08-19 00:49:46541IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_AudioOnly_WebM) {
[email protected]8a229322014-07-22 23:33:07542 TestSimplePlayback("bear-a_enc-a.webm", kWebMAudioOnly);
[email protected]63dc9072013-09-12 06:20:47543}
544
[email protected]626e517c2014-08-19 00:49:46545IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_AudioClearVideo_WebM) {
[email protected]8a229322014-07-22 23:33:07546 TestSimplePlayback("bear-320x240-av_enc-a.webm", kWebMAudioVideo);
[email protected]63dc9072013-09-12 06:20:47547}
548
[email protected]626e517c2014-08-19 00:49:46549IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_VideoAudio_WebM) {
[email protected]8a229322014-07-22 23:33:07550 TestSimplePlayback("bear-320x240-av_enc-av.webm", kWebMAudioVideo);
[email protected]63dc9072013-09-12 06:20:47551}
552
[email protected]626e517c2014-08-19 00:49:46553IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_VideoOnly_WebM) {
[email protected]8a229322014-07-22 23:33:07554 TestSimplePlayback("bear-320x240-v_enc-v.webm", kWebMVideoOnly);
[email protected]63dc9072013-09-12 06:20:47555}
556
[email protected]626e517c2014-08-19 00:49:46557IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_VideoClearAudio_WebM) {
[email protected]8a229322014-07-22 23:33:07558 TestSimplePlayback("bear-320x240-av_enc-v.webm", kWebMAudioVideo);
[email protected]63dc9072013-09-12 06:20:47559}
560
jrummell2fe87672015-01-02 19:13:51561IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_VP9Video_WebM) {
[email protected]8a229322014-07-22 23:33:07562 TestSimplePlayback("bear-320x240-v-vp9_enc-v.webm", kWebMVP9VideoOnly);
[email protected]2b197ac72014-04-11 23:33:52563}
564
jrummell2fe87672015-01-02 19:13:51565IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_AudioOnly_WebM_Opus) {
sandersd5ec6dcf2014-11-26 20:39:38566 TestSimplePlayback("bear-320x240-opus-a_enc-a.webm", kWebMAudioOnly);
567}
568
569IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_VideoAudio_WebM_Opus) {
570 TestSimplePlayback("bear-320x240-opus-av_enc-av.webm", kWebMAudioVideo);
571}
572
573IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_VideoClearAudio_WebM_Opus) {
574 TestSimplePlayback("bear-320x240-opus-av_enc-v.webm", kWebMAudioVideo);
575}
576
[email protected]626e517c2014-08-19 00:49:46577IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, InvalidResponseKeyError) {
[email protected]df06a3e2014-01-31 21:36:59578 RunInvalidResponseTest();
579}
580
[email protected]1825e772013-10-08 06:39:11581IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, ConfigChangeVideo) {
[email protected]df06a3e2014-01-31 21:36:59582 if (CurrentSourceType() != MSE || !IsMSESupported()) {
anujk.sharma9da298e12014-11-07 04:48:43583 DVLOG(0) << "Skipping test - ConfigChange test requires MSE.";
[email protected]df06a3e2014-01-31 21:36:59584 return;
585 }
586 if (!IsPlayBackPossible(CurrentKeySystem())) {
anujk.sharma9da298e12014-11-07 04:48:43587 DVLOG(0) << "Skipping test - ConfigChange test requires video playback.";
[email protected]df06a3e2014-01-31 21:36:59588 return;
589 }
[email protected]1825e772013-10-08 06:39:11590 TestConfigChange();
591}
592
jrummell2fe87672015-01-02 19:13:51593IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, FrameSizeChangeVideo) {
[email protected]63dc9072013-09-12 06:20:47594 // Times out on Windows XP. http://crbug.com/171937
595#if defined(OS_WIN)
596 if (base::win::GetVersion() < base::win::VERSION_VISTA)
597 return;
598#endif
[email protected]df06a3e2014-01-31 21:36:59599 if (!IsPlayBackPossible(CurrentKeySystem())) {
anujk.sharma9da298e12014-11-07 04:48:43600 DVLOG(0) << "Skipping test - FrameSizeChange test requires video playback.";
[email protected]df06a3e2014-01-31 21:36:59601 return;
602 }
[email protected]1825e772013-10-08 06:39:11603 TestFrameSizeChange();
[email protected]63dc9072013-09-12 06:20:47604}
605
606#if defined(USE_PROPRIETARY_CODECS)
607IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_VideoOnly_MP4) {
[email protected]63dc9072013-09-12 06:20:47608 // MP4 without MSE is not support yet, http://crbug.com/170793.
[email protected]1825e772013-10-08 06:39:11609 if (CurrentSourceType() != MSE) {
anujk.sharma9da298e12014-11-07 04:48:43610 DVLOG(0) << "Skipping test; Can only play MP4 encrypted streams by MSE.";
[email protected]63dc9072013-09-12 06:20:47611 return;
612 }
[email protected]1825e772013-10-08 06:39:11613 TestSimplePlayback("bear-640x360-v_frag-cenc.mp4", kMP4VideoOnly);
[email protected]63dc9072013-09-12 06:20:47614}
615
616IN_PROC_BROWSER_TEST_P(EncryptedMediaTest, Playback_AudioOnly_MP4) {
[email protected]63dc9072013-09-12 06:20:47617 // MP4 without MSE is not support yet, http://crbug.com/170793.
[email protected]1825e772013-10-08 06:39:11618 if (CurrentSourceType() != MSE) {
anujk.sharma9da298e12014-11-07 04:48:43619 DVLOG(0) << "Skipping test; Can only play MP4 encrypted streams by MSE.";
[email protected]63dc9072013-09-12 06:20:47620 return;
621 }
[email protected]1825e772013-10-08 06:39:11622 TestSimplePlayback("bear-640x360-a_frag-cenc.mp4", kMP4AudioOnly);
[email protected]63dc9072013-09-12 06:20:47623}
624#endif // defined(USE_PROPRIETARY_CODECS)
jamescook6107ed82014-11-06 06:59:21625#endif // !(defined(OS_CHROMEOS) && defined(OFFICIAL_BUILD))
[email protected]63dc9072013-09-12 06:20:47626
[email protected]63dc9072013-09-12 06:20:47627#if defined(WIDEVINE_CDM_AVAILABLE)
628// The parent key system cannot be used in generateKeyRequest.
[email protected]a32ef592014-03-07 19:11:15629IN_PROC_BROWSER_TEST_F(WVEncryptedMediaTest, ParentThrowsException_Prefixed) {
[email protected]e11d89d2014-06-19 11:36:31630 RunEncryptedMediaTest(kDefaultEmePlayer,
[email protected]8a229322014-07-22 23:33:07631 "bear-a_enc-a.webm",
[email protected]297b5a352013-10-18 00:09:17632 kWebMAudioOnly,
633 "com.widevine",
[email protected]e6bf64142013-10-18 23:07:54634 MSE,
[email protected]a32ef592014-03-07 19:11:15635 PREFIXED,
636 kNoSessionToLoad,
637 false,
638 kEmeNotSupportedError);
639}
640
641// TODO(jrummell): http://crbug.com/349181
642// The parent key system cannot be used when creating MediaKeys.
[email protected]b1620732014-04-01 23:17:18643IN_PROC_BROWSER_TEST_F(WVEncryptedMediaTest, ParentThrowsException) {
[email protected]e11d89d2014-06-19 11:36:31644 RunEncryptedMediaTest(kDefaultEmePlayer,
[email protected]8a229322014-07-22 23:33:07645 "bear-a_enc-a.webm",
[email protected]a32ef592014-03-07 19:11:15646 kWebMAudioOnly,
647 "com.widevine",
648 MSE,
649 UNPREFIXED,
[email protected]0af5dfa2014-02-07 22:33:44650 kNoSessionToLoad,
[email protected]df06a3e2014-01-31 21:36:59651 false,
[email protected]297b5a352013-10-18 00:09:17652 kEmeNotSupportedError);
[email protected]63dc9072013-09-12 06:20:47653}
[email protected]63dc9072013-09-12 06:20:47654#endif // defined(WIDEVINE_CDM_AVAILABLE)
[email protected]a941d4e572013-10-14 21:22:05655
656#if defined(ENABLE_PEPPER_CDMS)
[email protected]34afd582013-12-20 07:26:18657IN_PROC_BROWSER_TEST_F(ECKEncryptedMediaTest, InitializeCDMFail) {
[email protected]0af5dfa2014-02-07 22:33:44658 TestNonPlaybackCases(kExternalClearKeyInitializeFailKeySystem, kEmeKeyError);
[email protected]a941d4e572013-10-14 21:22:05659}
[email protected]34afd582013-12-20 07:26:18660
[email protected]a27d34ab2014-01-09 04:23:29661// When CDM crashes, we should still get a decode error.
[email protected]edaeb3f92014-06-19 18:27:22662// crbug.com/386657
663IN_PROC_BROWSER_TEST_F(ECKEncryptedMediaTest, DISABLED_CDMCrashDuringDecode) {
[email protected]1be9fa072014-03-21 22:50:29664 IgnorePluginCrash();
[email protected]0af5dfa2014-02-07 22:33:44665 TestNonPlaybackCases(kExternalClearKeyCrashKeySystem, kError);
[email protected]a27d34ab2014-01-09 04:23:29666}
667
[email protected]1be9fa072014-03-21 22:50:29668// Testing that the media browser test does fail on plugin crash.
[email protected]edaeb3f92014-06-19 18:27:22669// crbug.com/386657
670IN_PROC_BROWSER_TEST_F(ECKEncryptedMediaTest, DISABLED_CDMExpectedCrash) {
[email protected]1be9fa072014-03-21 22:50:29671 // Plugin crash is not ignored by default, the test is expected to fail.
672 EXPECT_NONFATAL_FAILURE(
673 TestNonPlaybackCases(kExternalClearKeyCrashKeySystem, kError),
674 "plugin crash");
675}
676
xhwang0c617e112014-09-19 17:33:24677IN_PROC_BROWSER_TEST_F(ECKEncryptedMediaTest, FileIOTest) {
[email protected]0af5dfa2014-02-07 22:33:44678 TestNonPlaybackCases(kExternalClearKeyFileIOTestKeySystem,
679 kFileIOTestSuccess);
680}
681
682IN_PROC_BROWSER_TEST_F(ECKEncryptedMediaTest, LoadLoadableSession) {
jrummell19f2c902015-02-11 01:17:50683 TestPlaybackCase(kLoadableSession, kEnded);
[email protected]0af5dfa2014-02-07 22:33:44684}
685
686IN_PROC_BROWSER_TEST_F(ECKEncryptedMediaTest, LoadUnknownSession) {
687 // TODO(xhwang): Add a specific error for this failure, e.g. kSessionNotFound.
jrummell19f2c902015-02-11 01:17:50688 TestPlaybackCase(kUnknownSession, kEmeKeyError);
[email protected]34afd582013-12-20 07:26:18689}
jrummellc467d232014-10-21 17:55:22690
jrummell19f2c902015-02-11 01:17:50691IN_PROC_BROWSER_TEST_F(ECKPrefixedEncryptedMediaTest, InitializeCDMFail) {
692 TestNonPlaybackCases(kExternalClearKeyInitializeFailKeySystem, kEmeKeyError);
jrummellc467d232014-10-21 17:55:22693}
694
jrummell19f2c902015-02-11 01:17:50695// When CDM crashes, we should still get a decode error.
696// crbug.com/386657
697IN_PROC_BROWSER_TEST_F(ECKPrefixedEncryptedMediaTest,
698 DISABLED_CDMCrashDuringDecode) {
699 IgnorePluginCrash();
700 TestNonPlaybackCases(kExternalClearKeyCrashKeySystem, kError);
701}
702
703// Testing that the media browser test does fail on plugin crash.
704// crbug.com/386657
705IN_PROC_BROWSER_TEST_F(ECKPrefixedEncryptedMediaTest,
706 DISABLED_CDMExpectedCrash) {
707 // Plugin crash is not ignored by default, the test is expected to fail.
708 EXPECT_NONFATAL_FAILURE(
709 TestNonPlaybackCases(kExternalClearKeyCrashKeySystem, kError),
710 "plugin crash");
711}
712
713IN_PROC_BROWSER_TEST_F(ECKPrefixedEncryptedMediaTest, FileIOTest) {
714 TestNonPlaybackCases(kExternalClearKeyFileIOTestKeySystem,
715 kFileIOTestSuccess);
716}
717
718IN_PROC_BROWSER_TEST_F(ECKPrefixedEncryptedMediaTest, LoadLoadableSession) {
719 TestPlaybackCase(kLoadableSession, kEnded);
720}
721
722IN_PROC_BROWSER_TEST_F(ECKPrefixedEncryptedMediaTest, LoadUnknownSession) {
jrummellc467d232014-10-21 17:55:22723 // TODO(xhwang): Add a specific error for this failure, e.g. kSessionNotFound.
jrummell19f2c902015-02-11 01:17:50724 TestPlaybackCase(kUnknownSession, kEmeKeyError);
jrummellc467d232014-10-21 17:55:22725}
[email protected]a941d4e572013-10-14 21:22:05726#endif // defined(ENABLE_PEPPER_CDMS)