summaryrefslogtreecommitdiff
path: root/deps/v8/test/unittests/objects/backing-store-unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/test/unittests/objects/backing-store-unittest.cc')
-rw-r--r--deps/v8/test/unittests/objects/backing-store-unittest.cc128
1 files changed, 128 insertions, 0 deletions
diff --git a/deps/v8/test/unittests/objects/backing-store-unittest.cc b/deps/v8/test/unittests/objects/backing-store-unittest.cc
new file mode 100644
index 0000000000..d00f5632fe
--- /dev/null
+++ b/deps/v8/test/unittests/objects/backing-store-unittest.cc
@@ -0,0 +1,128 @@
+// Copyright 2019 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/backing-store.h"
+#include "src/base/platform/platform.h"
+#include "test/unittests/test-utils.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace v8 {
+namespace internal {
+
+class BackingStoreTest : public TestWithIsolate {};
+
+TEST_F(BackingStoreTest, GrowWasmMemoryInPlace) {
+ auto backing_store =
+ BackingStore::AllocateWasmMemory(isolate(), 1, 2, SharedFlag::kNotShared);
+ CHECK(backing_store);
+ EXPECT_TRUE(backing_store->is_wasm_memory());
+ EXPECT_EQ(1 * wasm::kWasmPageSize, backing_store->byte_length());
+ EXPECT_EQ(2 * wasm::kWasmPageSize, backing_store->byte_capacity());
+
+ bool success = backing_store->GrowWasmMemoryInPlace(isolate(), 1, 2);
+ EXPECT_TRUE(success);
+ EXPECT_EQ(2 * wasm::kWasmPageSize, backing_store->byte_length());
+}
+
+TEST_F(BackingStoreTest, GrowWasmMemoryInPlace_neg) {
+ auto backing_store =
+ BackingStore::AllocateWasmMemory(isolate(), 1, 2, SharedFlag::kNotShared);
+ CHECK(backing_store);
+ EXPECT_TRUE(backing_store->is_wasm_memory());
+ EXPECT_EQ(1 * wasm::kWasmPageSize, backing_store->byte_length());
+ EXPECT_EQ(2 * wasm::kWasmPageSize, backing_store->byte_capacity());
+
+ bool success = backing_store->GrowWasmMemoryInPlace(isolate(), 2, 2);
+ EXPECT_FALSE(success);
+ EXPECT_EQ(1 * wasm::kWasmPageSize, backing_store->byte_length());
+}
+
+TEST_F(BackingStoreTest, GrowSharedWasmMemoryInPlace) {
+ auto backing_store =
+ BackingStore::AllocateWasmMemory(isolate(), 2, 3, SharedFlag::kShared);
+ CHECK(backing_store);
+ EXPECT_TRUE(backing_store->is_wasm_memory());
+ EXPECT_EQ(2 * wasm::kWasmPageSize, backing_store->byte_length());
+ EXPECT_EQ(3 * wasm::kWasmPageSize, backing_store->byte_capacity());
+
+ bool success = backing_store->GrowWasmMemoryInPlace(isolate(), 1, 3);
+ EXPECT_TRUE(success);
+ EXPECT_EQ(3 * wasm::kWasmPageSize, backing_store->byte_length());
+}
+
+TEST_F(BackingStoreTest, CopyWasmMemory) {
+ auto bs1 =
+ BackingStore::AllocateWasmMemory(isolate(), 1, 2, SharedFlag::kNotShared);
+ CHECK(bs1);
+ EXPECT_TRUE(bs1->is_wasm_memory());
+ EXPECT_EQ(1 * wasm::kWasmPageSize, bs1->byte_length());
+ EXPECT_EQ(2 * wasm::kWasmPageSize, bs1->byte_capacity());
+
+ auto bs2 = bs1->CopyWasmMemory(isolate(), 3);
+ EXPECT_TRUE(bs2->is_wasm_memory());
+ EXPECT_EQ(3 * wasm::kWasmPageSize, bs2->byte_length());
+ EXPECT_EQ(3 * wasm::kWasmPageSize, bs2->byte_capacity());
+}
+
+class GrowerThread : public base::Thread {
+ public:
+ GrowerThread(Isolate* isolate, uint32_t increment, uint32_t max,
+ std::shared_ptr<BackingStore> backing_store)
+ : base::Thread(base::Thread::Options("GrowerThread")),
+ isolate_(isolate),
+ increment_(increment),
+ max_(max),
+ backing_store_(backing_store) {}
+
+ void Run() override {
+ size_t max_length = max_ * wasm::kWasmPageSize;
+ while (true) {
+ size_t current_length = backing_store_->byte_length();
+ if (current_length >= max_length) break;
+ bool result =
+ backing_store_->GrowWasmMemoryInPlace(isolate_, increment_, max_);
+ size_t new_length = backing_store_->byte_length();
+ if (result) {
+ CHECK_GE(new_length, current_length + increment_);
+ } else {
+ CHECK_EQ(max_length, new_length);
+ }
+ }
+ }
+
+ private:
+ Isolate* isolate_;
+ uint32_t increment_;
+ uint32_t max_;
+ std::shared_ptr<BackingStore> backing_store_;
+};
+
+TEST_F(BackingStoreTest, RacyGrowWasmMemoryInPlace) {
+ constexpr int kNumThreads = 10;
+ constexpr int kMaxPages = 1024;
+ GrowerThread* threads[kNumThreads];
+
+ std::shared_ptr<BackingStore> backing_store =
+ BackingStore::AllocateWasmMemory(isolate(), 0, kMaxPages,
+ SharedFlag::kShared);
+
+ for (int i = 0; i < kNumThreads; i++) {
+ threads[i] = new GrowerThread(isolate(), 1, kMaxPages, backing_store);
+ CHECK(threads[i]->Start());
+ }
+
+ for (int i = 0; i < kNumThreads; i++) {
+ threads[i]->Join();
+ }
+
+ EXPECT_EQ(kMaxPages * wasm::kWasmPageSize, backing_store->byte_length());
+
+ for (int i = 0; i < kNumThreads; i++) {
+ delete threads[i];
+ }
+}
+
+} // namespace internal
+} // namespace v8