summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/fledge/tentative/component-auction.https.window.js
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
commit26a029d407be480d791972afb5975cf62c9360a6 (patch)
treef435a8308119effd964b339f76abb83a57c29483 /testing/web-platform/tests/fledge/tentative/component-auction.https.window.js
parentInitial commit. (diff)
downloadfirefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz
firefox-26a029d407be480d791972afb5975cf62c9360a6.zip
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'testing/web-platform/tests/fledge/tentative/component-auction.https.window.js')
-rw-r--r--testing/web-platform/tests/fledge/tentative/component-auction.https.window.js719
1 files changed, 719 insertions, 0 deletions
diff --git a/testing/web-platform/tests/fledge/tentative/component-auction.https.window.js b/testing/web-platform/tests/fledge/tentative/component-auction.https.window.js
new file mode 100644
index 0000000000..63771d42b8
--- /dev/null
+++ b/testing/web-platform/tests/fledge/tentative/component-auction.https.window.js
@@ -0,0 +1,719 @@
+// 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-last
+
+"use strict";
+
+// Creates an AuctionConfig with a single component auction.
+function createComponentAuctionConfig(uuid) {
+ let componentAuctionConfig = {
+ seller: window.location.origin,
+ decisionLogicURL: createDecisionScriptURL(uuid),
+ interestGroupBuyers: [window.location.origin]
+ };
+
+ return {
+ seller: window.location.origin,
+ decisionLogicURL: createDecisionScriptURL(uuid),
+ interestGroupBuyers: [],
+ componentAuctions: [componentAuctionConfig]
+ };
+}
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+
+ await joinInterestGroup(
+ test, uuid,
+ { biddingLogicURL: createBiddingScriptURL()});
+
+ await runBasicFledgeTestExpectingNoWinner(test, uuid, createComponentAuctionConfig(uuid));
+}, 'Component auction allowed not specified by bidder.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+
+ await joinInterestGroup(
+ test, uuid,
+ { biddingLogicURL: createBiddingScriptURL(
+ { allowComponentAuction: false })});
+
+ await runBasicFledgeTestExpectingNoWinner(test, uuid, createComponentAuctionConfig(uuid));
+}, 'Component auction not allowed by bidder.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+
+ await joinInterestGroup(
+ test, uuid,
+ { biddingLogicURL: createBiddingScriptURL(
+ { allowComponentAuction: true })});
+
+ let auctionConfig = createComponentAuctionConfig(uuid);
+ auctionConfig.componentAuctions[0].decisionLogicURL = createDecisionScriptURL(
+ uuid,
+ { scoreAd: "return 5;" });
+
+ await runBasicFledgeTestExpectingNoWinner(test, uuid, auctionConfig);
+}, 'Component auction allowed not specified by component seller.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+
+ await joinInterestGroup(
+ test, uuid,
+ { biddingLogicURL: createBiddingScriptURL(
+ { allowComponentAuction: true })});
+
+ let auctionConfig = createComponentAuctionConfig(uuid);
+ auctionConfig.componentAuctions[0].decisionLogicURL = createDecisionScriptURL(
+ uuid,
+ { scoreAd: "return {desirability: 5, allowComponentAuction: false};" });
+
+ await runBasicFledgeTestExpectingNoWinner(test, uuid, auctionConfig);
+}, 'Component auction not allowed by component seller.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+
+ await joinInterestGroup(
+ test, uuid,
+ { biddingLogicURL: createBiddingScriptURL(
+ { allowComponentAuction: true })});
+
+ let auctionConfig = createComponentAuctionConfig(uuid);
+ auctionConfig.decisionLogicURL = createDecisionScriptURL(
+ uuid,
+ { scoreAd: "return 5;" });
+
+ await runBasicFledgeTestExpectingNoWinner(test, uuid, auctionConfig);
+}, 'Component auction allowed not specified by top-level seller.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+
+ await joinInterestGroup(
+ test, uuid,
+ { biddingLogicURL: createBiddingScriptURL(
+ { allowComponentAuction: true })});
+
+ let auctionConfig = createComponentAuctionConfig(uuid);
+ auctionConfig.interestGroupBuyers = [window.location.origin];
+
+ try {
+ await runBasicFledgeAuction(test, uuid, auctionConfig);
+ } catch (exception) {
+ assert_true(exception instanceof TypeError, "did not get expected error: " + exception);
+ return;
+ }
+ throw 'Exception unexpectedly not thrown.'
+}, 'Component auction top-level auction cannot have buyers.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+
+ await joinInterestGroup(
+ test, uuid,
+ { biddingLogicURL: createBiddingScriptURL(
+ { allowComponentAuction: true })});
+
+ let auctionConfig = createComponentAuctionConfig(uuid);
+ auctionConfig.decisionLogicURL = createDecisionScriptURL(
+ uuid,
+ { scoreAd: "return {desirability: 5, allowComponentAuction: false};" });
+
+ await runBasicFledgeTestExpectingNoWinner(test, uuid, auctionConfig);
+}, 'Component auction not allowed by top-level seller.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+
+ // Use distinct origins so can validate all origin parameters passed to worklets.
+ let bidder = OTHER_ORIGIN1;
+ let componentSeller = OTHER_ORIGIN2;
+ let topLevelSeller = OTHER_ORIGIN3;
+
+ let bidderReportURL = createBidderReportURL(uuid);
+ let componentSellerReportURL = createSellerReportURL(uuid, /*id=*/"component");
+ let topLevelSellerReportURL = createSellerReportURL(uuid, /*id=*/"top");
+
+ // Note that generateBid() and reportWin() receive slightly different
+ // "browserSignals" fields - only reportWin() gets "interestGroupOwner", so
+ // need different sets of checks for them.
+ await joinCrossOriginInterestGroup(
+ test, uuid, bidder,
+ { biddingLogicURL: createBiddingScriptURL(
+ { origin: bidder,
+ allowComponentAuction: true,
+ generateBid:
+ `if (browserSignals.seller !== "${componentSeller}")
+ throw "Unexpected seller: " + browserSignals.seller;
+ if (browserSignals.componentSeller !== undefined)
+ throw "Unexpected componentSeller: " + browserSignals.componentSeller;
+ if (browserSignals.topLevelSeller !== "${topLevelSeller}")
+ throw "Unexpected topLevelSeller: " + browserSignals.topLevelSeller;
+ if (browserSignals.interestGroupOwner !== undefined)
+ throw "Unexpected interestGroupOwner: " + browserSignals.interestGroupOwner;
+ if (browserSignals.topWindowHostname !== "${window.location.hostname}")
+ throw "Unexpected topWindowHostname: " + browserSignals.topWindowHostname;`,
+ reportWin:
+ `if (browserSignals.seller !== "${componentSeller}")
+ throw "Unexpected seller: " + browserSignals.seller;
+ if (browserSignals.componentSeller !== undefined)
+ throw "Unexpected componentSeller: " + browserSignals.componentSeller;
+ if (browserSignals.topLevelSeller !== "${topLevelSeller}")
+ throw "Unexpected topLevelSeller: " + browserSignals.topLevelSeller;
+ if (browserSignals.interestGroupOwner !== "${bidder}")
+ throw "Unexpected interestGroupOwner: " + browserSignals.interestGroupOwner;
+ if (browserSignals.topWindowHostname !== "${window.location.hostname}")
+ throw "Unexpected topWindowHostname: " + browserSignals.topWindowHostname;
+ sendReportTo("${bidderReportURL}");`})});
+
+ // Checks for scoreAd() and reportResult() for the component seller.
+ let componentSellerChecks =
+ `if (browserSignals.seller !== undefined)
+ throw "Unexpected seller: " + browserSignals.seller;
+ if (browserSignals.componentSeller !== undefined)
+ throw "Unexpected componentSeller: " + browserSignals.componentSeller;
+ if (browserSignals.topLevelSeller !== "${topLevelSeller}")
+ throw "Unexpected topLevelSeller: " + browserSignals.topLevelSeller;
+ if (browserSignals.interestGroupOwner !== "${bidder}")
+ throw "Unexpected interestGroupOwner: " + browserSignals.interestGroupOwner;
+ if (browserSignals.topWindowHostname !== "${window.location.hostname}")
+ throw "Unexpected topWindowHostname: " + browserSignals.topWindowHostname;`;
+
+ let componentAuctionConfig = {
+ seller: componentSeller,
+ decisionLogicURL: createDecisionScriptURL(
+ uuid,
+ { origin: componentSeller,
+ scoreAd: componentSellerChecks,
+ reportResult: `${componentSellerChecks}
+ sendReportTo("${componentSellerReportURL}");` }),
+ interestGroupBuyers: [bidder]
+ };
+
+ // Checks for scoreAd() and reportResult() for the top-level seller.
+ let topLevelSellerChecks =
+ `if (browserSignals.seller !== undefined)
+ throw "Unexpected seller: " + browserSignals.seller;
+ if (browserSignals.componentSeller !== "${componentSeller}")
+ throw "Unexpected componentSeller: " + browserSignals.componentSeller;
+ if (browserSignals.topLevelSeller !== undefined)
+ throw "Unexpected topLevelSeller: " + browserSignals.topLevelSeller;
+ if (browserSignals.interestGroupOwner !== "${bidder}")
+ throw "Unexpected interestGroupOwner: " + browserSignals.interestGroupOwner;
+ if (browserSignals.topWindowHostname !== "${window.location.hostname}")
+ throw "Unexpected topWindowHostname: " + browserSignals.topWindowHostname;`;
+
+ let auctionConfigOverrides = {
+ seller: topLevelSeller,
+ decisionLogicURL: createDecisionScriptURL(
+ uuid,
+ { origin: topLevelSeller,
+ scoreAd: topLevelSellerChecks,
+ reportResult: `${topLevelSellerChecks}
+ sendReportTo("${topLevelSellerReportURL}");` }),
+ interestGroupBuyers: [],
+ componentAuctions: [componentAuctionConfig]
+ };
+
+ await runBasicFledgeAuctionAndNavigate(test, uuid, auctionConfigOverrides);
+ await waitForObservedRequests(
+ uuid,
+ [bidderReportURL, componentSellerReportURL, topLevelSellerReportURL]);
+}, 'Component auction browserSignals origins.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+
+ let bidderReportURL = createBidderReportURL(uuid);
+ let componentSellerReportURL = createSellerReportURL(uuid, /*id=*/"component");
+ let topLevelSellerReportURL = createSellerReportURL(uuid, /*id=*/"top");
+
+ await joinInterestGroup(
+ test, uuid,
+ { biddingLogicURL: createBiddingScriptURL(
+ { allowComponentAuction: true,
+ bid: 5,
+ reportWin:
+ `if (browserSignals.bid !== 5)
+ throw "Unexpected bid: " + browserSignals.bid;
+ sendReportTo("${bidderReportURL}");`})});
+
+ let auctionConfig = createComponentAuctionConfig(uuid);
+
+ auctionConfig.componentAuctions[0].decisionLogicURL =
+ createDecisionScriptURL(
+ uuid,
+ { scoreAd:
+ `if (bid !== 5)
+ throw "Unexpected component bid: " + bid`,
+ reportResult:
+ `if (browserSignals.bid !== 5)
+ throw "Unexpected component bid: " + browserSignals.bid;
+ if (browserSignals.modifiedBid !== undefined)
+ throw "Unexpected component modifiedBid: " + browserSignals.modifiedBid;
+ sendReportTo("${componentSellerReportURL}");` });
+
+ auctionConfig.decisionLogicURL =
+ createDecisionScriptURL(
+ uuid,
+ { scoreAd:
+ `if (bid !== 5)
+ throw "Unexpected top-level bid: " + bid`,
+ reportResult:
+ `if (browserSignals.bid !== 5)
+ throw "Unexpected top-level bid: " + browserSignals.bid;
+ if (browserSignals.modifiedBid !== undefined)
+ throw "Unexpected top-level modifiedBid: " + browserSignals.modifiedBid;
+ sendReportTo("${topLevelSellerReportURL}");` });
+
+ await runBasicFledgeAuctionAndNavigate(test, uuid, auctionConfig);
+ await waitForObservedRequests(
+ uuid,
+ [bidderReportURL, componentSellerReportURL, topLevelSellerReportURL]);
+}, 'Component auction unmodified bid.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+
+ let bidderReportURL = createBidderReportURL(uuid);
+ let componentSellerReportURL = createSellerReportURL(uuid, /*id=*/"component");
+ let topLevelSellerReportURL = createSellerReportURL(uuid, /*id=*/"top");
+
+ await joinInterestGroup(
+ test, uuid,
+ { biddingLogicURL: createBiddingScriptURL(
+ { allowComponentAuction: true,
+ bid: 5,
+ reportWin:
+ `if (browserSignals.bid !== 5)
+ throw "Unexpected bid: " + browserSignals.bid;
+ sendReportTo("${bidderReportURL}");`})});
+
+ let auctionConfig = createComponentAuctionConfig(uuid);
+
+ auctionConfig.componentAuctions[0].decisionLogicURL =
+ createDecisionScriptURL(
+ uuid,
+ { scoreAd:
+ `if (bid !== 5)
+ throw "Unexpected component bid: " + bid
+ return {desirability: 5, allowComponentAuction: true, bid: 4};`,
+ reportResult:
+ `if (browserSignals.bid !== 5)
+ throw "Unexpected component bid: " + browserSignals.bid;
+ if (browserSignals.modifiedBid !== 4)
+ throw "Unexpected component modifiedBid: " + browserSignals.modifiedBid;
+ sendReportTo("${componentSellerReportURL}");` });
+
+ auctionConfig.decisionLogicURL =
+ createDecisionScriptURL(
+ uuid,
+ { scoreAd:
+ `if (bid !== 4)
+ throw "Unexpected top-level bid: " + bid`,
+ reportResult:
+ `if (browserSignals.bid !== 4)
+ throw "Unexpected top-level bid: " + browserSignals.bid;
+ if (browserSignals.modifiedBid !== undefined)
+ throw "Unexpected top-level modifiedBid: " + browserSignals.modifiedBid;
+ sendReportTo("${topLevelSellerReportURL}");` });
+
+ await runBasicFledgeAuctionAndNavigate(test, uuid, auctionConfig);
+ await waitForObservedRequests(
+ uuid,
+ [bidderReportURL, componentSellerReportURL, topLevelSellerReportURL]);
+}, 'Component auction modified bid.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+
+ let bidderReportURL = createBidderReportURL(uuid);
+ let componentSellerReportURL = createSellerReportURL(uuid, /*id=*/"component");
+ let topLevelSellerReportURL = createSellerReportURL(uuid, /*id=*/"top");
+
+ await joinInterestGroup(
+ test, uuid,
+ { biddingLogicURL: createBiddingScriptURL(
+ { allowComponentAuction: true,
+ bid: 5,
+ reportWin:
+ `if (browserSignals.bid !== 5)
+ throw "Unexpected bid: " + browserSignals.bid;
+ sendReportTo("${bidderReportURL}");`})});
+
+ let auctionConfig = createComponentAuctionConfig(uuid);
+
+ auctionConfig.componentAuctions[0].decisionLogicURL =
+ createDecisionScriptURL(
+ uuid,
+ { scoreAd:
+ `if (bid !== 5)
+ throw "Unexpected component bid: " + bid
+ return {desirability: 5, allowComponentAuction: true, bid: 5};`,
+ reportResult:
+ `if (browserSignals.bid !== 5)
+ throw "Unexpected component bid: " + browserSignals.bid;
+ if (browserSignals.modifiedBid !== 5)
+ throw "Unexpected component modifiedBid: " + browserSignals.modifiedBid;
+ sendReportTo("${componentSellerReportURL}");` });
+
+ auctionConfig.decisionLogicURL =
+ createDecisionScriptURL(
+ uuid,
+ { scoreAd:
+ `if (bid !== 5)
+ throw "Unexpected top-level bid: " + bid`,
+ reportResult:
+ `if (browserSignals.bid !== 5)
+ throw "Unexpected top-level bid: " + browserSignals.bid;
+ if (browserSignals.modifiedBid !== undefined)
+ throw "Unexpected top-level modifiedBid: " + browserSignals.modifiedBid;
+ sendReportTo("${topLevelSellerReportURL}");` });
+
+ await runBasicFledgeAuctionAndNavigate(test, uuid, auctionConfig);
+ await waitForObservedRequests(
+ uuid,
+ [bidderReportURL, componentSellerReportURL, topLevelSellerReportURL]);
+}, 'Component auction modified bid to same value.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+
+ let bidderReportURL = createBidderReportURL(uuid);
+ let componentSellerReportURL = createSellerReportURL(uuid, /*id=*/"component");
+ let topLevelSellerReportURL = createSellerReportURL(uuid, /*id=*/"top");
+
+ await joinInterestGroup(
+ test, uuid,
+ { biddingLogicURL: createBiddingScriptURL(
+ { allowComponentAuction: true,
+ bid: 5,
+ reportWin:
+ `if (browserSignals.bid !== 5)
+ throw "Unexpected bid: " + browserSignals.bid;
+ sendReportTo("${bidderReportURL}");`})});
+
+ let auctionConfig = createComponentAuctionConfig(uuid);
+
+ auctionConfig.componentAuctions[0].decisionLogicURL =
+ createDecisionScriptURL(
+ uuid,
+ { scoreAd:
+ `if (bid !== 5)
+ throw "Unexpected component bid: " + bid`,
+ reportResult:
+ `if (browserSignals.bid !== 5)
+ throw "Unexpected component bid: " + browserSignals.bid;
+ if (browserSignals.modifiedBid !== undefined)
+ throw "Unexpected component modifiedBid: " + browserSignals.modifiedBid;
+ sendReportTo("${componentSellerReportURL}");` });
+
+ auctionConfig.decisionLogicURL =
+ createDecisionScriptURL(
+ uuid,
+ { scoreAd:
+ `if (bid !== 5)
+ throw "Unexpected top-level bid: " + bid
+ return {desirability: 5, allowComponentAuction: true, bid: 4};`,
+ reportResult:
+ `if (browserSignals.bid !== 5)
+ throw "Unexpected top-level bid: " + browserSignals.bid;
+ if (browserSignals.modifiedBid !== undefined)
+ throw "Unexpected top-level modifiedBid: " + browserSignals.modifiedBid;
+ sendReportTo("${topLevelSellerReportURL}");` });
+
+ await runBasicFledgeAuctionAndNavigate(test, uuid, auctionConfig);
+ await waitForObservedRequests(
+ uuid,
+ [bidderReportURL, componentSellerReportURL, topLevelSellerReportURL]);
+}, 'Top-level auction cannot modify bid.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+
+ let bidderReportURL = createBidderReportURL(uuid);
+ let componentSellerReportURL = createSellerReportURL(uuid, /*id=*/"component");
+ let topLevelSellerReportURL = createSellerReportURL(uuid, /*id=*/"top");
+
+ await joinInterestGroup(
+ test, uuid,
+ { biddingLogicURL: createBiddingScriptURL(
+ { allowComponentAuction: true,
+ reportWin:
+ `if (browserSignals.desirability !== undefined)
+ throw "Unexpected desirability: " + browserSignals.desirability;
+ sendReportTo("${bidderReportURL}");`})});
+
+ let auctionConfig = createComponentAuctionConfig(uuid);
+
+ auctionConfig.componentAuctions[0].decisionLogicURL =
+ createDecisionScriptURL(
+ uuid,
+ { scoreAd:
+ `return {desirability: 3, allowComponentAuction: true};`,
+ reportResult:
+ `if (browserSignals.desirability !== 3)
+ throw "Unexpected component desirability: " + browserSignals.desirability;
+ sendReportTo("${componentSellerReportURL}");` });
+
+ auctionConfig.decisionLogicURL =
+ createDecisionScriptURL(
+ uuid,
+ { scoreAd:
+ `return {desirability: 4, allowComponentAuction: true};`,
+ reportResult:
+ `if (browserSignals.desirability !== 4)
+ throw "Unexpected component desirability: " + browserSignals.desirability;
+ sendReportTo("${topLevelSellerReportURL}");` });
+
+ await runBasicFledgeAuctionAndNavigate(test, uuid, auctionConfig);
+ await waitForObservedRequests(
+ uuid,
+ [bidderReportURL, componentSellerReportURL, topLevelSellerReportURL]);
+}, 'Component auction desirability.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+
+ // An auction with two components, each of which has a distinct bidder origin,
+ // so the bidder in the second component is OTHER_ORIGIN1). The bidder in the
+ // first component auction bids more and is given the highest of all
+ // desirability scores in the auction by its component seller, but the
+ // top-level seller prefers bidder 2.
+ let bidder1ReportURL = createBidderReportURL(uuid, /*id=*/1);
+ let bidder2ReportURL = createBidderReportURL(uuid, /*id=*/2);
+ let componentSeller1ReportURL = createSellerReportURL(uuid, /*id=*/"component1");
+ let componentSeller2ReportURL = createSellerReportURL(uuid, /*id=*/"component2");
+ let topLevelSellerReportURL = createSellerReportURL(uuid, /*id=*/"top");
+
+ await Promise.all([
+ joinInterestGroup(
+ test, uuid,
+ { biddingLogicURL: createBiddingScriptURL(
+ { bid: 10,
+ allowComponentAuction: true,
+ reportWin:
+ `sendReportTo("${bidder1ReportURL}");`})}),
+ joinCrossOriginInterestGroup(test, uuid, OTHER_ORIGIN1,
+ { biddingLogicURL: createBiddingScriptURL(
+ { origin: OTHER_ORIGIN1,
+ bid: 2,
+ allowComponentAuction: true,
+ reportWin:
+ `if (browserSignals.bid !== 2)
+ throw "Unexpected bid: " + browserSignals.bid;
+ sendReportTo("${bidder2ReportURL}");`})})
+ ]);
+
+ let auctionConfig = createComponentAuctionConfig(uuid);
+
+ auctionConfig.componentAuctions[0].decisionLogicURL =
+ createDecisionScriptURL(
+ uuid,
+ { scoreAd:
+ `return {desirability: 10, allowComponentAuction: true};`,
+ reportResult:
+ `sendReportTo("${componentSeller1ReportURL}");` });
+
+ auctionConfig.componentAuctions[1] = {
+ ...auctionConfig.componentAuctions[0],
+ interestGroupBuyers: [OTHER_ORIGIN1],
+ decisionLogicURL: createDecisionScriptURL(
+ uuid,
+ { scoreAd:
+ `return {desirability: 1, allowComponentAuction: true};`,
+ reportResult:
+ `if (browserSignals.desirability !== 1)
+ throw "Unexpected component desirability: " + browserSignals.desirability;
+ sendReportTo("${componentSeller2ReportURL}");` })
+ }
+
+ auctionConfig.decisionLogicURL =
+ createDecisionScriptURL(
+ uuid,
+ { scoreAd:
+ `return {desirability: 11 - bid, allowComponentAuction: true};`,
+ reportResult:
+ `if (browserSignals.desirability !== 9)
+ throw "Unexpected component desirability: " + browserSignals.desirability;
+ sendReportTo("${topLevelSellerReportURL}");` });
+
+ await runBasicFledgeAuctionAndNavigate(test, uuid, auctionConfig);
+ await waitForObservedRequests(
+ uuid,
+ [bidder2ReportURL, componentSeller2ReportURL, topLevelSellerReportURL]);
+}, 'Component auction desirability two sellers, two bidders.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+
+ let renderURL1 = createRenderURL(uuid);
+ let renderURL2 = createRenderURL(uuid, /*script=*/';');
+
+ // The same bidder uses different ads, bids, and reporting URLs for different
+ // component sellers.
+ let bidderReportURL1 = createBidderReportURL(uuid, /*id=*/1);
+ let bidderReportURL2 = createBidderReportURL(uuid, /*id=*/2);
+ let componentSeller1ReportURL = createSellerReportURL(uuid, /*id=*/"component1");
+ let componentSeller2ReportURL = createSellerReportURL(uuid, /*id=*/"component2");
+ let topLevelSellerReportURL = createSellerReportURL(uuid, /*id=*/"top");
+
+ await joinInterestGroup(
+ test, uuid,
+ { ads: [{ renderURL: renderURL1 }, { renderURL: renderURL2 }],
+ biddingLogicURL: createBiddingScriptURL(
+ { allowComponentAuction: true,
+ generateBid:
+ // "auctionSignals" contains the bid and the report URL, to
+ // make the same bidder behave differently in the two
+ // auctions.
+ 'return auctionSignals;',
+ reportWin:
+ `if (browserSignals.renderURL !== "${renderURL2}")
+ throw "Wrong winner: " + browserSignals.renderURL;
+ sendReportTo(auctionSignals.reportURL);`})});
+
+ let auctionConfig = createComponentAuctionConfig(uuid);
+
+ auctionConfig.componentAuctions[0].decisionLogicURL =
+ createDecisionScriptURL(
+ uuid,
+ { scoreAd:
+ `return {desirability: 10, allowComponentAuction: true};`,
+ reportResult:
+ `sendReportTo("${componentSeller1ReportURL}");` });
+ // "auctionSignals" contains the bid and the report URL, to
+ // make the same bidder behave differently in the two
+ // auctions.
+ auctionConfig.componentAuctions[0].auctionSignals = {
+ bid: 10,
+ allowComponentAuction: true,
+ render: renderURL1,
+ reportURL: bidderReportURL1
+ };
+
+ auctionConfig.componentAuctions[1] = {
+ ...auctionConfig.componentAuctions[0],
+ auctionSignals: {
+ bid: 2,
+ allowComponentAuction: true,
+ render: renderURL2,
+ reportURL: bidderReportURL2
+ },
+ decisionLogicURL: createDecisionScriptURL(
+ uuid,
+ { scoreAd:
+ `return {desirability: 1, allowComponentAuction: true};`,
+ reportResult:
+ `if (browserSignals.desirability !== 1)
+ throw "Unexpected component desirability: " + browserSignals.desirability;
+ if (browserSignals.renderURL !== "${renderURL2}")
+ throw "Wrong winner: " + browserSignals.renderURL;
+ sendReportTo("${componentSeller2ReportURL}");` })
+ }
+
+ auctionConfig.decisionLogicURL =
+ createDecisionScriptURL(
+ uuid,
+ { scoreAd:
+ `return {desirability: 11 - bid, allowComponentAuction: true};`,
+ reportResult:
+ `if (browserSignals.desirability !== 9)
+ throw "Unexpected component desirability: " + browserSignals.desirability;
+ if (browserSignals.renderURL !== "${renderURL2}")
+ throw "Wrong winner: " + browserSignals.renderURL;
+ sendReportTo("${topLevelSellerReportURL}");` });
+
+ await runBasicFledgeAuctionAndNavigate(test, uuid, auctionConfig);
+ await waitForObservedRequests(
+ uuid,
+ [bidderReportURL2, componentSeller2ReportURL, topLevelSellerReportURL]);
+}, 'Component auction desirability and renderURL two sellers, one bidder.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+
+ // The renderURLs / report URLs for the first/second iterations of the auction.
+ let renderURL1 = createRenderURL(uuid);
+ let renderURL2 = createRenderURL(uuid, /*script=*/';');
+ let bidderReportURL1 = createBidderReportURL(uuid, /*id=*/1);
+ let bidderReportURL2 = createBidderReportURL(uuid, /*id=*/2);
+ let seller1ReportURL = createSellerReportURL(uuid, /*id=*/1);
+ let seller2ReportURL = createSellerReportURL(uuid, /*id=*/2);
+
+ await joinInterestGroup(
+ test, uuid,
+ { ads: [{ renderURL: renderURL1 }, { renderURL: renderURL2 }],
+ biddingLogicURL: createBiddingScriptURL(
+ { allowComponentAuction: true,
+ generateBid:
+ `// If this is the first recorded win, use "renderURL1"
+ if (browserSignals.bidCount === 0 &&
+ browserSignals.prevWinsMs.length === 0) {
+ return {bid: 2, allowComponentAuction: true, render: "${renderURL1}"};
+ }
+
+ // Otherwise, check that a single bid and win were reported, despite the
+ // bidder bidding twice in the first auction, once for each component
+ // auction.
+ if (browserSignals.bidCount === 1 &&
+ browserSignals.prevWinsMs.length === 1 &&
+ typeof browserSignals.prevWinsMs[0][0] === "number" &&
+ browserSignals.prevWinsMs[0][1].renderURL === "${renderURL1}") {
+ return {bid: 1, allowComponentAuction: true, render: "${renderURL2}"};
+ }
+ throw "Unexpected biddingSignals: " + JSON.stringify(browserSignals);`,
+ reportWin:
+ `if (browserSignals.renderURL === "${renderURL1}")
+ sendReportTo("${bidderReportURL1}");
+ if (browserSignals.renderURL === "${renderURL2}")
+ sendReportTo("${bidderReportURL2}");`})});
+
+ // Auction has two component auctions with different sellers but the same
+ // single bidder. The first component auction only accepts bids with
+ // "renderURL1", the second only accepts bids with "renderURL2".
+ let auctionConfig = createComponentAuctionConfig(uuid);
+ auctionConfig.componentAuctions[0].decisionLogicURL =
+ createDecisionScriptURL(
+ uuid,
+ { scoreAd: `if (browserSignals.renderURL != '${renderURL1}')
+ throw 'Wrong ad';`,
+ reportResult: `sendReportTo('${seller1ReportURL}');`}
+ );
+
+ auctionConfig.componentAuctions[1] = {
+ seller: OTHER_ORIGIN1,
+ interestGroupBuyers: [window.location.origin],
+ decisionLogicURL: createDecisionScriptURL(
+ uuid,
+ { origin: OTHER_ORIGIN1,
+ scoreAd: `if (browserSignals.renderURL != '${renderURL2}')
+ throw 'Wrong ad';`,
+ reportResult: `sendReportTo('${seller2ReportURL}');`}
+ )
+ };
+
+ // In the first auction, the bidder should use "renderURL1", which the first
+ // component auction allows. `prevWinsMs` and `numBids` should be updated.
+ await runBasicFledgeAuctionAndNavigate(test, uuid, auctionConfig);
+ await waitForObservedRequests(
+ uuid,
+ [bidderReportURL1, seller1ReportURL]);
+
+ // In the second auction, the bidder should use "renderURL2", which the second
+ // component auction allows. `prevWinsMs` and `numBids` should reflect the updated
+ // value.
+ await runBasicFledgeAuctionAndNavigate(test, uuid, auctionConfig);
+ await waitForObservedRequests(
+ uuid,
+ [bidderReportURL1, seller1ReportURL, bidderReportURL2, seller2ReportURL]);
+}, `Component auction prevWinsMs and numBids updating in one component seller's auction, read in another's.`);