blob: f70c826af24f10241f18ac6a090f9085ce19a62a [file] [log] [blame]
Jamie Garside558e1442020-03-27 17:05:55 +00001// Copyright 2020 The Pigweed Authors
2//
3// Licensed under the Apache License, Version 2.0 (the "License"); you may not
4// use this file except in compliance with the License. You may obtain a copy of
5// the License at
6//
7// https://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12// License for the specific language governing permissions and limitations under
13// the License.
14
15#include "pw_allocator/block.h"
16
Chenghan Zhouea0f7ad2020-07-29 18:20:37 -040017#include <cstring>
Wyatt Heplere2cbadf2020-06-22 11:21:45 -070018#include <span>
19
Jamie Garside558e1442020-03-27 17:05:55 +000020#include "gtest/gtest.h"
Jamie Garside558e1442020-03-27 17:05:55 +000021
22using std::byte;
23
24namespace pw::allocator {
25
26TEST(Block, CanCreateSingleBlock) {
27 constexpr size_t kN = 200;
28 alignas(Block*) byte bytes[kN];
29
30 Block* block = nullptr;
Wyatt Heplere2cbadf2020-06-22 11:21:45 -070031 auto status = Block::Init(std::span(bytes, kN), &block);
Jamie Garside558e1442020-03-27 17:05:55 +000032
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -080033 ASSERT_EQ(status, OkStatus());
Jamie Garside558e1442020-03-27 17:05:55 +000034 EXPECT_EQ(block->OuterSize(), kN);
Chenghan Zhouea0f7ad2020-07-29 18:20:37 -040035 EXPECT_EQ(block->InnerSize(),
36 kN - sizeof(Block) - 2 * PW_ALLOCATOR_POISON_OFFSET);
37 EXPECT_EQ(block->Prev(), nullptr);
38 EXPECT_EQ(block->Next(), (Block*)((uintptr_t)block + kN));
Jamie Garside558e1442020-03-27 17:05:55 +000039 EXPECT_EQ(block->Used(), false);
40 EXPECT_EQ(block->Last(), true);
41}
42
43TEST(Block, CannotCreateUnalignedSingleBlock) {
44 constexpr size_t kN = 1024;
45
46 // Force alignment, so we can un-force it below
47 alignas(Block*) byte bytes[kN];
48 byte* byte_ptr = bytes;
49
50 Block* block = nullptr;
Wyatt Heplere2cbadf2020-06-22 11:21:45 -070051 auto status = Block::Init(std::span(byte_ptr + 1, kN - 1), &block);
Jamie Garside558e1442020-03-27 17:05:55 +000052
Wyatt Heplerd78f7c62020-09-28 14:27:32 -070053 EXPECT_EQ(status, Status::InvalidArgument());
Jamie Garside558e1442020-03-27 17:05:55 +000054}
55
56TEST(Block, CannotCreateTooSmallBlock) {
57 constexpr size_t kN = 2;
58 alignas(Block*) byte bytes[kN];
59 Block* block = nullptr;
Wyatt Heplere2cbadf2020-06-22 11:21:45 -070060 auto status = Block::Init(std::span(bytes, kN), &block);
Jamie Garside558e1442020-03-27 17:05:55 +000061
Wyatt Heplerd78f7c62020-09-28 14:27:32 -070062 EXPECT_EQ(status, Status::InvalidArgument());
Jamie Garside558e1442020-03-27 17:05:55 +000063}
64
65TEST(Block, CanSplitBlock) {
66 constexpr size_t kN = 1024;
67 constexpr size_t kSplitN = 512;
68 alignas(Block*) byte bytes[kN];
69
70 Block* block = nullptr;
Armando Montanez1ee925c2020-06-29 13:15:28 -070071 EXPECT_EQ(Block::Init(std::span(bytes, kN), &block), OkStatus());
Jamie Garside558e1442020-03-27 17:05:55 +000072
73 Block* next_block = nullptr;
74 auto status = block->Split(kSplitN, &next_block);
75
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -080076 ASSERT_EQ(status, OkStatus());
Jamie Garside558e1442020-03-27 17:05:55 +000077 EXPECT_EQ(block->InnerSize(), kSplitN);
Chenghan Zhouea0f7ad2020-07-29 18:20:37 -040078 EXPECT_EQ(block->OuterSize(),
79 kSplitN + sizeof(Block) + 2 * PW_ALLOCATOR_POISON_OFFSET);
Jamie Garside558e1442020-03-27 17:05:55 +000080 EXPECT_EQ(block->Last(), false);
81
Chenghan Zhouea0f7ad2020-07-29 18:20:37 -040082 EXPECT_EQ(next_block->OuterSize(),
83 kN - kSplitN - sizeof(Block) - 2 * PW_ALLOCATOR_POISON_OFFSET);
Jamie Garside558e1442020-03-27 17:05:55 +000084 EXPECT_EQ(next_block->Used(), false);
85 EXPECT_EQ(next_block->Last(), true);
86
Chenghan Zhouea0f7ad2020-07-29 18:20:37 -040087 EXPECT_EQ(block->Next(), next_block);
88 EXPECT_EQ(next_block->Prev(), block);
Jamie Garside558e1442020-03-27 17:05:55 +000089}
90
91TEST(Block, CanSplitBlockUnaligned) {
92 constexpr size_t kN = 1024;
93 constexpr size_t kSplitN = 513;
94
95 alignas(Block*) byte bytes[kN];
96
97 // We should split at sizeof(Block) + kSplitN bytes. Then
98 // we need to round that up to an alignof(Block*) boundary.
99 uintptr_t split_addr = ((uintptr_t)&bytes) + kSplitN;
100 split_addr += alignof(Block*) - (split_addr % alignof(Block*));
101 uintptr_t split_len = split_addr - (uintptr_t)&bytes;
102
103 Block* block = nullptr;
Armando Montanez1ee925c2020-06-29 13:15:28 -0700104 EXPECT_EQ(Block::Init(std::span(bytes, kN), &block), OkStatus());
Jamie Garside558e1442020-03-27 17:05:55 +0000105
106 Block* next_block = nullptr;
107 auto status = block->Split(kSplitN, &next_block);
108
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -0800109 ASSERT_EQ(status, OkStatus());
Jamie Garside558e1442020-03-27 17:05:55 +0000110 EXPECT_EQ(block->InnerSize(), split_len);
Chenghan Zhouea0f7ad2020-07-29 18:20:37 -0400111 EXPECT_EQ(block->OuterSize(),
112 split_len + sizeof(Block) + 2 * PW_ALLOCATOR_POISON_OFFSET);
113 EXPECT_EQ(next_block->OuterSize(),
114 kN - split_len - sizeof(Block) - 2 * PW_ALLOCATOR_POISON_OFFSET);
Jamie Garside558e1442020-03-27 17:05:55 +0000115 EXPECT_EQ(next_block->Used(), false);
Chenghan Zhouea0f7ad2020-07-29 18:20:37 -0400116 EXPECT_EQ(block->Next(), next_block);
117 EXPECT_EQ(next_block->Prev(), block);
Jamie Garside558e1442020-03-27 17:05:55 +0000118}
119
120TEST(Block, CanSplitMidBlock) {
121 // Split once, then split the original block again to ensure that the
122 // pointers get rewired properly.
123 // I.e.
124 // [[ BLOCK 1 ]]
125 // block1->Split()
126 // [[ BLOCK1 ]][[ BLOCK2 ]]
127 // block1->Split()
128 // [[ BLOCK1 ]][[ BLOCK3 ]][[ BLOCK2 ]]
129
130 constexpr size_t kN = 1024;
131 constexpr size_t kSplit1 = 512;
132 constexpr size_t kSplit2 = 256;
Armando Montanez1ee925c2020-06-29 13:15:28 -0700133 alignas(Block*) byte bytes[kN];
Jamie Garside558e1442020-03-27 17:05:55 +0000134
135 Block* block = nullptr;
Armando Montanez1ee925c2020-06-29 13:15:28 -0700136 EXPECT_EQ(Block::Init(std::span(bytes, kN), &block), OkStatus());
Jamie Garside558e1442020-03-27 17:05:55 +0000137
138 Block* block2 = nullptr;
139 block->Split(kSplit1, &block2);
140
141 Block* block3 = nullptr;
142 block->Split(kSplit2, &block3);
143
Chenghan Zhouea0f7ad2020-07-29 18:20:37 -0400144 EXPECT_EQ(block->Next(), block3);
145 EXPECT_EQ(block3->Next(), block2);
146 EXPECT_EQ(block2->Prev(), block3);
147 EXPECT_EQ(block3->Prev(), block);
Jamie Garside558e1442020-03-27 17:05:55 +0000148}
149
150TEST(Block, CannotSplitBlockWithoutHeaderSpace) {
151 constexpr size_t kN = 1024;
Chenghan Zhouea0f7ad2020-07-29 18:20:37 -0400152 constexpr size_t kSplitN =
153 kN - sizeof(Block) - 2 * PW_ALLOCATOR_POISON_OFFSET - 1;
Armando Montanez1ee925c2020-06-29 13:15:28 -0700154 alignas(Block*) byte bytes[kN];
Jamie Garside558e1442020-03-27 17:05:55 +0000155
156 Block* block = nullptr;
Armando Montanez1ee925c2020-06-29 13:15:28 -0700157 EXPECT_EQ(Block::Init(std::span(bytes, kN), &block), OkStatus());
Jamie Garside558e1442020-03-27 17:05:55 +0000158
159 Block* next_block = nullptr;
160 auto status = block->Split(kSplitN, &next_block);
161
Wyatt Heplerd78f7c62020-09-28 14:27:32 -0700162 EXPECT_EQ(status, Status::ResourceExhausted());
Jamie Garside558e1442020-03-27 17:05:55 +0000163 EXPECT_EQ(next_block, nullptr);
164}
165
166TEST(Block, MustProvideNextBlockPointer) {
167 constexpr size_t kN = 1024;
168 constexpr size_t kSplitN = kN - sizeof(Block) - 1;
Armando Montanez1ee925c2020-06-29 13:15:28 -0700169 alignas(Block*) byte bytes[kN];
Jamie Garside558e1442020-03-27 17:05:55 +0000170
171 Block* block = nullptr;
Armando Montanez1ee925c2020-06-29 13:15:28 -0700172 EXPECT_EQ(Block::Init(std::span(bytes, kN), &block), OkStatus());
Jamie Garside558e1442020-03-27 17:05:55 +0000173
174 auto status = block->Split(kSplitN, nullptr);
Wyatt Heplerd78f7c62020-09-28 14:27:32 -0700175 EXPECT_EQ(status, Status::InvalidArgument());
Jamie Garside558e1442020-03-27 17:05:55 +0000176}
177
178TEST(Block, CannotMakeBlockLargerInSplit) {
179 // Ensure that we can't ask for more space than the block actually has...
180 constexpr size_t kN = 1024;
Armando Montanez1ee925c2020-06-29 13:15:28 -0700181 alignas(Block*) byte bytes[kN];
Jamie Garside558e1442020-03-27 17:05:55 +0000182
183 Block* block = nullptr;
Armando Montanez1ee925c2020-06-29 13:15:28 -0700184 EXPECT_EQ(Block::Init(std::span(bytes, kN), &block), OkStatus());
Jamie Garside558e1442020-03-27 17:05:55 +0000185
186 Block* next_block = nullptr;
187 auto status = block->Split(block->InnerSize() + 1, &next_block);
188
Wyatt Heplerd78f7c62020-09-28 14:27:32 -0700189 EXPECT_EQ(status, Status::OutOfRange());
Jamie Garside558e1442020-03-27 17:05:55 +0000190}
191
Chenghan Zhouea0f7ad2020-07-29 18:20:37 -0400192TEST(Block, CannotMakeSecondBlockLargerInSplit) {
193 // Ensure that the second block in split is at least of the size of header.
194 constexpr size_t kN = 1024;
Armando Montanez1ee925c2020-06-29 13:15:28 -0700195 alignas(Block*) byte bytes[kN];
Chenghan Zhouea0f7ad2020-07-29 18:20:37 -0400196
197 Block* block = nullptr;
Armando Montanez1ee925c2020-06-29 13:15:28 -0700198 EXPECT_EQ(Block::Init(std::span(bytes, kN), &block), OkStatus());
Chenghan Zhouea0f7ad2020-07-29 18:20:37 -0400199
200 Block* next_block = nullptr;
201 auto status = block->Split(
202 block->InnerSize() - sizeof(Block) - 2 * PW_ALLOCATOR_POISON_OFFSET + 1,
203 &next_block);
204
Wyatt Heplerd78f7c62020-09-28 14:27:32 -0700205 ASSERT_EQ(status, Status::ResourceExhausted());
Chenghan Zhouea0f7ad2020-07-29 18:20:37 -0400206 EXPECT_EQ(next_block, nullptr);
207}
208
Jamie Garside558e1442020-03-27 17:05:55 +0000209TEST(Block, CanMakeZeroSizeFirstBlock) {
210 // This block does support splitting with zero payload size.
211 constexpr size_t kN = 1024;
Armando Montanez1ee925c2020-06-29 13:15:28 -0700212 alignas(Block*) byte bytes[kN];
Jamie Garside558e1442020-03-27 17:05:55 +0000213
214 Block* block = nullptr;
Armando Montanez1ee925c2020-06-29 13:15:28 -0700215 EXPECT_EQ(Block::Init(std::span(bytes, kN), &block), OkStatus());
Jamie Garside558e1442020-03-27 17:05:55 +0000216
217 Block* next_block = nullptr;
218 auto status = block->Split(0, &next_block);
219
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -0800220 ASSERT_EQ(status, OkStatus());
Jamie Garside558e1442020-03-27 17:05:55 +0000221 EXPECT_EQ(block->InnerSize(), static_cast<size_t>(0));
222}
223
224TEST(Block, CanMakeZeroSizeSecondBlock) {
225 // Likewise, the split block can be zero-width.
226 constexpr size_t kN = 1024;
Armando Montanez1ee925c2020-06-29 13:15:28 -0700227 alignas(Block*) byte bytes[kN];
Jamie Garside558e1442020-03-27 17:05:55 +0000228
229 Block* block = nullptr;
Armando Montanez1ee925c2020-06-29 13:15:28 -0700230 EXPECT_EQ(Block::Init(std::span(bytes, kN), &block), OkStatus());
Jamie Garside558e1442020-03-27 17:05:55 +0000231
232 Block* next_block = nullptr;
Chenghan Zhouea0f7ad2020-07-29 18:20:37 -0400233 auto status = block->Split(
234 block->InnerSize() - sizeof(Block) - 2 * PW_ALLOCATOR_POISON_OFFSET,
235 &next_block);
Jamie Garside558e1442020-03-27 17:05:55 +0000236
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -0800237 ASSERT_EQ(status, OkStatus());
Jamie Garside558e1442020-03-27 17:05:55 +0000238 EXPECT_EQ(next_block->InnerSize(), static_cast<size_t>(0));
239}
240
241TEST(Block, CanMarkBlockUsed) {
242 constexpr size_t kN = 1024;
243 alignas(Block*) byte bytes[kN];
244
245 Block* block = nullptr;
Armando Montanez1ee925c2020-06-29 13:15:28 -0700246 EXPECT_EQ(Block::Init(std::span(bytes, kN), &block), OkStatus());
Jamie Garside558e1442020-03-27 17:05:55 +0000247
248 block->MarkUsed();
249 EXPECT_EQ(block->Used(), true);
250
251 // Mark used packs that data into the next pointer. Check that it's still
252 // valid
Chenghan Zhouea0f7ad2020-07-29 18:20:37 -0400253 EXPECT_EQ(block->Next(), (Block*)((uintptr_t)block + kN));
Jamie Garside558e1442020-03-27 17:05:55 +0000254
255 block->MarkFree();
256 EXPECT_EQ(block->Used(), false);
257}
258
259TEST(Block, CannotSplitUsedBlock) {
260 constexpr size_t kN = 1024;
261 alignas(Block*) byte bytes[kN];
262
263 Block* block = nullptr;
Armando Montanez1ee925c2020-06-29 13:15:28 -0700264 EXPECT_EQ(Block::Init(std::span(bytes, kN), &block), OkStatus());
Jamie Garside558e1442020-03-27 17:05:55 +0000265
266 block->MarkUsed();
267
268 Block* next_block = nullptr;
269 auto status = block->Split(512, &next_block);
Wyatt Heplerd78f7c62020-09-28 14:27:32 -0700270 EXPECT_EQ(status, Status::FailedPrecondition());
Jamie Garside558e1442020-03-27 17:05:55 +0000271}
272
273TEST(Block, CanMergeWithNextBlock) {
274 // Do the three way merge from "CanSplitMidBlock", and let's
275 // merge block 3 and 2
276 constexpr size_t kN = 1024;
277 constexpr size_t kSplit1 = 512;
278 constexpr size_t kSplit2 = 256;
Armando Montanez1ee925c2020-06-29 13:15:28 -0700279 alignas(Block*) byte bytes[kN];
Jamie Garside558e1442020-03-27 17:05:55 +0000280
281 Block* block = nullptr;
Armando Montanez1ee925c2020-06-29 13:15:28 -0700282 EXPECT_EQ(Block::Init(std::span(bytes, kN), &block), OkStatus());
Jamie Garside558e1442020-03-27 17:05:55 +0000283
284 Block* block2 = nullptr;
285 block->Split(kSplit1, &block2);
286
287 Block* block3 = nullptr;
288 block->Split(kSplit2, &block3);
289
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -0800290 EXPECT_EQ(block3->MergeNext(), OkStatus());
Jamie Garside558e1442020-03-27 17:05:55 +0000291
Chenghan Zhouea0f7ad2020-07-29 18:20:37 -0400292 EXPECT_EQ(block->Next(), block3);
293 EXPECT_EQ(block3->Prev(), block);
Jamie Garside558e1442020-03-27 17:05:55 +0000294 EXPECT_EQ(block->InnerSize(), kSplit2);
295
296 // The resulting "right hand" block should have an outer size of 1024 - 256 -
Chenghan Zhouea0f7ad2020-07-29 18:20:37 -0400297 // sizeof(Block) - 2*PW_ALLOCATOR_POISON_OFFSET, which accounts for the first
298 // block.
299 EXPECT_EQ(block3->OuterSize(),
300 kN - kSplit2 - sizeof(Block) - 2 * PW_ALLOCATOR_POISON_OFFSET);
Jamie Garside558e1442020-03-27 17:05:55 +0000301}
302
303TEST(Block, CannotMergeWithFirstOrLastBlock) {
304 constexpr size_t kN = 1024;
Armando Montanez1ee925c2020-06-29 13:15:28 -0700305 alignas(Block*) byte bytes[kN];
Jamie Garside558e1442020-03-27 17:05:55 +0000306
307 // Do a split, just to sanity check that the checks on Next/Prev are
308 // different...
309 Block* block = nullptr;
Armando Montanez1ee925c2020-06-29 13:15:28 -0700310 EXPECT_EQ(Block::Init(std::span(bytes, kN), &block), OkStatus());
Jamie Garside558e1442020-03-27 17:05:55 +0000311
312 Block* next_block = nullptr;
313 block->Split(512, &next_block);
314
Wyatt Heplerd78f7c62020-09-28 14:27:32 -0700315 EXPECT_EQ(next_block->MergeNext(), Status::OutOfRange());
316 EXPECT_EQ(block->MergePrev(), Status::OutOfRange());
Jamie Garside558e1442020-03-27 17:05:55 +0000317}
318
319TEST(Block, CannotMergeUsedBlock) {
320 constexpr size_t kN = 1024;
Armando Montanez1ee925c2020-06-29 13:15:28 -0700321 alignas(Block*) byte bytes[kN];
Jamie Garside558e1442020-03-27 17:05:55 +0000322
323 // Do a split, just to sanity check that the checks on Next/Prev are
324 // different...
325 Block* block = nullptr;
Armando Montanez1ee925c2020-06-29 13:15:28 -0700326 EXPECT_EQ(Block::Init(std::span(bytes, kN), &block), OkStatus());
Jamie Garside558e1442020-03-27 17:05:55 +0000327
328 Block* next_block = nullptr;
329 block->Split(512, &next_block);
330
331 block->MarkUsed();
Wyatt Heplerd78f7c62020-09-28 14:27:32 -0700332 EXPECT_EQ(block->MergeNext(), Status::FailedPrecondition());
333 EXPECT_EQ(next_block->MergePrev(), Status::FailedPrecondition());
Jamie Garside558e1442020-03-27 17:05:55 +0000334}
335
Chenghan Zhouea0f7ad2020-07-29 18:20:37 -0400336TEST(Block, CanCheckValidBlock) {
337 constexpr size_t kN = 1024;
Armando Montanez1ee925c2020-06-29 13:15:28 -0700338 alignas(Block*) byte bytes[kN];
Chenghan Zhouea0f7ad2020-07-29 18:20:37 -0400339
340 Block* first_block = nullptr;
Armando Montanez1ee925c2020-06-29 13:15:28 -0700341 EXPECT_EQ(Block::Init(std::span(bytes, kN), &first_block), OkStatus());
Chenghan Zhouea0f7ad2020-07-29 18:20:37 -0400342
343 Block* second_block = nullptr;
344 first_block->Split(512, &second_block);
345
346 Block* third_block = nullptr;
347 second_block->Split(256, &third_block);
348
349 EXPECT_EQ(first_block->IsValid(), true);
350 EXPECT_EQ(second_block->IsValid(), true);
351 EXPECT_EQ(third_block->IsValid(), true);
352}
353
354TEST(Block, CanCheckInalidBlock) {
355 constexpr size_t kN = 1024;
Armando Montanez1ee925c2020-06-29 13:15:28 -0700356 alignas(Block*) byte bytes[kN];
Chenghan Zhouea0f7ad2020-07-29 18:20:37 -0400357
358 Block* first_block = nullptr;
Armando Montanez1ee925c2020-06-29 13:15:28 -0700359 EXPECT_EQ(Block::Init(std::span(bytes, kN), &first_block), OkStatus());
Chenghan Zhouea0f7ad2020-07-29 18:20:37 -0400360
361 Block* second_block = nullptr;
362 first_block->Split(512, &second_block);
363
364 Block* third_block = nullptr;
365 second_block->Split(256, &third_block);
366
367 Block* fourth_block = nullptr;
368 third_block->Split(128, &fourth_block);
369
370 std::byte* next_ptr = reinterpret_cast<std::byte*>(first_block);
371 memcpy(next_ptr, second_block, sizeof(void*));
372 EXPECT_EQ(first_block->IsValid(), false);
373 EXPECT_EQ(second_block->IsValid(), false);
374 EXPECT_EQ(third_block->IsValid(), true);
375 EXPECT_EQ(fourth_block->IsValid(), true);
376
Ewout van Bekkume4d7b692020-10-15 13:12:30 -0700377#if defined(PW_ALLOCATOR_POISON_ENABLE) && PW_ALLOCATOR_POISON_ENABLE
Chenghan Zhouea0f7ad2020-07-29 18:20:37 -0400378 std::byte fault_poison[PW_ALLOCATOR_POISON_OFFSET] = {std::byte(0)};
379 std::byte* front_poison =
380 reinterpret_cast<std::byte*>(third_block) + sizeof(*third_block);
381 memcpy(front_poison, fault_poison, PW_ALLOCATOR_POISON_OFFSET);
382 EXPECT_EQ(third_block->IsValid(), false);
383
384 std::byte* end_poison =
385 reinterpret_cast<std::byte*>(fourth_block) + sizeof(*fourth_block);
386 memcpy(end_poison, fault_poison, PW_ALLOCATOR_POISON_OFFSET);
387 EXPECT_EQ(fourth_block->IsValid(), false);
388#endif // PW_ALLOCATOR_POISON_ENABLE
389}
390
391TEST(Block, CanPoisonBlock) {
Ewout van Bekkume4d7b692020-10-15 13:12:30 -0700392#if defined(PW_ALLOCATOR_POISON_ENABLE) && PW_ALLOCATOR_POISON_ENABLE
Chenghan Zhouea0f7ad2020-07-29 18:20:37 -0400393 constexpr size_t kN = 1024;
Armando Montanez1ee925c2020-06-29 13:15:28 -0700394 alignas(Block*) byte bytes[kN];
Chenghan Zhouea0f7ad2020-07-29 18:20:37 -0400395
396 Block* first_block = nullptr;
Armando Montanez1ee925c2020-06-29 13:15:28 -0700397 EXPECT_EQ(Block::Init(std::span(bytes, kN), &first_block), OkStatus());
Chenghan Zhouea0f7ad2020-07-29 18:20:37 -0400398
399 Block* second_block = nullptr;
400 first_block->Split(512, &second_block);
401
402 Block* third_block = nullptr;
403 second_block->Split(256, &third_block);
404
405 EXPECT_EQ(first_block->IsValid(), true);
406 EXPECT_EQ(second_block->IsValid(), true);
407 EXPECT_EQ(third_block->IsValid(), true);
408#endif // PW_ALLOCATOR_POISON_ENABLE
409}
410
Jamie Garside558e1442020-03-27 17:05:55 +0000411} // namespace pw::allocator