// 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();
}
