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)