// 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-last
"use strict;"
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
await fetchDirectFromSellerSignals({ 'Buyer-Origin': window.location.origin });
await runReportTest(
test, uuid,
directFromSellerSignalsValidatorCode(
uuid, /*expectedSellerSignals=*/ null,
/*expectedAuctionSignals=*/ null, /*expectedPerBuyerSignals=*/ null),
// expectedReportURLs
[createSellerReportURL(uuid), createBidderReportURL(uuid)],
// renderURLOverride
null,
// auctionConfigOverrides
{directFromSellerSignalsHeaderAdSlot: 'adSlot/0'});
}, 'Test directFromSellerSignals with empty Ad-Auction-Signals header.');
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
await fetchDirectFromSellerSignals({ 'Buyer-Origin': window.location.origin });
await runReportTest(
test, uuid,
directFromSellerSignalsValidatorCode(
uuid, 'sellerSignals/1',
/*expectedAuctionSignals=*/null, /*expectedPerBuyerSignals=*/null),
// expectedReportURLs
[createSellerReportURL(uuid), createBidderReportURL(uuid)],
// renderURLOverride
null,
// auctionConfigOverrides
{ directFromSellerSignalsHeaderAdSlot: 'adSlot/1' }
);
}, 'Test directFromSellerSignals with only sellerSignals.');
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
await fetchDirectFromSellerSignals({ 'Buyer-Origin': window.location.origin });
await runReportTest(
test, uuid,
directFromSellerSignalsValidatorCode(
uuid, /*expectedSellerSignals=*/null,
'auctionSignals/2', /*expectedPerBuyerSignals=*/null),
// expectedReportURLs
[createSellerReportURL(uuid), createBidderReportURL(uuid)],
// renderURLOverride
null,
// auctionConfigOverrides
{ directFromSellerSignalsHeaderAdSlot: 'adSlot/2' }
);
}, 'Test directFromSellerSignals with only auctionSignals.');
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
await fetchDirectFromSellerSignals({ 'Buyer-Origin': window.location.origin });
await runReportTest(
test, uuid,
directFromSellerSignalsValidatorCode(
uuid, /*expectedSellerSignals=*/null,
/*expectedAuctionSignals=*/null, 'perBuyerSignals/3'),
// expectedReportURLs
[createSellerReportURL(uuid), createBidderReportURL(uuid)],
// renderURLOverride
null,
// auctionConfigOverrides
{ directFromSellerSignalsHeaderAdSlot: 'adSlot/3' }
);
}, 'Test directFromSellerSignals with only perBuyerSignals.');
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
await fetchDirectFromSellerSignals({ 'Buyer-Origin': window.location.origin });
await runReportTest(
test, uuid,
directFromSellerSignalsValidatorCode(
uuid, 'sellerSignals/4',
'auctionSignals/4', 'perBuyerSignals/4'),
// expectedReportURLs
[createSellerReportURL(uuid), createBidderReportURL(uuid)],
// renderURLOverride
null,
// auctionConfigOverrides
{ directFromSellerSignalsHeaderAdSlot: 'adSlot/4' }
);
}, 'Test directFromSellerSignals with sellerSignals, auctionSignals and perBuyerSignals.');
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
await fetchDirectFromSellerSignals({ 'Buyer-Origin': window.location.origin });
await runReportTest(
test, uuid,
directFromSellerSignalsValidatorCode(
uuid, 'sellerSignals/1',
/*expectedAuctionSignals=*/null, /*expectedPerBuyerSignals=*/null),
// expectedReportURLs
[createSellerReportURL(uuid), createBidderReportURL(uuid)],
// renderURLOverride
null,
// auctionConfigOverrides
{ directFromSellerSignalsHeaderAdSlot: 'adSlot/1' }
);
await runReportTest(
test, uuid,
directFromSellerSignalsValidatorCode(
uuid, /*expectedSellerSignals=*/null,
'auctionSignals/2', /*expectedPerBuyerSignals=*/null),
// expectedReportURLs
[createSellerReportURL(uuid), createBidderReportURL(uuid)],
// renderURLOverride
null,
// auctionConfigOverrides
{ directFromSellerSignalsHeaderAdSlot: 'adSlot/2' }
);
}, 'Test directFromSellerSignals with single fetch and multiple auctions');
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
const ad_slot = Promise.resolve('adSlot/4');
await fetchDirectFromSellerSignals({ 'Buyer-Origin': window.location.origin });
await runReportTest(
test, uuid,
directFromSellerSignalsValidatorCode(
uuid, 'sellerSignals/4',
'auctionSignals/4', 'perBuyerSignals/4'),
// expectedReportURLs
[createSellerReportURL(uuid), createBidderReportURL(uuid)],
// renderURLOverride
null,
// auctionConfigOverrides
{ directFromSellerSignalsHeaderAdSlot: ad_slot }
);
}, 'Test directFromSellerSignals with resolved promise ad slot.');
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
await fetchDirectFromSellerSignals({ 'Buyer-Origin': window.location.origin });
await joinInterestGroup(test, uuid);
const adSlot = Promise.reject(new Error('This is a rejected promise.'));
let auctionConfig =
{ seller: window.location.origin,
interestGroupBuyers: [window.location.origin],
resolveToConfig: true,
decisionLogicURL: createDecisionScriptURL(uuid),
directFromSellerSignalsHeaderAdSlot: adSlot };
try {
await navigator.runAdAuction(auctionConfig);
} catch(e) {
assert_true(e instanceof TypeError);
return;
}
throw "Exception unexpectedly not thrown.";
}, 'Test directFromSellerSignals with rejected promise ad slot.');
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
const validator = directFromSellerSignalsValidatorCode(
uuid, 'sellerSignals/4',
'auctionSignals/4', 'perBuyerSignals/4');
let reportResult = `if (!(${validator.reportResultSuccessCondition})) {
sendReportTo('${createSellerReportURL(uuid, 'error')}');
return false;
}
${validator.reportResult}`;
let reportWin = `if (!(${validator.reportWinSuccessCondition})) {
sendReportTo('${createBidderReportURL(uuid, 'error')}');
return false;
}
${validator.reportWin}`;
let decisionScriptURLParams = { scoreAd : validator.scoreAd,
reportResult : reportResult };
let biddingScriptURLParams = { generateBid : validator.generateBid,
reportWin : reportWin };
let interestGroupOverrides =
{ biddingLogicURL: createBiddingScriptURL(biddingScriptURLParams) };
await joinInterestGroup(test, uuid, interestGroupOverrides);
let adSlotResolve = null;
const adSlotPromise = new Promise((resolve, reject) => { adSlotResolve = resolve });
let auctionConfig =
{ seller: window.location.origin,
interestGroupBuyers: [window.location.origin],
resolveToConfig: true,
decisionLogicURL: createDecisionScriptURL(uuid, decisionScriptURLParams),
directFromSellerSignalsHeaderAdSlot: adSlotPromise };
let resultPromise = navigator.runAdAuction(auctionConfig);
await fetchDirectFromSellerSignals({ 'Buyer-Origin': window.location.origin });
adSlotResolve('adSlot/4');
let result = await resultPromise;
createAndNavigateFencedFrame(test, result);
await waitForObservedRequests(uuid, [createSellerReportURL(uuid), createBidderReportURL(uuid)]);
}, 'Test directFromSellerSignals that runAdAuction will wait until the promise of fetch is resolved.');
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
await fetchDirectFromSellerSignals({ 'Buyer-Origin': window.location.origin });
await runReportTest(
test, uuid,
directFromSellerSignalsValidatorCode(
uuid, 'sellerSignals/5',
'auctionSignals/5', /*expectedPerBuyerSignals=*/null),
// expectedReportURLs
[createSellerReportURL(uuid), createBidderReportURL(uuid)],
// renderURLOverride
null,
// auctionConfigOverrides
{ directFromSellerSignalsHeaderAdSlot: 'adSlot/5' }
);
}, 'Test directFromSellerSignals with mismatched perBuyerSignals.');
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
await fetchDirectFromSellerSignals({ 'Buyer-Origin': '*' });
await runReportTest(
test, uuid,
directFromSellerSignalsValidatorCode(
uuid, 'sellerSignals/5',
'auctionSignals/5', /*expectedPerBuyerSignals=*/null),
// expectedReportURLs
[createSellerReportURL(uuid), createBidderReportURL(uuid)],
// renderURLOverride
null,
// auctionConfigOverrides
{ directFromSellerSignalsHeaderAdSlot: 'adSlot/5' }
);
}, 'Test directFromSellerSignals does not support wildcard for buyerOrigin of perBuyerSignals.');
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
await fetchDirectFromSellerSignals({ 'Buyer-Origin': window.location.origin });
await runReportTest(
test, uuid,
directFromSellerSignalsValidatorCode(
uuid, /*expectedSellerSignals=*/null,
/*expectedAuctionSignals=*/null, /*expectedPerBuyerSignals=*/null),
// expectedReportURLs
[createSellerReportURL(uuid), createBidderReportURL(uuid)],
// renderURLOverride
null,
// auctionConfigOverrides
{ directFromSellerSignalsHeaderAdSlot: 'adSlot/non-exist' }
);
}, 'Test directFromSellerSignals with non-existent adSlot.');
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
await fetchDirectFromSellerSignals({ 'Buyer-Origin': window.location.origin });
await runReportTest(
test, uuid,
directFromSellerSignalsValidatorCode(
uuid, /*expectedSellerSignals=*/null,
/*expectedAuctionSignals=*/null, /*expectedPerBuyerSignals=*/null),
[createSellerReportURL(uuid), createBidderReportURL(uuid)],
// renderURLOverride
null,
// auctionConfigOverrides
{ directFromSellerSignalsHeaderAdSlot: null }
);
}, 'Test directFromSellerSignals with null directFromSellerSignalsHeaderAdSlot.');
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
await fetchDirectFromSellerSignals({ 'Buyer-Origin': window.location.origin });
await runReportTest(
test, uuid,
directFromSellerSignalsValidatorCode(
uuid, /*expectedSellerSignals=*/null,
/*expectedAuctionSignals=*/null, /*expectedPerBuyerSignals=*/null),
[createSellerReportURL(uuid), createBidderReportURL(uuid)]
);
}, 'Test directFromSellerSignals with no directFromSellerSignalsHeaderAdSlot.');
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
await fetchDirectFromSellerSignals({ 'Negative-Test-Option': 'HTTP Error' });
await runReportTest(
test, uuid,
directFromSellerSignalsValidatorCode(
uuid, /*expectedSellerSignals=*/null,
/*expectedAuctionSignals=*/null, /*expectedPerBuyerSignals=*/null),
// expectedReportURLs
[createSellerReportURL(uuid), createBidderReportURL(uuid)],
// renderURLOverride
null,
// auctionConfigOverrides
{ directFromSellerSignalsHeaderAdSlot: 'adSlot' }
);
}, 'Test directFromSellerSignals with HTTP error.');
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
await fetchDirectFromSellerSignals({ 'Negative-Test-Option': 'No Ad-Auction-Signals Header' });
await runReportTest(
test, uuid,
directFromSellerSignalsValidatorCode(
uuid, /*expectedSellerSignals=*/null,
/*expectedAuctionSignals=*/null, /*expectedPerBuyerSignals=*/null),
// expectedReportURLs
[createSellerReportURL(uuid), createBidderReportURL(uuid)],
// renderURLOverride
null,
// auctionConfigOverrides
{ directFromSellerSignalsHeaderAdSlot: 'adSlot' }
);
}, 'Test directFromSellerSignals with no returned Ad-Auction-Signals Header.');
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
await fetchDirectFromSellerSignals({ 'Negative-Test-Option': 'Invalid Json' });
await runReportTest(
test, uuid,
directFromSellerSignalsValidatorCode(
uuid, /*expectedSellerSignals=*/null,
/*expectedAuctionSignals=*/null, /*expectedPerBuyerSignals=*/null),
// expectedReportURLs
[createSellerReportURL(uuid), createBidderReportURL(uuid)],
// renderURLOverride
null,
// auctionConfigOverrides
{ directFromSellerSignalsHeaderAdSlot: 'adSlot' }
);
}, 'Test directFromSellerSignals with invalid json in Ad-Auction-Signals header.');
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
let codeToInsert = directFromSellerSignalsValidatorCode(
uuid, /*expectedSellerSignals=*/null,
/*expectedAuctionSignals=*/null, /*expectedPerBuyerSignals=*/null);
codeToInsert.decisionScriptURLOrigin = OTHER_ORIGIN1;
await fetchDirectFromSellerSignals({ 'Buyer-Origin': window.location.origin });
await runReportTest(
test, uuid, codeToInsert,
// expectedReportURLs
[createSellerReportURL(uuid), createBidderReportURL(uuid)],
// renderURLOverride
null,
// auctionConfigOverrides
{ directFromSellerSignalsHeaderAdSlot: 'adSlot/4',
seller: OTHER_ORIGIN1 }
);
}, 'Test directFromSellerSignals with different fetch and seller origins.');
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
let codeToInsert = directFromSellerSignalsValidatorCode(
uuid, 'sellerSignals/4',
'auctionSignals/4', 'perBuyerSignals/4');
codeToInsert.decisionScriptURLOrigin = OTHER_ORIGIN1;
await fetchDirectFromSellerSignals({ 'Buyer-Origin': window.location.origin }, OTHER_ORIGIN1);
await runReportTest(
test, uuid, codeToInsert,
// expectedReportURLs
[createSellerReportURL(uuid), createBidderReportURL(uuid)],
// renderURLOverride
null,
// auctionConfigOverrides
{ directFromSellerSignalsHeaderAdSlot: 'adSlot/4',
seller: OTHER_ORIGIN1 }
);
}, 'Test directFromSellerSignals with same fetch and seller origins.');
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
let iframe = await createIframe(test, OTHER_ORIGIN1);
await runInFrame(test, iframe, `await joinInterestGroup(test_instance, "${uuid}");`);
await fetchDirectFromSellerSignals({ 'Buyer-Origin': OTHER_ORIGIN1 });
await runReportTest(
test, uuid,
directFromSellerSignalsValidatorCode(
uuid, 'sellerSignals/4',
'auctionSignals/4', 'perBuyerSignals/4'),
// expectedReportURLs
[createSellerReportURL(uuid), createBidderReportURL(uuid, '1', OTHER_ORIGIN1)],
// renderURLOverride
null,
// auctionConfigOverrides
{ directFromSellerSignalsHeaderAdSlot: 'adSlot/4',
interestGroupBuyers: [OTHER_ORIGIN1] }
);
}, 'Test directFromSellerSignals different interest group owner origin from top frame.');
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
let iframe = await createIframe(test, OTHER_ORIGIN1, "join-ad-interest-group; run-ad-auction");
await fetchDirectFromSellerSignals({ 'Buyer-Origin': OTHER_ORIGIN1 }, OTHER_ORIGIN1);
await runInFrame(
test, iframe,
`await runReportTest(
test_instance, "${uuid}",
directFromSellerSignalsValidatorCode(
"${uuid}", 'sellerSignals/4', 'auctionSignals/4', 'perBuyerSignals/4'),
// expectedReportURLs
[createSellerReportURL("${uuid}"), createBidderReportURL("${uuid}")],
// renderURLOverride
null,
// auctionConfigOverrides
{ directFromSellerSignalsHeaderAdSlot: 'adSlot/4' })`);
}, 'Test directFromSellerSignals with fetching in top frame and running auction in iframe.');
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
let iframe = await createIframe(test, OTHER_ORIGIN1, "join-ad-interest-group; run-ad-auction");
await runInFrame(
test, iframe,
`await fetchDirectFromSellerSignals({ 'Buyer-Origin': window.location.origin });
await runReportTest(
test_instance, "${uuid}",
directFromSellerSignalsValidatorCode(
"${uuid}", 'sellerSignals/4',
'auctionSignals/4', 'perBuyerSignals/4'),
// expectedReportURLs
[createSellerReportURL("${uuid}"), createBidderReportURL("${uuid}")],
// renderURLOverride
null,
// auctionConfigOverrides
{ directFromSellerSignalsHeaderAdSlot: 'adSlot/4' })`);
}, 'Test directFromSellerSignals with fetching and running auction in the same iframe.');
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
let iframe1 = await createIframe(test, OTHER_ORIGIN1);
let iframe2 = await createIframe(test, OTHER_ORIGIN2, "join-ad-interest-group; run-ad-auction");
await runInFrame(
test, iframe1,
`await fetchDirectFromSellerSignals({ 'Buyer-Origin': OTHER_ORIGIN2 }, OTHER_ORIGIN2);`);
await runInFrame(
test, iframe2,
`await runReportTest(
test_instance, "${uuid}",
directFromSellerSignalsValidatorCode(
"${uuid}", 'sellerSignals/4',
'auctionSignals/4', 'perBuyerSignals/4'),
// expectedReportURLs
[createSellerReportURL("${uuid}"), createBidderReportURL("${uuid}")],
// renderURLOverride
null,
// auctionConfigOverrides
{ directFromSellerSignalsHeaderAdSlot: 'adSlot/4' })`);
}, 'Test directFromSellerSignals with fetching in iframe 1 and running auction in iframe 2.');
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
let iframe = await createIframe(test, OTHER_ORIGIN1);
await runInFrame(
test, iframe,
`await fetchDirectFromSellerSignals(
{ 'Buyer-Origin': "${window.location.origin}" }, "${window.location.origin}");`);
await runReportTest(
test, uuid,
directFromSellerSignalsValidatorCode(
uuid, 'sellerSignals/4',
'auctionSignals/4', 'perBuyerSignals/4'),
// expectedReportURLs
[createSellerReportURL(uuid), createBidderReportURL(uuid)],
// renderURLOverride
null,
// auctionConfigOverrides
{ directFromSellerSignalsHeaderAdSlot: 'adSlot/4'}
);
}, 'Test directFromSellerSignals with fetching in iframe and running auction in top frame.');
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
await fetchDirectFromSellerSignals({ 'Negative-Test-Option': 'Network Error' });
await runReportTest(
test, uuid,
directFromSellerSignalsValidatorCode(
uuid, 'sellerSignals',
'auctionSignals', /*expectedPerBuyerSignals=*/null),
// expectedReportURLs
[createSellerReportURL(uuid), createBidderReportURL(uuid)],
// renderURLOverride
null,
// auctionConfigOverrides
{ directFromSellerSignalsHeaderAdSlot: 'adSlot' }
);
}, 'Test directFromSellerSignals with network error.');
subsetTest(promise_test, async test => {
let dfss = false;
navigator.runAdAuction({
get directFromSellerSignalsHeaderAdSlot() { dfss = true; }
}).catch((e) => {});
assert_true(dfss);
}, 'Test directFromSellerSignals feature detection.');
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
await fetchDirectFromSellerSignals({ 'Buyer-Origin': window.location.origin });
await fetchDirectFromSellerSignals(
{ 'Buyer-Origin': window.location.origin, 'Alternative-Response': 'Overwrite adSlot/1'});
await runReportTest(
test, uuid,
directFromSellerSignalsValidatorCode(
uuid, 'altSellerSignals/1',
/*expectedAuctionSignals=*/null, /*expectedPerBuyerSignals=*/null),
// expectedReportURLs
[createSellerReportURL(uuid), createBidderReportURL(uuid)],
// renderURLOverride
null,
// auctionConfigOverrides
{ directFromSellerSignalsHeaderAdSlot: 'adSlot/1' }
);
}, 'Test directFromSellerSignals with 2 responses -- the later overwrites the former.');
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
await fetchDirectFromSellerSignals({ 'Buyer-Origin': window.location.origin });
await fetchDirectFromSellerSignals(
{ 'Buyer-Origin': window.location.origin, 'Alternative-Response': 'Overwrite adSlot/1'});
await fetchDirectFromSellerSignals(
{ 'Buyer-Origin': window.location.origin, 'Alternative-Response': 'Overwrite adSlot/1 v2'});
await runReportTest(
test, uuid,
directFromSellerSignalsValidatorCode(
uuid, 'altV2SellerSignals/1',
/*expectedAuctionSignals=*/null, /*expectedPerBuyerSignals=*/null),
// expectedReportURLs
[createSellerReportURL(uuid), createBidderReportURL(uuid)],
// renderURLOverride
null,
// auctionConfigOverrides
{ directFromSellerSignalsHeaderAdSlot: 'adSlot/1' }
);
}, 'Test directFromSellerSignals with 3 responses -- the last response overwrites the former responses.');
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
await fetchDirectFromSellerSignals({ 'Buyer-Origin': window.location.origin });
await fetchDirectFromSellerSignals(
{ 'Buyer-Origin': window.location.origin, 'Alternative-Response': 'Overwrite adSlot/1'});
await runReportTest(
test, uuid,
directFromSellerSignalsValidatorCode(
uuid, /*expectedSellerSignals=*/null,
'auctionSignals/2', /*expectedPerBuyerSignals=*/null),
// expectedReportURLs
[createSellerReportURL(uuid), createBidderReportURL(uuid)],
// renderURLOverride
null,
// auctionConfigOverrides
{ directFromSellerSignalsHeaderAdSlot: 'adSlot/2' }
);
}, 'Test directFromSellerSignals with 2 responses -- old non-overwritten ad slot remains.');
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
await fetchDirectFromSellerSignals(
{ 'Buyer-Origin': window.location.origin, 'Alternative-Response': 'Duplicate adSlot/1'});
await runReportTest(
test, uuid,
directFromSellerSignalsValidatorCode(
uuid, 'firstSellerSignals/1',
/*expectedAuctionSignals=*/null, /*expectedPerBuyerSignals=*/null),
// expectedReportURLs
[createSellerReportURL(uuid), createBidderReportURL(uuid)],
// renderURLOverride
null,
// auctionConfigOverrides
{ directFromSellerSignalsHeaderAdSlot: 'adSlot/1' }
);
}, 'Test invalid directFromSellerSignals with duplicate adSlot in response -- the second is ignored.');
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
await fetchDirectFromSellerSignals(
{ 'Buyer-Origin': window.location.origin, 'Alternative-Response': 'Duplicate adSlot/1'});
await runReportTest(
test, uuid,
directFromSellerSignalsValidatorCode(
uuid, 'nonDupSellerSignals/2',
/*expectedAuctionSignals=*/null, /*expectedPerBuyerSignals=*/null),
// expectedReportURLs
[createSellerReportURL(uuid), createBidderReportURL(uuid)],
// renderURLOverride
null,
// auctionConfigOverrides
{ directFromSellerSignalsHeaderAdSlot: 'adSlot/2' }
);
}, 'Test invalid directFromSellerSignals with duplicate adSlot in response, selecting a non duplicated adSlot.');
subsetTest(promise_test, async test => {
const uuid = generateUuid(test);
await fetchDirectFromSellerSignals(
{ 'Buyer-Origin': window.location.origin,
'Alternative-Response': 'Two keys with same values'});
await runReportTest(
test, uuid,
directFromSellerSignalsValidatorCode(
uuid, 'sameSellerSignals',
'sameAuctionSignals', 'samePerBuyerSignals'),
// expectedReportURLs
[createSellerReportURL(uuid), createBidderReportURL(uuid)],
// renderURLOverride
null,
// auctionConfigOverrides
{ directFromSellerSignalsHeaderAdSlot: 'adSlot/1' }
);
}, 'Test invalid directFromSellerSignals with duplicate values in response.');