// 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'}]} });