var EncryptedmediaTest = function()

in 2019/media/emeTest.js [24:491]


var EncryptedmediaTest = function() {

var emeVersion = 'Current Editor\'s Draft';
var webkitPrefix = MediaSource.prototype.version.indexOf('webkit') >= 0;
var tests = [];
var info = 'No MSE Support!';
if (window.MediaSource) {
  info = 'EME Spec Version: ' + emeVersion;
  info += ' | webkit prefix: ' + webkitPrefix.toString();
}
info += ' | Default Timeout: ' + TestBase.timeout + 'ms';

var fields = ['passes', 'failures', 'timeouts'];

var createEmeTest = function(name, category, mandatory) {
  var t = createTest(name);
  t.prototype.index = tests.length;
  t.prototype.passes = 0;
  t.prototype.failures = 0;
  t.prototype.timeouts = 0;
  t.prototype.category = category || 'EME';
  if (typeof mandatory === 'boolean') {
    t.prototype.mandatory = mandatory;
  }
  t.prototype.emeHandler = new EMEHandler();
  t.prototype.baseTearDown = t.prototype.teardown;
  t.prototype.teardown = function(testSuiteVer, cb) {
    t.prototype.emeHandler.closeAllKeySessions(function() {
      t.prototype.emeHandler = new EMEHandler();
    });
    this.baseTearDown(testSuiteVer, cb);
  };
  tests.push(t);
  return t;
};

/**
 * Ensure Widevine encrypted H264 video could be played.
 */
var testWidevineH264Video = createEmeTest('WidevineH264Video', 'Widevine');
testWidevineH264Video.prototype.title =
    'Test if we can play video encrypted with Widevine encryption.';
testWidevineH264Video.prototype.start = function(runner, video) {
  var testEmeHandler = this.emeHandler;
  var videoStream = Media.H264.VideoSmallCenc;
  var audioStream = Media.AAC.AudioNormal;
  try {
    setupMse(video, runner, videoStream, audioStream);
    var licenseManager = new LicenseManager(video, videoStream,
                                            LicenseManager.WIDEVINE);
    testEmeHandler.init(video, licenseManager);
  } catch(err) {
    runner.fail(err);
  }
  video.addEventListener('timeupdate', function onTimeUpdate(e) {
    if (!video.paused && video.currentTime >= 15 &&
        !testEmeHandler.keyUnusable) {
      video.removeEventListener('timeupdate', onTimeUpdate);
      runner.checkGE(video.currentTime, 15, 'currentTime');
      runner.succeed();
    }
  });
  video.play();
};

/**
 * Ensure Widevine encrypted aac audio could be played.
 */
var testWidevineAacAudio = createEmeTest('WidevineAacAudio', 'Widevine');
testWidevineAacAudio.prototype.title =
    'Test if we can play aac audio encrypted with Widevine encryption.';
testWidevineAacAudio.prototype.start = function(runner, video) {
  var testEmeHandler = this.emeHandler;
  var audioStream = Media.AAC.AudioSmallCenc;
  var videoStream = Media.H264.VideoNormal;
  try {
    setupMse(video, runner, videoStream, audioStream);
    var licenseManager = new LicenseManager(video, audioStream,
                                            LicenseManager.WIDEVINE);
    testEmeHandler.init(video, licenseManager);
  } catch(err) {
    runner.fail(err);
  }
  video.addEventListener('timeupdate', function onTimeUpdate(e) {
    if (!video.paused && video.currentTime >= 15 &&
        !testEmeHandler.keyUnusable) {
      video.removeEventListener('timeupdate', onTimeUpdate);
      runner.checkGE(video.currentTime, 15, 'currentTime');
      runner.succeed();
    }
  });
  video.play();
};

/**
 * Ensure Widevine encrypted Opus audio could be played.
 */
var testWidevineOpusAudio = createEmeTest('WidevineOpusAudio', 'Widevine');
testWidevineOpusAudio.prototype.title =
    'Test if we can play opus audio encrypted with Widevine encryption.';
testWidevineOpusAudio.prototype.start = function(runner, video) {
  var testEmeHandler = this.emeHandler;
  var audioStream = Media.Opus.SintelEncrypted;
  var videoStream = Media.VP9.VideoNormal;
  try {
    setupMse(video, runner, videoStream, audioStream);
    var licenseManager = new LicenseManager(video, audioStream,
                                            LicenseManager.WIDEVINE);
    testEmeHandler.init(video, licenseManager);
  } catch(err) {
    runner.fail(err);
  }
  video.addEventListener('timeupdate', function onTimeUpdate(e) {
    if (!video.paused && video.currentTime >= 15 &&
        !testEmeHandler.keyUnusable) {
      video.removeEventListener('timeupdate', onTimeUpdate);
      runner.checkGE(video.currentTime, 15, 'currentTime');
      runner.succeed();
    }
  });
  video.play();
};

/**
 * Ensure Widevine subsample or full-sample encrypted VP9 video could be played.
 */
var createWidevineVP9VideoTest = function(videoStream, desc) {
  var test = createEmeTest('WidevineVP9' + desc + 'Video', 'Widevine');
  test.prototype.title =
      'Test if we can play VP9 video with Widevine key system.';
  test.prototype.start = function(runner, video) {
    var testEmeHandler = this.emeHandler;
    var audioStream = Media.AAC.AudioNormal
    try {
      setupMse(video, runner, videoStream, audioStream);
      var licenseManager = new LicenseManager(video, videoStream,
                                              LicenseManager.WIDEVINE);
      testEmeHandler.init(video, licenseManager);
    } catch(err) {
      runner.fail(err);
    }
    video.addEventListener('timeupdate', function onTimeUpdate(e) {
      if (!video.paused && video.currentTime >= 15 &&
          !testEmeHandler.keyUnusable) {
        video.removeEventListener('timeupdate', onTimeUpdate);
        runner.checkGE(video.currentTime, 15, 'currentTime');
        runner.succeed();
      }
    });
    video.play();
  };
};


createWidevineVP9VideoTest(Media.VP9.VideoHighEnc, '');
createWidevineVP9VideoTest(Media.VP9.VideoHighSubSampleEnc, 'Subsample');

/**
 * Validate device supports key rotation with 16 MediaKeySesssion objects and
 * 16 keys per MediaKeySession object.
 */
var testWidevineH264MultiMediaKeySessions = createEmeTest(
    'WidevineH264MultiMediaKeySessions', 'Widevine');
testWidevineH264MultiMediaKeySessions.prototype.title =
    'Test creating 16 MediaKeySession objects each with 16 keys for playing ' +
    'encrypted with Widevine encryption.';
testWidevineH264MultiMediaKeySessions.prototype.start = function(
    runner, video) {
  var testEmeHandler = this.emeHandler;
  var videoStream = Media.H264.VideoMultiKeyCenc;
  var audioStream = Media.AAC.AudioNormal;
  var videoStreams = [];
  for (var i = 0; i < 16; i++) {
    videoStreams.push(videoStream);
  }
  try {
    setupMse(video, runner, videoStreams, audioStream);
    var licenseManager = new LicenseManager(
        video, videoStream, LicenseManager.WIDEVINE);
    testEmeHandler.init(video, licenseManager);
  } catch(err) {
    runner.fail(err);
  }
  video.addEventListener('timeupdate', function onTimeUpdate(e) {
    if (!video.paused && video.currentTime >= 15 &&
        !testEmeHandler.keyUnusable) {
      video.removeEventListener('timeupdate', onTimeUpdate);
      runner.checkGE(video.currentTime, 15, 'currentTime');
      runner.checkEq(testEmeHandler.keySessions.length, 16, 'keySessionCount');
      runner.checkEq(testEmeHandler.keyCount, 256, 'keyCount');
      runner.succeed();
    }
  });
  video.play();
};

/**
 * Ensure Widevine encrypted video could be played with no clear start and
 * a 5 seconds license delay.
 */
var createWidevineLicenseDelayTest = function(videoStream) {
  var test = createEmeTest(
      'WidevineLicenseDelay' + videoStream.codec  + 'Video', 'Widevine');
  test.prototype.title = 'Test if we can play video encrypted with Widevine ' +
      'encryption with no clear start and 5 seconds license delay.';
  test.prototype.start = function(runner, video) {
    var testEmeHandler = this.emeHandler;
    var audioStream = Media.AAC.AudioNormal;
    try {
      setupMse(video, runner, videoStream, audioStream);
      var licenseManager = new LicenseManager(video, videoStream,
                                              LicenseManager.WIDEVINE);
      testEmeHandler.init(video, licenseManager);
      testEmeHandler.licenseDelay = 5000;
    } catch(err) {
      runner.fail(err);
    }
    video.addEventListener('timeupdate', function onTimeUpdate(e) {
      if (!video.paused && video.currentTime >= 15 &&
          !testEmeHandler.keyUnusable) {
        video.removeEventListener('timeupdate', onTimeUpdate);
        runner.checkGE(video.currentTime, 15, 'currentTime');
        runner.succeed();
      }
    });
    video.play();
  };
};


createWidevineLicenseDelayTest(Media.H264.VideoStreamYTCenc);
createWidevineLicenseDelayTest(Media.VP9.VideoHighSubSampleEnc);

/**
 * Validate specified video format with different display resolution could be
 * played with Widevine key system.
 */
var createWidevineVideoTest = function(videoStream, desc) {
  var test = createEmeTest(
      'Widevine' + desc + 'Video', 'Widevine Video Formats');
  test.prototype.title = 'Test if we can play ' + desc  +
      ' video format with Widevine key system.';
  test.prototype.start = function(runner, video) {
    var testEmeHandler = this.emeHandler;
    var audioStream = Media.AAC.AudioNormal
    try {
      setupMse(video, runner, videoStream, audioStream);
      var licenseManager = new LicenseManager(video, videoStream,
                                              LicenseManager.WIDEVINE);
      testEmeHandler.init(video, licenseManager);
    } catch(err) {
      runner.fail(err);
    }
    video.addEventListener('timeupdate', function onTimeUpdate(e) {
      if (!video.paused && video.currentTime >= 15 &&
          !testEmeHandler.keyUnusable) {
        video.removeEventListener('timeupdate', onTimeUpdate);
        runner.checkGE(video.currentTime, 15, 'currentTime');
        runner.succeed();
      }
    });
    video.play();
  };
};

createWidevineVideoTest(Media.VP9.SintelLowEnc, 'VP9.Low');
createWidevineVideoTest(Media.VP9.SintelMedEnc, 'VP9.Med');
createWidevineVideoTest(Media.VP9.SintelHighEnc, 'VP9.High');
createWidevineVideoTest(Media.VP9.SintelHighMqEnc, 'VP9.HighMq');
createWidevineVideoTest(Media.VP9.SintelHighHqEnc, 'VP9.HighHq');
createWidevineVideoTest(Media.VP9.Sintel720pEnc, 'VP9.720p');
createWidevineVideoTest(Media.VP9.Sintel720pMqEnc, 'VP9.720pMq');
createWidevineVideoTest(Media.VP9.Sintel720pHqEnc, 'VP9.720pHq');
createWidevineVideoTest(Media.VP9.Sintel1080pEnc, 'VP9.1080p');
createWidevineVideoTest(Media.VP9.Sintel1080pMqEnc, 'VP9.1080pMq');
createWidevineVideoTest(Media.VP9.Sintel1080pHqEnc, 'VP9.1080pHq');
createWidevineVideoTest(Media.VP9.Sintel2kEnc, 'VP9.2k');
createWidevineVideoTest(Media.VP9.Sintel4kEnc, 'VP9.4k');
createWidevineVideoTest(Media.H264.SintelLowCenc, 'H264.Low');
createWidevineVideoTest(Media.H264.SintelMedCenc, 'H264.Med');
createWidevineVideoTest(Media.H264.SintelHighCenc, 'H264.High');
createWidevineVideoTest(Media.H264.SintelHighMqCenc, 'H264.HighMq');
createWidevineVideoTest(Media.H264.SintelHighHqCenc, 'H264.HighHq');
createWidevineVideoTest(Media.H264.Sintel720pCenc, 'H264.720p');
createWidevineVideoTest(Media.H264.Sintel720pMqCenc, 'H264.720pMq');
createWidevineVideoTest(Media.H264.Sintel720pHqCenc, 'H264.720pHq');
createWidevineVideoTest(Media.H264.Sintel1080pCenc, 'H264.1080p');
createWidevineVideoTest(Media.H264.Sintel1080pMqCenc, 'H264.1080pMq');
createWidevineVideoTest(Media.H264.Sintel1080pHqCenc, 'H264.1080pHq');


/**
 * Ensure PlayReady encrypted H264 video could be played.
 */
var testPlayReadyH264Video = createEmeTest('PlayReadyH264Video',
    'PlayReady (Optional)', false);
testPlayReadyH264Video.prototype.title =
    'Test if we can play video encrypted with PlayReady encryption.';
testPlayReadyH264Video.prototype.start = function(runner, video) {
  var testEmeHandler = this.emeHandler;
  var videoStream = Media.H264.VideoSmallCenc;
  var audioStream = Media.AAC.AudioNormal;
  try {
    setupMse(video, runner, videoStream, audioStream);
    var licenseManager = new LicenseManager(video, videoStream,
                                            LicenseManager.PLAYREADY);
    testEmeHandler.init(video, licenseManager);
  } catch(err) {
    runner.fail(err);
  }
  video.addEventListener('timeupdate', function onTimeUpdate(e) {
    if (!video.paused && video.currentTime >= 15 &&
        !testEmeHandler.keyUnusable) {
      video.removeEventListener('timeupdate', onTimeUpdate);
      runner.checkGE(video.currentTime, 15, 'currentTime');
      runner.succeed();
    }
  });
  video.play();
};

/**
 * Ensure PlayReady encrypted aac audio could be played.
 */
var testPlayReadyAacAudio = createEmeTest('PlayReadyAacAudio',
    'PlayReady (Optional)', false);
testPlayReadyAacAudio.prototype.title =
    'Test if we can play video encrypted with PlayReady encryption.';
testPlayReadyAacAudio.prototype.start = function(runner, video) {
  var testEmeHandler = this.emeHandler;
  var audioStream = Media.AAC.AudioSmallCenc;
  var videoStream = Media.H264.VideoNormal;
  try {
    setupMse(video, runner, videoStream, audioStream);
    var licenseManager = new LicenseManager(video, audioStream,
                                            LicenseManager.PLAYREADY);
    testEmeHandler.init(video, licenseManager);
  } catch(err) {
    runner.fail(err);
  }
  video.addEventListener('timeupdate', function onTimeUpdate(e) {
    if (!video.paused && video.currentTime >= 15 &&
        !testEmeHandler.keyUnusable) {
      video.removeEventListener('timeupdate', onTimeUpdate);
      runner.checkGE(video.currentTime, 15, 'currentTime');
      runner.succeed();
    }
  });
  video.play();
};

/**
 * Ensure isTypeSupported and requestMediaKeySystemAccess for specified mime
 * type.
 */
var createIsTypeSupportedTest = function(type, desc, mandatory = true) {
  var test = createEmeTest('isTypeSupported.' + desc, 'General', mandatory);
  var descWithType = desc + ' (' + type + ')';
  test.prototype.title = 'Test support for ' + descWithType;
  test.prototype.start = function(runner, video) {
    runner.assert(
        MediaSource.isTypeSupported(type),
        'isTypeSupported failed for ' + descWithType);
    runner.succeed();
  };
};

createIsTypeSupportedTest(Media.AAC.mimetype, 'AAC');
createIsTypeSupportedTest(Media.H264.mimetype, 'H264');
createIsTypeSupportedTest(Media.VP9.mimetype, 'VP9');

/**
 * Test encrypted event data contains all expected pssh atoms in the initData
 * and a null keySystem.
 */
var testEncryptedEventData = createEmeTest('EncryptedEventData', 'General');
testEncryptedEventData.prototype.title =
    'Test encrypted event data contains all expected pssh atoms in the ' +
    'initData and a null keySystem.';
testEncryptedEventData.prototype.start = function(runner, video) {
  var testEmeHandler = this.emeHandler;
  var videoStream = Media.H264.VideoSmallCenc;
  try {
    setupMse(video, runner, videoStream, null);
    testEmeHandler.addEventSpies({
      onEncrypted: function(e) {
        var initData = new Uint8Array(e.initData);
        runner.checkEq(initData.length, 856, 'Length of initData');
        runner.checkEq(countPsshAtoms(initData), 3, 'Number of pssh atoms');
        runner.succeed();
      }
    });
    var licenseManager = new LicenseManager(video, videoStream,
                                            LicenseManager.WIDEVINE);
    testEmeHandler.init(video, licenseManager);
  } catch(err) {
    runner.fail(err);
  }
  video.play();
};

/**
 * Validate AudioContext#createMediaElementSource succeeds and sends audio
 * data for specified mime type.
 */
var createWidevineCreateMESEMETest =
    function(videoStream, audioStream, encStream) {
  var test = createEmeTest(
      'Widevine' + encStream.codec +
          util.MakeCapitalName(encStream.mediatype) +
          'CreateMediaElementSource',
      'Web Audio API (Optional)',
      false);
  test.prototype.title = 'Test if AudioContext#createMediaElementSource ' +
      'succeeds and sends audio data for ' + encStream.codec;
  test.prototype.start = function(runner, video) {
    var testEmeHandler = this.emeHandler;
    try {
      setupMse(video, runner, videoStream, audioStream);
      var licenseManager =
          new LicenseManager(video, encStream, LicenseManager.WIDEVINE);
      testEmeHandler.init(video, licenseManager);
    } catch(err) {
      runner.fail(err);
    }
    var Ctor = window.AudioContext || window.webkitAudioContext;
    var ctx = new Ctor();

    video.addEventListener('timeupdate', function onTimeUpdate() {
      if (!video.paused && video.currentTime >= 5 &&
          !testEmeHandler.keyUnusable) {
        video.removeEventListener('timeupdate', onTimeUpdate);
        try {
          runner.log('Creating MES');
          var source = ctx.createMediaElementSource(video);
        } catch (e) {
          runner.fail(e);
        } finally {
          ctx.close();
        }
        runner.checkNE(source, null, 'MediaElementSource');
        runner.succeed();
      }
    });
    video.play();
  };
}

createWidevineCreateMESEMETest(
    Media.H264.VideoSmallCenc,
    Media.AAC.AudioNormal,
    Media.H264.VideoSmallCenc);
createWidevineCreateMESEMETest(
    Media.H264.VideoNormal,
    Media.AAC.AudioSmallCenc,
    Media.AAC.AudioSmallCenc);
createWidevineCreateMESEMETest(
    Media.VP9.VideoNormal,
    Media.Opus.SintelEncrypted,
    Media.Opus.SintelEncrypted);
createWidevineCreateMESEMETest(
    Media.VP9.VideoHighEnc,
    Media.AAC.AudioNormal,
    Media.VP9.VideoHighEnc);

return {tests: tests, info: info, fields: fields, viewType: 'default'};

};