blob: 4904bfe3b65616f6cdce9cc85558a2b6023e4235 [file] [log] [blame]
// Copyright 2023 The Pigweed Authors
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
#include "pw_allocator/simple_allocator.h"
#include "gtest/gtest.h"
#include "pw_allocator/allocator_testing.h"
namespace pw::allocator {
// Size of the memory region to use in the tests below.
constexpr size_t kCapacity = 256;
// An `SimpleAllocator` that is automatically initialized on construction.
class SimpleAllocatorWithBuffer
: public test::WithBuffer<SimpleAllocator, kCapacity> {
public:
SimpleAllocatorWithBuffer() {
EXPECT_EQ((*this)->Init(ByteSpan(this->data(), this->size())), OkStatus());
}
};
// This is not meant to be a rigorous unit test of individual behaviors, as much
// as simply a way to demonstrate and exercise the simple allocator.
TEST(SimpleAllocatorTest, AllocateResizeDeallocate) {
SimpleAllocatorWithBuffer allocator;
// Can allocate usable memory.
constexpr size_t kSize1 = kCapacity / 4;
constexpr Layout layout1 = Layout::Of<std::byte[kSize1]>();
auto* ptr = static_cast<std::byte*>(allocator->Allocate(layout1));
ASSERT_NE(ptr, nullptr);
memset(ptr, 0x5A, kSize1);
// Can shrink memory. Contents are preserved.
constexpr size_t kSize2 = kCapacity / 8;
constexpr Layout layout2 = Layout::Of<std::byte[kSize2]>();
EXPECT_TRUE(allocator->Resize(ptr, layout1, layout2.size()));
for (size_t i = 0; i < kSize2; ++i) {
EXPECT_EQ(size_t(ptr[i]), 0x5Au);
}
// Can grow memory. Contents are preserved.
constexpr size_t kSize3 = kCapacity / 2;
constexpr Layout layout3 = Layout::Of<std::byte[kSize3]>();
EXPECT_TRUE(allocator->Resize(ptr, layout2, layout3.size()));
for (size_t i = 0; i < kSize2; ++i) {
EXPECT_EQ(size_t(ptr[i]), 0x5Au);
}
// Can free memory.
allocator->Deallocate(ptr, layout3);
}
} // namespace pw::allocator