<!DOCTYPE html>
<title>Test setting auction config's resolveToConfig to a promise</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/utils.js"></script>
<script src="/common/dispatcher/dispatcher.js"></script>
<script src="resources/utils.js"></script>
<script src="/common/get-host-info.sub.js"></script>
<script src="resources/default-enabled-features-helper.js"></script>

<body>
<script>
// To simulate the time it takes for a promise to resolve, we use a simple
// timeout that eventually resolves to a boolean.
function delayValue(value, timeout) {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve(value);
    }, timeout);
  });
}

promise_test(async(t) => {
  const key = token();

  const urn = await generateURNFromFledge("resources/embeddee.html", [key],
      [], delayValue(true, 500));
  assert_true(urn instanceof FencedFrameConfig);
  const fencedframe = attachFencedFrame(urn);

  const page1_resp = await nextValueFromServer(key);
  assert_equals(page1_resp, "PASS",
      "The page should have loaded.");
}, 'resolveToConfig set to a promise that resolves to true');

promise_test(async(t) => {
  const key = token();

  const urn = await generateURNFromFledge("resources/embeddee.html", [key],
      [], delayValue(false, 500));
  assert_false(urn instanceof FencedFrameConfig);
  const fencedframe = attachFencedFrame(urn);

  const page1_resp = await nextValueFromServer(key);
  assert_equals(page1_resp, "PASS",
      "The page should have loaded.");
}, 'resolveToConfig set to a promise that resolves to false');

promise_test(async(t) => {
  // This tests the case where the resolveToConfig promise resolves before
  // the auction finishes
  const key = token();

  const urn = await generateURNFromFledge("resources/embeddee.html", [key],
      [], delayValue(true, 0));
  assert_true(urn instanceof FencedFrameConfig);
  const fencedframe = attachFencedFrame(urn);

  const page1_resp = await nextValueFromServer(key);
  assert_equals(page1_resp, "PASS",
      "The page should have loaded.");
}, 'resolveToConfig set to a promise that immediately resolves');

promise_test(async(t) => {
  const key = token();

  const urn = await generateURNFromFledge("resources/embeddee.html", [key],
      [], delayValue("non-boolean", 0));
  assert_true(urn instanceof FencedFrameConfig);
  const fencedframe = attachFencedFrame(urn);

  const page1_resp = await nextValueFromServer(key);
  assert_equals(page1_resp, "PASS",
      "The page should have loaded.");
}, 'resolveToConfig set to a promise that resolves to an non-boolean value');

</script>
</body>
</html>
