blob: 049c8376583ba44f9e0aea645604bc850f2c5bc9 [file] [log] [blame]
// Copyright 2021 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/devices/bin/driver_runtime/arena.h"
#include <zxtest/zxtest.h>
TEST(fdf_arena, AllocateMultiple) {
fdf_arena* arena;
ASSERT_EQ(ZX_OK, fdf_arena::Create(0, "arena", 0, &arena));
void* addr1 = arena->Allocate(64);
EXPECT_NOT_NULL(addr1);
void* addr2 = arena->Allocate(64);
EXPECT_NOT_NULL(addr2);
EXPECT_NE(addr1, addr2);
arena->Destroy();
}
TEST(fdf_arena, AllocateLarge) {
fdf_arena* arena;
ASSERT_EQ(ZX_OK, fdf_arena::Create(0, "arena", 0, &arena));
void* addr1 = arena->Allocate(0x100000);
EXPECT_NOT_NULL(addr1);
void* addr2 = arena->Allocate(0x600000);
EXPECT_NOT_NULL(addr2);
EXPECT_NE(addr1, addr2);
arena->Destroy();
}
static void* increment_ptr(void* ptr, size_t offset) {
return reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(ptr) + offset);
}
TEST(fdf_arena, Contains) {
fdf_arena* arena;
ASSERT_EQ(ZX_OK, fdf_arena::Create(0, "arena", 0, &arena));
void* addr1 = arena->Allocate(0x1000);
EXPECT_NOT_NULL(addr1);
void* addr2 = arena->Allocate(0x10000);
EXPECT_NOT_NULL(addr2);
void* addr3 = arena->Allocate(0x500);
EXPECT_NOT_NULL(addr3);
EXPECT_FALSE(arena->Contains(0, 0x1));
EXPECT_TRUE(arena->Contains(addr1, 0x800));
EXPECT_TRUE(arena->Contains(addr1, 0x1000));
EXPECT_FALSE(arena->Contains(addr1, 0x1001));
EXPECT_TRUE(arena->Contains(increment_ptr(addr1, 0x1), 0x999));
EXPECT_TRUE(arena->Contains(increment_ptr(addr1, 0x800), 0x800));
// 1 byte past the end of the addr1 allocation
EXPECT_FALSE(arena->Contains(increment_ptr(addr1, 0x800), 0x801));
EXPECT_FALSE(arena->Contains(increment_ptr(addr1, 0xfff), 0x2));
EXPECT_TRUE(arena->Contains(addr2, 0x10000));
EXPECT_TRUE(arena->Contains(increment_ptr(addr2, 0x9990), 0xf));
EXPECT_TRUE(arena->Contains(addr3, 0x400));
EXPECT_TRUE(arena->Contains(addr3, 0x500));
EXPECT_FALSE(arena->Contains(addr3, 0x501));
EXPECT_TRUE(arena->Contains(increment_ptr(addr3, 0x5), 0x100));
EXPECT_TRUE(arena->Contains(increment_ptr(addr3, 0x250), 0x250));
// 1 byte past the end of the addr3 allocation
EXPECT_FALSE(arena->Contains(increment_ptr(addr3, 0x500), 0x1));
arena->Destroy();
}
TEST(fdf_arena, InitialBufferContains) {
fdf_arena* arena;
ASSERT_EQ(ZX_OK, fdf_arena::Create(0, "arena", 0, &arena));
EXPECT_FALSE(arena->Contains(reinterpret_cast<void*>(0xFFFFFFFF), 0x10));
void* addr = arena->Allocate(0x500);
EXPECT_NOT_NULL(addr);
EXPECT_TRUE(arena->Contains(addr, 0x500));
// This range is contained in the initial buffer, but not yet allocated by the user.
EXPECT_FALSE(arena->Contains(increment_ptr(addr, 0x500), 0x500));
arena->Destroy();
}