24 #include <gmock/gmock.h>
25 #include <gtest/gtest.h>
35 namespace iomgr_engine {
38 int64_t RandomDeadline(
void) {
return rand(); }
40 std::vector<Timer> CreateTestElements(
size_t num_elements) {
43 elems[
i].deadline = RandomDeadline();
48 void CheckValid(TimerHeap* pq) {
49 const std::vector<Timer*>& timers = pq->TestOnlyGetTimers();
50 for (
size_t i = 0;
i < timers.size(); ++
i) {
51 size_t left_child = 1
u + 2
u *
i;
52 size_t right_child = left_child + 1
u;
53 if (left_child < timers.size()) {
54 EXPECT_LE(timers[i]->deadline, timers[left_child]->deadline);
56 if (right_child < timers.size()) {
57 EXPECT_LE(timers[i]->deadline, timers[right_child]->deadline);
62 TEST(TimerHeapTest, Basics) {
64 const size_t num_test_elements = 200;
65 const size_t num_test_operations = 10000;
67 std::vector<Timer> test_elements = CreateTestElements(num_test_elements);
72 for (i = 0;
i < num_test_elements; ++
i) {
74 pq.Add(&test_elements[i]);
79 for (i = 0;
i < num_test_elements; ++
i) {
85 EXPECT_EQ(pq.TestOnlyGetTimers().size(), num_test_elements);
88 for (i = 0;
i < num_test_operations; ++
i) {
89 size_t elem_num =
static_cast<size_t>(rand()) % num_test_elements;
90 Timer* el = &test_elements[elem_num];
91 if (!inpq.
is_set(elem_num)) {
93 el->deadline = RandomDeadline();
102 inpq.
clear(elem_num);
113 ElemStruct* SearchElems(std::vector<ElemStruct>& elems,
bool inserted) {
114 std::vector<size_t> search_order;
115 for (
size_t i = 0;
i < elems.size();
i++) {
116 search_order.push_back(
i);
118 for (
size_t i = 0;
i < elems.size() * 2;
i++) {
119 size_t a =
static_cast<size_t>(rand()) % elems.size();
120 size_t b =
static_cast<size_t>(rand()) % elems.size();
123 ElemStruct*
out =
nullptr;
124 for (
size_t i = 0;
out ==
nullptr &&
i < elems.size();
i++) {
126 out = &elems[search_order[
i]];
133 TEST(TimerHeapTest, RandomMutations) {
136 static const size_t elems_size = 1000;
137 std::vector<ElemStruct> elems(elems_size);
138 size_t num_inserted = 0;
141 int r = rand() % 1000;
144 ElemStruct* el = SearchElems(elems,
false);
146 el->elem.deadline = RandomDeadline();
152 }
else if (
r <= 650) {
154 ElemStruct* el = SearchElems(elems,
true);
156 pq.Remove(&el->elem);
157 el->inserted =
false;
163 if (num_inserted > 0) {
164 Timer*
top = pq.Top();
166 for (
size_t i = 0;
i < elems_size;
i++) {
169 elems[
i].inserted =
false;
178 int64_t* min_deadline =
nullptr;
179 for (
size_t i = 0;
i < elems_size;
i++) {
181 if (min_deadline ==
nullptr) {
182 min_deadline = &elems[
i].elem.deadline;
185 min_deadline = &elems[
i].elem.deadline;
190 GPR_ASSERT(pq.Top()->deadline == *min_deadline);
199 int main(
int argc,
char** argv) {