<!doctype html>
<meta name=timeout content=long>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/utils.js"></script>
<script src="resources/protected-audience-helper-module.js"></script>

<body>
<script>
'use strict';

promise_test(async test => {
  const uuid = generateUuid();

  await runReportTest(
      test, uuid, {reportResult: `sendReportTo('${createWritingURL(uuid)}');`},
      /*expectedNumReports=*/ 1,
      /*overrides=*/ {
        runAdAuction: {
          auctionReportBuyerKeys: [100n],
          auctionReportBuyers: {interestGroupCount: {bucket: 0n, scale: 1}}
        }
      });
}, 'auctionReportBuyerDebugModeConfig missing');

promise_test(async test => {
  const uuid = generateUuid();

  await runReportTest(
      test, uuid, {reportResult: `sendReportTo('${createWritingURL(uuid)}');`},
      /*expectedNumReports=*/ 1,
      /*overrides=*/ {
        runAdAuction: {
          auctionReportBuyerKeys: [100n],
          auctionReportBuyers: {interestGroupCount: {bucket: 0n, scale: 1}},
          auctionReportBuyerDebugModeConfig: {enabled: true}
        }
      });
}, 'auctionReportBuyerDebugModeConfig with enabled true');

promise_test(async test => {
  const uuid = generateUuid();

  await runReportTest(
      test, uuid, {reportResult: `sendReportTo('${createWritingURL(uuid)}');`},
      /*expectedNumReports=*/ 1,
      /*overrides=*/ {
        runAdAuction: {
          auctionReportBuyerKeys: [100n],
          auctionReportBuyers: {interestGroupCount: {bucket: 0n, scale: 1}},
          auctionReportBuyerDebugModeConfig: {enabled: true, debugKey: 1234n}
        }
      });
}, 'auctionReportBuyerDebugModeConfig with enabled true and debug key');

promise_test(async test => {
  const uuid = generateUuid();

  await runReportTest(
      test, uuid, {reportResult: `sendReportTo('${createWritingURL(uuid)}');`},
      /*expectedNumReports=*/ 1,
      /*overrides=*/ {
        runAdAuction: {
          auctionReportBuyerKeys: [100n],
          auctionReportBuyers: {interestGroupCount: {bucket: 0n, scale: 1}},
          auctionReportBuyerDebugModeConfig: {enabled: false}
        }
      });
}, 'auctionReportBuyerDebugModeConfig with enabled false');


promise_test(async test => {
  const uuid = generateUuid();

  await runReportTest(
      test, uuid, {reportResult: `sendReportTo('${createWritingURL(uuid)}');`},
      /*expectedNumReports=*/ 1,
      /*overrides=*/ {
        runAdAuction: {
          auctionReportBuyerKeys: [100n],
          auctionReportBuyers: {interestGroupCount: {bucket: 0n, scale: 1}},
          auctionReportBuyerDebugModeConfig: {}
        }
      });
}, 'auctionReportBuyerDebugModeConfig empty');

promise_test(async test => {
  const uuid = generateUuid();

  await promise_rejects_js(
      test, TypeError,
      runReportTest(
          test, uuid, {},
          /*expectedNumReports=*/ 0,
          /*overrides=*/ {
            runAdAuction: {
              auctionReportBuyerKeys: [100n],
              auctionReportBuyers: {interestGroupCount: {bucket: 0n, scale: 1}},
              auctionReportBuyerDebugModeConfig: {enabled: true, debugKey: -1n}
            }
          }));
}, 'auctionReportBuyerDebugModeConfig with negative debug key');

promise_test(async test => {
  const uuid = generateUuid();

  await promise_rejects_js(
      test, TypeError,
      runReportTest(
          test, uuid, {},
          /*expectedNumReports=*/ 0,
          /*overrides=*/ {
            runAdAuction: {
              auctionReportBuyerKeys: [100n],
              auctionReportBuyers: {interestGroupCount: {bucket: 0n, scale: 1}},
              auctionReportBuyerDebugModeConfig:
                  {enabled: true, debugKey: 1n << 64n}
            }
          }));
}, 'auctionReportBuyerDebugModeConfig with too large debug key');

promise_test(async test => {
  const uuid = generateUuid();

  await promise_rejects_js(
      test, TypeError,
      runReportTest(
          test, uuid, {},
          /*expectedNumReports=*/ 0,
          /*overrides=*/ {
            runAdAuction: {
              auctionReportBuyerKeys: [100n],
              auctionReportBuyers: {interestGroupCount: {bucket: 0n, scale: 1}},
              auctionReportBuyerDebugModeConfig:
                  {enabled: false, debugKey: 1234n}
            }
          }));
}, 'auctionReportBuyerDebugModeConfig with debug key and enabled false');

promise_test(async test => {
  const uuid = generateUuid();

  await promise_rejects_js(
      test, TypeError,
      runReportTest(
          test, uuid, {},
          /*expectedNumReports=*/ 0,
          /*overrides=*/ {
            runAdAuction: {
              auctionReportBuyerKeys: [100n],
              auctionReportBuyers: {interestGroupCount: {bucket: 0n, scale: 1}},
              auctionReportBuyerDebugModeConfig: 123
            }
          }));
}, 'auctionReportBuyerDebugModeConfig not a dictionary');

</script>
</body>
