| // 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 browserSignals: " + 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.`); |