| // META: script=/resources/testdriver.js |
| // META: script=/resources/testdriver-vendor.js |
| // META: script=/common/get-host-info.sub.js |
| // META: script=/common/utils.js |
| // META: script=resources/ba-fledge-util.sub.js |
| // META: script=resources/fledge-util.sub.js |
| // META: script=/common/subset-tests.js |
| // META: script=third_party/cbor-js/cbor.js |
| // META: timeout=long |
| // META: variant=?1-last |
| |
| "use strict"; |
| |
| // These tests focus on the debugReports field in AuctionConfig's |
| // serverResponse, i.e. auctions involving forDebuggingOnly reports. |
| // NOTE: Due to DB's fDO lockout/cooldown tables are not cleaned after each run |
| // of a test, fDO reports will not be sent after the first run of the test sent |
| // it, so we cannot reliably test fDO reports being sent when downsampling is |
| // enabled yet. |
| |
| function createDebugReport( |
| url, isWinReport = null, isSellerReport = null, componentWin = null) { |
| let report = {}; |
| if (url !== null) { |
| report.url = url; |
| } |
| if (isWinReport !== null) { |
| report.isWinReport = isWinReport; |
| } |
| if (isSellerReport !== null) { |
| report.isSellerReport = isSellerReport; |
| } |
| if (componentWin !== null) { |
| report.componentWin = componentWin; |
| } |
| return report; |
| } |
| |
| function createDebugReportsPerOrigin( |
| adTechOrigin = MAIN_ORIGIN, reports = null) { |
| let reportsPerOrigin = {}; |
| if (adTechOrigin !== null) { |
| reportsPerOrigin.adTechOrigin = adTechOrigin; |
| } |
| if (reports !== null) { |
| reportsPerOrigin.reports = reports; |
| } |
| return reportsPerOrigin; |
| } |
| |
| const delay = ms => new Promise(resolve => step_timeout(resolve, ms)); |
| |
| // No forDebuggingOnly requests are observed, until time out. |
| async function noRequestsObserved(uuid, timeout = 2000 /*ms*/) { |
| const endTime = performance.now() + timeout; |
| |
| do { |
| let trackedData = await fetchTrackedData(uuid); |
| // Replace UUID to print consistent errors on failure. |
| let trackedRequests = |
| trackedData.trackedRequests.map((url) => url.replace(uuid, '<uuid>')) |
| .sort(); |
| |
| // No forDebuggingOnly requests should be observed. |
| for (const request of trackedRequests) { |
| assert_false( |
| request.includes('forDebuggingOnly'), |
| 'Unexpected forDebuggingOnly request: ' + request); |
| } |
| await delay(/*ms=*/ 100); |
| } while (performance.now() < endTime); |
| } |
| |
| async function testInvalidDebugReportsFields( |
| test, uuid, debugReports, ownerOverride = null) { |
| let result = await BA.testWithMutatedServerResponse( |
| test, /*expectWin=*/ true, |
| (msg) => { |
| msg.debugReports = debugReports; |
| }, |
| (ig, uuid) => { |
| ig.ads[0].renderURL = createRenderURL(uuid); |
| }, |
| ownerOverride); |
| createAndNavigateFencedFrame(test, result); |
| await noRequestsObserved(uuid); |
| } |
| |
| subsetTest(promise_test, async test => { |
| const uuid = generateUuid(test); |
| |
| let bidderDebugReportURL = |
| createBidderReportURL(uuid, /*id=*/ 'forDebuggingOnly'); |
| let debugReports = [createDebugReportsPerOrigin( |
| /*adTechOrigin=*/ null, |
| [createDebugReport(bidderDebugReportURL, /*isWinReport=*/ true)])]; |
| await testInvalidDebugReportsFields(test, uuid, debugReports); |
| }, `B&A forDebuggingOnly - missing required adTechOrigin`); |
| |
| subsetTest(promise_test, async test => { |
| const uuid = generateUuid(test); |
| let bidderDebugReportURL = |
| createBidderReportURL(uuid, /*id=*/ 'forDebuggingOnly'); |
| let debugReports = [createDebugReportsPerOrigin( |
| /*adTechOrigin=*/ 'http://nothttps.com', |
| [createDebugReport(bidderDebugReportURL, /*isWinReport=*/ true)])]; |
| await testInvalidDebugReportsFields(test, uuid, debugReports); |
| }, `B&A forDebuggingOnly - HTTP adTechOrigin`); |
| |
| subsetTest(promise_test, async test => { |
| const uuid = generateUuid(test); |
| let bidderDebugReportURL = |
| createBidderReportURL(uuid, /*id=*/ 'forDebuggingOnly'); |
| let debugReports = [createDebugReportsPerOrigin( |
| /*adTechOrigin=*/ window.location.origin, |
| [createDebugReport('http://nothttps.com', /*isWinReport=*/ true)])]; |
| await testInvalidDebugReportsFields(test, uuid, debugReports); |
| }, `B&A forDebuggingOnly - HTTP debug report url`); |
| |
| subsetTest(promise_test, async test => { |
| const uuid = generateUuid(test); |
| let bidderDebugReportURL = |
| createBidderReportURL(uuid, /*id=*/ 'forDebuggingOnly'); |
| let debugReports = [createDebugReportsPerOrigin( |
| /*adTechOrigin=*/ window.location.origin, |
| [createDebugReport('not a url', /*isWinReport=*/ true)])]; |
| await testInvalidDebugReportsFields(test, uuid, debugReports); |
| }, `B&A forDebuggingOnly - debug report url not a url`); |
| |
| subsetTest(promise_test, async test => { |
| const uuid = generateUuid(test); |
| const igOwner = OTHER_ORIGIN1; |
| |
| let bidderDebugReportURL = |
| createBidderReportURL(uuid, /*id=*/ 'forDebuggingOnly', igOwner); |
| let sellerDebugReportURL = |
| createSellerReportURL(uuid, /*id=*/ 'forDebuggingOnly'); |
| |
| let debugReports = [ |
| createDebugReportsPerOrigin( |
| igOwner, |
| [createDebugReport(bidderDebugReportURL, /*isWinReport=*/ true)]), |
| createDebugReportsPerOrigin( |
| window.location.origin, [createDebugReport( |
| sellerDebugReportURL, /*isWinReport=*/ true, |
| /*isSellerReport=*/ true)]) |
| ]; |
| |
| let result = await BA.testWithMutatedServerResponse( |
| test, /*expectWin=*/ true, |
| (msg) => { |
| msg.debugReports = debugReports; |
| }, |
| (ig, uuid) => { |
| ig.ads[0].renderURL = createRenderURL(uuid); |
| }, |
| igOwner); |
| createAndNavigateFencedFrame(test, result); |
| await waitForObservedRequests( |
| uuid, [bidderDebugReportURL, sellerDebugReportURL]); |
| }, `B&A forDebuggingOnly - debug reports sent`); |
| |
| subsetTest(promise_test, async test => { |
| const uuid = generateUuid(test); |
| const igOwner = OTHER_ORIGIN1; |
| |
| let bidderDebugReportURL = |
| createBidderReportURL(uuid, /*id=*/ 'forDebuggingOnly', igOwner); |
| let sellerDebugReportURL = |
| createSellerReportURL(uuid, /*id=*/ 'forDebuggingOnly'); |
| |
| let debugReports = [ |
| createDebugReportsPerOrigin( |
| igOwner, [createDebugReport('not a url', /*isWinReport=*/ true)]), |
| createDebugReportsPerOrigin( |
| window.location.origin, [createDebugReport( |
| sellerDebugReportURL, /*isWinReport=*/ true, |
| /*isSellerReport=*/ true)]) |
| ]; |
| |
| let result = await BA.testWithMutatedServerResponse( |
| test, /*expectWin=*/ true, |
| (msg) => { |
| msg.debugReports = debugReports; |
| }, |
| (ig, uuid) => { |
| ig.ads[0].renderURL = createRenderURL(uuid); |
| }, |
| igOwner); |
| createAndNavigateFencedFrame(test, result); |
| await waitForObservedRequests(uuid, [sellerDebugReportURL]); |
| }, `B&A forDebuggingOnly - invalid debug reports don't affect other debug reports`); |
| |
| // TODO(qingxinwu): multi seller auctions. |