// 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 <stdint.h>
#include <string.h>

#include <array>

#include "mojo/public/cpp/system/macros.h"
#include "testing/gtest/include/gtest/gtest.h"

#define EXPECT_ALIGNED(ptr, alignment) \
  EXPECT_EQ(0u, reinterpret_cast<uintptr_t>(ptr) % (alignment))

namespace mojo {
namespace platform {
namespace {

TEST(AlignedAlloc, 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(AlignedAlloc, 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<char> ptr = AlignedAlloc<char>(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<uint32_t> ptr =
            AlignedAlloc<uint32_t>(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<int64_t> ptr = AlignedAlloc<int64_t>(alignment, size);
        EXPECT_ALIGNED(ptr.get(), alignment);
        memset(ptr.get(), 123, size);
      }

      if (alignment >= alignof(float)) {
        size_t size = n * sizeof(float);
        AlignedUniquePtr<float> ptr = AlignedAlloc<float>(alignment, size);
        EXPECT_ALIGNED(ptr.get(), alignment);
        memset(ptr.get(), 123, size);
      }

      if (alignment >= alignof(double)) {
        size_t size = n * sizeof(double);
        AlignedUniquePtr<double> ptr = AlignedAlloc<double>(alignment, size);
        EXPECT_ALIGNED(ptr.get(), alignment);
        memset(ptr.get(), 123, size);
      }
    }
  }
}

}  // namespace
}  // namespace platform
}  // namespace mojo
