blob: c78a27bb87a67cae52c411beb6990796afd95f42 [file] [log] [blame]
// 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-5
// META: variant=?6-10
// META: variant=?11-15
// META: variant=?16-last
"use strict;"
// These tests focus on making sure AuctionConfig fields are passed to seller worklets,
// and are normalized if necessary. This test does not check the behaviors of the
// fields.
const makeTest = ({
// Test name.
name,
// AuctionConfig field name.
fieldName,
// AuctionConfig field value, both expected in worklets and acution in the
// auction. If undefined, value will not be set in auctionConfig, and will
// be expected to also not be set in the auctionConfig passed to worklets.
fieldValue,
// Additional values to use in the AuctionConfig passed to runAdAuction().
// If it contains a value for the key specified in `fieldName`, that takes
// precedent over `fieldValue`.
auctionConfigOverrides = {}
}) => {
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
if (!(fieldName in auctionConfigOverrides) && fieldValue !== undefined)
auctionConfigOverrides[fieldName] = fieldValue;
let comparison = `deepEquals(auctionConfig["${fieldName}"], ${JSON.stringify(fieldValue)})`;
// In the case it's undefined, require value not to be set.
if (fieldValue === undefined)
comparison = `!("${fieldName}" in auctionConfig)`;
// Prefer to use `auctionConfigOverrides.seller` if present. Treat it as a URL
// and then convert it to an origin because one test passes in a URL.
let origin = location.origin;
if (auctionConfigOverrides.seller)
origin = new URL(auctionConfigOverrides.seller).origin;
auctionConfigOverrides.decisionLogicURL = createDecisionScriptURL(
uuid,
{ origin: origin,
scoreAd:
`if (!${comparison})
throw "Unexpected value: " + JSON.stringify(auctionConfig["${fieldName}"]);`,
reportResult:
`let error = '';
if (!${comparison})
error += "_unexpected_value:" + JSON.stringify(auctionConfig["${fieldName}"]);
sendReportTo("${createSellerReportURL(uuid)}" + error);` }),
// Join an interest group so the auction has a winner. The details of the
// interest group do not matter.
await joinInterestGroup(test, uuid);
await runBasicFledgeAuctionAndNavigate(test, uuid, auctionConfigOverrides);
await waitForObservedRequests(
uuid, [createBidderReportURL(uuid), createSellerReportURL(uuid)]);
}, name);
};
makeTest({
name: 'AuctionConfig.seller.',
fieldName: 'seller',
fieldValue: OTHER_ORIGIN1
});
makeTest({
name: 'AuctionConfig.seller with non-normalized origin.',
fieldName: 'seller',
fieldValue: OTHER_ORIGIN1,
auctionConfigOverrides: {seller: ` ${OTHER_ORIGIN1.toUpperCase()} `}
});
makeTest({
name: 'AuctionConfig.seller is URL.',
fieldName: 'seller',
fieldValue: OTHER_ORIGIN1,
auctionConfigOverrides: {seller: OTHER_ORIGIN1 + "/Foopy"}
});
makeTest({
name: 'AuctionConfig.trustedScoringSignalsURL passed to seller worklets.',
fieldName: 'trustedScoringSignalsURL',
fieldValue: `${OTHER_ORIGIN1}${BASE_PATH}this-file-does-not-exist.json`,
auctionConfigOverrides: {seller: OTHER_ORIGIN1}
});
makeTest({
name: 'AuctionConfig.trustedScoringSignalsURL with non-normalized values.',
fieldName: 'trustedScoringSignalsURL',
fieldValue: `${OTHER_ORIGIN1}${BASE_PATH}this-file-does-not-exist.json`,
auctionConfigOverrides: {
seller: OTHER_ORIGIN1,
trustedScoringSignalsURL:
`${OTHER_ORIGIN1.toUpperCase()}${BASE_PATH}this-file-does-not-exist.json`
}
});
makeTest({
name: 'AuctionConfig.trustedScoringSignalsKeys not set.',
fieldName: 'trustedScoringSignalsKeys',
fieldValue: undefined
});
makeTest({
name: 'AuctionConfig.interestGroupBuyers.',
fieldName: 'interestGroupBuyers',
fieldValue: [OTHER_ORIGIN1, location.origin, OTHER_ORIGIN2]
});
makeTest({
name: 'AuctionConfig.interestGroupBuyers with non-normalized values.',
fieldName: 'interestGroupBuyers',
fieldValue: [OTHER_ORIGIN1, location.origin, OTHER_ORIGIN2],
auctionConfigOverrides: {
interestGroupBuyers: [
` ${OTHER_ORIGIN1} `,
location.origin.toUpperCase(),
`${OTHER_ORIGIN2}/Foo`]
}
});
makeTest({
name: 'AuctionConfig.nonStandardField.',
fieldName: 'nonStandardField',
fieldValue: undefined,
aucitonConfigOverrides: {nonStandardField: 'This value should not be passed to worklets'}
});
makeTest({
name: 'AuctionConfig.requestedSize not set.',
fieldName: 'requestedSize',
fieldValue: undefined
});
makeTest({
name: 'AuctionConfig.requestedSize in pixels.',
fieldName: 'requestedSize',
fieldValue: {width: '100px', height: '200px'}
});
makeTest({
name: 'AuctionConfig.requestedSize in implicit pixels.',
fieldName: 'requestedSize',
fieldValue: {width: '100px', height: '200px'},
auctionConfigOverrides: {fieldValue: {width: '100', height: '200'}}
});
makeTest({
name: 'AuctionConfig.requestedSize in screen units.',
fieldName: 'requestedSize',
fieldValue: {width: '70sw', height: '80sh'}
});
makeTest({
name: 'AuctionConfig.requestedSize in inverse screen units.',
fieldName: 'requestedSize',
fieldValue: {width: '70sh', height: '80sw'}
});
makeTest({
name: 'AuctionConfig.requestedSize in mixed units.',
fieldName: 'requestedSize',
fieldValue: {width: '100px', height: '80sh'}
});
makeTest({
name: 'AuctionConfig.requestedSize with decimals.',
fieldName: 'requestedSize',
fieldValue: {width: '70.5sw', height: '80.56sh'}
});
makeTest({
name: 'AuctionConfig.requestedSize with non-normalized values.',
fieldName: 'requestedSize',
fieldValue: {width: '100px', height: '200.5px'},
auctionConfigOverrides: {fieldValue: {width: ' 100.0px', height: '200.50px'}}
});
makeTest({
name: 'Unset AuctionConfig.allSlotsRequestedSizes.',
fieldName: 'allSlotsRequestedSizes',
fieldValue: undefined
});
makeTest({
name: 'AuctionConfig.allSlotsRequestedSizes.',
fieldName: 'allSlotsRequestedSizes',
fieldValue: [{width: '100px', height: '200px'}, {width: '70sh', height: '80sw'}]
});
makeTest({
name: 'AuctionConfig.allSlotsRequestedSizes with non-normalized values.',
fieldName: 'allSlotsRequestedSizes',
fieldValue: [{width: '100px', height: '200.5px'},
{width: '70sh', height: '80.5sw'}],
auctionConfigOverrides: {fieldValue:
[{width: ' 100', height: '200.50px '},
{width: ' 70.00sh ', height: '80.50sw'}]}
});