<!DOCTYPE html>
<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
<html>
    <head>
        <title>HTMLVideoElement.getVideoPlaybackQuality() test cases.</title>
        <script src="/resources/testharness.js"></script>
        <script src="/resources/testharnessreport.js"></script>
        <script src="mediasource-util.js"></script>
    </head>
    <body>
        <div id="log"></div>
        <script>
          mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
          {
              var previousQuality = mediaElement.getVideoPlaybackQuality();
              var timeUpdateCount = 0;
              mediaElement.addEventListener("timeupdate", test.step_func(function (e)
              {
                  var videoElement = e.target;
                  var newQuality = videoElement.getVideoPlaybackQuality();
                  var now = window.performance.now();

                  assert_not_equals(previousQuality, newQuality,
                    "New quality object is different from the previous one");
                  assert_greater_than(newQuality.creationTime, previousQuality.creationTime,
                    "creationTime increases monotonically");
                  assert_approx_equals(newQuality.creationTime, now, 100,
                    "creationTime roughly equals current time");

                  assert_greater_than_equal(newQuality.totalVideoFrames, 0, "totalVideoFrames >= 0");
                  assert_greater_than_equal(newQuality.totalVideoFrames, previousQuality.totalVideoFrames,
                    "totalVideoFrames increases monotonically");
                  assert_less_than(newQuality.totalVideoFrames, 300,
                    "totalVideoFrames should remain low as duration is less than 10s and framerate less than 30fps");

                  assert_greater_than_equal(newQuality.droppedVideoFrames, 0, "droppedVideoFrames >= 0");
                  assert_greater_than_equal(newQuality.droppedVideoFrames, previousQuality.droppedVideoFrames,
                    "droppedVideoFrames increases monotonically");
                  assert_less_than_equal(newQuality.droppedVideoFrames, newQuality.totalVideoFrames,
                    "droppedVideoFrames is only a portion of totalVideoFrames");

                  assert_greater_than_equal(newQuality.corruptedVideoFrames, 0, "corruptedVideoFrames >= 0");
                  assert_greater_than_equal(newQuality.corruptedVideoFrames, previousQuality.corruptedVideoFrames,
                    "corruptedVideoFrames increases monotonically");
                  assert_less_than_equal(newQuality.corruptedVideoFrames, newQuality.totalVideoFrames,
                    "corruptedVideoFrames is only a portion of totalVideoFrames");

                  previousQuality = newQuality;
                  timeUpdateCount++;
              }));

              mediaElement.addEventListener('error', test.unreached_func("Unexpected event 'error'"));

              sourceBuffer.appendBuffer(mediaData);
              test.expectEvent(sourceBuffer, 'updateend', 'sourceBuffer');

              test.waitForExpectedEvents(function()
              {
                  assert_false(sourceBuffer.updating, "updating");
                  mediaSource.endOfStream();
                  assert_less_than(mediaSource.duration, 10, "duration");
                  mediaElement.play();
                  test.expectEvent(mediaElement, 'ended', 'mediaElement');
              });

              test.waitForExpectedEvents(function()
              {
                  assert_greater_than(timeUpdateCount, 2, "timeUpdateCount");
                  test.done();
              });
          }, "Test HTMLVideoElement.getVideoPlaybackQuality() with MediaSource API");


          mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
          {
              var previousQuality = mediaElement.getVideoPlaybackQuality();
              var timeUpdateCount = 0;
              var startTime = 0;
              mediaElement.addEventListener("timeupdate", test.step_func(function (e)
              {
                  var videoElement = e.target;
                  var newQuality = videoElement.getVideoPlaybackQuality();
                  var now = window.performance.now();

                  assert_greater_than_equal(newQuality.totalFrameDelay, 0, "totalFrameDelay >= 0");
                  assert_greater_than_equal(newQuality.totalFrameDelay, previousQuality.totalFrameDelay,
                    "totalFrameDelay increases monotonically");
                  assert_less_than(newQuality.totalFrameDelay, (now - startTime) / 1000,
                    "totalFrameDelay does not exceed the time elapsed since playback started");

                  previousQuality = newQuality;
                  timeUpdateCount++;
              }));

              mediaElement.addEventListener('error', test.unreached_func("Unexpected event 'error'"));

              sourceBuffer.appendBuffer(mediaData);
              test.expectEvent(sourceBuffer, 'updateend', 'sourceBuffer');
              test.waitForExpectedEvents(function()
              {
                  assert_false(sourceBuffer.updating, "updating");
                  mediaSource.endOfStream();
                  assert_less_than(mediaSource.duration, 10, "duration");
                  startTime = window.performance.now();
                  mediaElement.play();
                  test.expectEvent(mediaElement, 'ended', 'mediaElement');
              });

              test.waitForExpectedEvents(function()
              {
                  assert_greater_than(timeUpdateCount, 2, "timeUpdateCount");
                  test.done();
              });
          }, "Test the totalFrameDelay attribute of HTMLVideoElement.getVideoPlaybackQuality() with MediaSource API");
        </script>
    </body>
</html>
