summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/fledge/tentative/currency.https.window.js
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/fledge/tentative/currency.https.window.js')
-rw-r--r--testing/web-platform/tests/fledge/tentative/currency.https.window.js874
1 files changed, 874 insertions, 0 deletions
diff --git a/testing/web-platform/tests/fledge/tentative/currency.https.window.js b/testing/web-platform/tests/fledge/tentative/currency.https.window.js
new file mode 100644
index 0000000000..9a33d12148
--- /dev/null
+++ b/testing/web-platform/tests/fledge/tentative/currency.https.window.js
@@ -0,0 +1,874 @@
+// META: script=/resources/testdriver.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-4
+// META: variant=?5-8
+// META: variant=?9-12
+// META: variant=?13-16
+// META: variant=?17-20
+// META: variant=?21-24
+// META: variant=?25-28
+// META: variant=?29-32
+// META: variant=?33-last
+
+'use strict;'
+
+const ORIGIN = window.location.origin;
+
+// The tests in this file focus on calls to runAdAuction involving currency
+// handling.
+
+// Joins an interest group that bids 9USD on window.location.origin, and one
+// that bids 10CAD on OTHER_ORIGIN1, each with a reportWin() report.
+async function joinTwoCurrencyGroups(test, uuid) {
+ const reportWinURL = createBidderReportURL(uuid, 'USD');
+ const biddingURL = createBiddingScriptURL(
+ {bidCurrency: 'USD', reportWin: `sendReportTo('${reportWinURL}')`});
+ await joinInterestGroup(test, uuid, {biddingLogicURL: biddingURL});
+
+ const otherReportWinURL = createBidderReportURL(uuid, 'CAD', OTHER_ORIGIN1);
+ const otherBiddingURL = createBiddingScriptURL({
+ origin: OTHER_ORIGIN1,
+ bid: 10,
+ bidCurrency: 'CAD',
+ reportWin: `sendReportTo('${otherReportWinURL}')`
+ });
+ await joinCrossOriginInterestGroup(
+ test, uuid, OTHER_ORIGIN1, {biddingLogicURL: otherBiddingURL});
+}
+
+function createBiddingScriptURLWithCurrency(uuid, currency) {
+ return createBiddingScriptURL({
+ bidCurrency: currency,
+ allowComponentAuction: true,
+ reportWin: `
+ sendReportTo('${createBidderReportURL(uuid, /*id=*/ '')}' +
+ browserSignals.bid + browserSignals.bidCurrency);`,
+ });
+}
+
+// Creates a component-auction eligible bidding script returning a bid `bid` in
+// currency `currency`. It provides a reporting handler that logs bid and
+// highestScoringOtherBid along with their currencies.
+function createBiddingScriptURLForHighestScoringOther(uuid, bid, currency) {
+ return createBiddingScriptURL({
+ bid: bid,
+ bidCurrency: currency,
+ allowComponentAuction: true,
+ generateBid: `
+ forDebuggingOnly.reportAdAuctionWin(
+ '${createBidderReportURL(uuid, /*id=*/ 'dbg_')}' +
+ '\${winningBid}\${winningBidCurrency}_' +
+ '\${highestScoringOtherBid}\${highestScoringOtherBidCurrency}');`,
+ reportWin: `
+ sendReportTo(
+ '${createBidderReportURL(uuid, /*id=*/ '')}' +
+ browserSignals.bid + browserSignals.bidCurrency +
+ '_' + browserSignals.highestScoringOtherBid +
+ browserSignals.highestScoringOtherBidCurrency);`,
+ });
+}
+
+function createDecisionURLExpectCurrency(uuid, currencyInScore) {
+ return createDecisionScriptURL(uuid, {
+ scoreAd: `
+ if (browserSignals.bidCurrency !== '${currencyInScore}')
+ throw 'Wrong currency';`,
+ reportResult: `
+ sendReportTo('${createSellerReportURL(uuid, /*id=*/ '')}' +
+ browserSignals.bid + browserSignals.bidCurrency);`,
+ });
+}
+
+// Creates a component-auction seller script, which by default just scores
+// bid * 2, but the `conversion` argument can be used to customize bid
+// modification and currenct conversion.
+//
+// The script provides a reporting handler that logs bid and
+// highestScoringOtherBid along with their currencies as well as `suffix`.
+function createDecisionURLForHighestScoringOther(
+ uuid, conversion = '', suffix = '') {
+ return createDecisionScriptURL(uuid, {
+ scoreAd: `
+ forDebuggingOnly.reportAdAuctionWin(
+ '${createSellerReportURL(uuid, /*id=*/ 'dbg_')}' + '${suffix}' +
+ '\${winningBid}\${winningBidCurrency}_' +
+ '\${highestScoringOtherBid}\${highestScoringOtherBidCurrency}');
+ let converted = undefined;
+ let modified = undefined;
+ let modifiedCurrency = undefined;
+ ${conversion}
+ return {desirability: 2 * bid,
+ incomingBidInSellerCurrency: converted,
+ bid: modified,
+ bidCurrency: modifiedCurrency,
+ allowComponentAuction: true};
+ `,
+ reportResult: `
+ sendReportTo(
+ '${createSellerReportURL(uuid, /*id=*/ '')}' + '${suffix}' +
+ browserSignals.bid + browserSignals.bidCurrency +
+ '_' + browserSignals.highestScoringOtherBid +
+ browserSignals.highestScoringOtherBidCurrency);`,
+ });
+}
+
+// Joins groups for 9USD and 10USD, with reporting including
+// highestScoringOtherBid.
+async function joinTwoGroupsForHighestScoringOther(test, uuid) {
+ await joinInterestGroup(test, uuid, {
+ name: 'group-9USD',
+ biddingLogicURL:
+ createBiddingScriptURLForHighestScoringOther(uuid, /*bid=*/ 9, 'USD')
+ });
+ await joinInterestGroup(test, uuid, {
+ name: 'group-10USD',
+ biddingLogicURL:
+ createBiddingScriptURLForHighestScoringOther(uuid, /*bid=*/ 10, 'USD')
+ });
+}
+
+async function runCurrencyComponentAuction(test, uuid, params = {}) {
+ let auctionConfigOverrides = {
+ interestGroupBuyers: [],
+ decisionLogicURL: createDecisionScriptURL(uuid, {
+ reportResult: `
+ sendReportTo('${createSellerReportURL(uuid, 'top_')}' +
+ browserSignals.bid + browserSignals.bidCurrency)`,
+ ...params.topLevelSellerScriptParamsOverride
+ }),
+ componentAuctions: [{
+ seller: ORIGIN,
+ decisionLogicURL: createDecisionScriptURL(uuid, {
+ reportResult: `
+ sendReportTo('${createSellerReportURL(uuid, 'component_')}' +
+ browserSignals.bid + browserSignals.bidCurrency)`,
+ ...params.componentSellerScriptParamsOverride
+ }),
+ interestGroupBuyers: [ORIGIN],
+ ...params.componentAuctionConfigOverrides
+ }],
+ ...params.topLevelAuctionConfigOverrides
+ };
+ return await runBasicFledgeAuction(test, uuid, auctionConfigOverrides);
+}
+
+// Runs a component auction with reporting scripts that report bid and
+// highestScoringOtherBid, along with their currencies.
+//
+// Customization points in `params` are:
+// componentAuctionConfigOverrides, topLevelAuctionConfigOverrides:
+// edit auctionConfig for given auction level.
+//
+// topLevelConversion and componentConversion:
+// Permit customizing how the scoring function does currency conversiona and
+// bid modification. See createDecisionURLForHighestScoringOther().
+async function runCurrencyComponentAuctionForHighestScoringOther(
+ test, uuid, params = {}) {
+ let auctionConfigOverrides = {
+ interestGroupBuyers: [],
+ decisionLogicURL: createDecisionURLForHighestScoringOther(
+ uuid, params.topLevelConversion || '', 'top_'),
+ componentAuctions: [{
+ seller: ORIGIN,
+ decisionLogicURL: createDecisionURLForHighestScoringOther(
+ uuid, params.componentConversion || '', 'component_'),
+ interestGroupBuyers: [ORIGIN],
+ ...params.componentAuctionConfigOverrides
+ }],
+ ...params.topLevelAuctionConfigOverrides
+ };
+ return await runBasicFledgeAuction(test, uuid, auctionConfigOverrides);
+}
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+ await joinInterestGroup(
+ test, uuid,
+ {biddingLogicURL: createBiddingScriptURL({bidCurrency: 'usd'})});
+ await runBasicFledgeTestExpectingNoWinner(test, uuid);
+}, 'Returning bid with invalid currency.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+ await joinInterestGroup(
+ test, uuid,
+ {biddingLogicURL: createBiddingScriptURLWithCurrency(uuid, 'USD')});
+ await runBasicFledgeAuctionAndNavigate(
+ test, uuid,
+ {decisionLogicURL: createDecisionURLExpectCurrency(uuid, 'USD')});
+ await waitForObservedRequests(uuid, [
+ createSellerReportURL(uuid, '9???'), createBidderReportURL(uuid, '9???')
+ ]);
+}, 'Returning bid with currency, configuration w/o currency.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+ await joinInterestGroup(
+ test, uuid,
+ {biddingLogicURL: createBiddingScriptURLWithCurrency(uuid, undefined)});
+ await runBasicFledgeAuctionAndNavigate(test, uuid, {
+ perBuyerCurrencies: {'*': 'USD'},
+ decisionLogicURL: createDecisionURLExpectCurrency(uuid, '???')
+ });
+ await waitForObservedRequests(uuid, [
+ createSellerReportURL(uuid, '9USD'), createBidderReportURL(uuid, '9USD')
+ ]);
+}, 'Returning bid w/o currency, configuration w/currency.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+ await joinInterestGroup(
+ test, uuid,
+ {biddingLogicURL: createBiddingScriptURLWithCurrency(uuid, 'USD')});
+ await runBasicFledgeAuctionAndNavigate(test, uuid, {
+ perBuyerCurrencies: {'*': 'USD'},
+ decisionLogicURL: createDecisionURLExpectCurrency(uuid, 'USD')
+ });
+ await waitForObservedRequests(uuid, [
+ createSellerReportURL(uuid, '9USD'), createBidderReportURL(uuid, '9USD')
+ ]);
+}, 'Returning bid w/currency, configuration w/matching currency.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+ await joinInterestGroup(
+ test, uuid,
+ {biddingLogicURL: createBiddingScriptURL({bidCurrency: 'USD'})});
+ await runBasicFledgeTestExpectingNoWinner(
+ test, uuid, {perBuyerCurrencies: {'*': 'CAD'}});
+}, 'Returning bid w/currency, configuration w/different currency.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+ await joinTwoCurrencyGroups(test, uuid);
+ let auctionConfigOverrides = {
+ interestGroupBuyers: [ORIGIN, OTHER_ORIGIN1],
+ perBuyerCurrencies: {}
+ };
+ auctionConfigOverrides.perBuyerCurrencies['*'] = 'USD';
+ auctionConfigOverrides.perBuyerCurrencies[OTHER_ORIGIN1] = 'CAD';
+ await runBasicFledgeAuctionAndNavigate(test, uuid, auctionConfigOverrides);
+
+ // Since the scoring script doesn't actually look at the currencies,
+ // We expect 10CAD to win because 10 > 9
+ await waitForObservedRequests(uuid, [
+ createBidderReportURL(uuid, 'CAD', OTHER_ORIGIN1),
+ createSellerReportURL(uuid)
+ ]);
+}, 'Different currencies for different origins, all match.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+ await joinTwoCurrencyGroups(test, uuid);
+ let auctionConfigOverrides = {
+ interestGroupBuyers: [ORIGIN, OTHER_ORIGIN1],
+ perBuyerCurrencies: {}
+ };
+ auctionConfigOverrides.perBuyerCurrencies[ORIGIN] = 'USD';
+ auctionConfigOverrides.perBuyerCurrencies[OTHER_ORIGIN1] = 'EUR';
+ await runBasicFledgeAuctionAndNavigate(test, uuid, auctionConfigOverrides);
+
+ // Since the configuration for CAD script expects EUR only the USD bid goes
+ // through.
+ await waitForObservedRequests(
+ uuid, [createBidderReportURL(uuid, 'USD'), createSellerReportURL(uuid)]);
+}, 'Different currencies for different origins, USD one matches.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+ await joinTwoCurrencyGroups(test, uuid);
+ let auctionConfigOverrides = {
+ interestGroupBuyers: [ORIGIN, OTHER_ORIGIN1],
+ perBuyerCurrencies: {}
+ };
+ auctionConfigOverrides.perBuyerCurrencies['*'] = 'EUR';
+}, 'Different currencies for different origins, none match.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+ await joinInterestGroup(
+ test, uuid,
+ {biddingLogicURL: createBiddingScriptURLWithCurrency(uuid, 'USD')});
+ let config = await runCurrencyComponentAuction(test, uuid, {
+ topLevelSellerScriptParamsOverride: {
+ scoreAd: `
+ if (browserSignals.bidCurrency !== 'USD')
+ throw 'Wrong currency';`
+ }
+ });
+ expectSuccess(config);
+ createAndNavigateFencedFrame(test, config);
+ // While scoring sees the original currency tag, reporting currency tags are
+ // config-based.
+ await waitForObservedRequests(uuid, [
+ createSellerReportURL(uuid, 'top_9???'),
+ createSellerReportURL(uuid, 'component_9???'),
+ createBidderReportURL(uuid, '9???')
+ ]);
+}, 'Multi-seller auction --- no currency restriction.');
+
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+ await joinInterestGroup(
+ test, uuid,
+ {biddingLogicURL: createBiddingScriptURLWithCurrency(uuid, 'USD')});
+ let config = await runCurrencyComponentAuction(test, uuid, {
+ componentAuctionConfigOverrides: {sellerCurrency: 'USD'},
+ topLevelSellerScriptParamsOverride: {
+ scoreAd: `
+ if (browserSignals.bidCurrency !== 'USD')
+ throw 'Wrong currency';`
+ }
+ });
+ expectSuccess(config);
+ createAndNavigateFencedFrame(test, config);
+ // Because component's sellerCurrency is USD, the bid it makes is seen to be
+ // in dollars by top-level reporting. That doesn't affect reporting in its
+ // own auction.
+ await waitForObservedRequests(uuid, [
+ createSellerReportURL(uuid, 'top_9USD'),
+ createSellerReportURL(uuid, 'component_9???'),
+ createBidderReportURL(uuid, '9???')
+ ]);
+}, 'Multi-seller auction --- component sellerCurrency matches bid.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+ await joinInterestGroup(
+ test, uuid,
+ {biddingLogicURL: createBiddingScriptURLWithCurrency(uuid, 'USD')});
+ let config = await runCurrencyComponentAuction(test, uuid, {
+ componentAuctionConfigOverrides: {sellerCurrency: 'EUR'},
+ componentSellerScriptParamsOverride: {
+ scoreAd: `
+ return {desirability: 2 * bid, allowComponentAuction: true,
+ bid: 1.5 * bid, bidCurrency: 'EUR'}
+ `
+ },
+ topLevelSellerScriptParamsOverride: {
+ scoreAd: `
+ if (browserSignals.bidCurrency !== 'EUR')
+ throw 'Wrong currency';`
+ }
+ });
+ expectSuccess(config);
+ createAndNavigateFencedFrame(test, config);
+ // Because component's sellerCurrency is USD, the bid it makes is seen to be
+ // in dollars by top-level reporting. That doesn't affect reporting in its
+ // own auction.
+ await waitForObservedRequests(uuid, [
+ createSellerReportURL(uuid, 'top_13.5EUR'),
+ createSellerReportURL(uuid, 'component_9???'),
+ createBidderReportURL(uuid, '9???')
+ ]);
+}, 'Multi-seller auction --- component scoreAd modifies bid into its sellerCurrency.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+ await joinInterestGroup(
+ test, uuid,
+ {biddingLogicURL: createBiddingScriptURLWithCurrency(uuid, 'USD')});
+ let config = await runCurrencyComponentAuction(test, uuid, {
+ componentAuctionConfigOverrides: {sellerCurrency: 'EUR'},
+ componentSellerScriptParamsOverride: {
+ scoreAd: `
+ return {desirability: 2 * bid, allowComponentAuction: true,
+ bid: 1.5 * bid}
+ `
+ },
+ topLevelSellerScriptParamsOverride: {
+ scoreAd: `
+ // scoreAd sees what's actually passed in.
+ if (browserSignals.bidCurrency !== '???')
+ throw 'Wrong currency';`
+ }
+ });
+ expectSuccess(config);
+ createAndNavigateFencedFrame(test, config);
+ await waitForObservedRequests(uuid, [
+ createSellerReportURL(uuid, 'top_13.5EUR'),
+ createSellerReportURL(uuid, 'component_9???'),
+ createBidderReportURL(uuid, '9???')
+ ]);
+}, 'Multi-seller auction --- component scoreAd modifies bid, no explicit currency.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+ await joinInterestGroup(
+ test, uuid,
+ {biddingLogicURL: createBiddingScriptURLWithCurrency(uuid, 'USD')});
+ let config = await runCurrencyComponentAuction(test, uuid, {
+ componentAuctionConfigOverrides:
+ {sellerCurrency: 'EUR', perBuyerCurrencies: {'*': 'USD'}},
+ componentSellerScriptParamsOverride: {
+ scoreAd: `
+ return {desirability: 2 * bid, allowComponentAuction: true,
+ bid: 1.5 * bid}
+ `
+ },
+ topLevelSellerScriptParamsOverride: {
+ scoreAd: `
+ // scoreAd sees what's actually passed in.
+ if (browserSignals.bidCurrency !== '???')
+ throw 'Wrong currency';`
+ }
+ });
+ expectSuccess(config);
+ createAndNavigateFencedFrame(test, config);
+ await waitForObservedRequests(uuid, [
+ createSellerReportURL(uuid, 'top_13.5EUR'),
+ createSellerReportURL(uuid, 'component_9USD'),
+ createBidderReportURL(uuid, '9USD')
+ ]);
+}, 'Multi-seller auction --- component scoreAd modifies bid, bidder has bidCurrency.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+ await joinInterestGroup(
+ test, uuid,
+ {biddingLogicURL: createBiddingScriptURLWithCurrency(uuid, 'USD')});
+ let config = await runCurrencyComponentAuction(test, uuid, {
+ componentAuctionConfigOverrides: {perBuyerCurrencies: {'*': 'USD'}},
+ componentSellerScriptParamsOverride: {
+ scoreAd: `
+ return {desirability: 2 * bid, allowComponentAuction: true,
+ bid: 1.5 * bid}
+ `
+ },
+ topLevelSellerScriptParamsOverride: {
+ scoreAd: `
+ // scoreAd sees what's actually passed in.
+ if (browserSignals.bidCurrency !== '???')
+ throw 'Wrong currency';`
+ }
+ });
+ expectSuccess(config);
+ createAndNavigateFencedFrame(test, config);
+ await waitForObservedRequests(uuid, [
+ createSellerReportURL(uuid, 'top_13.5???'),
+ createSellerReportURL(uuid, 'component_9USD'),
+ createBidderReportURL(uuid, '9USD')
+ ]);
+}, 'Multi-seller auction --- only bidder currency specified.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+ await joinInterestGroup(
+ test, uuid,
+ {biddingLogicURL: createBiddingScriptURLWithCurrency(uuid, 'USD')});
+ let config = await runCurrencyComponentAuction(test, uuid, {
+ componentAuctionConfigOverrides: {perBuyerCurrencies: {'*': 'USD'}},
+ componentSellerScriptParamsOverride: {
+ scoreAd: `
+ return {desirability: 2 * bid, allowComponentAuction: true,
+ bid: 1.5 * bid, bidCurrency: 'CAD'}
+ `
+ },
+ topLevelSellerScriptParamsOverride: {
+ scoreAd: `
+ // scoreAd sees what's actually passed in.
+ if (browserSignals.bidCurrency !== 'CAD')
+ throw 'Wrong currency';`
+ }
+ });
+ expectSuccess(config);
+ createAndNavigateFencedFrame(test, config);
+ await waitForObservedRequests(uuid, [
+ createSellerReportURL(uuid, 'top_13.5???'),
+ createSellerReportURL(uuid, 'component_9USD'),
+ createBidderReportURL(uuid, '9USD')
+ ]);
+}, 'Multi-seller auction --- only bidder currency in config, component uses explicit currency.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+ await joinInterestGroup(test, uuid, {
+ biddingLogicURL:
+ createBiddingScriptURLWithCurrency(uuid, /*bidCurrency=*/ undefined)
+ });
+ let config = await runCurrencyComponentAuction(test, uuid, {
+ componentAuctionConfigOverrides: {sellerCurrency: 'CAD'},
+ componentSellerScriptParamsOverride: {
+ scoreAd: `
+ return {desirability: 2 * bid, allowComponentAuction: true,
+ incomingBidInSellerCurrency: 12345}
+ `
+ },
+ topLevelSellerScriptParamsOverride: {
+ scoreAd: `
+ // scoreAd sees what's actually passed in.
+ if (bid != 9)
+ throw 'Wrong bid';
+ if (browserSignals.bidCurrency !== '???')
+ throw 'Wrong currency';`
+ }
+ });
+ expectSuccess(config);
+ createAndNavigateFencedFrame(test, config);
+ await waitForObservedRequests(uuid, [
+ createSellerReportURL(uuid, 'top_9CAD'),
+ createSellerReportURL(uuid, 'component_9???'),
+ createBidderReportURL(uuid, '9???')
+ ]);
+}, 'Multi-seller auction --- incomingBidInSellerCurrency does not go to top-level; component sellerCurrency does.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+ await joinInterestGroup(
+ test, uuid,
+ {biddingLogicURL: createBiddingScriptURLWithCurrency(uuid, 'USD')});
+ let result = await runCurrencyComponentAuction(test, uuid, {
+ componentAuctionConfigOverrides: {sellerCurrency: 'EUR'},
+ componentSellerScriptParamsOverride: {
+ scoreAd: `
+ return {desirability: 2 * bid, allowComponentAuction: true,
+ bid: 1.5 * bid, bidCurrency: 'CAD'}
+ `
+ }
+ });
+ expectNoWinner(result);
+}, 'Multi-seller auction --- component scoreAd modifies bid to wrong currency.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+ await joinInterestGroup(
+ test, uuid,
+ {biddingLogicURL: createBiddingScriptURLWithCurrency(uuid, 'USD')});
+ let topLevelConfigOverride = {perBuyerCurrencies: {}};
+ topLevelConfigOverride.perBuyerCurrencies[ORIGIN] = 'USD';
+ let config = await runCurrencyComponentAuction(test, uuid, {
+ topLevelAuctionConfigOverrides: topLevelConfigOverride,
+ topLevelSellerScriptParamsOverride: {
+ scoreAd: `
+ if (browserSignals.bidCurrency !== 'USD')
+ throw 'Wrong currency';`
+ }
+ });
+ expectSuccess(config);
+ createAndNavigateFencedFrame(test, config);
+ // Because component is constrained by perBuyerCurrencies for it on top-level
+ // to USD, the bid it makes is seen to be in dollars by top-level reporting.
+ // That doesn't affect reporting in its own auction.
+ await waitForObservedRequests(uuid, [
+ createSellerReportURL(uuid, 'top_9USD'),
+ createSellerReportURL(uuid, 'component_9???'),
+ createBidderReportURL(uuid, '9???')
+ ]);
+}, 'Multi-seller auction --- top-level perBuyerCurrencies matches bid.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+ await joinInterestGroup(
+ test, uuid,
+ {biddingLogicURL: createBiddingScriptURLWithCurrency(uuid, 'USD')});
+ let topLevelConfigOverride = {perBuyerCurrencies: {}};
+ topLevelConfigOverride.perBuyerCurrencies[ORIGIN] = 'USD';
+ let config = await runCurrencyComponentAuction(test, uuid, {
+ componentAuctionConfigOverrides: {sellerCurrency: 'USD'},
+ topLevelAuctionConfigOverrides: topLevelConfigOverride,
+ topLevelSellerScriptParamsOverride: {
+ scoreAd: `
+ if (browserSignals.bidCurrency !== 'USD')
+ throw 'Wrong currency';`
+ }
+ });
+ expectSuccess(config);
+ createAndNavigateFencedFrame(test, config);
+ // Because component is constrained by perBuyerCurrencies for it on top-level
+ // to USD, the bid it makes is seen to be in dollars by top-level reporting.
+ // That doesn't affect reporting in its own auction.
+ await waitForObservedRequests(uuid, [
+ createSellerReportURL(uuid, 'top_9USD'),
+ createSellerReportURL(uuid, 'component_9???'),
+ createBidderReportURL(uuid, '9???')
+ ]);
+}, 'Multi-seller auction --- consistent sellerConfig and top-level perBuyerCurrencies.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+ await joinInterestGroup(
+ test, uuid,
+ {biddingLogicURL: createBiddingScriptURLWithCurrency(uuid, 'USD')});
+ let topLevelConfigOverride = {perBuyerCurrencies: {}};
+ topLevelConfigOverride.perBuyerCurrencies[ORIGIN] = 'EUR';
+ let result = await runCurrencyComponentAuction(test, uuid, {
+ componentAuctionConfigOverrides: {sellerCurrency: 'USD'},
+ topLevelAuctionConfigOverrides: topLevelConfigOverride,
+ topLevelSellerScriptParamsOverride: {
+ scoreAd: `
+ if (browserSignals.bidCurrency !== 'USD')
+ throw 'Wrong currency';`
+ }
+ });
+ expectNoWinner(result);
+}, 'Multi-seller auction --- inconsistent sellerConfig and top-level perBuyerCurrencies.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+ await joinInterestGroup(
+ test, uuid,
+ {biddingLogicURL: createBiddingScriptURLWithCurrency(uuid, 'USD')});
+ let topLevelConfigOverride = {perBuyerCurrencies: {}};
+ topLevelConfigOverride.perBuyerCurrencies[ORIGIN] = 'EUR';
+
+ let result = await runCurrencyComponentAuction(
+ test, uuid, {componentAuctionConfigOverrides: topLevelConfigOverride});
+ expectNoWinner(result);
+}, 'Multi-seller auction --- top-level perBuyerCurrencies different from bid.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+ await joinInterestGroup(
+ test, uuid,
+ {biddingLogicURL: createBiddingScriptURLWithCurrency(uuid, 'USD')});
+ let result = await runCurrencyComponentAuction(
+ test, uuid, {componentAuctionConfigOverrides: {sellerCurrency: 'EUR'}});
+ expectNoWinner(result);
+}, 'Multi-seller auction --- component sellerCurrency different from bid.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+ await joinInterestGroup(test, uuid);
+ await runBasicFledgeTestExpectingNoWinner(test, uuid, {
+ decisionLogicURL: createDecisionScriptURL(uuid, {
+ scoreAd: `
+ return {desirability: 2 * bid,
+ incomingBidInSellerCurrency: 5* bid}
+ `
+ })
+ });
+}, 'Trying to use incomingBidInSellerCurrency w/o sellerCurrency set.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+ await joinInterestGroup(test, uuid);
+ await runBasicFledgeTestExpectingWinner(test, uuid, {
+ decisionLogicURL: createDecisionScriptURL(uuid, {
+ scoreAd: `
+ return {desirability: 2 * bid,
+ incomingBidInSellerCurrency: 5* bid}
+ `,
+ }),
+ sellerCurrency: 'USD'
+ });
+}, 'Trying to use incomingBidInSellerCurrency w/sellerCurrency set.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+ await joinInterestGroup(
+ test, uuid,
+ {biddingLogicURL: createBiddingScriptURLWithCurrency(uuid, 'USD')});
+ await runBasicFledgeTestExpectingNoWinner(test, uuid, {
+ decisionLogicURL: createDecisionScriptURL(uuid, {
+ scoreAd: `
+ return {desirability: 2 * bid,
+ incomingBidInSellerCurrency: 5* bid}
+ `
+ }),
+ sellerCurrency: 'USD'
+ });
+}, 'Trying to use incomingBidInSellerCurrency to change bid already in that currency.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+ await joinInterestGroup(
+ test, uuid,
+ {biddingLogicURL: createBiddingScriptURLWithCurrency(uuid, 'USD')});
+ await runBasicFledgeTestExpectingWinner(test, uuid, {
+ decisionLogicURL: createDecisionScriptURL(uuid, {
+ scoreAd: `
+ return {desirability: 2 * bid,
+ incomingBidInSellerCurrency: bid}
+ `
+ }),
+ sellerCurrency: 'USD'
+ });
+}, 'incomingBidInSellerCurrency repeating value of bid already in that currency is OK.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+ await joinTwoGroupsForHighestScoringOther(test, uuid);
+ await runBasicFledgeAuctionAndNavigate(
+ test, uuid,
+ {decisionLogicURL: createDecisionURLForHighestScoringOther(uuid)});
+ await waitForObservedRequests(uuid, [
+ createSellerReportURL(uuid, '10???_9???'),
+ createBidderReportURL(uuid, '10???_9???'),
+ // w/o sellerCurrency set, forDebuggingOnly reports original values and ???
+ // as tags.
+ createSellerReportURL(uuid, 'dbg_10???_9???'),
+ createBidderReportURL(uuid, 'dbg_10???_9???')
+ ]);
+}, 'Converted currency use with no sellerCurrency set.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+ await joinTwoGroupsForHighestScoringOther(test, uuid);
+ await runBasicFledgeAuctionAndNavigate(test, uuid, {
+ decisionLogicURL: createDecisionURLForHighestScoringOther(uuid),
+ sellerCurrency: 'USD'
+ });
+ await waitForObservedRequests(uuid, [
+ createSellerReportURL(uuid, '10???_9USD'),
+ createBidderReportURL(uuid, '10???_9USD'),
+ // w/sellerCurrency set, forDebuggingOnly reports converted bids +
+ // sellerCurrency.
+ createSellerReportURL(uuid, 'dbg_10USD_9USD'),
+ createBidderReportURL(uuid, 'dbg_10USD_9USD')
+ ]);
+}, 'Converted currency use with sellerCurrency set matching.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+ await joinTwoGroupsForHighestScoringOther(test, uuid);
+ await runBasicFledgeAuctionAndNavigate(test, uuid, {
+ decisionLogicURL: createDecisionURLForHighestScoringOther(uuid),
+ sellerCurrency: 'EUR'
+ });
+ await waitForObservedRequests(uuid, [
+ createSellerReportURL(uuid, '10???_0EUR'),
+ createBidderReportURL(uuid, '10???_0EUR'),
+ // sellerCurrency set, and no bid available in it: get 0s.
+ createSellerReportURL(uuid, 'dbg_0EUR_0EUR'),
+ createBidderReportURL(uuid, 'dbg_0EUR_0EUR')
+ ]);
+}, 'Converted currency use with sellerCurrency different, no conversion.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+ await joinTwoGroupsForHighestScoringOther(test, uuid);
+ await runBasicFledgeAuctionAndNavigate(test, uuid, {
+ decisionLogicURL:
+ createDecisionURLForHighestScoringOther(uuid, 'converted = 3 * bid'),
+ sellerCurrency: 'EUR'
+ });
+ await waitForObservedRequests(uuid, [
+ createSellerReportURL(uuid, '10???_27EUR'),
+ createBidderReportURL(uuid, '10???_27EUR'),
+ // sellerCurrency set, converted bids.
+ createSellerReportURL(uuid, 'dbg_30EUR_27EUR'),
+ createBidderReportURL(uuid, 'dbg_30EUR_27EUR')
+ ]);
+}, 'Converted currency use with sellerCurrency different, conversion.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+ await joinTwoGroupsForHighestScoringOther(test, uuid);
+ let result =
+ await runCurrencyComponentAuctionForHighestScoringOther(test, uuid, {
+ componentConversion: `
+ modified = bid + 1;
+ modifiedCurrency = 'EUR';`,
+ componentAuctionConfigOverrides: {sellerCurrency: 'EUR'}
+ });
+ expectSuccess(result);
+ createAndNavigateFencedFrame(test, result);
+ await waitForObservedRequests(uuid, [
+ createSellerReportURL(uuid, 'top_11EUR_0???'),
+ createSellerReportURL(uuid, 'component_10???_0EUR'),
+ createBidderReportURL(uuid, '10???_0EUR'),
+ // forDebuggingOnly info w/sellerCurrency set relies on conversion;
+ // but sellerCurrency is on component auction only.
+ createBidderReportURL(uuid, 'dbg_0EUR_0EUR'),
+ createSellerReportURL(uuid, 'dbg_component_0EUR_0EUR'),
+ createSellerReportURL(uuid, 'dbg_top_11???_0???'),
+ ]);
+}, 'Modified bid does not act in place of incomingBidInSellerCurrency.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+ await joinTwoGroupsForHighestScoringOther(test, uuid);
+ let result =
+ await runCurrencyComponentAuctionForHighestScoringOther(test, uuid, {
+ componentConversion: `
+ modified = bid + 1;
+ modifiedCurrency = 'EUR';
+ converted = bid - 1;`,
+ componentAuctionConfigOverrides: {sellerCurrency: 'EUR'}
+ });
+ expectSuccess(result);
+ createAndNavigateFencedFrame(test, result);
+ await waitForObservedRequests(uuid, [
+ createSellerReportURL(uuid, 'top_11EUR_0???'),
+ createSellerReportURL(uuid, 'component_10???_8EUR'),
+ createBidderReportURL(uuid, '10???_8EUR'),
+ // Debug at component shows converted; top-level has no sellerCurrency,
+ // so shows modified.
+ createBidderReportURL(uuid, 'dbg_9EUR_8EUR'),
+ createSellerReportURL(uuid, 'dbg_component_9EUR_8EUR'),
+ createSellerReportURL(uuid, 'dbg_top_11???_0???'),
+ ]);
+}, 'Both modified bid and incomingBidInSellerCurrency.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+ await joinTwoGroupsForHighestScoringOther(test, uuid);
+ let result =
+ await runCurrencyComponentAuctionForHighestScoringOther(test, uuid, {
+ componentConversion: `
+ modified = bid + 1;
+ modifiedCurrency = 'CAD';`,
+ topLevelAuctionConfigOverrides: {sellerCurrency: 'EUR'},
+ topLevelConversion: `converted = 3 * bid;`,
+ });
+ expectSuccess(result);
+ createAndNavigateFencedFrame(test, result);
+ await waitForObservedRequests(uuid, [
+ createSellerReportURL(uuid, 'top_11???_0???'),
+ createSellerReportURL(uuid, 'component_10???_9???'),
+ createBidderReportURL(uuid, '10???_9???'),
+ // No sellerCurrency at component; debug at top-level shows the result of
+ // conversion.
+ createBidderReportURL(uuid, 'dbg_10???_9???'),
+ createSellerReportURL(uuid, 'dbg_component_10???_9???'),
+ createSellerReportURL(uuid, 'dbg_top_33EUR_0???'),
+ ]);
+}, 'incomingBidInSellerCurrency at top-level trying to convert is OK.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+ await joinTwoGroupsForHighestScoringOther(test, uuid);
+ let result =
+ await runCurrencyComponentAuctionForHighestScoringOther(test, uuid, {
+ componentConversion: `
+ modified = bid + 1;
+ modifiedCurrency = 'EUR';`,
+ topLevelAuctionConfigOverrides: {sellerCurrency: 'EUR'},
+ topLevelConversion: `converted = 3 * bid;`,
+ });
+ // Tried to change a bid that was already in EUR.
+ expectNoWinner(result);
+}, 'incomingBidInSellerCurrency at top-level trying to change bid is not OK.');
+
+subsetTest(promise_test, async test => {
+ const uuid = generateUuid(test);
+ await joinTwoGroupsForHighestScoringOther(test, uuid);
+ let result =
+ await runCurrencyComponentAuctionForHighestScoringOther(test, uuid, {
+ componentConversion: `
+ modified = bid + 1;
+ modifiedCurrency = 'EUR';`,
+ topLevelAuctionConfigOverrides: {sellerCurrency: 'EUR'},
+ topLevelConversion: `converted = bid;`,
+ });
+ // Changing the bid to itself when it was already in right currency is OK.
+ expectSuccess(result);
+ createAndNavigateFencedFrame(test, result);
+ await waitForObservedRequests(uuid, [
+ createSellerReportURL(uuid, 'top_11???_0???'),
+ createSellerReportURL(uuid, 'component_10???_9???'),
+ createBidderReportURL(uuid, '10???_9???'),
+ // No sellerCurrency at component; debug at top-level shows the result of
+ // no-op conversion.
+ createBidderReportURL(uuid, 'dbg_10???_9???'),
+ createSellerReportURL(uuid, 'dbg_component_10???_9???'),
+ createSellerReportURL(uuid, 'dbg_top_11EUR_0???'),
+ ]);
+}, 'incomingBidInSellerCurrency at top-level doing a no-op conversion OK.');
+
+// TODO: PrivateAggregation. It follows the same rules as
+// highestScoringOtherBid, but is actually visible at top-level.