<!DOCTYPE html>
<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
<meta charset="utf-8">
<meta name="timeout" content="long">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="mediasource-util.js"></script>
<script>
    var subType = MediaSourceUtil.getSubType(MediaSourceUtil.AUDIO_ONLY_TYPE);
    var manifestFilenameAudio = subType + "/test-a-128k-44100Hz-1ch-manifest.json";

    // Fill up a given SourceBuffer by appending data repeatedly via doAppendDataFunc until
    // an exception is thrown. The thrown exception is passed to onCaughtExceptionCallback.
    function fillUpSourceBuffer(test, sourceBuffer, doAppendDataFunc, onCaughtExceptionCallback) {
        // We are appending data repeatedly in sequence mode, there should be no gaps.
        assert_false(sourceBuffer.buffered.length > 1, "unexpected gap in buffered ranges.");
        try {
            doAppendDataFunc();
        } catch(ex) {
            onCaughtExceptionCallback(ex);
        }
        test.expectEvent(sourceBuffer, 'updateend', 'append ended.');
        test.waitForExpectedEvents(function() { fillUpSourceBuffer(test, sourceBuffer, doAppendDataFunc, onCaughtExceptionCallback); });
    }

    mediasource_test(function(test, mediaElement, mediaSource)
    {
        mediaElement.addEventListener("error", test.unreached_func("Unexpected event 'error'"));
        MediaSourceUtil.fetchManifestAndData(test, manifestFilenameAudio, function(typeAudio, dataAudio)
        {
            var sourceBuffer = mediaSource.addSourceBuffer(typeAudio);
            sourceBuffer.mode = 'sequence';
            fillUpSourceBuffer(test, sourceBuffer,
                function () { // doAppendDataFunc
                    sourceBuffer.appendBuffer(dataAudio);
                },
                function (ex) { // onCaughtExceptionCallback
                    assert_equals(ex.name, 'QuotaExceededError');
                    test.done();
                });
        });
    }, 'Appending data repeatedly should fill up the buffer and throw a QuotaExceededError when buffer is full.');
</script>
