var ProgressiveTest = function()

in 2020/media/progressiveTest.js [24:523]


var ProgressiveTest = function() {

var tests = [];
var info = 'Default Timeout: ' + TestBase.timeout + 'ms';

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

var createProgressiveTest = function(testId, category, name, mandatory = true) {
  var t = createTest(name, category, mandatory, testId, 'Progressive Tests');
  t.prototype.index = tests.length;
  tests.push(t);
  return t;
};

/**
 * Test the inital state of a video element.
 */
var createInitialMediaStateTest = function(testId, state, value, check) {
  var test = createProgressiveTest(testId, 'state before initial', state);

  check = typeof(check) === 'undefined' ? 'checkEq' : check;
  test.prototype.title = 'Test if the state ' + state +
      ' is correct when media element is just created';
  test.prototype.start = function(runner, video) {
    test.prototype.status = util.formatStatus(util.getAttr(video, state));
    runner[check](util.getAttr(video, state), value, state);
    runner.succeed();
  };
};

createInitialMediaStateTest('6.1.1.1', 'src', '');  // can actually be undefined
createInitialMediaStateTest('6.1.2.1', 'currentSrc', '');
createInitialMediaStateTest('6.1.3.1', 'defaultPlaybackRate', 1);
createInitialMediaStateTest('6.1.4.1', 'playbackRate', 1);
createInitialMediaStateTest('6.1.5.1', 'duration', NaN);
createInitialMediaStateTest('6.1.6.1', 'paused', true);
createInitialMediaStateTest('6.1.7.1', 'seeking', false);
createInitialMediaStateTest('6.1.8.1', 'ended', false);
createInitialMediaStateTest('6.1.9.1', 'videoWidth', 0);
createInitialMediaStateTest('6.1.10.1', 'videoHeight', 0);
createInitialMediaStateTest('6.1.11.1', 'buffered.length', 0);
createInitialMediaStateTest('6.1.12.1', 'played.length', 0);
createInitialMediaStateTest('6.1.13.1', 'seekable.length', 0);
createInitialMediaStateTest(
    '6.1.14.1', 'networkState', HTMLMediaElement.NETWORK_EMPTY);
createInitialMediaStateTest(
    '6.1.15.1', 'readyState', HTMLMediaElement.HAVE_NOTHING);

/**
 * Test the state when a src has been assigned to the video element.
 */
var createMediaStateAfterSrcAssignedTest = function(testId, state, value, check) {
  var test = createProgressiveTest(testId, 'state after src assigned', state);

  check = typeof(check) === 'undefined' ? 'checkEq' : check;
  test.prototype.title = 'Test if the state ' + state +
      ' is correct when media element is a src has been assigned';
  test.prototype.start = function(runner, video) {
    video.src = Media.H264.ProgressiveLow.src;
    test.prototype.status = util.formatStatus(util.getAttr(video, state));
    runner[check](util.getAttr(video, state), value, state);
    runner.succeed();
  };
};

createMediaStateAfterSrcAssignedTest(
    '6.2.1.1', 'networkState', HTMLMediaElement.NETWORK_NO_SOURCE);
createMediaStateAfterSrcAssignedTest(
    '6.2.2.1', 'readyState', HTMLMediaElement.HAVE_NOTHING);
createMediaStateAfterSrcAssignedTest('6.2.3.1', 'src', '', 'checkNE');

/**
 * Test the state of video element when loadstart event is fired.
 */
var createMediaStateInLoadStart = function(testId, state, value, check) {
  var test = createProgressiveTest(testId, 'state in loadstart', state);

  check = typeof(check) === 'undefined' ? 'checkEq' : check;
  test.prototype.title = 'Test if the state ' + state +
      ' is correct when media element is in loadstart';
  test.prototype.start = function(runner, video) {
    video.addEventListener('loadstart', function() {
      test.prototype.status = util.formatStatus(util.getAttr(video, state));
      runner[check](util.getAttr(video, state), value, state);
      runner.succeed();
    });
    video.src = Media.H264.ProgressiveLow.src;
  };
};

createMediaStateInLoadStart('6.3.1.1', 'networkState', HTMLMediaElement.NETWORK_LOADING);
createMediaStateInLoadStart('6.3.2.1', 'readyState', HTMLMediaElement.HAVE_NOTHING);
createMediaStateInLoadStart('6.3.3.1', 'currentSrc', '', 'checkNE');

/**
 * Test if there is progress event.
 */
var createProgressTest = function(testId) {
  var test = createProgressiveTest(testId, 'event', 'onprogress');

  test.prototype.title = 'Test if there is progress event.';
  test.prototype.start = function(runner, video) {
    var self = this;
    video.src = Media.H264.ProgressiveLow.src + '?' + Date.now();
    video.addEventListener('progress', function() {
      self.log('onprogress called');
      runner.succeed();
    });
  };
};

createProgressTest('6.4.1.1');

/**
 * Test timeupdate event of video element.
 */
var createTimeUpdateTest = function(testId) {
  var test = createProgressiveTest(testId, 'event', 'ontimeupdate');

  test.prototype.title = 'Test if there is timeupdate event.';
  test.prototype.start = function(runner, video) {
    var self = this;
    video.src = Media.H264.ProgressiveLow.src;
    video.addEventListener('timeupdate', function() {
      self.log('ontimeupdate called');
      runner.succeed();
    });
    video.play();
  };
};

createTimeUpdateTest('6.4.2.1');

/**
 * Test canplay event in video element.
 */
var createCanPlayTest = function(testId) {
  var test = createProgressiveTest(testId, 'event', 'canplay');

  test.prototype.title = 'Test if there is canplay event.';
  test.prototype.start = function(runner, video) {
    var self = this;
    video.src = Media.H264.ProgressiveLow.src;
    video.addEventListener('canplay', function() {
      self.log('canplay called');
      runner.succeed();
    });
  };
};

createCanPlayTest('6.4.3.1');

/**
 * Test the autoplay attribute in video element.
 */
var createAutoPlayTest = function(testId) {
  var test = createProgressiveTest(testId, 'control', 'autoplay');

  test.prototype.title = 'Test if autoplay works';
  test.prototype.start = function(runner, video) {
    var self = this;
    video.autoplay = true;
    video.src = Media.H264.ProgressiveLow.src;
    video.addEventListener('timeupdate', function() {
      self.log('ontimeupdate called');
      runner.succeed();
    });
  };
};

createAutoPlayTest('6.5.1.1');

/**
 * Test the network states of video element.
 */
var createNetworkStateTest = function(testId) {
  var test = createProgressiveTest(testId, 'state', 'networkState');

  test.prototype.title = 'Test if the network state is correct';
  test.prototype.start = function(runner, video) {
    var self = this;
    runner.checkEq(video.networkState, HTMLMediaElement.NETWORK_EMPTY,
                   'networkState');
    video.addEventListener('suspend', function() {
      self.log('onsuspend called');
      var networkState = video.networkState;
      if (networkState == HTMLMediaElement.NETWORK_LOADING) {
        // Skip NETWORK_LOADING state wait until next suspend event to find
        // NETWORK_IDLE state.
        return;
      }
      runner.checkEq(networkState, HTMLMediaElement.NETWORK_IDLE,
                     'networkState');
      runner.succeed();
    });
    video.src = Media.H264.ProgressiveLow.src;
  };
};

createNetworkStateTest('6.6.1.1');

/**
 * Test video without valid source data. The video should pause.
 */
var createPlayingWithoutDataPaused = function(testId) {
  var test = createProgressiveTest(testId, 'play without data', 'paused');

  test.prototype.title = 'Test if we can play without any data';
  test.prototype.start = function(runner, video) {
    video.src = 'hang.py';
    video.play();
    test.prototype.status = util.formatStatus(video.paused);
    runner.checkEq(video.paused, false, 'video.paused');
    runner.succeed();
  };
};

createPlayingWithoutDataPaused('6.7.1.1');

/**
 * Test playing a video without valid source data. Waiting event should occur.
 */
var createPlayingWithoutDataWaiting = function(testId) {
  var test = createProgressiveTest(testId, 'play without data', 'onwaiting');

  test.prototype.title = 'Test if we can play without any data';
  test.prototype.start = function(runner, video) {
    video.addEventListener('waiting', function() {
      runner.checkEq(video.currentTime, 0, 'video.currentTime');
      runner.succeed();
    });
    video.src = 'hang.py';
    video.play();
  };
};

createPlayingWithoutDataWaiting('6.7.2.1');

/**
 * Test the maximum timupdate event granularity for different playbackRate.
 * It should be smaller than 0.26.
 */
var createTimeUpdateMaxGranularity = function(testId, playbackRate) {
  var test =
      createProgressiveTest(testId, 'timeupdate', 'maxGranularityPlaybackRate' +
      parseFloat(playbackRate).toFixed(2));

  test.prototype.title = 'Test the time update granularity.';
  test.prototype.start = function(runner, video) {
    var warmUpCount = 15;
    var maxGranularity = 0;
    var times = 0;
    var last = 0;
    video.addEventListener('loadstart', function() {
      video.playbackRate = playbackRate;
      video.play();
      video.addEventListener('timeupdate', function() {
        if (times >= warmUpCount) {
          var interval = Date.now() - last;
          if (interval > maxGranularity)
            maxGranularity = interval;
        }
        if (times === 50 + warmUpCount) {
          maxGranularity = maxGranularity / 1000.0;
          runner.checkLE(maxGranularity, 0.26, 'maxGranularity');
          runner.succeed();
        }
        last = Date.now();
        ++times;
      });
    });
    video.src = Media.H264.ProgressiveLow.src;
  };
};

createTimeUpdateMaxGranularity('6.8.1.1', 0.25);
createTimeUpdateMaxGranularity('6.8.2.1', 0.50);
createTimeUpdateMaxGranularity('6.8.3.1', 1.00);
createTimeUpdateMaxGranularity('6.8.4.1', 1.25);
createTimeUpdateMaxGranularity('6.8.5.1', 1.50);
createTimeUpdateMaxGranularity('6.8.6.1', 2.0);

/**
 * Test the minimum timupdate event granularity for different playbackRate.
 * It should be larger than 0.015.
 */
var createTimeUpdateMinGranularity = function(testId, playbackRate) {
  var test =
      createProgressiveTest(testId, 'timeupdate', 'minGranularityPlaybackRate' +
      parseFloat(playbackRate).toFixed(2));

  test.prototype.title = 'Test the time update granularity.';
  test.prototype.start = function(runner, video) {
    var warmUpCount = 15;
    var minGranularity = Infinity;
    var times = 0;
    var last = 0;
    video.addEventListener('loadstart', function() {
      video.playbackRate = playbackRate;
      video.play();
      video.addEventListener('timeupdate', function() {
        if (times >= warmUpCount) {
          var interval = Date.now() - last;
          if (interval > 1 && interval < minGranularity)
            minGranularity = interval;
        }
        if (times === 50 + warmUpCount) {
          minGranularity = minGranularity / 1000.0;
          runner.checkGE(minGranularity, 0.015, 'minGranularity');
          runner.succeed();
        }
        last = Date.now();
        ++times;
      });
    });
    video.src = Media.H264.ProgressiveLow.src;
  };
};

createTimeUpdateMinGranularity('6.8.7.1', 0.25);
createTimeUpdateMinGranularity('6.8.8.1', 0.50);
createTimeUpdateMinGranularity('6.8.9.1', 1.00);
createTimeUpdateMinGranularity('6.8.10.1', 1.25);
createTimeUpdateMinGranularity('6.8.11.1', 1.50);
createTimeUpdateMinGranularity('6.8.12.1', 2.0);

/**
 * Test the timeupdate accuracy by video.currentTime.
 */
var createTimeUpdateAccuracy = function(testId) {
  var test = createProgressiveTest(testId, 'timeupdate', 'accuracy');

  test.prototype.title = 'Test the time update granularity.';
  test.prototype.start = function(runner, video) {
    var maxTimeDiff = 0;
    var baseTimeDiff = 0;
    var times = 0;
    video.addEventListener('canplaythrough', function() {
      video.play();
      video.addEventListener('timeupdate', function() {
        if (times === 0) {
          baseTimeDiff = util.ElapsedTimeInS() - video.currentTime;
        } else {
          var timeDiff = util.ElapsedTimeInS() - video.currentTime;
          maxTimeDiff = Math.max(
              Math.abs(timeDiff - baseTimeDiff), maxTimeDiff);
        }
        if (times > 500 || video.currentTime > 10) {
          test.prototype.status = util.Round(maxTimeDiff, 2);
          runner.checkLE(maxTimeDiff, 0.25, 'maxTimeDiff');
          runner.succeed();
        }
        ++times;
      });
    });
    video.src = Media.H264.ProgressiveLow.src;
  };
};

createTimeUpdateAccuracy('6.8.13.1');

/**
 * Test if time updates progress when video is playing.
 */
var createTimeUpdateProgressing = function(testId) {
  var test = createProgressiveTest(testId, 'timeupdate', 'progressing');

  test.prototype.title = 'Test if the time updates progress.';
  test.prototype.start = function(runner, video) {
    var last = 0;
    var times = 0;
    video.addEventListener('timeupdate', function() {
      if (times === 0) {
        last = video.currentTime;
      } else {
        runner.checkGE(video.currentTime, last, 'video.currentTime');
        last = video.currentTime;
      }
      if (video.currentTime > 10) {
        test.prototype.status = util.Round(video.currentTime, 2);
        runner.succeed();
      }
      ++times;
    });
    video.src = Media.H264.ProgressiveLow.src;
    video.play();
  };
};

createTimeUpdateProgressing('6.8.14.1');

/**
 * Test if time updates progress when video is playing with initial seek.
 */
var createTimeUpdateProgressingWithInitialSeek = function(testId) {
  var test =
      createProgressiveTest(testId, 'timeupdate', 'progressing after seek');

  test.prototype.title = 'Test if the time updates progress.';
  test.prototype.start = function(runner, video) {
    var last = 0;
    var times = 0;
    video.addEventListener('canplay', function() {
      if (times == 0) {
        video.currentTime = 0.001;
        video.play();
        video.addEventListener('timeupdate', function() {
          if (times === 0) {
            last = video.currentTime;
          } else {
            runner.checkGE(video.currentTime, last, 'video.currentTime');
            last = video.currentTime;
          }
          if (video.currentTime > 10) {
            test.prototype.status = util.Round(video.currentTime, 2);
            runner.succeed();
          }
          ++times;
        });
      }
    });
    video.src = Media.H264.ProgressiveLow.src;
  };
};

createTimeUpdateProgressingWithInitialSeek('6.8.15.1');

/**
 * Test if time updates progress when video is playing with duration check.
 */
var createTimeUpdateProgressingWithDurationCheck = function(testId) {
  var test =
      createProgressiveTest(testId, 'timeupdate', 'duration on timeupdate');

  test.prototype.title = 'Test if the duration is non-negative when time ' +
      'updates.';
  test.prototype.start = function(runner, video) {
    video.addEventListener('timeupdate', function() {
      runner.checkGE(video.duration, 0, 'video.duration');
      if (video.currentTime > 1) {
        runner.succeed();
      }
    });
    video.src = Media.H264.ProgressiveLow.src;
    video.play();
  };
};

createTimeUpdateProgressingWithDurationCheck('6.8.16.1');

/**
 * Test if video plays at expected playback rate.
 */
var createPlaybackRateTest = function(testId, playbackRate) {
  var test = createProgressiveTest(testId, 'playbackRate', 'PlaybackRate' +
      parseFloat(playbackRate).toFixed(2));
  test.prototype.title = 'Test playbackRate plays back at the expected rate.';
  test.prototype.start = function(runner, video) {
    video.addEventListener('loadstart', function() {
      video.playbackRate = playbackRate;
      video.play();
      var warmUpCount = 15;
      var times = 0;
      var realTimeLast;
      var playTimeLast;
      video.addEventListener('timeupdate', function() {
        if (times <= warmUpCount) {
          realTimeLast = Date.now();
          playTimeLast = video.currentTime;
        } else {
          var realTimeNext = Date.now();
          var playTimeNext = video.currentTime;
          var realTimeDelta = (realTimeNext - realTimeLast) / 1000.0;
          var playTimeDelta = playTimeNext - playTimeLast;
          runner.checkApproxEq(playTimeDelta, realTimeDelta * playbackRate,
              'playback time delta', 0.25);
          realTimeLast = realTimeNext;
          playTimeLast = playTimeNext;
        }
        if (times === 50 + warmUpCount) {
          runner.succeed();
        }
        times++;
      });
    });
    video.src = Media.H264.ProgressiveLow.src;
  };
};

createPlaybackRateTest('6.9.1.1', 0.25);
createPlaybackRateTest('6.9.2.1', 0.50);
createPlaybackRateTest('6.9.3.1', 1.00);
createPlaybackRateTest('6.9.4.1', 1.25);
createPlaybackRateTest('6.9.5.1', 1.50);
createPlaybackRateTest('6.9.6.1', 2.0);


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

};