Skip to content

Commit

Permalink
[eme] Add test for expiration attribute value (web-platform-tests#3798)
Browse files Browse the repository at this point in the history
  • Loading branch information
mwatson2 authored Sep 28, 2016
1 parent 77fbd71 commit 8381843
Show file tree
Hide file tree
Showing 6 changed files with 230 additions and 28 deletions.
17 changes: 12 additions & 5 deletions encrypted-media/content/content-metadata.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ content = addMemberListToObject( {
path: '/encrypted-media/content/video_512x288_h264-360k_clear_dashinit.mp4' }
},

'mp4-basic' : { initDataType: 'cenc',
'mp4-basic' : { assetId: 'mp4-basic',
initDataType: 'cenc',
audio : { type: 'audio/mp4;codecs="mp4a.40.2"',
path: '/encrypted-media/content/audio_aac-lc_128k_dashinit.mp4' },
video : { type: 'video/mp4;codecs="avc1.4d401e"',
Expand All @@ -19,6 +20,7 @@ content = addMemberListToObject( {
},

'mp4-av-multikey' : {
assetId: 'mp4-basic',
initDataType: 'cenc',
associatedInitData: true, // indicates that initData for one key causes other keys to be returned as well
audio: { type: 'audio/mp4;codecs="mp4a.40.2"',
Expand All @@ -35,18 +37,21 @@ content = addMemberListToObject( {
initData: 'AAAAcXBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAFEIARIQVY7lQbkKsvOVDQCt43YNRRoIY2FzdGxhYnMiKGV5SmhjM05sZEVsa0lqb2laVzFsTFhSbGMzUXRjMmx1WjJ4bEluMD0yB2RlZmF1bHQAAAMacHNzaAAAAACaBPB5mEBChquS5lvgiF+VAAAC+voCAAABAAEA8AI8AFcAUgBNAEgARQBBAEQARQBSACAAeABtAGwAbgBzAD0AIgBoAHQAdABwADoALwAvAHMAYwBoAGUAbQBhAHMALgBtAGkAYwByAG8AcwBvAGYAdAAuAGMAbwBtAC8ARABSAE0ALwAyADAAMAA3AC8AMAAzAC8AUABsAGEAeQBSAGUAYQBkAHkASABlAGEAZABlAHIAIgAgAHYAZQByAHMAaQBvAG4APQAiADQALgAwAC4AMAAuADAAIgA+ADwARABBAFQAQQA+ADwAUABSAE8AVABFAEMAVABJAE4ARgBPAD4APABLAEUAWQBMAEUATgA+ADEANgA8AC8ASwBFAFkATABFAE4APgA8AEEATABHAEkARAA+AEEARQBTAEMAVABSADwALwBBAEwARwBJAEQAPgA8AC8AUABSAE8AVABFAEMAVABJAE4ARgBPAD4APABLAEkARAA+AFEAZQBXAE8AVgBRAHEANQA4ADcASwBWAEQAUQBDAHQANAAzAFkATgBSAFEAPQA9ADwALwBLAEkARAA+ADwAQwBIAEUAQwBLAFMAVQBNAD4AWQBpAE8ALwAxADYATABzADkANgBFAD0APAAvAEMASABFAEMASwBTAFUATQA+ADwATABBAF8AVQBSAEwAPgBoAHQAdABwADoALwAvAHAAbABhAHkAcgBlAGEAZAB5AC4AZABpAHIAZQBjAHQAdABhAHAAcwAuAG4AZQB0AC8AcAByAC8AcwB2AGMALwByAGkAZwBoAHQAcwBtAGEAbgBhAGcAZQByAC4AYQBzAG0AeAA/AFAAbABhAHkAUgBpAGcAaAB0AD0AMQAmAGEAbQBwADsAVQBzAGUAUwBpAG0AcABsAGUATgBvAG4AUABlAHIAcwBpAHMAdABlAG4AdABMAGkAYwBlAG4AcwBlAD0AMQA8AC8ATABBAF8AVQBSAEwAPgA8AC8ARABBAFQAQQA+ADwALwBXAFIATQBIAEUAQQBEAEUAUgA+AA==' } ]
},

'mp4-multikey' : { initDataType: 'cenc',
'mp4-multikey' : { assetId: 'mp4-multikey',
initDataType: 'cenc',
audio: { type: 'audio/mp4;codecs="mp4a.40.2"',
path: '/encrypted-media/content/audio_aac-lc_128k_2keys_2sess.mp4' },
video: { type: 'video/mp4;codecs="avc1.4d401e"',
path: '/encrypted-media/content/video_512x288_h264-360k_enc_2keys_2sess.mp4' },
keys: [ { kid: [ 0x13, 0xa7, 0x53, 0x06, 0xd1, 0x18, 0x91, 0x7b, 0x47, 0xa6, 0xc1, 0x83, 0x64, 0x42, 0x51, 0x6f ],
key: [ 0x8a, 0xaa, 0xd8, 0xc4, 0xdb, 0xde, 0xac, 0xcd, 0xad, 0x26, 0x76, 0xa1, 0xed, 0x38, 0x95, 0x2e ],
variantId: 'key1',
initDataType: 'cenc',
initData: 'AAAAjXBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAG0IARIQE6dTBtEYkXtHpsGDZEJRbxoIY2FzdGxhYnMiRGV5SmhjM05sZEVsa0lqb2laVzFsTFhSbGMzUXRNbk5sYzNOcGIyNGlMQ0oyWVhKcFlXNTBTV1FpT2lKclpYa3hJbjA9MgdkZWZhdWx0AAADwnBzc2gAAAAAmgTweZhAQoarkuZb4IhflQAAA6KiAwAAAQABAJgDPABXAFIATQBIAEUAQQBEAEUAUgAgAHgAbQBsAG4AcwA9ACIAaAB0AHQAcAA6AC8ALwBzAGMAaABlAG0AYQBzAC4AbQBpAGMAcgBvAHMAbwBmAHQALgBjAG8AbQAvAEQAUgBNAC8AMgAwADAANwAvADAAMwAvAFAAbABhAHkAUgBlAGEAZAB5AEgAZQBhAGQAZQByACIAIAB2AGUAcgBzAGkAbwBuAD0AIgA0AC4AMAAuADAALgAwACIAPgA8AEQAQQBUAEEAPgA8AFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBFAFkATABFAE4APgAxADYAPAAvAEsARQBZAEwARQBOAD4APABBAEwARwBJAEQAPgBBAEUAUwBDAFQAUgA8AC8AQQBMAEcASQBEAD4APAAvAFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBJAEQAPgBCAGwATwBuAEUAeABqAFIAZQA1AEYASABwAHMARwBEAFoARQBKAFIAYgB3AD0APQA8AC8ASwBJAEQAPgA8AEwAQQBfAFUAUgBMAD4AaAB0AHQAcABzADoALwAvAGwAaQBjAC4AcwB0AGEAZwBpAG4AZwAuAGQAcgBtAHQAbwBkAGEAeQAuAGMAbwBtAC8AbABpAGMAZQBuAHMAZQAtAHAAcgBvAHgAeQAtAGgAZQBhAGQAZQByAGEAdQB0AGgALwBkAHIAbQB0AG8AZABhAHkALwBSAGkAZwBoAHQAcwBNAGEAbgBhAGcAZQByAC4AYQBzAG0AeAA8AC8ATABBAF8AVQBSAEwAPgA8AEwAVQBJAF8AVQBSAEwAPgBoAHQAdABwAHMAOgAvAC8AbABpAGMALgBzAHQAYQBnAGkAbgBnAC4AZAByAG0AdABvAGQAYQB5AC4AYwBvAG0ALwBsAGkAYwBlAG4AcwBlAC0AcAByAG8AeAB5AC0AaABlAGEAZABlAHIAYQB1AHQAaAAvAGQAcgBtAHQAbwBkAGEAeQAvAFIAaQBnAGgAdABzAE0AYQBuAGEAZwBlAHIALgBhAHMAbQB4ADwALwBMAFUASQBfAFUAUgBMAD4APABDAEgARQBDAEsAUwBVAE0APgBJAEQAUgB0AFAAZwBVAEkALwBiAEkAPQA8AC8AQwBIAEUAQwBLAFMAVQBNAD4APAAvAEQAQQBUAEEAPgA8AC8AVwBSAE0ASABFAEEARABFAFIAPgA=' },
{ kid: [ 0xee, 0x73, 0x56, 0x4e, 0xc8, 0xa8, 0x90, 0xf0, 0x78, 0xef, 0x68, 0x71, 0xfa, 0x4b, 0xe1, 0x8b ],
key: [ 0xe4, 0x4f, 0xe1, 0x45, 0x7c, 0x5e, 0xbc, 0xd8, 0x3e, 0xad, 0xdc, 0xd6, 0x2c, 0xaf, 0x55, 0x18 ],
initDataType: 'cenc',
variantId: 'key2',
initDataType: 'cenc',
initData: 'AAAAjXBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAG0IARIQ7nNWTsiokPB472hx+kvhixoIY2FzdGxhYnMiRGV5SmhjM05sZEVsa0lqb2laVzFsTFhSbGMzUXRNbk5sYzNOcGIyNGlMQ0oyWVhKcFlXNTBTV1FpT2lKclpYa3lJbjA9MgdkZWZhdWx0AAADwnBzc2gAAAAAmgTweZhAQoarkuZb4IhflQAAA6KiAwAAAQABAJgDPABXAFIATQBIAEUAQQBEAEUAUgAgAHgAbQBsAG4AcwA9ACIAaAB0AHQAcAA6AC8ALwBzAGMAaABlAG0AYQBzAC4AbQBpAGMAcgBvAHMAbwBmAHQALgBjAG8AbQAvAEQAUgBNAC8AMgAwADAANwAvADAAMwAvAFAAbABhAHkAUgBlAGEAZAB5AEgAZQBhAGQAZQByACIAIAB2AGUAcgBzAGkAbwBuAD0AIgA0AC4AMAAuADAALgAwACIAPgA8AEQAQQBUAEEAPgA8AFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBFAFkATABFAE4APgAxADYAPAAvAEsARQBZAEwARQBOAD4APABBAEwARwBJAEQAPgBBAEUAUwBDAFQAUgA8AC8AQQBMAEcASQBEAD4APAAvAFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBJAEQAPgBUAGwAWgB6ADcAcQBqAEkAOABKAEIANAA3ADIAaAB4ACsAawB2AGgAaQB3AD0APQA8AC8ASwBJAEQAPgA8AEwAQQBfAFUAUgBMAD4AaAB0AHQAcABzADoALwAvAGwAaQBjAC4AcwB0AGEAZwBpAG4AZwAuAGQAcgBtAHQAbwBkAGEAeQAuAGMAbwBtAC8AbABpAGMAZQBuAHMAZQAtAHAAcgBvAHgAeQAtAGgAZQBhAGQAZQByAGEAdQB0AGgALwBkAHIAbQB0AG8AZABhAHkALwBSAGkAZwBoAHQAcwBNAGEAbgBhAGcAZQByAC4AYQBzAG0AeAA8AC8ATABBAF8AVQBSAEwAPgA8AEwAVQBJAF8AVQBSAEwAPgBoAHQAdABwAHMAOgAvAC8AbABpAGMALgBzAHQAYQBnAGkAbgBnAC4AZAByAG0AdABvAGQAYQB5AC4AYwBvAG0ALwBsAGkAYwBlAG4AcwBlAC0AcAByAG8AeAB5AC0AaABlAGEAZABlAHIAYQB1AHQAaAAvAGQAcgBtAHQAbwBkAGEAeQAvAFIAaQBnAGgAdABzAE0AYQBuAGEAZwBlAHIALgBhAHMAbQB4ADwALwBMAFUASQBfAFUAUgBMAD4APABDAEgARQBDAEsAUwBVAE0APgB4AEQASwBBAFkAMAB2AFoAaABVAFUAPQA8AC8AQwBIAEUAQwBLAFMAVQBNAD4APAAvAEQAQQBUAEEAPgA8AC8AVwBSAE0ASABFAEEARABFAFIAPgA=' } ] },

'webm' : { audio : { type: 'audio/webm; codecs="opus"' },
Expand Down Expand Up @@ -151,9 +156,11 @@ function getMultikeyInitDatas( contentitem, initDataType )

function getProprietaryInitDatas( contentitem )
{
var keysWithInitData = contentitem.keys.filter( function( k ) { return k.initData; } );
return { initDataType: contentitem.initDataType,
initDatas : contentitem.keys.filter( function( k ) { return k.initData; } )
.map( function( k ) { return k.initData; } ) };
initDatas : keysWithInitData.map( function( k ) { return k.initData; } ),
variantIds: keysWithInitData.map( function( k ) { return k.variantId; } )
};
}

// Returns a promise that resolves to the following object
Expand Down
67 changes: 67 additions & 0 deletions encrypted-media/drm-expiration.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
<!doctype html>
<html>
<head>
<meta charset=utf-8>
<title>Encrypted Media Extensions: Expiration with DRM</title>
<link rel="help" href="https://w3c.github.io/encrypted-media/">

<!-- Web Platform Test Harness scripts -->
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>

<!-- Helper scripts for Encrypted Media Extensions tests -->
<script src=/encrypted-media/util/utils.js></script>
<script src=/encrypted-media/util/utf8.js></script>
<script src=/encrypted-media/util/fetch.js></script>
<script src=/encrypted-media/util/testmediasource.js></script>

<!-- Content metadata -->
<script src=/encrypted-media/content/content-metadata.js></script>

<!-- Message handler for DRM servers -->
<script src=/encrypted-media/util/drm-messagehandler.js></script>

<!-- The script for this specific test -->
<script src=/encrypted-media/scripts/expiration.js></script>

</head>
<body>
<div id='log'></div>

<script>
var keysystem = getSupportedKeySystem();

getSupportedContentAndInitDataTypes( keysystem ).then( function( supported ) {
// This test requires initData for supported content.
// We prefer explicit initData configured for the content, but
// otherwise we will generate initData for a supported initDataType
// FIXME: Move me to a utility function
var content,
initDataType,
initData;

var contentWithExplicitInitData = supported.filter( function( s ) { return s.content.initDataType; } );
if ( contentWithExplicitInitData.length > 0 ) {
content = contentWithExplicitInitData[ 0 ].content;
initDataType = content.keys[ 0 ].initDataType;
initData = base64DecodeToUnit8Array( content.keys[ 0 ].initData );
} else {
content = supported[ 0 ].content;
initDataType = supported[ 0 ].initDataTypes[ 0 ];
initData = getInitData( content, initDataType );
}

var handler = new MessageHandler( keysystem, content );

runTest( { keysystem: keysystem,
content: content,
messagehandler: handler.messagehandler,
initDataType: initDataType,
initData: initData,
expiration: Date.now().valueOf() + 120000 // Two minutes from now
} );
} );

</script>
</body>
</html>
4 changes: 3 additions & 1 deletion encrypted-media/drm-mp4-playback-temporary-multisession.html
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
var keysystem = getSupportedKeySystem(),
contentitem = content['mp4-multikey'],
handler = new MessageHandler( keysystem, contentitem ),
proprietaryInitDatas = getProprietaryInitDatas(contentitem),
config = { video: document.getElementById('videoelement'),
keysystem: keysystem,
messagehandler: handler.messagehandler,
Expand All @@ -44,7 +45,8 @@
audioType: contentitem.audio.type,
videoType: contentitem.video.type,
initDataType: contentitem.initDataType,
initData: getProprietaryInitDatas(contentitem).initDatas.map( base64DecodeToUnit8Array ),
initData: proprietaryInitDatas.initDatas.map( base64DecodeToUnit8Array ),
variantIds: proprietaryInitDatas.variantIds,
testcase: 'multikey video' };

runTest(config);
Expand Down
43 changes: 43 additions & 0 deletions encrypted-media/scripts/expiration.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
function runTest(config,qualifier) {

var testname = testnamePrefix(qualifier, config.keysystem) + ', expiration';

var configuration = getSimpleConfigurationForContent(config.content);
if (config.initDataType && config.initData) {
configuration.initDataTypes = [config.initDataType];
}

async_test(function(test) {

var _mediaKeys,
_mediaKeySession;

function onFailure(error) {
forceTestFailureFromPromise(test, error);
}

function onMessage(event) {
assert_equals(event.target, _mediaKeySession);
assert_true(event instanceof window.MediaKeyMessageEvent);
assert_equals(event.type, 'message');

assert_in_array(event.messageType, [ 'license-request', 'individualization-request' ] );

config.messagehandler(event.messageType, event.message, config.expiration).then(function(response) {
return event.target.update(response);
}).then(test.step_func(function() {
assert_approx_equals(event.target.expiration, config.expiration, 2000, "expiration attribute should equal provided expiration time");
test.done();
})).catch(onFailure);
}

navigator.requestMediaKeySystemAccess(config.keysystem, [configuration]).then(function(access) {
return access.createMediaKeys();
}).then(function(mediaKeys) {
_mediaKeys = mediaKeys;
_mediaKeySession = _mediaKeys.createSession( 'temporary' );
waitForEventAndRunStep('message', _mediaKeySession, onMessage, test);
return _mediaKeySession.generateRequest(config.initDataType, config.initData);
}).catch(onFailure);
}, testname);
}
5 changes: 3 additions & 2 deletions encrypted-media/scripts/playback-temporary-multisession.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ function runTest(config,qualifier) {

assert_in_array(event.messageType, ['license-request', 'individualization-request']);

config.messagehandler(event.messageType, event.message).then(function(response) {
config.messagehandler(event.messageType, event.message, undefined, event.target._variantId ).then(function(response) {
return event.target.update(response);
}).catch(onFailure);
}
Expand All @@ -57,8 +57,9 @@ function runTest(config,qualifier) {
}).then(function() {
waitForEventAndRunStep('playing', _video, onPlaying, test);

config.initData.forEach(function(initData) {
config.initData.forEach(function(initData,i) {
var mediaKeySession = _mediaKeys.createSession( 'temporary' );
mediaKeySession._variantId = config.variantIds[i];
waitForEventAndRunStep('message', mediaKeySession, onMessage, test);
_mediaKeySessions.push(mediaKeySession);
mediaKeySession.generateRequest(config.initDataType, initData).catch(onFailure);
Expand Down
Loading

0 comments on commit 8381843

Please sign in to comment.