server-response-for-debugging-only.https.window.js (6877B)
1 // META: script=/resources/testdriver.js 2 // META: script=/resources/testdriver-vendor.js 3 // META: script=/common/get-host-info.sub.js 4 // META: script=/common/utils.js 5 // META: script=resources/ba-fledge-util.sub.js 6 // META: script=resources/fledge-util.sub.js 7 // META: script=/common/subset-tests.js 8 // META: script=third_party/cbor-js/cbor.js 9 // META: timeout=long 10 // META: variant=?1-last 11 12 "use strict"; 13 14 // These tests focus on the debugReports field in AuctionConfig's 15 // serverResponse, i.e. auctions involving forDebuggingOnly reports. 16 // NOTE: Due to DB's fDO lockout/cooldown tables are not cleaned after each run 17 // of a test, fDO reports will not be sent after the first run of the test sent 18 // it, so we cannot reliably test fDO reports being sent when downsampling is 19 // enabled yet. 20 21 function createDebugReport( 22 url, isWinReport = null, isSellerReport = null, componentWin = null) { 23 let report = {}; 24 if (url !== null) { 25 report.url = url; 26 } 27 if (isWinReport !== null) { 28 report.isWinReport = isWinReport; 29 } 30 if (isSellerReport !== null) { 31 report.isSellerReport = isSellerReport; 32 } 33 if (componentWin !== null) { 34 report.componentWin = componentWin; 35 } 36 return report; 37 } 38 39 function createDebugReportsPerOrigin( 40 adTechOrigin = MAIN_ORIGIN, reports = null) { 41 let reportsPerOrigin = {}; 42 if (adTechOrigin !== null) { 43 reportsPerOrigin.adTechOrigin = adTechOrigin; 44 } 45 if (reports !== null) { 46 reportsPerOrigin.reports = reports; 47 } 48 return reportsPerOrigin; 49 } 50 51 const delay = ms => new Promise(resolve => step_timeout(resolve, ms)); 52 53 // No forDebuggingOnly requests are observed, until time out. 54 async function noRequestsObserved(uuid, timeout = 2000 /*ms*/) { 55 const endTime = performance.now() + timeout; 56 57 do { 58 let trackedData = await fetchTrackedData(uuid); 59 // Replace UUID to print consistent errors on failure. 60 let trackedRequests = 61 trackedData.trackedRequests.map((url) => url.replace(uuid, '<uuid>')) 62 .sort(); 63 64 // No forDebuggingOnly requests should be observed. 65 for (const request of trackedRequests) { 66 assert_false( 67 request.includes('forDebuggingOnly'), 68 'Unexpected forDebuggingOnly request: ' + request); 69 } 70 await delay(/*ms=*/ 100); 71 } while (performance.now() < endTime); 72 } 73 74 async function testInvalidDebugReportsFields( 75 test, uuid, debugReports, ownerOverride = null) { 76 let result = await BA.testWithMutatedServerResponse( 77 test, /*expectWin=*/ true, 78 (msg) => { 79 msg.debugReports = debugReports; 80 }, 81 (ig, uuid) => { 82 ig.ads[0].renderURL = createRenderURL(uuid); 83 }, 84 ownerOverride); 85 createAndNavigateFencedFrame(test, result); 86 await noRequestsObserved(uuid); 87 } 88 89 subsetTest(promise_test, async test => { 90 const uuid = generateUuid(test); 91 92 let bidderDebugReportURL = 93 createBidderReportURL(uuid, /*id=*/ 'forDebuggingOnly'); 94 let debugReports = [createDebugReportsPerOrigin( 95 /*adTechOrigin=*/ null, 96 [createDebugReport(bidderDebugReportURL, /*isWinReport=*/ true)])]; 97 await testInvalidDebugReportsFields(test, uuid, debugReports); 98 }, `B&A forDebuggingOnly - missing required adTechOrigin`); 99 100 subsetTest(promise_test, async test => { 101 const uuid = generateUuid(test); 102 let bidderDebugReportURL = 103 createBidderReportURL(uuid, /*id=*/ 'forDebuggingOnly'); 104 let debugReports = [createDebugReportsPerOrigin( 105 /*adTechOrigin=*/ 'http://nothttps.com', 106 [createDebugReport(bidderDebugReportURL, /*isWinReport=*/ true)])]; 107 await testInvalidDebugReportsFields(test, uuid, debugReports); 108 }, `B&A forDebuggingOnly - HTTP adTechOrigin`); 109 110 subsetTest(promise_test, async test => { 111 const uuid = generateUuid(test); 112 let bidderDebugReportURL = 113 createBidderReportURL(uuid, /*id=*/ 'forDebuggingOnly'); 114 let debugReports = [createDebugReportsPerOrigin( 115 /*adTechOrigin=*/ window.location.origin, 116 [createDebugReport('http://nothttps.com', /*isWinReport=*/ true)])]; 117 await testInvalidDebugReportsFields(test, uuid, debugReports); 118 }, `B&A forDebuggingOnly - HTTP debug report url`); 119 120 subsetTest(promise_test, async test => { 121 const uuid = generateUuid(test); 122 let bidderDebugReportURL = 123 createBidderReportURL(uuid, /*id=*/ 'forDebuggingOnly'); 124 let debugReports = [createDebugReportsPerOrigin( 125 /*adTechOrigin=*/ window.location.origin, 126 [createDebugReport('not a url', /*isWinReport=*/ true)])]; 127 await testInvalidDebugReportsFields(test, uuid, debugReports); 128 }, `B&A forDebuggingOnly - debug report url not a url`); 129 130 subsetTest(promise_test, async test => { 131 const uuid = generateUuid(test); 132 const igOwner = OTHER_ORIGIN1; 133 134 let bidderDebugReportURL = 135 createBidderReportURL(uuid, /*id=*/ 'forDebuggingOnly', igOwner); 136 let sellerDebugReportURL = 137 createSellerReportURL(uuid, /*id=*/ 'forDebuggingOnly'); 138 139 let debugReports = [ 140 createDebugReportsPerOrigin( 141 igOwner, 142 [createDebugReport(bidderDebugReportURL, /*isWinReport=*/ true)]), 143 createDebugReportsPerOrigin( 144 window.location.origin, [createDebugReport( 145 sellerDebugReportURL, /*isWinReport=*/ true, 146 /*isSellerReport=*/ true)]) 147 ]; 148 149 let result = await BA.testWithMutatedServerResponse( 150 test, /*expectWin=*/ true, 151 (msg) => { 152 msg.debugReports = debugReports; 153 }, 154 (ig, uuid) => { 155 ig.ads[0].renderURL = createRenderURL(uuid); 156 }, 157 igOwner); 158 createAndNavigateFencedFrame(test, result); 159 await waitForObservedRequests( 160 uuid, [bidderDebugReportURL, sellerDebugReportURL]); 161 }, `B&A forDebuggingOnly - debug reports sent`); 162 163 subsetTest(promise_test, async test => { 164 const uuid = generateUuid(test); 165 const igOwner = OTHER_ORIGIN1; 166 167 let bidderDebugReportURL = 168 createBidderReportURL(uuid, /*id=*/ 'forDebuggingOnly', igOwner); 169 let sellerDebugReportURL = 170 createSellerReportURL(uuid, /*id=*/ 'forDebuggingOnly'); 171 172 let debugReports = [ 173 createDebugReportsPerOrigin( 174 igOwner, [createDebugReport('not a url', /*isWinReport=*/ true)]), 175 createDebugReportsPerOrigin( 176 window.location.origin, [createDebugReport( 177 sellerDebugReportURL, /*isWinReport=*/ true, 178 /*isSellerReport=*/ true)]) 179 ]; 180 181 let result = await BA.testWithMutatedServerResponse( 182 test, /*expectWin=*/ true, 183 (msg) => { 184 msg.debugReports = debugReports; 185 }, 186 (ig, uuid) => { 187 ig.ads[0].renderURL = createRenderURL(uuid); 188 }, 189 igOwner); 190 createAndNavigateFencedFrame(test, result); 191 await waitForObservedRequests(uuid, [sellerDebugReportURL]); 192 }, `B&A forDebuggingOnly - invalid debug reports don't affect other debug reports`); 193 194 // TODO(qingxinwu): multi seller auctions.