tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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.');