Commit 7d3fff95 authored by Xiaohan Wang's avatar Xiaohan Wang Committed by Commit Bot

media: Improve Widevine EncryptedMediaTest.PolicyCheck

This CL adds more detailed test case for EncryptedMediaTest.PolicyCheck
when using Widevine key system. Note that the test is bypassed on
ChromeOS since Widevine CDM on ChromeOS doesn't support this API yet.

Bug: 849846
Test: Add more detailed test case.
Change-Id: Iae08027f8fae25710dd5b997ff4942c234c04192
Reviewed-on: https://chromium-review.googlesource.com/1087438
Commit-Queue: Xiaohan Wang <xhwang@chromium.org>
Reviewed-by: default avatarJohn Rummell <jrummell@chromium.org>
Cr-Commit-Position: refs/heads/master@{#565466}
parent caf0d18b
...@@ -440,6 +440,13 @@ class EncryptedMediaTest ...@@ -440,6 +440,13 @@ class EncryptedMediaTest
} }
void TestPolicyCheck() { void TestPolicyCheck() {
// TODO(crbug.com/847591): ChromeOS Widevine CDM does not support policy check
// API yet. Remove this condition when the CDM is updated.
#if defined(WIDEVINE_CDM_AVAILABLE) && defined(OS_CHROMEOS)
if (IsWidevine(key_system))
return;
#endif // defined(WIDEVINE_CDM_AVAILABLE) && defined(OS_CHROMEOS)
base::StringPairs query_params; base::StringPairs query_params;
// We do not care about playback so choose an arbitrary media file. // We do not care about playback so choose an arbitrary media file.
query_params.emplace_back("mediaFile", "bear-a_enc-a.webm"); query_params.emplace_back("mediaFile", "bear-a_enc-a.webm");
......
...@@ -64,58 +64,69 @@ PlayerUtils.registerEMEEventListeners = function(player) { ...@@ -64,58 +64,69 @@ PlayerUtils.registerEMEEventListeners = function(player) {
}); });
} }
// Call getStatusForPolicy() and compare the result with |expectedResult|. // Calls getStatusForPolicy() and returns a resolved promise if the result
// |expectedResult| can be a valid key status, e.g. "usable", in which case // matches the |expectedResult|, whose value can be:
// getStatusForPolicy() should return a resolved promise. It can also be // - a valid key status, e.g. "usable", in which case getStatusForPolicy()
// "rejected", in which getStatusForPolicy() should return a rejected // must be resolved with |expectedResult|.
// promise. // - "rejected", in which case getStatusForPolicy() must be rejected.
function getStatusForHdcpPolicy(mediaKeys, hdcpVersion, expectedResult) { // - "resolved", in which case getStatusForPolicy() can be resolved by any
return mediaKeys.getStatusForPolicy({minHdcpVersion: hdcpVersion}) // value.
.then( async function getStatusForHdcpPolicy(
keyStatus => { mediaKeys, hdcpVersion, expectedResult) {
if (keyStatus == expectedResult) { try {
return Promise.resolve(); var keyStatus =
} else { await mediaKeys.getStatusForPolicy({minHdcpVersion: hdcpVersion});
return Promise.reject( if (expectedResult == 'resolved' ||
'keyStatus ' + keyStatus + ' does not match ' + (expectedResult != 'rejected' && keyStatus == expectedResult)) {
expectedResult); return true;
} }
},
error => { throw new Error(
if (expectedResult == 'rejected') { 'keyStatus ' + keyStatus + ' does not match ' + expectedResult);
return Promise.resolve(); } catch (e) {
} else { if (expectedResult == 'rejected') {
return Promise.reject("Promise rejected unexpectedly."); return true;
} }
});
throw new Error('Promise rejected unexpectedly: ' + e);
}
} }
// Tests HDCP policy check. Returns a resolved promise if all tests pass.
function testGetStatusForHdcpPolicy(mediaKeys) { function testGetStatusForHdcpPolicy(mediaKeys) {
const keySystem = this.testConfig.keySystem; const keySystem = this.testConfig.keySystem;
Utils.timeLog('Key system: ' + keySystem); Utils.timeLog('Key system: ' + keySystem);
if (keySystem == EXTERNAL_CLEARKEY) { if (keySystem == EXTERNAL_CLEARKEY) {
return Promise.resolve().then(function() { // ClearKeyCdm pretends the device is HDCP 2.0 compliant. See
return getStatusForHdcpPolicy(mediaKeys, "", "usable"); // ClearKeyCdm::GetStatusForPolicy() for details.
}).then(function() { return Promise.all([
return getStatusForHdcpPolicy(mediaKeys, "hdcp-1.0", "usable"); getStatusForHdcpPolicy(mediaKeys, '', 'usable'),
}).then(function() { getStatusForHdcpPolicy(mediaKeys, 'hdcp-1.0', 'usable'),
return getStatusForHdcpPolicy( getStatusForHdcpPolicy(mediaKeys, 'hdcp-2.2', 'output-restricted'),
mediaKeys, "hdcp-2.2", "output-restricted"); ]);
}); }
} else if (keySystem == CLEARKEY) {
return Promise.resolve().then(function () { if (keySystem == CLEARKEY) {
return getStatusForHdcpPolicy(mediaKeys, "", "rejected"); // AesDecryptor does not support getStatusForPolicy() so the promise
}).then(function () { // is always rejected.
return getStatusForHdcpPolicy(mediaKeys, "hdcp-1.0", "rejected"); return Promise.all([
}); getStatusForHdcpPolicy(mediaKeys, '', 'rejected'),
} else if (keySystem == WIDEVINE_KEYSYSTEM) { getStatusForHdcpPolicy(mediaKeys, 'hdcp-1.0', 'rejected'),
// TODO(crbug.com/849846): Currently support on HDCP policy check by ]);
// Widevine CDM varies on different platforms. Update this to test more
// specific behaviors.
return Promise.resolve();
} else {
return Promise.reject("Unsupported key system");
} }
if (keySystem == WIDEVINE_KEYSYSTEM) {
// Widevine CDM supports getStatusForPolicy() so the promise is always
// resolved. However the key status depends on the device's HDCP level
// so we cannot enforce it.
return Promise.all([
getStatusForHdcpPolicy(mediaKeys, '', 'usable'),
getStatusForHdcpPolicy(mediaKeys, 'hdcp-1.0', 'resolved'),
]);
}
return Promise.reject('Unsupported key system');
} }
try { try {
...@@ -158,13 +169,13 @@ PlayerUtils.registerEMEEventListeners = function(player) { ...@@ -158,13 +169,13 @@ PlayerUtils.registerEMEEventListeners = function(player) {
// new test js file once we figure out an easy way to separate the // new test js file once we figure out an easy way to separate the
// requrestMediaKeySystemAccess() logic from the rest of this file. // requrestMediaKeySystemAccess() logic from the rest of this file.
Utils.timeLog('Policy check test.'); Utils.timeLog('Policy check test.');
player.access.createMediaKeys().then(function(mediaKeys) { player.access.createMediaKeys().then(function (mediaKeys) {
// Call getStatusForPolicy() before creating any MediaKeySessions. // Call getStatusForPolicy() before creating any MediaKeySessions.
return testGetStatusForHdcpPolicy(mediaKeys); return testGetStatusForHdcpPolicy(mediaKeys);
}).then(function(result) { }).then(function (result) {
Utils.timeLog('Policy check test passed.'); Utils.timeLog('Policy check test passed.');
Utils.setResultInTitle(UNIT_TEST_SUCCESS); Utils.setResultInTitle(UNIT_TEST_SUCCESS);
}).catch(function(error) { }).catch(function (error) {
Utils.timeLog('Policy check test failed.'); Utils.timeLog('Policy check test failed.');
Utils.failTest(error, UNIT_TEST_FAILURE); Utils.failTest(error, UNIT_TEST_FAILURE);
}); });
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment