// Copyright 2017 The Fuchsia 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/connectivity/bluetooth/core/bt-host/common/slab_allocator_traits.h"

#include <gtest/gtest.h>

namespace bt {

namespace {

constexpr size_t kBufferSize = 256;
constexpr size_t kNumBuffers = 2;

}  // namespace

// The static slab allocator needs to be declared in the global namespace and
// cannot refer to a traits type that's declared in an anonymous namespace. So
// we use the test namespace here.
namespace test {

class TestBuffer;

using TestTraits = SlabAllocatorTraits<TestBuffer, kBufferSize, kNumBuffers>;

class TestBuffer : public fbl::SlabAllocated<TestTraits> {
 public:
  char data[kBufferSize];
};

}  // namespace test

namespace {

using TestAllocator = fbl::SlabAllocator<test::TestTraits>;

// This tests that allocation/deallocation via std::unique_ptr works as
// expected.
TEST(SlabAllocatedBufferTest, Basic) {
  // Buffer has only one slab. This should return nullptr after two allocations.
  std::unique_ptr<test::TestBuffer> buffer0 = TestAllocator::New();
  std::unique_ptr<test::TestBuffer> buffer1 = TestAllocator::New();
  std::unique_ptr<test::TestBuffer> buffer2 = TestAllocator::New();

  EXPECT_TRUE(buffer0);
  EXPECT_TRUE(buffer1);
  EXPECT_FALSE(buffer2);

  // Free one of the allocated buffers and request a new one. This should return
  // the memory back to the allocator and the next allocation should succeed.
  buffer1 = nullptr;
  buffer2 = TestAllocator::New();
  EXPECT_TRUE(buffer2);
}

}  // namespace
}  // namespace bt

// Creates no more than one slab.
DECLARE_STATIC_SLAB_ALLOCATOR_STORAGE(bt::test::TestTraits, 1, true);
