// Copyright 2015 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 "mojo/edk/platform/aligned_alloc.h" #include #include #include #include "mojo/public/cpp/system/macros.h" #include "testing/gtest/include/gtest/gtest.h" #define EXPECT_ALIGNED(ptr, alignment) \ EXPECT_EQ(0u, reinterpret_cast(ptr) % (alignment)) namespace mojo { namespace platform { namespace { TEST(AlignedAllocTest, RawAlignedAlloc) { for (size_t alignment = sizeof(void*); alignment <= 4096u; alignment <<= 1u) { for (size_t size = 1u; size <= 256u; size <<= 1u) { SCOPED_TRACE(testing::Message() << "alignment = " << alignment << ", size = " << size); void* ptr = RawAlignedAlloc(alignment, size); EXPECT_TRUE(ptr); EXPECT_ALIGNED(ptr, alignment); // Check that we can actually write to this memory. memset(ptr, 123, size); RawAlignedFree(ptr); } // Check non-power-of-2 sizes. for (size_t size = 2u; size <= 64u; size++) { SCOPED_TRACE(testing::Message() << "alignment = " << alignment << ", size = " << size); void* ptr = RawAlignedAlloc(alignment, size); EXPECT_TRUE(ptr); EXPECT_ALIGNED(ptr, alignment); // Check that we can actually write to this memory. memset(ptr, 123, size); RawAlignedFree(ptr); } } } TEST(AlignedAllocTest, AlignedAlloc) { for (size_t alignment = sizeof(void*); alignment <= 4096u; alignment <<= 1u) { for (size_t n = 1u; n <= 16u; n++) { SCOPED_TRACE(testing::Message() << "alignment = " << alignment << ", n = " << n); if (alignment >= alignof(char)) { size_t size = n * sizeof(char); AlignedUniquePtr ptr = AlignedAlloc(alignment, size); EXPECT_ALIGNED(ptr.get(), alignment); memset(ptr.get(), 123, size); } if (alignment >= alignof(uint32_t)) { size_t size = n * sizeof(uint32_t); AlignedUniquePtr ptr = AlignedAlloc(alignment, size); EXPECT_ALIGNED(ptr.get(), alignment); memset(ptr.get(), 123, size); } if (alignment >= alignof(int64_t)) { size_t size = n * sizeof(int64_t); AlignedUniquePtr ptr = AlignedAlloc(alignment, size); EXPECT_ALIGNED(ptr.get(), alignment); memset(ptr.get(), 123, size); } if (alignment >= alignof(float)) { size_t size = n * sizeof(float); AlignedUniquePtr ptr = AlignedAlloc(alignment, size); EXPECT_ALIGNED(ptr.get(), alignment); memset(ptr.get(), 123, size); } if (alignment >= alignof(double)) { size_t size = n * sizeof(double); AlignedUniquePtr ptr = AlignedAlloc(alignment, size); EXPECT_ALIGNED(ptr.get(), alignment); memset(ptr.get(), 123, size); } } } } } // namespace } // namespace platform } // namespace mojo