trusted-bidding-signals.https.window.js (45067B)
1 // META: script=/resources/testdriver.js 2 // META: script=/resources/testdriver-vendor.js 3 // META: script=/common/utils.js 4 // META: script=/common/subset-tests.js 5 // META: script=resources/fledge-util.sub.js 6 // META: timeout=long 7 // META: variant=?1-5 8 // META: variant=?6-10 9 // META: variant=?11-15 10 // META: variant=?16-20 11 // META: variant=?21-25 12 // META: variant=?26-30 13 // META: variant=?31-35 14 // META: variant=?36-40 15 // META: variant=?41-45 16 // META: variant=?46-50 17 // META: variant=?51-55 18 // META: variant=?56-60 19 // META: variant=?61-65 20 // META: variant=?66-70 21 // META: variant=?71-75 22 // META: variant=?76-last 23 24 "use strict"; 25 26 // These tests focus on trustedBiddingSignals: Requesting them, handling network 27 // errors, handling the keys portion of the response, and passing keys to 28 // worklet scripts, and handling the Data-Version header 29 // 30 // Because of request batching, left over interest groups from 31 // other tests may result in tests that request TRUSTED_BIDDING_SIGNALS_URL 32 // with certain special keys failing, if interest groups with names other than 33 // the default one are not successfully left after previously run tests. 34 35 // Helper for trusted bidding signals test. Runs an auction, and fails the 36 // test if there's no winner. "generateBidCheck" is an expression that should 37 // be true when evaluated in generateBid(). "interestGroupOverrides" is a 38 // set of overridden fields added to the default interestGroup when joining it, 39 // allowing trusted bidding signals keys and URL to be set, in addition to other 40 // fields. 41 async function runTrustedBiddingSignalsTest( 42 test, generateBidCheck, interestGroupOverrides = {}, auctionConfigOverrides = {}, uuidOverride = null) { 43 interestGroupOverrides.biddingLogicURL = 44 createBiddingScriptURL({ 45 allowComponentAuction: true, 46 generateBid: `if (!(${generateBidCheck})) return false;` }); 47 let testConfig = { 48 interestGroupOverrides: interestGroupOverrides, 49 auctionConfigOverrides: auctionConfigOverrides 50 }; 51 if (uuidOverride) 52 testConfig.uuid = uuidOverride; 53 await joinGroupAndRunBasicFledgeTestExpectingWinner(test, testConfig); 54 } 55 56 // Much like runTrustedBiddingSignalsTest, but runs auctions through reporting 57 // as well, and evaluates `check` both in generateBid() and reportWin(). Also 58 // makes sure browserSignals.dataVersion is undefined in scoreAd() and 59 // reportResult(). 60 async function runTrustedBiddingSignalsDataVersionTest( 61 test, check, interestGroupOverrides = {}) { 62 const uuid = generateUuid(test); 63 interestGroupOverrides.biddingLogicURL = 64 createBiddingScriptURL({ 65 generateBid: 66 `if (!(${check})) return false;`, 67 reportWin: 68 `if (!(${check})) 69 sendReportTo('${createBidderReportURL(uuid, 'error')}'); 70 else 71 sendReportTo('${createBidderReportURL(uuid)}');` }); 72 await joinInterestGroup(test, uuid, interestGroupOverrides); 73 74 const auctionConfigOverrides = { 75 decisionLogicURL: createDecisionScriptURL( 76 uuid, 77 { scoreAd: 78 `if (browserSignals.dataVersion !== undefined) 79 return false;`, 80 reportResult: 81 `if (browserSignals.dataVersion !== undefined) 82 sendReportTo('${createSellerReportURL(uuid, 'error')}') 83 sendReportTo('${createSellerReportURL(uuid)}')`, }) 84 } 85 await runBasicFledgeAuctionAndNavigate(test, uuid, auctionConfigOverrides); 86 await waitForObservedRequests( 87 uuid, [createBidderReportURL(uuid), createSellerReportURL(uuid)]); 88 } 89 90 subsetTest(promise_test, async test => { 91 await runTrustedBiddingSignalsTest(test, 'trustedBiddingSignals === null'); 92 }, 'No trustedBiddingSignalsKeys or trustedBiddingSignalsURL.'); 93 94 subsetTest(promise_test, async test => { 95 await runTrustedBiddingSignalsTest( 96 test, 'trustedBiddingSignals === null', 97 { trustedBiddingSignalsKeys: ['numValue'] }); 98 }, 'trustedBiddingSignalsKeys but no trustedBiddingSignalsURL.'); 99 100 subsetTest(promise_test, async test => { 101 await runTrustedBiddingSignalsTest( 102 test, 'trustedBiddingSignals === null', 103 { trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 104 }, 'trustedBiddingSignalsURL without trustedBiddingSignalsKeys.'); 105 106 subsetTest(promise_test, async test => { 107 await runTrustedBiddingSignalsTest( 108 test, 'trustedBiddingSignals === null', 109 { trustedBiddingSignalsKeys: ['close-connection'], 110 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 111 }, 'trustedBiddingSignalsURL closes the connection without sending anything.'); 112 113 subsetTest(promise_test, async test => { 114 await runTrustedBiddingSignalsTest( 115 test, 'trustedBiddingSignals === null', 116 { trustedBiddingSignalsKeys: ['http-error'], 117 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 118 }, 'Trusted bidding signals response is HTTP 404 error.'); 119 120 subsetTest(promise_test, async test => { 121 await runTrustedBiddingSignalsTest( 122 test, 'trustedBiddingSignals === null', 123 { trustedBiddingSignalsKeys: ['no-content-type'], 124 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 125 }, 'Trusted bidding signals response has no content-type.'); 126 127 subsetTest(promise_test, async test => { 128 await runTrustedBiddingSignalsTest( 129 test, 'trustedBiddingSignals === null', 130 { trustedBiddingSignalsKeys: ['wrong-content-type'], 131 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 132 }, 'Trusted bidding signals response has wrong content-type.'); 133 134 subsetTest(promise_test, async test => { 135 await runTrustedBiddingSignalsTest( 136 test, 'trustedBiddingSignals === null', 137 { trustedBiddingSignalsKeys: ['ad-auction-not-allowed'], 138 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 139 }, 'Trusted bidding signals response does not allow fledge.'); 140 141 subsetTest(promise_test, async test => { 142 await runTrustedBiddingSignalsTest( 143 test, 'trustedBiddingSignals === null', 144 { trustedBiddingSignalsKeys: ['bad-ad-auction-allowed'], 145 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 146 }, 'Trusted bidding signals response has wrong Ad-Auction-Allowed header.'); 147 148 subsetTest(promise_test, async test => { 149 await runTrustedBiddingSignalsTest( 150 test, 'trustedBiddingSignals === null', 151 { trustedBiddingSignalsKeys: ['no-ad-auction-allow'], 152 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 153 }, 'Trusted bidding signals response has no Ad-Auction-Allowed header.'); 154 155 subsetTest(promise_test, async test => { 156 await runTrustedBiddingSignalsTest( 157 test, 'trustedBiddingSignals === null', 158 { trustedBiddingSignalsKeys: ['replace-body:'], 159 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 160 }, 'Trusted bidding signals response has no body.'); 161 162 subsetTest(promise_test, async test => { 163 await runTrustedBiddingSignalsTest( 164 test, 'trustedBiddingSignals === null', 165 { trustedBiddingSignalsKeys: ['replace-body:Not JSON'], 166 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 167 }, 'Trusted bidding signals response is not JSON.'); 168 169 subsetTest(promise_test, async test => { 170 await runTrustedBiddingSignalsTest( 171 test, 'trustedBiddingSignals === null', 172 { trustedBiddingSignalsKeys: ['replace-body:[]'], 173 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 174 }, 'Trusted bidding signals response is a JSON array.'); 175 176 subsetTest(promise_test, async test => { 177 await runTrustedBiddingSignalsTest( 178 test, 'trustedBiddingSignals === null', 179 { trustedBiddingSignalsKeys: ['replace-body:{JSON_keys_need_quotes: 1}'], 180 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 181 }, 'Trusted bidding signals response in invalid JSON object.'); 182 183 subsetTest(promise_test, async test => { 184 await runTrustedBiddingSignalsTest( 185 test, 'trustedBiddingSignals["replace-body:{}"] === null', 186 { trustedBiddingSignalsKeys: ['replace-body:{}'], 187 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 188 }, 'Trusted bidding signals response has no keys object.'); 189 190 subsetTest(promise_test, async test => { 191 await runTrustedBiddingSignalsTest( 192 test, `trustedBiddingSignals['replace-body:{"keys":{}}'] === null`, 193 { trustedBiddingSignalsKeys: ['replace-body:{"keys":{}}'], 194 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 195 }, 'Trusted bidding signals response has no keys.'); 196 197 subsetTest(promise_test, async test => { 198 await runTrustedBiddingSignalsTest( 199 test, 200 `trustedBiddingSignals["0"] === null && 201 trustedBiddingSignals["1"] === null && 202 trustedBiddingSignals["2"] === null && 203 trustedBiddingSignals["length"] === null`, 204 { trustedBiddingSignalsKeys: 205 ['replace-body:{"keys":[1,2,3]}', "0", "1", "2", "length"], 206 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 207 }, 'Trusted bidding signals response keys is incorrectly an array.'); 208 209 subsetTest(promise_test, async test => { 210 await runTrustedBiddingSignalsTest( 211 test, 212 `trustedBiddingSignals["wrong-value"] === null && 213 trustedBiddingSignals["another-value"] === undefined`, 214 { trustedBiddingSignalsKeys: ['wrong-value'], 215 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 216 }, 'Trusted bidding signals response has key not in trustedBiddingSignalsKeys.'); 217 218 subsetTest(promise_test, async test => { 219 await runTrustedBiddingSignalsTest( 220 test, 'trustedBiddingSignals["null-value"] === null', 221 { trustedBiddingSignalsKeys: ['null-value'], 222 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 223 }, 'Trusted bidding signals response has null value for key.'); 224 225 subsetTest(promise_test, async test => { 226 await runTrustedBiddingSignalsTest( 227 test, 'trustedBiddingSignals["num-value"] === 1', 228 { trustedBiddingSignalsKeys: ['num-value'], 229 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 230 }, 'Trusted bidding signals response has a number value for key.'); 231 232 subsetTest(promise_test, async test => { 233 await runTrustedBiddingSignalsTest( 234 test, 'trustedBiddingSignals["string-value"] === "1"', 235 { trustedBiddingSignalsKeys: ['string-value'], 236 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 237 }, 'Trusted bidding signals response has string value for key.'); 238 239 subsetTest(promise_test, async test => { 240 await runTrustedBiddingSignalsTest( 241 test, 242 `JSON.stringify(trustedBiddingSignals["array-value"]) === '[1,"foo",null]'`, 243 { trustedBiddingSignalsKeys: ['array-value'], 244 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 245 }, 'Trusted bidding signals response has array value for key.'); 246 247 subsetTest(promise_test, async test => { 248 await runTrustedBiddingSignalsTest( 249 test, 250 `Object.keys(trustedBiddingSignals["object-value"]).length === 2 && 251 trustedBiddingSignals["object-value"]["a"] === "b" && 252 JSON.stringify(trustedBiddingSignals["object-value"]["c"]) === '["d"]'`, 253 { trustedBiddingSignalsKeys: ['object-value'], 254 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 255 }, 'Trusted bidding signals response has object value for key.'); 256 257 subsetTest(promise_test, async test => { 258 await runTrustedBiddingSignalsTest( 259 test, 260 'trustedBiddingSignals[""] === "default value"', 261 { trustedBiddingSignalsKeys: [''], 262 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 263 }, 'Trusted bidding signals receives empty string key.'); 264 265 subsetTest(promise_test, async test => { 266 await runTrustedBiddingSignalsTest( 267 test, 268 `Object.keys(trustedBiddingSignals).length === 6 && 269 trustedBiddingSignals["wrong-value"] === null && 270 trustedBiddingSignals["null-value"] === null && 271 trustedBiddingSignals["num-value"] === 1 && 272 trustedBiddingSignals["string-value"] === "1" && 273 JSON.stringify(trustedBiddingSignals["array-value"]) === '[1,"foo",null]' && 274 trustedBiddingSignals[""] === "default value"`, 275 { trustedBiddingSignalsKeys: ['wrong-value', 'null-value', 'num-value', 276 'string-value', 'array-value', ''], 277 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 278 }, 'Trusted bidding signals response has multiple keys.'); 279 280 subsetTest(promise_test, async test => { 281 await runTrustedBiddingSignalsTest( 282 test, 283 'trustedBiddingSignals["+%20 \x00?,3#&"] === "default value"', 284 { trustedBiddingSignalsKeys: ['+%20 \x00?,3#&'], 285 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 286 }, 'Trusted bidding signals receives escaped key.'); 287 288 subsetTest(promise_test, async test => { 289 await runTrustedBiddingSignalsTest( 290 test, 291 'trustedBiddingSignals["\x00"] === "default value"', 292 { trustedBiddingSignalsKeys: ['\x00'], 293 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 294 }, 'Trusted bidding signals receives null key.'); 295 296 subsetTest(promise_test, async test => { 297 await runTrustedBiddingSignalsTest( 298 test, 299 `trustedBiddingSignals["interest-group-names"] === '["${DEFAULT_INTEREST_GROUP_NAME}"]'`, 300 { trustedBiddingSignalsKeys: ['interest-group-names'], 301 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 302 }, 'Trusted bidding signals receives interest group name.'); 303 304 subsetTest(promise_test, async test => { 305 await runTrustedBiddingSignalsTest( 306 test, 307 // Interest group names is a JSONified list of JSONified names, so the 308 // null ends up being escaped twice. 309 `trustedBiddingSignals["interest-group-names"] === '["+%20 \\\\u0000?,3#&"]'`, 310 { name: '+%20 \x00?,3#&', 311 trustedBiddingSignalsKeys: ['interest-group-names'], 312 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 313 }, 'Trusted bidding signals receives escaped interest group name.'); 314 315 subsetTest(promise_test, async test => { 316 await runTrustedBiddingSignalsTest( 317 test, 318 `trustedBiddingSignals["interest-group-names"] === '[""]'`, 319 { name: '', 320 trustedBiddingSignalsKeys: ['interest-group-names'], 321 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 322 }, 'Trusted bidding signals receives empty interest group name.'); 323 324 subsetTest(promise_test, async test => { 325 await runTrustedBiddingSignalsTest( 326 test, 327 `trustedBiddingSignals["hostname"] === "${window.location.hostname}"`, 328 { trustedBiddingSignalsKeys: ['hostname'], 329 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 330 }, 'Trusted bidding signals receives hostname field.'); 331 332 ///////////////////////////////////////////////////////////////////////////// 333 // Cross-origin trusted bidding signals tests 334 ///////////////////////////////////////////////////////////////////////////// 335 336 subsetTest(promise_test, async test => { 337 await runTrustedBiddingSignalsTest( 338 test, 339 `trustedBiddingSignals === null && 340 !('dataVersion' in browserSignals) && 341 crossOriginTrustedBiddingSignals['${OTHER_ORIGIN1}']['num-value'] === 1 && 342 browserSignals.crossOriginDataVersion === 4`, 343 { name: 'data-version', 344 trustedBiddingSignalsKeys: ['num-value', 'cors'], 345 trustedBiddingSignalsURL: CROSS_ORIGIN_TRUSTED_BIDDING_SIGNALS_URL }); 346 }, 'Basic cross-origin trusted bidding signals'); 347 348 subsetTest(promise_test, async test => { 349 await runTrustedBiddingSignalsTest( 350 test, 351 `trustedBiddingSignals === null && 352 !('dataVersion' in browserSignals) && 353 crossOriginTrustedBiddingSignals === null && 354 !('crossOriginDataVersion' in browserSignals)`, 355 { name: 'data-version', 356 trustedBiddingSignalsKeys: ['num-value'], 357 trustedBiddingSignalsURL: CROSS_ORIGIN_TRUSTED_BIDDING_SIGNALS_URL }); 358 }, 'Cross-origin trusted bidding signals w/o CORS authorization'); 359 360 ///////////////////////////////////////////////////////////////////////////// 361 // Data-Version tests 362 ///////////////////////////////////////////////////////////////////////////// 363 364 subsetTest(promise_test, async test => { 365 await runTrustedBiddingSignalsDataVersionTest( 366 test, 367 'browserSignals.dataVersion === undefined', 368 { trustedBiddingSignalsKeys: ['num-value'], 369 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 370 }, 'Trusted bidding signals response has no Data-Version.'); 371 372 subsetTest(promise_test, async test => { 373 await runTrustedBiddingSignalsDataVersionTest( 374 test, 375 'browserSignals.dataVersion === 3', 376 { trustedBiddingSignalsKeys: ['data-version:3'], 377 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 378 }, 'Trusted bidding signals response has numeric Data-Version.'); 379 380 subsetTest(promise_test, async test => { 381 await runTrustedBiddingSignalsDataVersionTest( 382 test, 383 'browserSignals.dataVersion === 0', 384 { trustedBiddingSignalsKeys: ['data-version:0'], 385 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 386 }, 'Trusted bidding signals response has min Data-Version.'); 387 388 subsetTest(promise_test, async test => { 389 await runTrustedBiddingSignalsDataVersionTest( 390 test, 391 'browserSignals.dataVersion === 4294967295', 392 { trustedBiddingSignalsKeys: ['data-version:4294967295'], 393 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 394 }, 'Trusted bidding signals response has max Data-Version.'); 395 396 subsetTest(promise_test, async test => { 397 await runTrustedBiddingSignalsDataVersionTest( 398 test, 399 'browserSignals.dataVersion === undefined', 400 { trustedBiddingSignalsKeys: ['data-version:4294967296'], 401 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 402 }, 'Trusted bidding signals response has too large Data-Version.'); 403 404 subsetTest(promise_test, async test => { 405 await runTrustedBiddingSignalsDataVersionTest( 406 test, 407 'browserSignals.dataVersion === undefined', 408 { trustedBiddingSignalsKeys: ['data-version:03'], 409 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 410 }, 'Trusted bidding signals response has Data-Version with leading 0.'); 411 412 subsetTest(promise_test, async test => { 413 await runTrustedBiddingSignalsDataVersionTest( 414 test, 415 'browserSignals.dataVersion === undefined', 416 { trustedBiddingSignalsKeys: ['data-version:-1'], 417 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 418 }, 'Trusted bidding signals response has negative Data-Version.'); 419 420 subsetTest(promise_test, async test => { 421 await runTrustedBiddingSignalsDataVersionTest( 422 test, 423 'browserSignals.dataVersion === undefined', 424 { trustedBiddingSignalsKeys: ['data-version:1.3'], 425 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 426 }, 'Trusted bidding signals response has decimal in Data-Version.'); 427 428 subsetTest(promise_test, async test => { 429 await runTrustedBiddingSignalsDataVersionTest( 430 test, 431 'browserSignals.dataVersion === undefined', 432 { trustedBiddingSignalsKeys: ['data-version:2 2'], 433 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 434 }, 'Trusted bidding signals response has space in Data-Version.'); 435 436 subsetTest(promise_test, async test => { 437 await runTrustedBiddingSignalsDataVersionTest( 438 test, 439 'browserSignals.dataVersion === undefined', 440 { trustedBiddingSignalsKeys: ['data-version:0x4'], 441 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 442 }, 'Trusted bidding signals response has hex Data-Version.'); 443 444 subsetTest(promise_test, async test => { 445 await runTrustedBiddingSignalsDataVersionTest( 446 test, 447 'browserSignals.dataVersion === 4', 448 { name: 'data-version', 449 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 450 }, 'Trusted bidding signals response has Data-Version and no trustedBiddingSignalsKeys.'); 451 452 subsetTest(promise_test, async test => { 453 await runTrustedBiddingSignalsDataVersionTest( 454 test, 455 'browserSignals.dataVersion === undefined', 456 { trustedBiddingSignalsKeys: ['data-version:3', 'replace-body:'], 457 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 458 }, 'Trusted bidding signals response with Data-Version and empty body.'); 459 460 subsetTest(promise_test, async test => { 461 await runTrustedBiddingSignalsDataVersionTest( 462 test, 463 'browserSignals.dataVersion === undefined', 464 { trustedBiddingSignalsKeys: ['data-version:3', 'replace-body:[]'], 465 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 466 }, 'Trusted bidding signals response with Data-Version and JSON array body.'); 467 468 subsetTest(promise_test, async test => { 469 await runTrustedBiddingSignalsDataVersionTest( 470 test, 471 'browserSignals.dataVersion === undefined', 472 { trustedBiddingSignalsKeys: ['data-version:3', 'replace-body:{} {}'], 473 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 474 }, 'Trusted bidding signals response with Data-Version and double JSON object body.'); 475 476 subsetTest(promise_test, async test => { 477 await runTrustedBiddingSignalsDataVersionTest( 478 test, 479 'browserSignals.dataVersion === 3', 480 { trustedBiddingSignalsKeys: ['data-version:3', 'replace-body:{"keys":5}'], 481 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 482 }, 'Trusted bidding signals response with Data-Version and invalid keys entry'); 483 484 ///////////////////////////////////////////////////////////////////////////// 485 // trustedBiddingSignalsSlotSizeMode tests 486 ///////////////////////////////////////////////////////////////////////////// 487 488 async function runTrustedBiddingSignalsSlotSizeTest( 489 test, 490 expectedSlotSize, 491 expectedAllSlotsRequestedSizes, 492 trustedBiddingSignalsSlotSizeMode = null, 493 auctionConfigOverrides = {}, 494 uuidOverride = null) { 495 await runTrustedBiddingSignalsTest( 496 test, 497 `trustedBiddingSignals["slotSize"] === 498 ${JSON.stringify(expectedSlotSize)} && 499 trustedBiddingSignals["allSlotsRequestedSizes"] === 500 ${JSON.stringify(expectedAllSlotsRequestedSizes)}`, 501 { trustedBiddingSignalsKeys: ['slotSize', 'allSlotsRequestedSizes'], 502 trustedBiddingSignalsSlotSizeMode: trustedBiddingSignalsSlotSizeMode, 503 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL}, 504 auctionConfigOverrides, 505 uuidOverride); 506 } 507 508 subsetTest(promise_test, async test => { 509 await runTrustedBiddingSignalsSlotSizeTest( 510 test, 511 /*expectedSlotSize=*/'not-found', 512 /*expectedAllSlotsRequestedSizes=*/'not-found'); 513 }, 'Null trustedBiddingSignalsSlotSizeMode, no sizes in AuctionConfig'); 514 515 subsetTest(promise_test, async test => { 516 await runTrustedBiddingSignalsSlotSizeTest( 517 test, 518 /*expectedSlotSize=*/'not-found', 519 /*expectedAllSlotsRequestedSizes=*/'not-found', 520 /*trustedBiddingSignalsSlotSizeMode=*/'not-a-real-mode'); 521 }, 'Unknown trustedBiddingSignalsSlotSizeMode, no sizes in AuctionConfig'); 522 523 subsetTest(promise_test, async test => { 524 await runTrustedBiddingSignalsSlotSizeTest( 525 test, 526 /*expectedSlotSize=*/'not-found', 527 /*expectedAllSlotsRequestedSizes=*/'not-found', 528 /*trustedBiddingSignalsSlotSizeMode=*/'none'); 529 }, 'none trustedBiddingSignalsSlotSizeMode, no sizes in AuctionConfig'); 530 531 subsetTest(promise_test, async test => { 532 await runTrustedBiddingSignalsSlotSizeTest( 533 test, 534 /*expectedSlotSize=*/'not-found', 535 /*expectedAllSlotsRequestedSizes=*/'not-found', 536 /*trustedBiddingSignalsSlotSizeMode=*/'slot-size'); 537 }, 'slot-size trustedBiddingSignalsSlotSizeMode, no sizes in AuctionConfig'); 538 539 subsetTest(promise_test, async test => { 540 await runTrustedBiddingSignalsSlotSizeTest( 541 test, 542 /*expectedSlotSize=*/'not-found', 543 /*expectedAllSlotsRequestedSizes=*/'not-found', 544 /*trustedBiddingSignalsSlotSizeMode=*/'slot-size'); 545 }, 'all-slots-requested-sizes trustedBiddingSignalsSlotSizeMode, no sizes in AuctionConfig'); 546 547 subsetTest(promise_test, async test => { 548 await runTrustedBiddingSignalsSlotSizeTest( 549 test, 550 /*expectedSlotSize=*/'not-found', 551 /*expectedAllSlotsRequestedSizes=*/'not-found', 552 /*trustedBiddingSignalsSlotSizeMode=*/'none', 553 {requestedSize: {width:'10', height:'20'}}); 554 }, 'none trustedBiddingSignalsSlotSizeMode, requestedSize in AuctionConfig'); 555 556 subsetTest(promise_test, async test => { 557 await runTrustedBiddingSignalsSlotSizeTest( 558 test, 559 /*expectedSlotSize=*/'not-found', 560 /*expectedAllSlotsRequestedSizes=*/'not-found', 561 /*trustedBiddingSignalsSlotSizeMode=*/null, 562 {requestedSize: {width:'10', height:'20'}}); 563 }, 'Null trustedBiddingSignalsSlotSizeMode, requestedSize in AuctionConfig'); 564 565 subsetTest(promise_test, async test => { 566 await runTrustedBiddingSignalsSlotSizeTest( 567 test, 568 /*expectedSlotSize=*/'not-found', 569 /*expectedAllSlotsRequestedSizes=*/'not-found', 570 /*trustedBiddingSignalsSlotSizeMode=*/'not-a-real-mode', 571 {requestedSize: {width:'10', height:'20'}}); 572 }, 'Unknown trustedBiddingSignalsSlotSizeMode, requestedSize in AuctionConfig'); 573 574 subsetTest(promise_test, async test => { 575 await runTrustedBiddingSignalsSlotSizeTest( 576 test, 577 /*expectedSlotSize=*/'10px,20px', 578 /*expectedAllSlotsRequestedSizes=*/'not-found', 579 /*trustedBiddingSignalsSlotSizeMode=*/'slot-size', 580 {requestedSize: {width:'10', height:'20'}}); 581 }, 'slot-size trustedBiddingSignalsSlotSizeMode, requestedSize in AuctionConfig'); 582 583 subsetTest(promise_test, async test => { 584 await runTrustedBiddingSignalsSlotSizeTest( 585 test, 586 /*expectedSlotSize=*/'not-found', 587 /*expectedAllSlotsRequestedSizes=*/'not-found', 588 /*trustedBiddingSignalsSlotSizeMode=*/'all-slots-requested-sizes', 589 {requestedSize: {width:'10', height:'20'}}); 590 }, 'all-slots-requested-sizes trustedBiddingSignalsSlotSizeMode, requestedSize in AuctionConfig'); 591 592 subsetTest(promise_test, async test => { 593 await runTrustedBiddingSignalsSlotSizeTest( 594 test, 595 /*expectedSlotSize=*/'not-found', 596 /*expectedAllSlotsRequestedSizes=*/'not-found', 597 /*trustedBiddingSignalsSlotSizeMode=*/'none', 598 {allSlotsRequestedSizes: [{width:10, height:20}]}); 599 }, 'none trustedBiddingSignalsSlotSizeMode, allSlotsRequestedSizes in AuctionConfig'); 600 601 subsetTest(promise_test, async test => { 602 await runTrustedBiddingSignalsSlotSizeTest( 603 test, 604 /*expectedSlotSize=*/'not-found', 605 /*expectedAllSlotsRequestedSizes=*/'not-found', 606 /*trustedBiddingSignalsSlotSizeMode=*/null, 607 {allSlotsRequestedSizes: [{width:'10', height:'20'}]}); 608 }, 'Null trustedBiddingSignalsSlotSizeMode, allSlotsRequestedSizes in AuctionConfig'); 609 610 subsetTest(promise_test, async test => { 611 await runTrustedBiddingSignalsSlotSizeTest( 612 test, 613 /*expectedSlotSize=*/'not-found', 614 /*expectedAllSlotsRequestedSizes=*/'not-found', 615 /*trustedBiddingSignalsSlotSizeMode=*/'not-a-real-mode', 616 {allSlotsRequestedSizes: [{width:'10', height:'20'}]}); 617 }, 'Unknown trustedBiddingSignalsSlotSizeMode, allSlotsRequestedSizes in AuctionConfig'); 618 619 subsetTest(promise_test, async test => { 620 await runTrustedBiddingSignalsSlotSizeTest( 621 test, 622 /*expectedSlotSize=*/'not-found', 623 /*expectedAllSlotsRequestedSizes=*/'not-found', 624 /*trustedBiddingSignalsSlotSizeMode=*/'slot-size', 625 {allSlotsRequestedSizes: [{width:'10', height:'20'}]}); 626 }, 'slot-size trustedBiddingSignalsSlotSizeMode, allSlotsRequestedSizes in AuctionConfig'); 627 628 subsetTest(promise_test, async test => { 629 await runTrustedBiddingSignalsSlotSizeTest( 630 test, 631 /*expectedSlotSize=*/'not-found', 632 /*expectedAllSlotsRequestedSizes=*/'10px,20px', 633 /*trustedBiddingSignalsSlotSizeMode=*/'all-slots-requested-sizes', 634 {allSlotsRequestedSizes: [{width:'10', height:'20'}]}); 635 }, 'all-slots-requested-sizes trustedBiddingSignalsSlotSizeMode, allSlotsRequestedSizes in AuctionConfig'); 636 637 subsetTest(promise_test, async test => { 638 await runTrustedBiddingSignalsSlotSizeTest( 639 test, 640 /*expectedSlotSize=*/'10px,20px', 641 /*expectedAllSlotsRequestedSizes=*/'not-found', 642 /*trustedBiddingSignalsSlotSizeMode=*/'slot-size', 643 {requestedSize: {width:'10px', height:'20px'}}); 644 }, 'slot-size trustedBiddingSignalsSlotSizeMode, explicit pixel units'); 645 646 subsetTest(promise_test, async test => { 647 await runTrustedBiddingSignalsSlotSizeTest( 648 test, 649 /*expectedSlotSize=*/'80sw,12.5sh', 650 /*expectedAllSlotsRequestedSizes=*/'not-found', 651 /*trustedBiddingSignalsSlotSizeMode=*/'slot-size', 652 {requestedSize: {width:'80sw', height:'12.50sh'}}); 653 }, 'slot-size trustedBiddingSignalsSlotSizeMode, screen size units'); 654 655 subsetTest(promise_test, async test => { 656 await runTrustedBiddingSignalsSlotSizeTest( 657 test, 658 /*expectedSlotSize=*/'80sh,12.5sw', 659 /*expectedAllSlotsRequestedSizes=*/'not-found', 660 /*trustedBiddingSignalsSlotSizeMode=*/'slot-size', 661 {requestedSize: {width:'80sh', height:'12.5sw'}}); 662 }, 'slot-size trustedBiddingSignalsSlotSizeMode, flipped screen size units'); 663 664 subsetTest(promise_test, async test => { 665 await runTrustedBiddingSignalsSlotSizeTest( 666 test, 667 /*expectedSlotSize=*/'10px,25sh', 668 /*expectedAllSlotsRequestedSizes=*/'not-found', 669 /*trustedBiddingSignalsSlotSizeMode=*/'slot-size', 670 {requestedSize: {width:'10', height:'25sh'}}); 671 }, 'slot-size trustedBiddingSignalsSlotSizeMode, mixed pixel and screen width units'); 672 673 subsetTest(promise_test, async test => { 674 await runTrustedBiddingSignalsSlotSizeTest( 675 test, 676 /*expectedSlotSize=*/'not-found', 677 /*expectedAllSlotsRequestedSizes=*/'10px,20px,25sw,20px,22px,80sh', 678 /*trustedBiddingSignalsSlotSizeMode=*/'all-slots-requested-sizes', 679 { allSlotsRequestedSizes: [ {width:'10', height:'20'}, 680 {width:'25sw', height:'20px'}, 681 {width:'22', height:'80sh'}]}); 682 }, 'all-slots-requested-sizes trustedBiddingSignalsSlotSizeMode, multiple unit types'); 683 684 subsetTest(promise_test, async test => { 685 const uuid = generateUuid(test); 686 687 let group1ReportURL = createBidderReportURL(uuid, /*id=*/'none') 688 let group2ReportURL = createBidderReportURL(uuid, /*id=*/'slot-size') 689 let group3ReportURL = createBidderReportURL(uuid, /*id=*/'all-slots-requested-sizes') 690 691 // The simplest way to make sure interest groups with different modes all receive 692 // the right sizes is to have interest groups that modify their bids based on ad 693 // size sent to the trusted server. 694 await Promise.all( 695 [ joinInterestGroup( 696 test, uuid, 697 { name: 'group 1', 698 trustedBiddingSignalsKeys: ['slotSize', 'allSlotsRequestedSizes'], 699 trustedBiddingSignalsSlotSizeMode: 'none', 700 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL, 701 biddingLogicURL: createBiddingScriptURL( 702 { generateBid: 703 `if (trustedBiddingSignals["slotSize"] !== "not-found" || 704 trustedBiddingSignals["allSlotsRequestedSizes"] !== "not-found") { 705 throw "unexpected trustedBiddingSignals"; 706 } 707 return {bid: 5, render: interestGroup.ads[0].renderURL};`, 708 reportWin: `sendReportTo("${group1ReportURL}");`})}), 709 joinInterestGroup( 710 test, uuid, 711 { name: 'group 2', 712 trustedBiddingSignalsKeys: ['slotSize', 'allSlotsRequestedSizes'], 713 trustedBiddingSignalsSlotSizeMode: 'slot-size', 714 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL, 715 biddingLogicURL: createBiddingScriptURL( 716 { generateBid: 717 `if (trustedBiddingSignals["slotSize"] === "not-found" || 718 trustedBiddingSignals["allSlotsRequestedSizes"] !== "not-found") { 719 throw "unexpected trustedBiddingSignals"; 720 } 721 // Group 3 bids using the first digit of the first dimension. 722 return { bid: trustedBiddingSignals["slotSize"].substr(0, 1), 723 render: interestGroup.ads[0].renderURL};`, 724 reportWin: `sendReportTo("${group2ReportURL}");`})}), 725 joinInterestGroup( 726 test, uuid, 727 { name: 'group 3', 728 trustedBiddingSignalsKeys: ['slotSize', 'allSlotsRequestedSizes'], 729 trustedBiddingSignalsSlotSizeMode: 'all-slots-requested-sizes', 730 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL, 731 biddingLogicURL: createBiddingScriptURL( 732 { generateBid: 733 `if (trustedBiddingSignals["slotSize"] !== "not-found" || 734 trustedBiddingSignals["allSlotsRequestedSizes"] === "not-found") { 735 throw "unexpected trustedBiddingSignals"; 736 } 737 // Group 3 bids using the second digit of the first dimension. 738 return { bid: trustedBiddingSignals["allSlotsRequestedSizes"].substr(1, 1), 739 render: interestGroup.ads[0].renderURL};`, 740 reportWin: `sendReportTo("${group3ReportURL}");`})}), 741 ] 742 ); 743 744 let auctionConfigOverrides = { 745 // Disable the default seller reporting, for simplicity. 746 decisionLogicURL: createDecisionScriptURL(uuid, { reportResult: '' }), 747 // Default sizes start with a "11", so groups 2 and 3 will start with a bid 748 // of 1 and lose. 749 requestedSize: {width:'11', height:'20'}, 750 allSlotsRequestedSizes: [{width:'11', height:'20'}] 751 }; 752 753 // Group 1 wins the first auction. 754 await runBasicFledgeAuctionAndNavigate(test, uuid, auctionConfigOverrides); 755 await waitForObservedRequests(uuid, [group1ReportURL]); 756 757 // Group2 should bid "6" in the second auction, and win it. 758 auctionConfigOverrides.requestedSize = {width:'61', height:'20'}; 759 auctionConfigOverrides.allSlotsRequestedSizes = [{width:'61', height:'20'}]; 760 await runBasicFledgeAuctionAndNavigate(test, uuid, auctionConfigOverrides); 761 await waitForObservedRequests(uuid, [group1ReportURL, group2ReportURL]); 762 763 // Group3 should bid "7" in the third auction, and win it. 764 auctionConfigOverrides.requestedSize = {width:'67', height:'20'}; 765 auctionConfigOverrides.allSlotsRequestedSizes = [{width:'67', height:'20'}]; 766 await runBasicFledgeAuctionAndNavigate(test, uuid, auctionConfigOverrides); 767 await waitForObservedRequests(uuid, [group1ReportURL, group2ReportURL, group3ReportURL]); 768 }, 'Mixed trustedBiddingSignalsSlotSizeModes in a single auction'); 769 770 subsetTest(promise_test, async test => { 771 const uuid = generateUuid(test); 772 let componentAuctionConfig = { 773 seller: window.location.origin, 774 decisionLogicURL: createDecisionScriptURL(uuid), 775 interestGroupBuyers: [window.location.origin], 776 requestedSize: {width:'10', height:'20'} 777 }; 778 779 let auctionConfigOverrides = { 780 interestGroupBuyers: [], 781 componentAuctions: [componentAuctionConfig], 782 requestedSize: {width:'22', height:'33'} 783 } 784 785 await runTrustedBiddingSignalsSlotSizeTest( 786 test, 787 // Dimensions from the component auction should be used. 788 /*expectedSlotSize=*/'10px,20px', 789 /*expectedAllSlotsRequestedSizes=*/'not-found', 790 /*trustedBiddingSignalsSlotSizeMode=*/'slot-size', 791 auctionConfigOverrides, 792 uuid); 793 }, 'slot-size trustedBiddingSignalsSlotSizeMode in a component auction'); 794 795 subsetTest(promise_test, async test => { 796 const uuid = generateUuid(test); 797 let componentAuctionConfig = { 798 seller: window.location.origin, 799 decisionLogicURL: createDecisionScriptURL(uuid), 800 interestGroupBuyers: [window.location.origin], 801 allSlotsRequestedSizes: [{width:'11', height:'22'}, {width:'12', height:'23'}] 802 }; 803 804 let auctionConfigOverrides = { 805 interestGroupBuyers: [], 806 componentAuctions: [componentAuctionConfig], 807 allSlotsRequestedSizes: [{width:'10', height:'20'}] 808 } 809 810 await runTrustedBiddingSignalsSlotSizeTest( 811 test, 812 // Dimensions from the component auction should be used. 813 /*expectedSlotSize=*/'not-found', 814 /*expectedAllSlotsRequestedSizes=*/'11px,22px,12px,23px', 815 /*trustedBiddingSignalsSlotSizeMode=*/'all-slots-requested-sizes', 816 auctionConfigOverrides, 817 uuid); 818 }, 'all-slots-requested-sizes trustedBiddingSignalsSlotSizeMode in a component auction'); 819 820 ///////////////////////////////////////////////////////////////////////////// 821 // maxTrustedBiddingSignalsURLLength tests 822 ///////////////////////////////////////////////////////////////////////////// 823 // To detect whether two signals are fetched together or separately, the trusted bidding signals 824 // Python server will return the request URL as the signal value if the request URL contains the 825 // string url in its query parameters. 826 827 // Trusted bidding signals can be retrieved when `maxTrustedBiddingSignalsURLLength` is set to 0, 828 // which means infinite length limit. 829 subsetTest(promise_test, async test => { 830 const name = 'group'; 831 const expect_queries = 'keys=interest-group-names,url&interestGroupNames=group'; 832 await runTrustedBiddingSignalsTest( 833 test, 834 // Check returned signal contains expected queries to ensure the URL is not truncated. 835 ` trustedBiddingSignals["interest-group-names"] === '["${name}"]' && 836 trustedBiddingSignals["url"].includes("${expect_queries}") `, 837 { 838 name: name, 839 trustedBiddingSignalsKeys: ['interest-group-names', 'url'], 840 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL, 841 maxTrustedBiddingSignalsURLLength: 0 842 }); 843 }, 'Trusted bidding signals request works with a URL length limit set to 0.'); 844 845 // Trusted bidding signals can be retrieved when `maxTrustedBiddingSignalsURLLength` is set to 846 // a non-zero value smaller than the length of the request URL. It also tests that multiple 847 // bidding keys from the same interest group will not be separated even the full URL length is 848 // larger than the limit. 849 subsetTest(promise_test, async test => { 850 const name = 'group'; 851 const expect_queries = 'keys=interest-group-names,url&interestGroupNames=group'; 852 await runTrustedBiddingSignalsTest( 853 test, 854 // Check returned signal contains expected queries to ensure the URL is not truncated. 855 ` trustedBiddingSignals["interest-group-names"] === '["${name}"]' && 856 trustedBiddingSignals["url"].includes("${expect_queries}") `, 857 { 858 name: name, 859 trustedBiddingSignalsKeys: ['interest-group-names', 'url'], 860 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL, 861 maxTrustedBiddingSignalsURLLength: 1 862 }); 863 }, 'Trusted bidding signals request works with a URL length limit smaller than the URL length.'); 864 865 // Trusted bidding signals can be retrieved when `maxTrustedBiddingSignalsURLLength` is set to 866 // a value larger than the length of the request URL. 867 subsetTest(promise_test, async test => { 868 const name = 'group'; 869 const expect_queries = 'keys=interest-group-names,url&interestGroupNames=group'; 870 await runTrustedBiddingSignalsTest( 871 test, 872 // Check returned signal contains expected queries to ensure the URL is not truncated. 873 ` trustedBiddingSignals["interest-group-names"] === '["${name}"]' && 874 trustedBiddingSignals["url"].includes("${expect_queries}") `, 875 { 876 name: name, 877 trustedBiddingSignalsKeys: ['interest-group-names', 'url'], 878 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL, 879 maxTrustedBiddingSignalsURLLength: 1000 880 }); 881 }, 'Trusted bidding signals request works with a URL length limit larger than the URL length.'); 882 883 // Test whether an oversized trusted bidding signals request URL, generated from two interest 884 // groups, will be split into two parts when `maxTrustedBiddingSignalsURLLength` is set to a 885 // value larger than a single URL length and smaller than the combined URL length. A request 886 // URL from a single interest group contains about 188 characters, while a request URL from 887 // two interest groups contains about 216 characters. 888 subsetTest(promise_test, async test => { 889 const uuid = generateUuid(test); 890 const name1 = 'extraordinarilyLongNameGroup1'; 891 const name2 = 'extraordinarilyLongNameGroup2'; 892 893 await Promise.all( 894 [ joinInterestGroup( 895 test, uuid, 896 { 897 name: name1, 898 trustedBiddingSignalsKeys: ['interest-group-names', 'url'], 899 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL, 900 maxTrustedBiddingSignalsURLLength: 200, 901 biddingLogicURL: createBiddingScriptURL( 902 { 903 // Return 0 as bid to force the second interest group to win. This interest group 904 // is considered as fetching trusted bidding signals by itself if the winner's 905 // URL length passes the limit check. 906 generateBid: 907 `return { bid: 0, render: interestGroup.ads[0].renderURL };` 908 }) 909 }), 910 joinInterestGroup( 911 test, uuid, 912 { 913 name: name2, 914 trustedBiddingSignalsKeys: ['interest-group-names', 'url'], 915 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL, 916 maxTrustedBiddingSignalsURLLength: 200, 917 biddingLogicURL: createBiddingScriptURL( 918 { 919 generateBid: 920 `if (trustedBiddingSignals["interest-group-names"] !== '["${name2}"]' || 921 trustedBiddingSignals["url"].includes("${name1}")) { 922 throw "unexpected trustedBiddingSignals"; 923 } 924 return { bid: 10, render: interestGroup.ads[0].renderURL };`}) 925 }) 926 ] 927 ); 928 await runBasicFledgeTestExpectingWinner(test, uuid); 929 }, 'Trusted bidding signals splits the request if the combined URL length exceeds the limit of regular value.'); 930 931 // Test whether an oversized trusted bidding signals request URL, generated from two interest 932 // groups, will be split into two parts when `maxTrustedBiddingSignalsURLLength` is set to a 933 // value smaller than a single URL length. 934 subsetTest(promise_test, async test => { 935 const uuid = generateUuid(test); 936 const name1 = 'extraordinaryLongNameGroup1'; 937 const name2 = 'extraordinaryLongNameGroup2'; 938 939 await Promise.all( 940 [ joinInterestGroup( 941 test, uuid, 942 { 943 name: name1, 944 trustedBiddingSignalsKeys: ['interest-group-names', 'url'], 945 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL, 946 maxTrustedBiddingSignalsURLLength: 1, 947 biddingLogicURL: createBiddingScriptURL( 948 { 949 generateBid: 950 `return { bid: 0, render: interestGroup.ads[0].renderURL };` 951 }) 952 }), 953 joinInterestGroup( 954 test, uuid, 955 { 956 name: name2, 957 trustedBiddingSignalsKeys: ['interest-group-names', 'url'], 958 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL, 959 maxTrustedBiddingSignalsURLLength: 1, 960 biddingLogicURL: createBiddingScriptURL( 961 { 962 generateBid: 963 `if (trustedBiddingSignals["interest-group-names"] !== '["${name2}"]' || 964 trustedBiddingSignals["url"].includes("${name1}")) { 965 throw "unexpected trustedBiddingSignals"; 966 } 967 return { bid: 10, render: interestGroup.ads[0].renderURL };`}) 968 }) 969 ] 970 ); 971 await runBasicFledgeTestExpectingWinner(test, uuid); 972 }, 'Trusted bidding signals splits the request if the combined URL length exceeds the limit of small value.'); 973 974 ///////////////////////////////////////////////////////////////////////////// 975 // updateIfOlderThanMs tests 976 // 977 // NOTE: Due to the lack of mock time in wpt, these test just exercise the code 978 // paths and ensure that no crash occurs -- they don't otherwise verify 979 // behavior. 980 ///////////////////////////////////////////////////////////////////////////// 981 982 subsetTest(promise_test, async test => { 983 await runTrustedBiddingSignalsTest( 984 test, 985 'true', 986 { name: 'use-update-if-older-than-ms', 987 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 988 }, 'Trusted bidding signals response has updateIfOlderThanMs > 10 min.'); 989 990 subsetTest(promise_test, async test => { 991 await runTrustedBiddingSignalsTest( 992 test, 993 'true', 994 { name: 'use-update-if-older-than-ms-small', 995 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 996 }, 'Trusted bidding signals response has updateIfOlderThanMs == 1 ms.'); 997 998 subsetTest(promise_test, async test => { 999 await runTrustedBiddingSignalsTest( 1000 test, 1001 'true', 1002 { name: 'use-update-if-older-than-ms-zero', 1003 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 1004 }, 'Trusted bidding signals response has updateIfOlderThanMs == 0 ms.'); 1005 1006 subsetTest(promise_test, async test => { 1007 await runTrustedBiddingSignalsTest( 1008 test, 1009 'true', 1010 { name: 'use-update-if-older-than-ms-negative', 1011 trustedBiddingSignalsURL: TRUSTED_BIDDING_SIGNALS_URL }); 1012 }, 'Trusted bidding signals response has updateIfOlderThanMs == -1 ms.');