summaryrefslogtreecommitdiff
path: root/deps/v8/test/unittests/objects/microtask-queue-unittest.cc
blob: 2b237ebc50a8f216d51ac2f03137ed254bd30d27 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// Copyright 2018 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/objects/microtask-queue-inl.h"

#include "test/unittests/test-utils.h"

namespace v8 {
namespace internal {

void NoopCallback(void*) {}

class MicrotaskQueueTest : public TestWithIsolate {
 public:
  Handle<Microtask> NewMicrotask() {
    MicrotaskCallback callback = &NoopCallback;
    void* data = nullptr;
    return factory()->NewCallbackTask(
        factory()->NewForeign(reinterpret_cast<Address>(callback)),
        factory()->NewForeign(reinterpret_cast<Address>(data)));
  }
};

TEST_F(MicrotaskQueueTest, EnqueueMicrotask) {
  Handle<MicrotaskQueue> microtask_queue = factory()->NewMicrotaskQueue();
  Handle<Microtask> microtask = NewMicrotask();

  EXPECT_EQ(0, microtask_queue->pending_microtask_count());
  MicrotaskQueue::EnqueueMicrotask(isolate(), microtask_queue, microtask);
  EXPECT_EQ(1, microtask_queue->pending_microtask_count());
  ASSERT_LE(1, microtask_queue->queue()->length());
  EXPECT_EQ(*microtask, microtask_queue->queue()->get(0));

  std::vector<Handle<Microtask>> microtasks;
  microtasks.push_back(microtask);

  // Queue microtasks until the reallocation happens.
  int queue_capacity = microtask_queue->queue()->length();
  for (int i = 0; i < queue_capacity; ++i) {
    microtask = NewMicrotask();
    MicrotaskQueue::EnqueueMicrotask(isolate(), microtask_queue, microtask);
    microtasks.push_back(microtask);
  }

  int num_tasks = static_cast<int>(microtasks.size());
  EXPECT_EQ(num_tasks, microtask_queue->pending_microtask_count());
  ASSERT_LE(num_tasks, microtask_queue->queue()->length());
  for (int i = 0; i < num_tasks; ++i) {
    EXPECT_EQ(*microtasks[i], microtask_queue->queue()->get(i));
  }
}

}  // namespace internal
}  // namespace v8