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