// META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js // META: script=/common/utils.js // META: script=resources/fledge-util.sub.js // META: script=/common/subset-tests.js // META: timeout=long // META: variant=?1-5 // META: variant=?6-last "use strict"; const makeTest = ({ // Name of the test. name, // The value of the selectableReportingIds to be used in the test. selectableBuyerAndSellerReportingIds = undefined, // The value of the buyerAndSellerReportingId to be used in the test. buyerAndSellerReportingId = undefined, // The value of the buyerReportingId to be used in the test. buyerReportingId = undefined, // The javascript comparison to be used in generateBid() generateBidComparison, // what gets returned by generateBid() generateBidReturn, // The javascript comparison to be used in scoreAd() scoreAdComparison, // The javascript comparison to be used in reportWin() reportWinComparison, // The javascript comparison to be used in reportResult() reportResultComparison, // Whether we expect the auction to have a winner or not. expectWinner = true, }) => { subsetTest(promise_test, async test => { const uuid = generateUuid(test); let renderURL = createRenderURL(uuid); const bidderReportURL = createBidderReportURL(uuid); const sellerReportURL = createSellerReportURL(uuid); let interestGroupOverrides = {}; interestGroupOverrides.ads = [{ renderURL: renderURL, selectableBuyerAndSellerReportingIds: selectableBuyerAndSellerReportingIds, buyerAndSellerReportingId: buyerAndSellerReportingId, buyerReportingId: buyerReportingId, }]; interestGroupOverrides.biddingLogicURL = createBiddingScriptURL( { generateBid: ` if(${(generateBidComparison)}){ return ${generateBidReturn}; } throw "Failed comparison in generateBid: " + interestGroup["ads"][0]; `, reportWin: ` if(${reportWinComparison}) sendReportTo('${bidderReportURL}') else throw "Failed comparison in reportWin"; ` }); let auctionConfigOverrides = {}; auctionConfigOverrides.decisionLogicURL = createDecisionScriptURL( uuid, { scoreAd: ` if (${scoreAdComparison}){ return {desirability: 10, bid: 10} } throw "Failed comparison in scoreAd "; `, reportResult: ` if(${reportResultComparison}) sendReportTo("${sellerReportURL}"); else throw "Failed comparison in reportResult"; ` }); await joinInterestGroup(test, uuid, interestGroupOverrides); if (expectWinner) { await runBasicFledgeAuctionAndNavigate(test, uuid, auctionConfigOverrides); await waitForObservedRequests( uuid, [bidderReportURL, sellerReportURL]); } else { await runBasicFledgeTestExpectingNoWinner(test, uuid, auctionConfigOverrides); } }, name); }; // Verify that basic form of selectableReportingIds and selectedReportingId are where they should be. makeTest({ name: "selectableBuyerAndSellerReportingIds", selectableBuyerAndSellerReportingIds: ["selectable_id1", "selectable_id2"], generateBidComparison: `deepEquals(interestGroup["ads"][0].selectableBuyerAndSellerReportingIds, ["selectable_id1", "selectable_id2"])`, generateBidReturn: `{bid:10, render: interestGroup.ads[0].renderURL, selectedBuyerAndSellerReportingId:interestGroup.ads[0].selectableBuyerAndSellerReportingIds[0]}`, scoreAdComparison: `browserSignals.selectedBuyerAndSellerReportingId === "selectable_id1" && browserSignals.buyerAndSellerReportingId === undefined && browserSignals.buyerReportingId === undefined`, reportWinComparison: `browserSignals.selectedBuyerAndSellerReportingId === "selectable_id1" && browserSignals.buyerAndSellerReportingId === undefined && browserSignals.buyerReportingId === undefined`, reportResultComparison: `browserSignals.selectedBuyerAndSellerReportingId === "selectable_id1" && browserSignals.buyerAndSellerReportingId === undefined && browserSignals.buyerReportingId === undefined`, }); // Verify the buyer and seller reporting id is where we expect it when it is present alongside the selected reporting id. makeTest({ name: "selectableBuyerAndSellerReportingIds and buyerAndSellerReportingId", selectableBuyerAndSellerReportingIds: ["selectable_id1", "selectable_id2"], buyerAndSellerReportingId: "buyer_and_seller_reporting_id", generateBidComparison: `deepEquals(interestGroup["ads"][0].selectableBuyerAndSellerReportingIds, ["selectable_id1", "selectable_id2"]) && interestGroup["ads"][0].buyerAndSellerReportingId === "buyer_and_seller_reporting_id"`, generateBidReturn: `{bid:10, render: interestGroup.ads[0].renderURL, selectedBuyerAndSellerReportingId:interestGroup.ads[0].selectableBuyerAndSellerReportingIds[0]}`, scoreAdComparison: `browserSignals.selectedBuyerAndSellerReportingId === "selectable_id1" && browserSignals.buyerAndSellerReportingId === "buyer_and_seller_reporting_id" && browserSignals.buyerReportingId === undefined`, reportWinComparison: `browserSignals.selectedBuyerAndSellerReportingId === "selectable_id1" && browserSignals.buyerAndSellerReportingId === "buyer_and_seller_reporting_id" && browserSignals.buyerReportingId === undefined`, reportResultComparison: `browserSignals.selectedBuyerAndSellerReportingId === "selectable_id1" && browserSignals.buyerAndSellerReportingId === "buyer_and_seller_reporting_id" && browserSignals.buyerReportingId === undefined`, }); // Verify the buyer reporting id is where we expect it when it is present alongside the selected reporting id. makeTest({ name: "selectableBuyerAndSellerReportingIds and buyerReportingId", selectableBuyerAndSellerReportingIds: ["selectable_id1", "selectable_id2"], buyerReportingId: "buyer_reporting_id", generateBidComparison: `deepEquals(interestGroup["ads"][0].selectableBuyerAndSellerReportingIds, ["selectable_id1", "selectable_id2"]) && interestGroup["ads"][0].buyerReportingId === "buyer_reporting_id"`, generateBidReturn: `{bid:10, render: interestGroup.ads[0].renderURL, selectedBuyerAndSellerReportingId:interestGroup.ads[0].selectableBuyerAndSellerReportingIds[0]}`, scoreAdComparison: `browserSignals.selectedBuyerAndSellerReportingId === "selectable_id1" && browserSignals.buyerAndSellerReportingId === undefined && browserSignals.buyerReportingId === undefined`, reportWinComparison: `browserSignals.selectedBuyerAndSellerReportingId === "selectable_id1" && browserSignals.buyerAndSellerReportingId === undefined && browserSignals.buyerReportingId === "buyer_reporting_id"`, reportResultComparison: `browserSignals.selectedBuyerAndSellerReportingId === "selectable_id1" && browserSignals.buyerAndSellerReportingId === undefined && browserSignals.buyerReportingId === undefined`, }); // Verify all reporting ids are where we expect when they are all present alongside the selected reporting id. makeTest({ name: "selectableBuyerAndSellerReportingIds, buyerAndSellerReportingId, and buyerReportingId", selectableBuyerAndSellerReportingIds: ["selectable_id1", "selectable_id2"], buyerAndSellerReportingId: "buyer_and_seller_reporting_id", buyerReportingId: "buyer_reporting_id", generateBidComparison: `deepEquals(interestGroup["ads"][0].selectableBuyerAndSellerReportingIds, ["selectable_id1", "selectable_id2"]) && interestGroup["ads"][0].buyerAndSellerReportingId === "buyer_and_seller_reporting_id" && interestGroup["ads"][0].buyerReportingId === "buyer_reporting_id"`, generateBidReturn: `{bid:10, render: interestGroup.ads[0].renderURL, selectedBuyerAndSellerReportingId:interestGroup.ads[0].selectableBuyerAndSellerReportingIds[0]}`, scoreAdComparison: `browserSignals.selectedBuyerAndSellerReportingId === "selectable_id1" && browserSignals.buyerAndSellerReportingId === "buyer_and_seller_reporting_id" && browserSignals.buyerReportingId === undefined`, reportWinComparison: `browserSignals.selectedBuyerAndSellerReportingId === "selectable_id1" && browserSignals.buyerAndSellerReportingId === "buyer_and_seller_reporting_id" && browserSignals.buyerReportingId === "buyer_reporting_id"`, reportResultComparison: `browserSignals.selectedBuyerAndSellerReportingId === "selectable_id1" && browserSignals.buyerAndSellerReportingId === "buyer_and_seller_reporting_id" && browserSignals.buyerReportingId === undefined`, }); // Verify old behavior occurs when no id was selected, even though there was selectable ids. makeTest({ name: "selectableBuyerAndSellerReportingIds but none selected, buyerAndSellerReportingId, and buyerReportingId", selectableBuyerAndSellerReportingIds: ["selectable_id1", "selectable_id2"], buyerAndSellerReportingId: "buyer_and_seller_reporting_id", buyerReportingId: "buyer_reporting_id", generateBidComparison: `deepEquals(interestGroup["ads"][0].selectableBuyerAndSellerReportingIds, ["selectable_id1", "selectable_id2"]) && interestGroup["ads"][0].buyerAndSellerReportingId === "buyer_and_seller_reporting_id" && interestGroup["ads"][0].buyerReportingId === "buyer_reporting_id"`, generateBidReturn: `{bid:10, render: interestGroup.ads[0].renderURL}`, scoreAdComparison: `browserSignals.selectedBuyerAndSellerReportingId === undefined && browserSignals.buyerAndSellerReportingId === undefined && browserSignals.buyerReportingId === undefined`, reportWinComparison: `browserSignals.selectedBuyerAndSellerReportingId === undefined && browserSignals.buyerAndSellerReportingId === "buyer_and_seller_reporting_id" && browserSignals.buyerReportingId === undefined`, reportResultComparison: `browserSignals.selectedBuyerAndSellerReportingId === undefined && browserSignals.buyerAndSellerReportingId === "buyer_and_seller_reporting_id" && browserSignals.buyerReportingId === undefined`, }); // Make sure if there was a selectedReportingId that's not within the selectables, // that the worklet throws an error and the auction does not have a winner. makeTest({ name: "selected not included selectables", selectableBuyerAndSellerReportingIds: ["selectable_id1", "selectable_id2"], buyerAndSellerReportingId: "buyer_and_seller_reporting_id", buyerReportingId: "buyer_reporting_id", generateBidComparison: `deepEquals(interestGroup["ads"][0].selectableBuyerAndSellerReportingIds, ["selectable_id1", "selectable_id2"]) && interestGroup["ads"][0].buyerAndSellerReportingId === "buyer_and_seller_reporting_id" && interestGroup["ads"][0].buyerReportingId === "buyer_reporting_id"`, generateBidReturn: `{bid:10, render: interestGroup.ads[0].renderURL, selectedBuyerAndSellerReportingId:"invalid_id"}`, scoreAdComparison: `browserSignals.selectedBuyerAndSellerReportingId === undefined && browserSignals.buyerAndSellerReportingId === undefined && browserSignals.buyerReportingId === undefined`, reportWinComparison: `false`, reportResultComparison: `false"`, expectWinner: false }); // Make sure if there was a selectedReportingId but no selectables, // that the worklet throws an error and the auction does not have a winner makeTest({ name: "selected without selectables", buyerAndSellerReportingId: "buyer_and_seller_reporting_id", buyerReportingId: "buyer_reporting_id", generateBidComparison: `interestGroup["ads"][0].selectableBuyerAndSellerReportingIds === undefined && interestGroup["ads"][0].buyerAndSellerReportingId === undefined && interestGroup["ads"][0].buyerReportingId === undefined`, generateBidReturn: `{bid:10, render: interestGroup.ads[0].renderURL, selectedBuyerAndSellerReportingId:"invalid_id"}`, scoreAdComparison: `browserSignals.selectedBuyerAndSellerReportingId === undefined && browserSignals.buyerAndSellerReportingId === undefined && browserSignals.buyerReportingId === undefined`, reportWinComparison: `false`, reportResultComparison: `false`, expectWinner: false }); // Verify old behavior occurs when there are no present selectable ids. makeTest({ name: "buyerAndSellerReportingId, and buyerReportingId, but no selectables present", buyerAndSellerReportingId: "buyer_and_seller_reporting_id", buyerReportingId: "buyer_reporting_id", generateBidComparison: `interestGroup["ads"][0].selectableBuyerAndSellerReportingIds === undefined && interestGroup["ads"][0].buyerAndSellerReportingId === undefined && interestGroup["ads"][0].buyerReportingId === undefined`, generateBidReturn: `{bid:10, render: interestGroup.ads[0].renderURL}`, scoreAdComparison: `browserSignals.selectedBuyerAndSellerReportingId === undefined && browserSignals.buyerAndSellerReportingId === undefined && browserSignals.buyerReportingId === undefined`, reportWinComparison: `browserSignals.selectedBuyerAndSellerReportingId === undefined && browserSignals.buyerAndSellerReportingId === "buyer_and_seller_reporting_id" && browserSignals.buyerReportingId === undefined`, reportResultComparison: `browserSignals.selectedBuyerAndSellerReportingId === undefined && browserSignals.buyerAndSellerReportingId === "buyer_and_seller_reporting_id" && browserSignals.buyerReportingId === undefined`, }); makeTest({ name: "only buyerAndSellerReportingId", buyerAndSellerReportingId: "buyer_and_seller_reporting_id", generateBidComparison: `interestGroup["ads"][0].selectableBuyerAndSellerReportingIds === undefined && interestGroup["ads"][0].buyerAndSellerReportingId === undefined && interestGroup["ads"][0].buyerReportingId === undefined`, generateBidReturn: `{bid:10, render: interestGroup.ads[0].renderURL}`, scoreAdComparison: `browserSignals.selectedBuyerAndSellerReportingId === undefined && browserSignals.buyerAndSellerReportingId === undefined && browserSignals.buyerReportingId === undefined`, reportWinComparison: `browserSignals.selectedBuyerAndSellerReportingId === undefined && browserSignals.buyerAndSellerReportingId === "buyer_and_seller_reporting_id" && browserSignals.buyerReportingId === undefined`, reportResultComparison: `browserSignals.selectedBuyerAndSellerReportingId === undefined && browserSignals.buyerAndSellerReportingId === "buyer_and_seller_reporting_id" && browserSignals.buyerReportingId === undefined`, }); makeTest({ name: "only buyerReportingId", buyerReportingId: "buyer_reporting_id", generateBidComparison: `interestGroup["ads"][0].selectableBuyerAndSellerReportingIds === undefined && interestGroup["ads"][0].buyerAndSellerReportingId === undefined && interestGroup["ads"][0].buyerReportingId === undefined`, generateBidReturn: `{bid:10, render: interestGroup.ads[0].renderURL}`, scoreAdComparison: `browserSignals.selectedBuyerAndSellerReportingId === undefined && browserSignals.buyerAndSellerReportingId === undefined && browserSignals.buyerReportingId === undefined`, reportWinComparison: `browserSignals.selectedBuyerAndSellerReportingId === undefined && browserSignals.buyerAndSellerReportingId === undefined && browserSignals.buyerReportingId === "buyer_reporting_id"`, reportResultComparison: `browserSignals.selectedBuyerAndSellerReportingId === undefined && browserSignals.buyerAndSellerReportingId === undefined && browserSignals.buyerReportingId === undefined`, }); makeTest({ name: "no reporting ids, expect IG name", generateBidComparison: `interestGroup["ads"][0].selectableBuyerAndSellerReportingIds === undefined && interestGroup["ads"][0].buyerAndSellerReportingId === undefined && interestGroup["ads"][0].buyerReportingId === undefined`, generateBidReturn: `{bid:10, render: interestGroup.ads[0].renderURL}`, scoreAdComparison: `browserSignals.selectedBuyerAndSellerReportingId === undefined && browserSignals.buyerAndSellerReportingId === undefined && browserSignals.buyerReportingId === undefined`, reportWinComparison: `browserSignals.selectedBuyerAndSellerReportingId === undefined && browserSignals.buyerAndSellerReportingId === undefined && browserSignals.buyerReportingId === undefined && browserSignals.interestGroupName === "default name"`, reportResultComparison: `browserSignals.selectedBuyerAndSellerReportingId === undefined && browserSignals.buyerAndSellerReportingId === undefined && browserSignals.buyerReportingId === undefined`, });