aboutsummaryrefslogtreecommitdiff
path: root/pw_allocator/simple_allocator_test.cc
blob: 4904bfe3b65616f6cdce9cc85558a2b6023e4235 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
// 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