summaryrefslogtreecommitdiff
path: root/deps/v8/test/unittests/objects/microtask-queue-unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/test/unittests/objects/microtask-queue-unittest.cc')
-rw-r--r--deps/v8/test/unittests/objects/microtask-queue-unittest.cc55
1 files changed, 55 insertions, 0 deletions
diff --git a/deps/v8/test/unittests/objects/microtask-queue-unittest.cc b/deps/v8/test/unittests/objects/microtask-queue-unittest.cc
new file mode 100644
index 0000000000..2b237ebc50
--- /dev/null
+++ b/deps/v8/test/unittests/objects/microtask-queue-unittest.cc
@@ -0,0 +1,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