2026-09-09 22:42:07 -07:00
|
|
|
#include <gtest/gtest.h>
|
|
|
|
|
#include "mimir.h"
|
|
|
|
|
|
2026-09-09 23:16:01 -07:00
|
|
|
namespace mimir_tests {
|
|
|
|
|
|
2026-09-09 22:42:07 -07:00
|
|
|
void writeData(std::byte* dest, size_t count, int seed)
|
|
|
|
|
{
|
|
|
|
|
for (int i = 0; i < count; i++) {
|
|
|
|
|
dest[i] = std::byte((seed * 3162 + i * 63163) % 0xff);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool checkData(std::byte* src, size_t count, int seed)
|
|
|
|
|
{
|
|
|
|
|
for (int i = 0; i < count; i++) {
|
|
|
|
|
if (src[i] != std::byte((seed * 3162 + i * 63163) % 0xff)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2026-09-09 23:16:01 -07:00
|
|
|
TEST(Region, InitialState)
|
|
|
|
|
{
|
2026-09-09 22:42:07 -07:00
|
|
|
mimir::init();
|
|
|
|
|
mimir::Region region;
|
|
|
|
|
EXPECT_TRUE(region.getAddress() == nullptr);
|
|
|
|
|
EXPECT_TRUE(region.getMaxSize() == 0);
|
|
|
|
|
EXPECT_TRUE(region.getSize() == 0);
|
|
|
|
|
}
|
|
|
|
|
|
2026-09-09 23:16:01 -07:00
|
|
|
TEST(Region, TooBig)
|
|
|
|
|
{
|
|
|
|
|
mimir::init();
|
|
|
|
|
mimir::Region region;
|
2026-09-09 23:32:05 -07:00
|
|
|
EXPECT_FALSE(region.init(1ULL << 50)); // Attempt to reserve too many pages
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST(Region, OutOfMemory)
|
|
|
|
|
{
|
|
|
|
|
mimir::init();
|
|
|
|
|
mimir::Region region;
|
|
|
|
|
EXPECT_TRUE(region.init(1ULL << 46)); // Attempt to reserve 64TB of pages
|
2026-09-10 21:37:27 -07:00
|
|
|
EXPECT_FALSE(region.resize(1ULL << 60)); // Attempt to commit an extremely large number of pages
|
2026-09-09 23:16:01 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST(Region, Min1GB)
|
|
|
|
|
{
|
|
|
|
|
mimir::init();
|
|
|
|
|
mimir::Region region;
|
2026-09-09 23:32:05 -07:00
|
|
|
EXPECT_TRUE(region.init(1ULL << 30)); // Allocate 1GB of pages
|
2026-09-09 23:16:01 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST(Region, Resizing)
|
2026-09-09 22:42:07 -07:00
|
|
|
{
|
|
|
|
|
mimir::init();
|
|
|
|
|
mimir::Region region;
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(region.init(1 << 10ULL));
|
|
|
|
|
EXPECT_NE(region.getAddress(), nullptr);
|
|
|
|
|
EXPECT_GT(region.getMaxSize(), 0);
|
|
|
|
|
EXPECT_EQ(region.getSize(), 0);
|
|
|
|
|
EXPECT_TRUE(region.resize(0));
|
|
|
|
|
EXPECT_EQ(region.getSize(), 0);
|
2026-09-09 23:16:01 -07:00
|
|
|
|
2026-09-09 23:32:05 -07:00
|
|
|
EXPECT_TRUE(region.resize(1ULL << 4));
|
|
|
|
|
EXPECT_TRUE(region.resize(1ULL << 10));
|
|
|
|
|
EXPECT_TRUE(region.resize(1ULL << 5));
|
|
|
|
|
EXPECT_TRUE(region.resize(1ULL << 0));
|
|
|
|
|
EXPECT_TRUE(region.resize(1ULL << 9));
|
2026-09-09 23:16:01 -07:00
|
|
|
}
|
|
|
|
|
|
2026-09-10 21:32:57 -07:00
|
|
|
TEST(Region, Oversized)
|
2026-09-09 23:16:01 -07:00
|
|
|
{
|
|
|
|
|
mimir::init();
|
|
|
|
|
mimir::Region region;
|
|
|
|
|
|
2026-09-10 21:32:57 -07:00
|
|
|
EXPECT_TRUE(region.init(1ULL << 4));
|
2026-09-09 23:16:01 -07:00
|
|
|
size_t prevSize = region.getSize();
|
|
|
|
|
|
2026-09-09 23:32:05 -07:00
|
|
|
EXPECT_FALSE(region.resize(1ULL << 20));
|
2026-09-09 23:16:01 -07:00
|
|
|
EXPECT_EQ(region.getSize(), prevSize);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST(Region, WriteData)
|
|
|
|
|
{
|
|
|
|
|
mimir::init();
|
|
|
|
|
mimir::Region region;
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(region.init());
|
2026-09-09 22:42:07 -07:00
|
|
|
EXPECT_TRUE(region.resize(100));
|
|
|
|
|
EXPECT_GE(region.getSize(), 100);
|
|
|
|
|
writeData(region.getAddress(), 100, 1);
|
|
|
|
|
EXPECT_TRUE(checkData(region.getAddress(), 100, 1));
|
|
|
|
|
EXPECT_TRUE(region.resize(1 << 9ULL));
|
|
|
|
|
writeData(region.getAddress() + 100, 900, 2);
|
|
|
|
|
EXPECT_TRUE(checkData(region.getAddress(), 100, 1));
|
|
|
|
|
EXPECT_TRUE(checkData(region.getAddress() + 100, 900, 2));
|
|
|
|
|
}
|
2026-09-09 23:16:01 -07:00
|
|
|
|
|
|
|
|
}; // namespace mimir_tests
|