diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
commit | 26a029d407be480d791972afb5975cf62c9360a6 (patch) | |
tree | f435a8308119effd964b339f76abb83a57c29483 /testing/web-platform/tests/fledge/tentative/component-auction.https.window.js | |
parent | Initial commit. (diff) | |
download | firefox-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.js | 719 |
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.`); |