tor-browser

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

queuing-strategies.any.js (6149B)


      1 // META: global=window,worker,shadowrealm
      2 'use strict';
      3 
      4 const highWaterMarkConversions = new Map([
      5  [-Infinity, -Infinity],
      6  [-5, -5],
      7  [false, 0],
      8  [true, 1],
      9  [NaN, NaN],
     10  ['foo', NaN],
     11  ['0', 0],
     12  [{}, NaN],
     13  [() => {}, NaN]
     14 ]);
     15 
     16 for (const QueuingStrategy of [CountQueuingStrategy, ByteLengthQueuingStrategy]) {
     17  test(() => {
     18    new QueuingStrategy({ highWaterMark: 4 });
     19  }, `${QueuingStrategy.name}: Can construct a with a valid high water mark`);
     20 
     21  test(() => {
     22    const highWaterMark = 1;
     23    const highWaterMarkObjectGetter = {
     24      get highWaterMark() { return highWaterMark; }
     25    };
     26    const error = new Error('wow!');
     27    const highWaterMarkObjectGetterThrowing = {
     28      get highWaterMark() { throw error; }
     29    };
     30 
     31    assert_throws_js(TypeError, () => new QueuingStrategy(), 'construction fails with undefined');
     32    assert_throws_js(TypeError, () => new QueuingStrategy(null), 'construction fails with null');
     33    assert_throws_js(TypeError, () => new QueuingStrategy(true), 'construction fails with true');
     34    assert_throws_js(TypeError, () => new QueuingStrategy(5), 'construction fails with 5');
     35    assert_throws_js(TypeError, () => new QueuingStrategy({}), 'construction fails with {}');
     36    assert_throws_exactly(error, () => new QueuingStrategy(highWaterMarkObjectGetterThrowing),
     37      'construction fails with an object with a throwing highWaterMark getter');
     38 
     39    assert_equals((new QueuingStrategy(highWaterMarkObjectGetter)).highWaterMark, highWaterMark);
     40  }, `${QueuingStrategy.name}: Constructor behaves as expected with strange arguments`);
     41 
     42  test(() => {
     43    for (const [input, output] of highWaterMarkConversions.entries()) {
     44      const strategy = new QueuingStrategy({ highWaterMark: input });
     45      assert_equals(strategy.highWaterMark, output, `${input} gets set correctly`);
     46    }
     47  }, `${QueuingStrategy.name}: highWaterMark constructor values are converted per the unrestricted double rules`);
     48 
     49  test(() => {
     50    const size1 = (new QueuingStrategy({ highWaterMark: 5 })).size;
     51    const size2 = (new QueuingStrategy({ highWaterMark: 10 })).size;
     52 
     53    assert_equals(size1, size2);
     54  }, `${QueuingStrategy.name}: size is the same function across all instances`);
     55 
     56  test(() => {
     57    const size = (new QueuingStrategy({ highWaterMark: 5 })).size;
     58    assert_equals(size.name, 'size');
     59  }, `${QueuingStrategy.name}: size should have the right name`);
     60 
     61  test(() => {
     62    class SubClass extends QueuingStrategy {
     63      size() {
     64        return 2;
     65      }
     66 
     67      subClassMethod() {
     68        return true;
     69      }
     70    }
     71 
     72    const sc = new SubClass({ highWaterMark: 77 });
     73    assert_equals(sc.constructor.name, 'SubClass', 'constructor.name should be correct');
     74    assert_equals(sc.highWaterMark, 77, 'highWaterMark should come from the parent class');
     75    assert_equals(sc.size(), 2, 'size() on the subclass should override the parent');
     76    assert_true(sc.subClassMethod(), 'subClassMethod() should work');
     77  }, `${QueuingStrategy.name}: subclassing should work correctly`);
     78 
     79  test(() => {
     80    const size = new QueuingStrategy({ highWaterMark: 5 }).size;
     81    assert_false('prototype' in size);
     82  }, `${QueuingStrategy.name}: size should not have a prototype property`);
     83 }
     84 
     85 test(() => {
     86  const size = new CountQueuingStrategy({ highWaterMark: 5 }).size;
     87  assert_throws_js(TypeError, () => new size());
     88 }, `CountQueuingStrategy: size should not be a constructor`);
     89 
     90 test(() => {
     91  const size = new ByteLengthQueuingStrategy({ highWaterMark: 5 }).size;
     92  assert_throws_js(TypeError, () => new size({ byteLength: 1024 }));
     93 }, `ByteLengthQueuingStrategy: size should not be a constructor`);
     94 
     95 test(() => {
     96  const size = (new CountQueuingStrategy({ highWaterMark: 5 })).size;
     97  assert_equals(size.length, 0);
     98 }, 'CountQueuingStrategy: size should have the right length');
     99 
    100 test(() => {
    101  const size = (new ByteLengthQueuingStrategy({ highWaterMark: 5 })).size;
    102  assert_equals(size.length, 1);
    103 }, 'ByteLengthQueuingStrategy: size should have the right length');
    104 
    105 test(() => {
    106  const size = 1024;
    107  const chunk = { byteLength: size };
    108  const chunkGetter = {
    109    get byteLength() { return size; }
    110  };
    111  const error = new Error('wow!');
    112  const chunkGetterThrowing = {
    113    get byteLength() { throw error; }
    114  };
    115 
    116  const sizeFunction = (new CountQueuingStrategy({ highWaterMark: 5 })).size;
    117 
    118  assert_equals(sizeFunction(), 1, 'size returns 1 with undefined');
    119  assert_equals(sizeFunction(null), 1, 'size returns 1 with null');
    120  assert_equals(sizeFunction('potato'), 1, 'size returns 1 with non-object type');
    121  assert_equals(sizeFunction({}), 1, 'size returns 1 with empty object');
    122  assert_equals(sizeFunction(chunk), 1, 'size returns 1 with a chunk');
    123  assert_equals(sizeFunction(chunkGetter), 1, 'size returns 1 with chunk getter');
    124  assert_equals(sizeFunction(chunkGetterThrowing), 1,
    125    'size returns 1 with chunk getter that throws');
    126 }, 'CountQueuingStrategy: size behaves as expected with strange arguments');
    127 
    128 test(() => {
    129  const size = 1024;
    130  const chunk = { byteLength: size };
    131  const chunkGetter = {
    132    get byteLength() { return size; }
    133  };
    134  const error = new Error('wow!');
    135  const chunkGetterThrowing = {
    136    get byteLength() { throw error; }
    137  };
    138 
    139  const sizeFunction = (new ByteLengthQueuingStrategy({ highWaterMark: 5 })).size;
    140 
    141  assert_throws_js(TypeError, () => sizeFunction(), 'size fails with undefined');
    142  assert_throws_js(TypeError, () => sizeFunction(null), 'size fails with null');
    143  assert_equals(sizeFunction('potato'), undefined, 'size succeeds with undefined with a random non-object type');
    144  assert_equals(sizeFunction({}), undefined, 'size succeeds with undefined with an object without hwm property');
    145  assert_equals(sizeFunction(chunk), size, 'size succeeds with the right amount with an object with a hwm');
    146  assert_equals(sizeFunction(chunkGetter), size,
    147    'size succeeds with the right amount with an object with a hwm getter');
    148  assert_throws_exactly(error, () => sizeFunction(chunkGetterThrowing),
    149    'size fails with the error thrown by the getter');
    150 }, 'ByteLengthQueuingStrategy: size behaves as expected with strange arguments');