mirror of
https://github.com/johndoe6345789/MetalOS.git
synced 2026-04-24 13:45:02 +00:00
130 lines
3.9 KiB
C
130 lines
3.9 KiB
C
/*
|
|
* Unit tests for bootloader utilities
|
|
* Tests memory address validation and basic bootloader logic
|
|
*/
|
|
|
|
#include "test_framework.h"
|
|
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
|
|
// Bootloader constants (from bootloader.h)
|
|
#define KERNEL_LOAD_ADDRESS 0x100000 // 1MB mark
|
|
#define MAX_KERNEL_SIZE 0x1000000 // 16MB max
|
|
|
|
// Test: Kernel load address is valid
|
|
TEST(kernel_load_address_valid) {
|
|
// Kernel should load at 1MB boundary (after BIOS/bootloader space)
|
|
ASSERT_EQ(KERNEL_LOAD_ADDRESS, 0x100000);
|
|
|
|
// Verify it's above 1MB (avoiding low memory)
|
|
ASSERT_TRUE(KERNEL_LOAD_ADDRESS >= 0x100000);
|
|
|
|
TEST_PASS();
|
|
}
|
|
|
|
// Test: Maximum kernel size is reasonable
|
|
TEST(max_kernel_size_reasonable) {
|
|
// 16MB should be plenty for minimal kernel
|
|
ASSERT_EQ(MAX_KERNEL_SIZE, 0x1000000);
|
|
|
|
// Should be at least 1MB
|
|
ASSERT_TRUE(MAX_KERNEL_SIZE >= 0x100000);
|
|
|
|
// Should be less than 100MB (we're minimal!)
|
|
ASSERT_TRUE(MAX_KERNEL_SIZE <= 0x6400000);
|
|
|
|
TEST_PASS();
|
|
}
|
|
|
|
// Test: Kernel address range doesn't overlap bootloader
|
|
TEST(kernel_address_no_overlap) {
|
|
uint64_t kernel_start = KERNEL_LOAD_ADDRESS;
|
|
uint64_t kernel_end = KERNEL_LOAD_ADDRESS + MAX_KERNEL_SIZE;
|
|
|
|
// Kernel should start after 1MB
|
|
ASSERT_TRUE(kernel_start >= 0x100000);
|
|
|
|
// Kernel should not wrap around
|
|
ASSERT_TRUE(kernel_end > kernel_start);
|
|
|
|
TEST_PASS();
|
|
}
|
|
|
|
// Mock function: Validate memory address is in valid range
|
|
static bool is_valid_memory_address(uint64_t address) {
|
|
// Address must be above 1MB (avoid BIOS/bootloader area)
|
|
if (address < 0x100000) return false;
|
|
|
|
// Address must be below 4GB for 32-bit compatibility
|
|
if (address >= 0x100000000ULL) return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
// Test: Memory address validation - valid addresses
|
|
TEST(memory_address_validation_valid) {
|
|
ASSERT_TRUE(is_valid_memory_address(0x100000)); // 1MB
|
|
ASSERT_TRUE(is_valid_memory_address(0x200000)); // 2MB
|
|
ASSERT_TRUE(is_valid_memory_address(0x1000000)); // 16MB
|
|
ASSERT_TRUE(is_valid_memory_address(0x80000000)); // 2GB
|
|
|
|
TEST_PASS();
|
|
}
|
|
|
|
// Test: Memory address validation - invalid addresses
|
|
TEST(memory_address_validation_invalid) {
|
|
ASSERT_FALSE(is_valid_memory_address(0x0)); // Null
|
|
ASSERT_FALSE(is_valid_memory_address(0x7C00)); // BIOS area
|
|
ASSERT_FALSE(is_valid_memory_address(0x10000)); // Below 1MB
|
|
ASSERT_FALSE(is_valid_memory_address(0xFFFFF)); // Just below 1MB
|
|
ASSERT_FALSE(is_valid_memory_address(0x100000000ULL)); // Above 4GB
|
|
|
|
TEST_PASS();
|
|
}
|
|
|
|
// Mock function: Align address to page boundary
|
|
static uint64_t align_to_page(uint64_t address) {
|
|
return (address + 0xFFF) & ~0xFFFULL;
|
|
}
|
|
|
|
// Test: Page alignment
|
|
TEST(page_alignment) {
|
|
ASSERT_EQ(align_to_page(0x100000), 0x100000); // Already aligned
|
|
ASSERT_EQ(align_to_page(0x100001), 0x101000); // Align up
|
|
ASSERT_EQ(align_to_page(0x100FFF), 0x101000); // Align up
|
|
ASSERT_EQ(align_to_page(0x101000), 0x101000); // Already aligned
|
|
ASSERT_EQ(align_to_page(0x101001), 0x102000); // Align up
|
|
|
|
TEST_PASS();
|
|
}
|
|
|
|
// Test: Bootloader version encoding
|
|
TEST(bootloader_version) {
|
|
#define BOOTLOADER_VERSION_MAJOR 0
|
|
#define BOOTLOADER_VERSION_MINOR 1
|
|
#define BOOTLOADER_VERSION_PATCH 0
|
|
|
|
// Verify version numbers are reasonable
|
|
ASSERT_TRUE(BOOTLOADER_VERSION_MAJOR >= 0);
|
|
ASSERT_TRUE(BOOTLOADER_VERSION_MAJOR < 10);
|
|
ASSERT_TRUE(BOOTLOADER_VERSION_MINOR >= 0);
|
|
ASSERT_TRUE(BOOTLOADER_VERSION_MINOR < 100);
|
|
|
|
TEST_PASS();
|
|
}
|
|
|
|
// Main test runner
|
|
int main(void) {
|
|
test_init("Bootloader Utilities");
|
|
|
|
RUN_TEST(kernel_load_address_valid);
|
|
RUN_TEST(max_kernel_size_reasonable);
|
|
RUN_TEST(kernel_address_no_overlap);
|
|
RUN_TEST(memory_address_validation_valid);
|
|
RUN_TEST(memory_address_validation_invalid);
|
|
RUN_TEST(page_alignment);
|
|
RUN_TEST(bootloader_version);
|
|
|
|
return test_summary();
|
|
}
|