summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/platform/wtf/allocator/atomic_operations_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/blink/renderer/platform/wtf/allocator/atomic_operations_test.cc')
-rw-r--r--chromium/third_party/blink/renderer/platform/wtf/allocator/atomic_operations_test.cc139
1 files changed, 139 insertions, 0 deletions
diff --git a/chromium/third_party/blink/renderer/platform/wtf/allocator/atomic_operations_test.cc b/chromium/third_party/blink/renderer/platform/wtf/allocator/atomic_operations_test.cc
new file mode 100644
index 00000000000..819b3bff584
--- /dev/null
+++ b/chromium/third_party/blink/renderer/platform/wtf/allocator/atomic_operations_test.cc
@@ -0,0 +1,139 @@
+// Copyright 2019 The Chromium 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 "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace WTF {
+
+class AtomicOperationsTest : public ::testing::Test {};
+
+template <size_t buffer_size, typename CopyMethod>
+void TestCopyImpl(CopyMethod copy) {
+ alignas(sizeof(size_t)) unsigned char src[buffer_size];
+ for (size_t i = 0; i < buffer_size; ++i)
+ src[i] = static_cast<char>(i + 1);
+ // Allocating extra memory before and after the buffer to make sure the
+ // atomic memcpy doesn't exceed the buffer in any direction.
+ alignas(sizeof(size_t)) unsigned char tgt[buffer_size + (2 * sizeof(size_t))];
+ memset(tgt, 0, buffer_size + (2 * sizeof(size_t)));
+ copy(tgt + sizeof(size_t), src);
+ // Check nothing before the buffer was changed
+ EXPECT_EQ(0u, *reinterpret_cast<size_t*>(&tgt[0]));
+ // Check buffer was copied correctly
+ EXPECT_TRUE(!memcmp(src, tgt + sizeof(size_t), buffer_size));
+ // Check nothing after the buffer was changed
+ EXPECT_EQ(0u, *reinterpret_cast<size_t*>(&tgt[sizeof(size_t) + buffer_size]));
+}
+
+// Tests for AtomicReadMemcpy
+template <size_t buffer_size>
+void TestAtomicReadMemcpy() {
+ TestCopyImpl<buffer_size>(AtomicReadMemcpy<buffer_size>);
+}
+
+TEST_F(AtomicOperationsTest, AtomicReadMemcpy_UINT8T) {
+ TestAtomicReadMemcpy<sizeof(uint8_t)>();
+}
+TEST_F(AtomicOperationsTest, AtomicReadMemcpy_UINT16T) {
+ TestAtomicReadMemcpy<sizeof(uint16_t)>();
+}
+TEST_F(AtomicOperationsTest, AtomicReadMemcpy_UINT32T) {
+ TestAtomicReadMemcpy<sizeof(uint32_t)>();
+}
+TEST_F(AtomicOperationsTest, AtomicReadMemcpy_UINT64T) {
+ TestAtomicReadMemcpy<sizeof(uint64_t)>();
+}
+
+TEST_F(AtomicOperationsTest, AtomicReadMemcpy_17Bytes) {
+ TestAtomicReadMemcpy<17>();
+}
+TEST_F(AtomicOperationsTest, AtomicReadMemcpy_34Bytes) {
+ TestAtomicReadMemcpy<34>();
+}
+TEST_F(AtomicOperationsTest, AtomicReadMemcpy_68Bytes) {
+ TestAtomicReadMemcpy<68>();
+}
+TEST_F(AtomicOperationsTest, AtomicReadMemcpy_127Bytes) {
+ TestAtomicReadMemcpy<127>();
+}
+
+// Tests for AtomicWriteMemcpy
+template <size_t buffer_size>
+void TestAtomicWriteMemcpy() {
+ TestCopyImpl<buffer_size>(AtomicWriteMemcpy<buffer_size>);
+}
+
+TEST_F(AtomicOperationsTest, AtomicWriteMemcpy_UINT8T) {
+ TestAtomicWriteMemcpy<sizeof(uint8_t)>();
+}
+TEST_F(AtomicOperationsTest, AtomicWriteMemcpy_UINT16T) {
+ TestAtomicWriteMemcpy<sizeof(uint16_t)>();
+}
+TEST_F(AtomicOperationsTest, AtomicWriteMemcpy_UINT32T) {
+ TestAtomicWriteMemcpy<sizeof(uint32_t)>();
+}
+TEST_F(AtomicOperationsTest, AtomicWriteMemcpy_UINT64T) {
+ TestAtomicWriteMemcpy<sizeof(uint64_t)>();
+}
+
+TEST_F(AtomicOperationsTest, AtomicWriteMemcpy_17Bytes) {
+ TestAtomicWriteMemcpy<17>();
+}
+TEST_F(AtomicOperationsTest, AtomicWriteMemcpy_34Bytes) {
+ TestAtomicWriteMemcpy<34>();
+}
+TEST_F(AtomicOperationsTest, AtomicWriteMemcpy_68Bytes) {
+ TestAtomicWriteMemcpy<68>();
+}
+TEST_F(AtomicOperationsTest, AtomicWriteMemcpy_127Bytes) {
+ TestAtomicWriteMemcpy<127>();
+}
+
+// Tests for AtomicMemzero
+template <size_t buffer_size>
+void TestAtomicMemzero() {
+ // Allocating extra memory before and after the buffer to make sure the
+ // AtomicMemzero doesn't exceed the buffer in any direction.
+ alignas(sizeof(size_t)) unsigned char buf[buffer_size + (2 * sizeof(size_t))];
+ memset(buf, ~uint8_t{0}, buffer_size + (2 * sizeof(size_t)));
+ AtomicMemzero<buffer_size>(buf + sizeof(size_t));
+ // Check nothing before the buffer was changed
+ EXPECT_EQ(~size_t{0}, *reinterpret_cast<size_t*>(&buf[0]));
+ // Check buffer was copied correctly
+ static const unsigned char for_comparison[buffer_size] = {0};
+ EXPECT_TRUE(!memcmp(buf + sizeof(size_t), for_comparison, buffer_size));
+ // Check nothing after the buffer was changed
+ EXPECT_EQ(~size_t{0},
+ *reinterpret_cast<size_t*>(&buf[sizeof(size_t) + buffer_size]));
+}
+
+TEST_F(AtomicOperationsTest, AtomicMemzero_UINT8T) {
+ TestAtomicMemzero<sizeof(uint8_t)>();
+}
+TEST_F(AtomicOperationsTest, AtomicMemzero_UINT16T) {
+ TestAtomicMemzero<sizeof(uint16_t)>();
+}
+TEST_F(AtomicOperationsTest, AtomicMemzero_UINT32T) {
+ TestAtomicMemzero<sizeof(uint32_t)>();
+}
+TEST_F(AtomicOperationsTest, AtomicMemzero_UINT64T) {
+ TestAtomicMemzero<sizeof(uint64_t)>();
+}
+
+TEST_F(AtomicOperationsTest, AtomicMemzero_17Bytes) {
+ TestAtomicMemzero<17>();
+}
+TEST_F(AtomicOperationsTest, AtomicMemzero_34Bytes) {
+ TestAtomicMemzero<34>();
+}
+TEST_F(AtomicOperationsTest, AtomicMemzero_68Bytes) {
+ TestAtomicMemzero<68>();
+}
+TEST_F(AtomicOperationsTest, AtomicMemzero_127Bytes) {
+ TestAtomicMemzero<127>();
+}
+
+} // namespace WTF