<!DOCTYPE html>
<html>
  <head>
    <title>
      Test AudioContext.close() closes many contexts
    </title>
    <script src="../../imported/w3c/web-platform-tests/resources/testharness.js"></script>
    <script src="../../resources/testharnessreport.js"></script>
    <script src="../resources/audit-util.js"></script>
    <script src="../resources/audit.js"></script>
  </head>
  <body>
    <script id="layout-test-code">
      let audit = Audit.createTaskRunner();

      let context = null;

      // The number of contexts we want to create and close.
      let MAX_ITERATION = 100;
      let counter = 0;

      function createContextAndClose(task, should) {
        // Bypass the first iteration.
        if (context) {
          should(context.state, 'context.state for closed context ' + counter)
              .beEqualTo('closed');
          context = null;
        }
        // Create new context and close.
        context = new AudioContext();
        if (counter++ < MAX_ITERATION) {
          // Recursive promise resolution.
          context.close().then(
              function() {
                createContextAndClose(task, should);
              },
              function() {
                onFailure(should);
                task.done();
              });
        } else {
          context.close().then(function() {
            // |counter| is one more than MAX_ITERATION if we
            // succeeded.
            should(
                counter - 1,
                'Number of contexts successfully created and closed')
                .beEqualTo(MAX_ITERATION);
            task.done();
          });
        }
      }

      function onFailure(should) {
        should(context.state, 'Context ' + counter + 'failed to close')
            .beEqualTo('closed');
      }

      audit.define(
          {
            label: 'test',
            description:
                'Test that closing a context releases the audio HW context'
          },
          function(task, should) {
            createContextAndClose(task, should);
          });

      audit.run();
    </script>
  </body>
</html>
