tor-browser

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

testSliceBudget.cpp (3196B)


      1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
      2 * vim: set ts=8 sts=2 et sw=2 tw=80:
      3 */
      4 /* This Source Code Form is subject to the terms of the Mozilla Public
      5 * License, v. 2.0. If a copy of the MPL was not distributed with this
      6 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      7 
      8 #include "js/SliceBudget.h"
      9 #include "jsapi-tests/tests.h"
     10 
     11 using namespace js;
     12 using JS::SliceBudget;
     13 using JS::TimeBudget;
     14 using JS::WorkBudget;
     15 
     16 BEGIN_TEST(testSliceBudgetUnlimited) {
     17  SliceBudget budget = SliceBudget::unlimited();
     18  CHECK(budget.isUnlimited());
     19  CHECK(!budget.isTimeBudget());
     20  CHECK(!budget.isWorkBudget());
     21 
     22  CHECK(!budget.isOverBudget());
     23 
     24  budget.step(1000000);
     25  CHECK(!budget.isOverBudget());
     26 
     27  return true;
     28 }
     29 END_TEST(testSliceBudgetUnlimited)
     30 
     31 BEGIN_TEST(testSliceBudgetWork) {
     32  SliceBudget budget = SliceBudget(WorkBudget(10000));
     33  CHECK(!budget.isUnlimited());
     34  CHECK(budget.isWorkBudget());
     35  CHECK(!budget.isTimeBudget());
     36 
     37  CHECK(budget.workBudget() == 10000);
     38 
     39  CHECK(!budget.isOverBudget());
     40 
     41  budget.step(5000);
     42  CHECK(!budget.isOverBudget());
     43 
     44  budget.step(5000);
     45  CHECK(budget.isOverBudget());
     46 
     47  return true;
     48 }
     49 END_TEST(testSliceBudgetWork)
     50 
     51 BEGIN_TEST(testSliceBudgetTime) {
     52  SliceBudget budget = SliceBudget(TimeBudget(10000));
     53  CHECK(!budget.isUnlimited());
     54  CHECK(!budget.isWorkBudget());
     55  CHECK(budget.isTimeBudget());
     56 
     57  CHECK(budget.timeBudget() == 10000);
     58 
     59  CHECK(!budget.isOverBudget());
     60 
     61  budget.step(5000);
     62  budget.step(5000);
     63  CHECK(!budget.isOverBudget());
     64 
     65  // This doesn't test the deadline is correct as that would require waiting.
     66 
     67  return true;
     68 }
     69 END_TEST(testSliceBudgetTime)
     70 
     71 BEGIN_TEST(testSliceBudgetTimeZero) {
     72  SliceBudget budget = SliceBudget(TimeBudget(0));
     73  budget.step(1000);
     74  CHECK(budget.isOverBudget());
     75 
     76  return true;
     77 }
     78 END_TEST(testSliceBudgetTimeZero)
     79 
     80 BEGIN_TEST(testSliceBudgetInterruptibleTime) {
     81  SliceBudget::InterruptRequestFlag wantInterrupt(false);
     82 
     83  // Interruptible 100 second budget. This test will finish in well under that
     84  // time.
     85  static constexpr int64_t LONG_TIME = 100000;
     86  SliceBudget budget = SliceBudget(TimeBudget(LONG_TIME), &wantInterrupt);
     87  CHECK(!budget.isUnlimited());
     88  CHECK(!budget.isWorkBudget());
     89  CHECK(budget.isTimeBudget());
     90 
     91  CHECK(budget.timeBudget() == LONG_TIME);
     92 
     93  CHECK(!budget.isOverBudget());
     94 
     95  // We do a little work, very small amount of time passes.
     96  budget.step(500);
     97 
     98  // Not enough work to check interrupt, and no interrupt anyway.
     99  CHECK(!budget.isOverBudget());
    100 
    101  // External signal: interrupt requested.
    102  wantInterrupt = true;
    103 
    104  // Interrupt requested, but not enough work has been done to check for it.
    105  CHECK(!budget.isOverBudget());
    106 
    107  // Do enough work for an expensive check.
    108  budget.step(1000);
    109 
    110  // Interrupt requested!
    111  CHECK(budget.isOverBudget());
    112 
    113  // The external flag is not reset, but the budget will internally remember
    114  // that an interrupt was requested.
    115  CHECK(wantInterrupt);
    116  wantInterrupt = false;
    117  CHECK(budget.isOverBudget());
    118 
    119  // This doesn't test the deadline is correct as that would require waiting.
    120 
    121  return true;
    122 }
    123 END_TEST(testSliceBudgetInterruptibleTime)