<!DOCTYPE html>

<head>
  <title>JavaScript Profiler Test</title>
  <script async src="black_box_js_test_utils.js"></script>
  <script>

    const testPrimeProfiler = async () => {
      const profiler = new Profiler({ sampleInterval: 10 /**ms**/, maxBufferSize: 10 /**number of samples*/ });

      // sleep 10 seconds
      await new Promise(resolve => setTimeout(resolve, 10000 /**ms**/));

      // stop & check
      const trace = await profiler.stop();
      assertTrue(trace.samples.length > 0, "expected some stack traces");
    };

    const testSampleBufferFullProfiler = async () => {
      const promise = new Promise((resolve, reject) => {
        const profiler = new Profiler({ maxBufferSize: 1, sampleInterval: 10 });
        profiler.addEventListener("samplebufferfull", () => {
          profiler.stop().then(() => { resolve(true); });
        });
      });
      const timeoutPromise = new Promise((resolve) => {
        setTimeout(() => {
          resolve(false);
        }, 60000);
      });

      const result = await Promise.race([timeoutPromise, promise]);
      assertTrue(result, "expected sample buffer to be full");
    };

    /**
      * Creates a new Profiler and then deletes it before the sample buffer is full.
      * Expects the SampleBuffer to be full and the callback to be executed.
    */
    const testAbruptGarbageCollection = async () => {
      const profilerPromise = new Promise((resolve) => {
        window.profiler = new Profiler({ maxBufferSize: 100, sampleInterval: 10 });
        delete window.profiler; // simulates the effects of GC.
        resolve(true);
      });

      const survivePromise = new Promise((resolve) => {
        setTimeout(() => {
          resolve(true);
        }, 10000);
      });

      // must survive for 10 seconds
      const result = await Promise.all([survivePromise, profilerPromise]);
      assertTrue(result.every(p => p), "expected cobalt to survive 10 sec if GC collects profiler");
    };

    window.addEventListener("load", async () => {
      setupFinished();
      // Test Case 1: Prime Profiler
      if (window.location.search.includes("mode=testPrimeProfiler")) {
        console.log("testPrimeProfiler");
        await testPrimeProfiler();
      }
      // Test Case 2: SampleBufferFull Profiler
      else if (window.location.search.includes("mode=testSampleBufferFullProfiler")) {
        console.log("testSampleBufferFullProfiler");
        await testSampleBufferFullProfiler();
      }
      // Test Case 3: GC Profiler
      else if (window.location.search.includes("mode=testAbruptGarbageCollection")) {
        console.log("testAbruptGarbageCollection");
        await testAbruptGarbageCollection();
      }
      else {
        console.log("Running all tests");
        await testPrimeProfiler();
        await testSampleBufferFullProfiler();
        await testAbruptGarbageCollection();
      }
      console.log("DONE");
      onEndTest();
    });
  </script>
</head>

<body>
</body>
