summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/fledge/tentative/trusted-bidding-signals.https.window.js
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/fledge/tentative/trusted-bidding-signals.https.window.js')
-rw-r--r--testing/web-platform/tests/fledge/tentative/trusted-bidding-signals.https.window.js787
1 files changed, 787 insertions, 0 deletions
diff --git a/testing/web-platform/tests/fledge/tentative/trusted-bidding-signals.https.window.js b/testing/web-platform/tests/fledge/tentative/trusted-bidding-signals.https.window.js
new file mode 100644
index 0000000000..9799af6ac1
--- /dev/null
+++ b/testing/web-platform/tests/fledge/tentative/trusted-bidding-signals.https.window.js
@@ -0,0 +1,787 @@
+// META: script=/resources/testdriver.js
+// META: script=/common/utils.js
+// META: script=/common/subset-tests.js
+// META: script=resources/fledge-util.sub.js
+// META: timeout=long
+// META: variant=?1-5
+// META: variant=?6-10
+// META: variant=?11-15
+// META: variant=?16-20
+// META: variant=?21-25
+// META: variant=?26-30
+// META: variant=?31-35
+// META: variant=?36-40
+// META: variant=?41-45
+// META: variant=?46-50
+// META: variant=?51-55
+// META: variant=?56-60
+// META: variant=?61-65
+// META: variant=?66-last
+
+"use strict";
+
+// These tests focus on trustedBiddingSignals: Requesting them, handling network
+// errors, handling the keys portion of the response, and passing keys to
+// worklet scripts, and handling the Data-Version header
+//
+// Because of request batching, left over interest groups from
+// other tests may result in tests that request TRUSTED_BIDDING_SIGNALS_URL
+// with certain special keys failing, if interest groups with names other than
+// the default one are not successfully left after previously run tests.
+
+// Helper for trusted bidding signals test. Runs an auction, and fails the
+// test if there's no winner. "generateBidCheck" is an expression that should
+// be true when evaluated in generateBid(). "interestGroupOverrides" is a
+// set of overridden fields added to the default interestGroup when joining it,
+// allowing trusted bidding signals keys and URL to be set, in addition to other
+// fields.
+async function runTrustedBiddingSignalsTest(
+ test, generateBidCheck, interestGroupOverrides = {}, auctionConfigOverrides = {}, uuidOverride = null) {
+ interestGroupOverrides.biddingLogicURL =
+ createBiddingScriptURL({
+ allowComponentAuction: true,
+ generateBid: `if (!(${generateBidCheck})) return false;` });
+ let testConfig = {
+ interestGroupOverrides: interestGroupOverrides,
+ auctionConfigOverrides: auctionConfigOverrides
+ };
+ if (uuidOverride)
+ testConfig.uuid = uuidOverride;
+ await joinGroupAndRunBasicFledgeTestExpectingWinner(test, testConfig);
+}
+
+// Much like runTrustedBiddingSignalsTest, but runs auctions through reporting
+// as well, and evaluates `check` both in generateBid() and reportWin(). Also
+// makes sure browserSignals.dataVersion is undefined in scoreAd() and
+// reportResult().
+async function runTrustedBiddingSignalsDataVersionTest(
+ test, check, interestGroupOverrides = {}) {
+ const uuid = generateUuid(test);
+ interestGroupOverrides.biddingLogicURL =
+ createBiddingScriptURL({
+ generateBid:
+ `if (!(${check})) return false;`,
+ reportWin:
+ `if (!(${check}))
+ sendReportTo('${createBidderReportURL(uuid, 'error')}');
+ else
+ sendReportTo('${createBidderReportURL(uuid)}');` });
+ await joinInterestGroup(test, uuid, interestGroupOverrides);
+
+ const auctionConfigOverrides = {
+ decisionLogicURL: createDecisionScriptURL(
+ uuid,
+ { scoreAd:
+ `if (browserSignals.dataVersion !== undefined)
+ return false;`,
+ reportResult:
+ `if (browserSignals.dataVersion !== undefined)
+ sendReportTo('${createSellerReportURL(uuid, 'error')}')
+ sendReportTo('${createSellerReportURL(uuid)}')`, })
+ }
+ await runBasicFledgeAuctionAndNavigate(test, uuid, auctionConfigOverrides);
+ await waitForObservedRequests(
+ uuid, [createBidderReportURL(uuid), createSellerReportURL(uuid)]);
+}
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsTest(test, 'trustedBiddingSignals === null');
+}, 'No trustedBiddingSignalsKeys or trustedBiddingSignalsURL.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsTest(
+ test, 'trustedBiddingSignals === null',
+ { trustedBiddingSignalsKeys: ['numValue'] });
+}, 'trustedBiddingSignalsKeys but no trustedBiddingSignalsURL.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsTest(
+ test, 'trustedBiddingSignals === null',
+ { trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'trustedBiddingSignalsURL without trustedBiddingSignalsKeys.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsTest(
+ test, 'trustedBiddingSignals === null',
+ { trustedBiddingSignalsKeys: ['close-connection'],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'trustedBiddingSignalsURL closes the connection without sending anything.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsTest(
+ test, 'trustedBiddingSignals === null',
+ { trustedBiddingSignalsKeys: ['http-error'],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals response is HTTP 404 error.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsTest(
+ test, 'trustedBiddingSignals === null',
+ { trustedBiddingSignalsKeys: ['no-content-type'],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals response has no content-type.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsTest(
+ test, 'trustedBiddingSignals === null',
+ { trustedBiddingSignalsKeys: ['wrong-content-type'],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals response has wrong content-type.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsTest(
+ test, 'trustedBiddingSignals === null',
+ { trustedBiddingSignalsKeys: ['ad-auction-not-allowed'],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals response does not allow fledge.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsTest(
+ test, 'trustedBiddingSignals === null',
+ { trustedBiddingSignalsKeys: ['bad-ad-auction-allowed'],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals response has wrong Ad-Auction-Allowed header.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsTest(
+ test, 'trustedBiddingSignals === null',
+ { trustedBiddingSignalsKeys: ['no-ad-auction-allow'],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals response has no Ad-Auction-Allowed header.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsTest(
+ test, 'trustedBiddingSignals === null',
+ { trustedBiddingSignalsKeys: ['replace-body:'],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals response has no body.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsTest(
+ test, 'trustedBiddingSignals === null',
+ { trustedBiddingSignalsKeys: ['replace-body:Not JSON'],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals response is not JSON.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsTest(
+ test, 'trustedBiddingSignals === null',
+ { trustedBiddingSignalsKeys: ['replace-body:[]'],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals response is a JSON array.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsTest(
+ test, 'trustedBiddingSignals === null',
+ { trustedBiddingSignalsKeys: ['replace-body:{JSON_keys_need_quotes: 1}'],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals response in invalid JSON object.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsTest(
+ test, 'trustedBiddingSignals["replace-body:{}"] === null',
+ { trustedBiddingSignalsKeys: ['replace-body:{}'],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals response has no keys object.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsTest(
+ test, `trustedBiddingSignals['replace-body:{"keys":{}}'] === null`,
+ { trustedBiddingSignalsKeys: ['replace-body:{"keys":{}}'],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals response has no keys.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsTest(
+ test,
+ `trustedBiddingSignals["0"] === null &&
+ trustedBiddingSignals["1"] === null &&
+ trustedBiddingSignals["2"] === null &&
+ trustedBiddingSignals["length"] === null`,
+ { trustedBiddingSignalsKeys:
+ ['replace-body:{"keys":[1,2,3]}', "0", "1", "2", "length"],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals response keys is incorrectly an array.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsTest(
+ test,
+ `trustedBiddingSignals["wrong-value"] === null &&
+ trustedBiddingSignals["another-value"] === undefined`,
+ { trustedBiddingSignalsKeys: ['wrong-value'],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals response has key not in trustedBiddingSignalsKeys.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsTest(
+ test, 'trustedBiddingSignals["null-value"] === null',
+ { trustedBiddingSignalsKeys: ['null-value'],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals response has null value for key.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsTest(
+ test, 'trustedBiddingSignals["num-value"] === 1',
+ { trustedBiddingSignalsKeys: ['num-value'],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals response has a number value for key.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsTest(
+ test, 'trustedBiddingSignals["string-value"] === "1"',
+ { trustedBiddingSignalsKeys: ['string-value'],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals response has string value for key.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsTest(
+ test,
+ `JSON.stringify(trustedBiddingSignals["array-value"]) === '[1,"foo",null]'`,
+ { trustedBiddingSignalsKeys: ['array-value'],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals response has array value for key.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsTest(
+ test,
+ `Object.keys(trustedBiddingSignals["object-value"]).length === 2 &&
+ trustedBiddingSignals["object-value"]["a"] === "b" &&
+ JSON.stringify(trustedBiddingSignals["object-value"]["c"]) === '["d"]'`,
+ { trustedBiddingSignalsKeys: ['object-value'],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals response has object value for key.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsTest(
+ test,
+ 'trustedBiddingSignals[""] === "default value"',
+ { trustedBiddingSignalsKeys: [''],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals receives empty string key.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsTest(
+ test,
+ `Object.keys(trustedBiddingSignals).length === 6 &&
+ trustedBiddingSignals["wrong-value"] === null &&
+ trustedBiddingSignals["null-value"] === null &&
+ trustedBiddingSignals["num-value"] === 1 &&
+ trustedBiddingSignals["string-value"] === "1" &&
+ JSON.stringify(trustedBiddingSignals["array-value"]) === '[1,"foo",null]' &&
+ trustedBiddingSignals[""] === "default value"`,
+ { trustedBiddingSignalsKeys: ['wrong-value', 'null-value', 'num-value',
+ 'string-value', 'array-value', ''],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals response has multiple keys.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsTest(
+ test,
+ 'trustedBiddingSignals["+%20 \x00?,3#&"] === "default value"',
+ { trustedBiddingSignalsKeys: ['+%20 \x00?,3#&'],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals receives escaped key.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsTest(
+ test,
+ 'trustedBiddingSignals["\x00"] === "default value"',
+ { trustedBiddingSignalsKeys: ['\x00'],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals receives null key.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsTest(
+ test,
+ `trustedBiddingSignals["interest-group-names"] === '["${DEFAULT_INTEREST_GROUP_NAME}"]'`,
+ { trustedBiddingSignalsKeys: ['interest-group-names'],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals receives interest group name.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsTest(
+ test,
+ // Interest group names is a JSONified list of JSONified names, so the
+ // null ends up being escaped twice.
+ `trustedBiddingSignals["interest-group-names"] === '["+%20 \\\\u0000?,3#&"]'`,
+ { name: '+%20 \x00?,3#&',
+ trustedBiddingSignalsKeys: ['interest-group-names'],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals receives escaped interest group name.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsTest(
+ test,
+ `trustedBiddingSignals["interest-group-names"] === '[""]'`,
+ { name: '',
+ trustedBiddingSignalsKeys: ['interest-group-names'],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals receives empty interest group name.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsTest(
+ test,
+ `trustedBiddingSignals["hostname"] === "${window.location.hostname}"`,
+ { trustedBiddingSignalsKeys: ['hostname'],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals receives hostname field.');
+
+/////////////////////////////////////////////////////////////////////////////
+// Data-Version tests
+/////////////////////////////////////////////////////////////////////////////
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsDataVersionTest(
+ test,
+ 'browserSignals.dataVersion === undefined',
+ { trustedBiddingSignalsKeys: ['num-value'],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals response has no Data-Version.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsDataVersionTest(
+ test,
+ 'browserSignals.dataVersion === 3',
+ { trustedBiddingSignalsKeys: ['data-version:3'],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals response has numeric Data-Version.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsDataVersionTest(
+ test,
+ 'browserSignals.dataVersion === 0',
+ { trustedBiddingSignalsKeys: ['data-version:0'],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals response has min Data-Version.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsDataVersionTest(
+ test,
+ 'browserSignals.dataVersion === 4294967295',
+ { trustedBiddingSignalsKeys: ['data-version:4294967295'],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals response has max Data-Version.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsDataVersionTest(
+ test,
+ 'browserSignals.dataVersion === undefined',
+ { trustedBiddingSignalsKeys: ['data-version:4294967296'],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals response has too large Data-Version.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsDataVersionTest(
+ test,
+ 'browserSignals.dataVersion === undefined',
+ { trustedBiddingSignalsKeys: ['data-version:03'],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals response has Data-Version with leading 0.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsDataVersionTest(
+ test,
+ 'browserSignals.dataVersion === undefined',
+ { trustedBiddingSignalsKeys: ['data-version:-1'],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals response has negative Data-Version.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsDataVersionTest(
+ test,
+ 'browserSignals.dataVersion === undefined',
+ { trustedBiddingSignalsKeys: ['data-version:1.3'],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals response has decimal in Data-Version.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsDataVersionTest(
+ test,
+ 'browserSignals.dataVersion === undefined',
+ { trustedBiddingSignalsKeys: ['data-version:2 2'],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals response has space in Data-Version.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsDataVersionTest(
+ test,
+ 'browserSignals.dataVersion === undefined',
+ { trustedBiddingSignalsKeys: ['data-version:0x4'],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals response has hex Data-Version.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsDataVersionTest(
+ test,
+ 'browserSignals.dataVersion === 4',
+ { name: 'data-version',
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals response has Data-Version and no trustedBiddingSignalsKeys.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsDataVersionTest(
+ test,
+ 'browserSignals.dataVersion === undefined',
+ { trustedBiddingSignalsKeys: ['data-version:3', 'replace-body:'],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals response with Data-Version and empty body.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsDataVersionTest(
+ test,
+ 'browserSignals.dataVersion === undefined',
+ { trustedBiddingSignalsKeys: ['data-version:3', 'replace-body:[]'],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals response with Data-Version and JSON array body.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsDataVersionTest(
+ test,
+ 'browserSignals.dataVersion === undefined',
+ { trustedBiddingSignalsKeys: ['data-version:3', 'replace-body:{} {}'],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals response with Data-Version and double JSON object body.');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsDataVersionTest(
+ test,
+ 'browserSignals.dataVersion === 3',
+ { trustedBiddingSignalsKeys: ['data-version:3', 'replace-body:{"keys":5}'],
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL });
+}, 'Trusted bidding signals response with Data-Version and invalid keys entry');
+
+/////////////////////////////////////////////////////////////////////////////
+// trustedBiddingSignalsSlotSizeMode tests
+/////////////////////////////////////////////////////////////////////////////
+
+async function runTrustedBiddingSignalsSlotSizeTest(
+ test,
+ expectedSlotSize,
+ expectedAllSlotsRequestedSizes,
+ trustedBiddingSignalsSlotSizeMode = null,
+ auctionConfigOverrides = {},
+ uuidOverride = null) {
+ await runTrustedBiddingSignalsTest(
+ test,
+ `trustedBiddingSignals["slotSize"] ===
+ ${JSON.stringify(expectedSlotSize)} &&
+ trustedBiddingSignals["allSlotsRequestedSizes"] ===
+ ${JSON.stringify(expectedAllSlotsRequestedSizes)}`,
+ { trustedBiddingSignalsKeys: ['slotSize', 'allSlotsRequestedSizes'],
+ trustedBiddingSignalsSlotSizeMode: trustedBiddingSignalsSlotSizeMode,
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL},
+ auctionConfigOverrides,
+ uuidOverride);
+}
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsSlotSizeTest(
+ test,
+ /*expectedSlotSize=*/'not-found',
+ /*expectedAllSlotsRequestedSizes=*/'not-found');
+}, 'Null trustedBiddingSignalsSlotSizeMode, no sizes in AuctionConfig');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsSlotSizeTest(
+ test,
+ /*expectedSlotSize=*/'not-found',
+ /*expectedAllSlotsRequestedSizes=*/'not-found',
+ /*trustedBiddingSignalsSlotSizeMode=*/'not-a-real-mode');
+}, 'Unknown trustedBiddingSignalsSlotSizeMode, no sizes in AuctionConfig');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsSlotSizeTest(
+ test,
+ /*expectedSlotSize=*/'not-found',
+ /*expectedAllSlotsRequestedSizes=*/'not-found',
+ /*trustedBiddingSignalsSlotSizeMode=*/'none');
+}, 'none trustedBiddingSignalsSlotSizeMode, no sizes in AuctionConfig');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsSlotSizeTest(
+ test,
+ /*expectedSlotSize=*/'not-found',
+ /*expectedAllSlotsRequestedSizes=*/'not-found',
+ /*trustedBiddingSignalsSlotSizeMode=*/'slot-size');
+}, 'slot-size trustedBiddingSignalsSlotSizeMode, no sizes in AuctionConfig');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsSlotSizeTest(
+ test,
+ /*expectedSlotSize=*/'not-found',
+ /*expectedAllSlotsRequestedSizes=*/'not-found',
+ /*trustedBiddingSignalsSlotSizeMode=*/'slot-size');
+}, 'all-slots-requested-sizes trustedBiddingSignalsSlotSizeMode, no sizes in AuctionConfig');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsSlotSizeTest(
+ test,
+ /*expectedSlotSize=*/'not-found',
+ /*expectedAllSlotsRequestedSizes=*/'not-found',
+ /*trustedBiddingSignalsSlotSizeMode=*/'none',
+ {requestedSize: {width:'10', height:'20'}});
+}, 'none trustedBiddingSignalsSlotSizeMode, requestedSize in AuctionConfig');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsSlotSizeTest(
+ test,
+ /*expectedSlotSize=*/'not-found',
+ /*expectedAllSlotsRequestedSizes=*/'not-found',
+ /*trustedBiddingSignalsSlotSizeMode=*/null,
+ {requestedSize: {width:'10', height:'20'}});
+}, 'Null trustedBiddingSignalsSlotSizeMode, requestedSize in AuctionConfig');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsSlotSizeTest(
+ test,
+ /*expectedSlotSize=*/'not-found',
+ /*expectedAllSlotsRequestedSizes=*/'not-found',
+ /*trustedBiddingSignalsSlotSizeMode=*/'not-a-real-mode',
+ {requestedSize: {width:'10', height:'20'}});
+}, 'Unknown trustedBiddingSignalsSlotSizeMode, requestedSize in AuctionConfig');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsSlotSizeTest(
+ test,
+ /*expectedSlotSize=*/'10px,20px',
+ /*expectedAllSlotsRequestedSizes=*/'not-found',
+ /*trustedBiddingSignalsSlotSizeMode=*/'slot-size',
+ {requestedSize: {width:'10', height:'20'}});
+}, 'slot-size trustedBiddingSignalsSlotSizeMode, requestedSize in AuctionConfig');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsSlotSizeTest(
+ test,
+ /*expectedSlotSize=*/'not-found',
+ /*expectedAllSlotsRequestedSizes=*/'not-found',
+ /*trustedBiddingSignalsSlotSizeMode=*/'all-slots-requested-sizes',
+ {requestedSize: {width:'10', height:'20'}});
+}, 'all-slots-requested-sizes trustedBiddingSignalsSlotSizeMode, requestedSize in AuctionConfig');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsSlotSizeTest(
+ test,
+ /*expectedSlotSize=*/'not-found',
+ /*expectedAllSlotsRequestedSizes=*/'not-found',
+ /*trustedBiddingSignalsSlotSizeMode=*/'none',
+ {allSlotsRequestedSizes: [{width:10, height:20}]});
+}, 'none trustedBiddingSignalsSlotSizeMode, allSlotsRequestedSizes in AuctionConfig');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsSlotSizeTest(
+ test,
+ /*expectedSlotSize=*/'not-found',
+ /*expectedAllSlotsRequestedSizes=*/'not-found',
+ /*trustedBiddingSignalsSlotSizeMode=*/null,
+ {allSlotsRequestedSizes: [{width:'10', height:'20'}]});
+}, 'Null trustedBiddingSignalsSlotSizeMode, allSlotsRequestedSizes in AuctionConfig');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsSlotSizeTest(
+ test,
+ /*expectedSlotSize=*/'not-found',
+ /*expectedAllSlotsRequestedSizes=*/'not-found',
+ /*trustedBiddingSignalsSlotSizeMode=*/'not-a-real-mode',
+ {allSlotsRequestedSizes: [{width:'10', height:'20'}]});
+}, 'Unknown trustedBiddingSignalsSlotSizeMode, allSlotsRequestedSizes in AuctionConfig');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsSlotSizeTest(
+ test,
+ /*expectedSlotSize=*/'not-found',
+ /*expectedAllSlotsRequestedSizes=*/'not-found',
+ /*trustedBiddingSignalsSlotSizeMode=*/'slot-size',
+ {allSlotsRequestedSizes: [{width:'10', height:'20'}]});
+}, 'slot-size trustedBiddingSignalsSlotSizeMode, allSlotsRequestedSizes in AuctionConfig');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsSlotSizeTest(
+ test,
+ /*expectedSlotSize=*/'not-found',
+ /*expectedAllSlotsRequestedSizes=*/'10px,20px',
+ /*trustedBiddingSignalsSlotSizeMode=*/'all-slots-requested-sizes',
+ {allSlotsRequestedSizes: [{width:'10', height:'20'}]});
+}, 'all-slots-requested-sizes trustedBiddingSignalsSlotSizeMode, allSlotsRequestedSizes in AuctionConfig');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsSlotSizeTest(
+ test,
+ /*expectedSlotSize=*/'10px,20px',
+ /*expectedAllSlotsRequestedSizes=*/'not-found',
+ /*trustedBiddingSignalsSlotSizeMode=*/'slot-size',
+ {requestedSize: {width:'10px', height:'20px'}});
+}, 'slot-size trustedBiddingSignalsSlotSizeMode, explicit pixel units');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsSlotSizeTest(
+ test,
+ /*expectedSlotSize=*/'80sw,12.5sh',
+ /*expectedAllSlotsRequestedSizes=*/'not-found',
+ /*trustedBiddingSignalsSlotSizeMode=*/'slot-size',
+ {requestedSize: {width:'80sw', height:'12.50sh'}});
+}, 'slot-size trustedBiddingSignalsSlotSizeMode, screen size units');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsSlotSizeTest(
+ test,
+ /*expectedSlotSize=*/'80sh,12.5sw',
+ /*expectedAllSlotsRequestedSizes=*/'not-found',
+ /*trustedBiddingSignalsSlotSizeMode=*/'slot-size',
+ {requestedSize: {width:'80sh', height:'12.5sw'}});
+}, 'slot-size trustedBiddingSignalsSlotSizeMode, flipped screen size units');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsSlotSizeTest(
+ test,
+ /*expectedSlotSize=*/'10px,25sh',
+ /*expectedAllSlotsRequestedSizes=*/'not-found',
+ /*trustedBiddingSignalsSlotSizeMode=*/'slot-size',
+ {requestedSize: {width:'10', height:'25sh'}});
+}, 'slot-size trustedBiddingSignalsSlotSizeMode, mixed pixel and screen width units');
+
+subsetTest(promise_test, async test => {
+ await runTrustedBiddingSignalsSlotSizeTest(
+ test,
+ /*expectedSlotSize=*/'not-found',
+ /*expectedAllSlotsRequestedSizes=*/'10px,20px,25sw,20px,22px,80sh',
+ /*trustedBiddingSignalsSlotSizeMode=*/'all-slots-requested-sizes',
+ { allSlotsRequestedSizes: [ {width:'10', height:'20'},
+ {width:'25sw', height:'20px'},
+ {width:'22', height:'80sh'}]});
+}, 'all-slots-requested-sizes trustedBiddingSignalsSlotSizeMode, multiple unit types');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+
+ let group1ReportURL = createBidderReportURL(uuid, /*id=*/'none')
+ let group2ReportURL = createBidderReportURL(uuid, /*id=*/'slot-size')
+ let group3ReportURL = createBidderReportURL(uuid, /*id=*/'all-slots-requested-sizes')
+
+ // The simplest way to make sure interest groups with different modes all receive
+ // the right sizes is to have interest groups that modify their bids based on ad
+ // size sent to the trusted server.
+ await Promise.all(
+ [ joinInterestGroup(
+ test, uuid,
+ { name: 'group 1',
+ trustedBiddingSignalsKeys: ['slotSize', 'allSlotsRequestedSizes'],
+ trustedBiddingSignalsSlotSizeMode: 'none',
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL,
+ biddingLogicURL: createBiddingScriptURL(
+ { generateBid:
+ `if (trustedBiddingSignals["slotSize"] !== "not-found" ||
+ trustedBiddingSignals["allSlotsRequestedSizes"] !== "not-found") {
+ throw "unexpected trustedBiddingSignals";
+ }
+ return {bid: 5, render: interestGroup.ads[0].renderURL};`,
+ reportWin: `sendReportTo("${group1ReportURL}");`})}),
+ joinInterestGroup(
+ test, uuid,
+ { name: 'group 2',
+ trustedBiddingSignalsKeys: ['slotSize', 'allSlotsRequestedSizes'],
+ trustedBiddingSignalsSlotSizeMode: 'slot-size',
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL,
+ biddingLogicURL: createBiddingScriptURL(
+ { generateBid:
+ `if (trustedBiddingSignals["slotSize"] === "not-found" ||
+ trustedBiddingSignals["allSlotsRequestedSizes"] !== "not-found") {
+ throw "unexpected trustedBiddingSignals";
+ }
+ // Group 3 bids using the first digit of the first dimension.
+ return { bid: trustedBiddingSignals["slotSize"].substr(0, 1),
+ render: interestGroup.ads[0].renderURL};`,
+ reportWin: `sendReportTo("${group2ReportURL}");`})}),
+ joinInterestGroup(
+ test, uuid,
+ { name: 'group 3',
+ trustedBiddingSignalsKeys: ['slotSize', 'allSlotsRequestedSizes'],
+ trustedBiddingSignalsSlotSizeMode: 'all-slots-requested-sizes',
+ trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL,
+ biddingLogicURL: createBiddingScriptURL(
+ { generateBid:
+ `if (trustedBiddingSignals["slotSize"] !== "not-found" ||
+ trustedBiddingSignals["allSlotsRequestedSizes"] === "not-found") {
+ throw "unexpected trustedBiddingSignals";
+ }
+ // Group 3 bids using the second digit of the first dimension.
+ return { bid: trustedBiddingSignals["allSlotsRequestedSizes"].substr(1, 1),
+ render: interestGroup.ads[0].renderURL};`,
+ reportWin: `sendReportTo("${group3ReportURL}");`})}),
+ ]
+ );
+
+ let auctionConfigOverrides = {
+ // Disable the default seller reporting, for simplicity.
+ decisionLogicURL: createDecisionScriptURL(uuid, { reportResult: '' }),
+ // Default sizes start with a "11", so groups 2 and 3 will start with a bid
+ // of 1 and lose.
+ requestedSize: {width:'11', height:'20'},
+ allSlotsRequestedSizes: [{width:'11', height:'20'}]
+ };
+
+ // Group 1 wins the first auction.
+ await runBasicFledgeAuctionAndNavigate(test, uuid, auctionConfigOverrides);
+ await waitForObservedRequests(uuid, [group1ReportURL]);
+
+ // Group2 should bid "6" in the second auction, and win it.
+ auctionConfigOverrides.requestedSize = {width:'61', height:'20'};
+ auctionConfigOverrides.allSlotsRequestedSizes = [{width:'61', height:'20'}];
+ await runBasicFledgeAuctionAndNavigate(test, uuid, auctionConfigOverrides);
+ await waitForObservedRequests(uuid, [group1ReportURL, group2ReportURL]);
+
+ // Group3 should bid "7" in the third auction, and win it.
+ auctionConfigOverrides.requestedSize = {width:'67', height:'20'};
+ auctionConfigOverrides.allSlotsRequestedSizes = [{width:'67', height:'20'}];
+ await runBasicFledgeAuctionAndNavigate(test, uuid, auctionConfigOverrides);
+ await waitForObservedRequests(uuid, [group1ReportURL, group2ReportURL, group3ReportURL]);
+}, 'Mixed trustedBiddingSignalsSlotSizeModes in a single auction');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+ let componentAuctionConfig = {
+ seller: window.location.origin,
+ decisionLogicURL: createDecisionScriptURL(uuid),
+ interestGroupBuyers: [window.location.origin],
+ requestedSize: {width:'10', height:'20'}
+ };
+
+ let auctionConfigOverrides = {
+ interestGroupBuyers: [],
+ componentAuctions: [componentAuctionConfig],
+ requestedSize: {width:'22', height:'33'}
+ }
+
+ await runTrustedBiddingSignalsSlotSizeTest(
+ test,
+ // Dimensions from the component auction should be used.
+ /*expectedSlotSize=*/'10px,20px',
+ /*expectedAllSlotsRequestedSizes=*/'not-found',
+ /*trustedBiddingSignalsSlotSizeMode=*/'slot-size',
+ auctionConfigOverrides,
+ uuid);
+}, 'slot-size trustedBiddingSignalsSlotSizeMode in a component auction');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+ let componentAuctionConfig = {
+ seller: window.location.origin,
+ decisionLogicURL: createDecisionScriptURL(uuid),
+ interestGroupBuyers: [window.location.origin],
+ allSlotsRequestedSizes: [{width:'11', height:'22'}, {width:'12', height:'23'}]
+ };
+
+ let auctionConfigOverrides = {
+ interestGroupBuyers: [],
+ componentAuctions: [componentAuctionConfig],
+ allSlotsRequestedSizes: [{width:'10', height:'20'}]
+ }
+
+ await runTrustedBiddingSignalsSlotSizeTest(
+ test,
+ // Dimensions from the component auction should be used.
+ /*expectedSlotSize=*/'not-found',
+ /*expectedAllSlotsRequestedSizes=*/'11px,22px,12px,23px',
+ /*trustedBiddingSignalsSlotSizeMode=*/'all-slots-requested-sizes',
+ auctionConfigOverrides,
+ uuid);
+}, 'all-slots-requested-sizes trustedBiddingSignalsSlotSizeMode in a component auction');