From 82dcb74824fdf34a6145e4b32499ba9946ea57e5 Mon Sep 17 00:00:00 2001 From: Alex Kotov Date: Thu, 16 Jun 2022 13:55:32 +0300 Subject: [PATCH] Main: include/kernaux/memmap.h: Write tests (closes #58) --- .gitignore | 1 + examples/memmap.c | 1 + src/memmap.c | 1 + tests/Makefile.am | 10 +++ tests/test_memmap.c | 189 ++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 202 insertions(+) create mode 100644 tests/test_memmap.c diff --git a/.gitignore b/.gitignore index 7876a6f..d3df71c 100644 --- a/.gitignore +++ b/.gitignore @@ -128,6 +128,7 @@ /tests/test_cmdline_gen.c /tests/test_elf /tests/test_mbr +/tests/test_memmap /tests/test_multiboot2_common_packing /tests/test_multiboot2_header_helpers /tests/test_multiboot2_header_print diff --git a/examples/memmap.c b/examples/memmap.c index 35bcced..0139717 100644 --- a/examples/memmap.c +++ b/examples/memmap.c @@ -2,6 +2,7 @@ #include #include +#include #include #define SIZE_256MiB ( 256 * 1024 * 1024) diff --git a/src/memmap.c b/src/memmap.c index 6e6e899..04534a9 100644 --- a/src/memmap.c +++ b/src/memmap.c @@ -41,6 +41,7 @@ bool KernAux_MemMap_add_entry( if (MEMMAP.entries_count >= KERNAUX_MEMMAP_ENTRIES_MAX) return false; if (SIZE_MAX - start < size) return false; + if (size == 0) return false; const size_t index = MEMMAP.entries_count++; diff --git a/tests/Makefile.am b/tests/Makefile.am index aa7228f..4ebfcf7 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -103,6 +103,16 @@ test_mbr_LDADD = $(top_builddir)/libkernaux.la test_mbr_SOURCES = test_mbr.c endif +############### +# test_memmap # +############### + +if WITH_MEMMAP +TESTS += test_memmap +test_memmap_LDADD = $(top_builddir)/libkernaux.la +test_memmap_SOURCES = test_memmap.c +endif + ################################## # test_multiboot2_common_packing # ################################## diff --git a/tests/test_memmap.c b/tests/test_memmap.c new file mode 100644 index 0000000..825d7cd --- /dev/null +++ b/tests/test_memmap.c @@ -0,0 +1,189 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include +#include +#include +#include + +static KernAux_MemMap memmap; + +#define MEMSET memset(memmap, 0xff, sizeof(memmap)) +#define MEMMAP (*memmap) + +int main() +{ + { + MEMSET; + KernAux_MemMap_init(memmap, 0); + + assert(MEMMAP.is_finished == false); + assert(MEMMAP.memory_size == 0); + assert(MEMMAP.entries_count == 0); + + assert(KernAux_MemMap_finish(memmap)); + + assert(MEMMAP.is_finished); + assert(MEMMAP.memory_size == 0); + assert(MEMMAP.entries_count == 0); + + assert(KernAux_MemMap_entry_by_index(memmap, 0) == NULL); + } + + { + MEMSET; + KernAux_MemMap_init(memmap, 0); + + assert(MEMMAP.is_finished == false); + assert(MEMMAP.memory_size == 0); + assert(MEMMAP.entries_count == 0); + + assert(!KernAux_MemMap_add_entry(memmap, false, NULL, 0, 0)); + + assert(MEMMAP.is_finished == false); + assert(MEMMAP.memory_size == 0); + assert(MEMMAP.entries_count == 0); + + assert(KernAux_MemMap_finish(memmap)); + + assert(MEMMAP.is_finished); + assert(MEMMAP.memory_size == 0); + assert(MEMMAP.entries_count == 0); + + assert(KernAux_MemMap_entry_by_index(memmap, 0) == NULL); + } + + { + MEMSET; + KernAux_MemMap_init(memmap, 1); + + assert(MEMMAP.is_finished == false); + assert(MEMMAP.memory_size == 1); + assert(MEMMAP.entries_count == 0); + + assert(KernAux_MemMap_add_entry(memmap, false, NULL, 0, 1)); + + assert(MEMMAP.is_finished == false); + assert(MEMMAP.memory_size == 1); + assert(MEMMAP.entries_count == 1); + + assert(KernAux_MemMap_finish(memmap)); + + assert(MEMMAP.is_finished); + assert(MEMMAP.memory_size == 1); + assert(MEMMAP.entries_count == 1); + assert(MEMMAP.entries[0].is_available == false); + assert(MEMMAP.entries[0].tag[0] == '\0'); + assert(MEMMAP.entries[0].start == 0); + assert(MEMMAP.entries[0].size == 1); + assert(MEMMAP.entries[0].end == 0); + assert(MEMMAP.entries[0].limit == 1); + + assert(KernAux_MemMap_entry_by_index(memmap, 0) == &MEMMAP.entries[0]); + } + + { + MEMSET; + KernAux_MemMap_init(memmap, 2); + + assert(MEMMAP.is_finished == false); + assert(MEMMAP.memory_size == 2); + assert(MEMMAP.entries_count == 0); + + assert(KernAux_MemMap_add_entry(memmap, false, NULL, 0, 2)); + + assert(MEMMAP.is_finished == false); + assert(MEMMAP.memory_size == 2); + assert(MEMMAP.entries_count == 1); + + assert(KernAux_MemMap_finish(memmap)); + + assert(MEMMAP.is_finished); + assert(MEMMAP.memory_size == 2); + assert(MEMMAP.entries_count == 1); + assert(MEMMAP.entries[0].is_available == false); + assert(MEMMAP.entries[0].tag[0] == '\0'); + assert(MEMMAP.entries[0].start == 0); + assert(MEMMAP.entries[0].size == 2); + assert(MEMMAP.entries[0].end == 1); + assert(MEMMAP.entries[0].limit == 2); + + assert(KernAux_MemMap_entry_by_index(memmap, 0) == &MEMMAP.entries[0]); + } + + { + MEMSET; + KernAux_MemMap_init(memmap, 1); + + assert(MEMMAP.is_finished == false); + assert(MEMMAP.memory_size == 1); + assert(MEMMAP.entries_count == 0); + + assert(KernAux_MemMap_add_entry(memmap, false, NULL, 0, 2)); + + assert(MEMMAP.is_finished == false); + assert(MEMMAP.memory_size == 1); + assert(MEMMAP.entries_count == 1); + + assert(!KernAux_MemMap_finish(memmap)); + + assert(MEMMAP.is_finished == false); + assert(MEMMAP.memory_size == 1); + assert(MEMMAP.entries_count == 1); + assert(MEMMAP.entries[0].is_available == false); + assert(MEMMAP.entries[0].tag[0] == '\0'); + assert(MEMMAP.entries[0].start == 0); + assert(MEMMAP.entries[0].size == 2); + assert(MEMMAP.entries[0].end == 1); + assert(MEMMAP.entries[0].limit == 2); + + assert(KernAux_MemMap_entry_by_index(memmap, 0) == NULL); + } + + { + MEMSET; + KernAux_MemMap_init(memmap, 2); + + assert(MEMMAP.is_finished == false); + assert(MEMMAP.memory_size == 2); + assert(MEMMAP.entries_count == 0); + + assert(KernAux_MemMap_add_entry(memmap, false, NULL, 0, 1)); + + assert(MEMMAP.is_finished == false); + assert(MEMMAP.memory_size == 2); + assert(MEMMAP.entries_count == 1); + + assert(KernAux_MemMap_add_entry(memmap, false, NULL, 1, 1)); + + assert(MEMMAP.is_finished == false); + assert(MEMMAP.memory_size == 2); + assert(MEMMAP.entries_count == 2); + + assert(KernAux_MemMap_finish(memmap)); + + assert(MEMMAP.is_finished); + assert(MEMMAP.memory_size == 2); + assert(MEMMAP.entries_count == 2); + assert(MEMMAP.entries[0].is_available == false); + assert(MEMMAP.entries[0].tag[0] == '\0'); + assert(MEMMAP.entries[0].start == 0); + assert(MEMMAP.entries[0].size == 1); + assert(MEMMAP.entries[0].end == 0); + assert(MEMMAP.entries[0].limit == 1); + assert(MEMMAP.entries[1].is_available == false); + assert(MEMMAP.entries[1].tag[0] == '\0'); + assert(MEMMAP.entries[1].start == 1); + assert(MEMMAP.entries[1].size == 1); + assert(MEMMAP.entries[1].end == 1); + assert(MEMMAP.entries[1].limit == 2); + + assert(KernAux_MemMap_entry_by_index(memmap, 0) == &MEMMAP.entries[0]); + assert(KernAux_MemMap_entry_by_index(memmap, 1) == &MEMMAP.entries[1]); + } + + return 0; +}