From a379621934003ddea1ce8ea3b54e39267ab116ea Mon Sep 17 00:00:00 2001 From: Rian Quinn <“rianquinn@gmail.com”> Date: Tue, 5 Sep 2017 09:12:02 -0600 Subject: [PATCH] missing bfdriver unit tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rian Quinn <“rianquinn@gmail.com”> --- CMakeLists.txt | 16 +- bfdriver/CMakeLists.txt | 3 +- bfdriver/include/common.h | 8 +- bfdriver/src/CMakeLists.txt | 11 + bfdriver/src/arch/linux/entry.c | 5 +- bfdriver/src/arch/test/platform.c | 134 +++------ bfdriver/src/common.c | 132 ++++----- bfdriver/tests/CMakeLists.txt | 12 +- bfdriver/tests/test.cpp | 224 -------------- bfdriver/tests/test.h | 156 ---------- bfdriver/tests/test_common_add_module.cpp | 130 +++----- bfdriver/tests/test_common_dump.cpp | 99 ++----- bfdriver/tests/test_common_fini.cpp | 181 ++++-------- bfdriver/tests/test_common_init.cpp | 10 +- bfdriver/tests/test_common_load.cpp | 277 +++++++----------- bfdriver/tests/test_common_start.cpp | 168 ++++++----- bfdriver/tests/test_common_stop.cpp | 196 +++++++------ bfdriver/tests/test_common_unload.cpp | 125 ++++---- bfdriver/tests/test_common_vmcall.cpp | 154 ---------- bfdriver/tests/test_helpers.cpp | 179 ----------- bfdriver/tests/test_support.cpp | 112 +++++++ bfdriver/tests/test_support.h | 34 +++ bfelf_loader/include/bfelf_loader.h | 80 ++++- bfelf_loader/tests/test_binary.cpp | 72 +++++ bfsdk/cmake/CMakeGlobal_Includes.txt | 1 + bfsdk/include/bfsupport.h | 1 + bfsysroot/bfsupport/crt/src/crt.cpp | 3 - bfsysroot/bfsupport/dummy_main/CMakeLists.txt | 55 +++- bfsysroot/bfsupport/dummy_main/dummy_main.cpp | 68 ++++- 29 files changed, 1035 insertions(+), 1611 deletions(-) create mode 100644 bfdriver/src/CMakeLists.txt delete mode 100644 bfdriver/tests/test.cpp delete mode 100644 bfdriver/tests/test.h delete mode 100644 bfdriver/tests/test_common_vmcall.cpp delete mode 100644 bfdriver/tests/test_helpers.cpp create mode 100644 bfdriver/tests/test_support.cpp create mode 100644 bfdriver/tests/test_support.h diff --git a/CMakeLists.txt b/CMakeLists.txt index a849d6508..c82e9c85f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -216,6 +216,7 @@ endif() # ------------------------------------------------------------------------------ # SDK # ------------------------------------------------------------------------------ + list(APPEND BFSDK_CMAKE_ARGS -DBAREFLANK_SOURCE_DIR=${CMAKE_SOURCE_DIR} -DBAREFLANK_BINARY_DIR=${CMAKE_BINARY_DIR} @@ -506,8 +507,8 @@ list(APPEND BFDRIVER_CMAKE_ARGS -DENABLE_TIDY=${ENABLE_TIDY} -DENABLE_ASTYLE=${ENABLE_ASTYLE} -DENABLE_UNITTESTING=${ENABLE_UNITTESTING} - -DBUILD_SHARED_LIBS=${BAREFLANK_TEST_SHARED_LIBS} - -DBUILD_STATIC_LIBS=${BAREFLANK_TEST_STATIC_LIBS} + -DBUILD_SHARED_LIBS=${BAREFLANK_HOST_SHARED_LIBS} + -DBUILD_STATIC_LIBS=${BAREFLANK_HOST_STATIC_LIBS} ) ExternalProject_Add( @@ -520,11 +521,14 @@ ExternalProject_Add( SOURCE_DIR ${CMAKE_SOURCE_DIR}/bfdriver BINARY_DIR ${CMAKE_BINARY_DIR}/bfdriver/build UPDATE_COMMAND ${CMAKE_COMMAND} -E echo "checking for updates" - BUILD_COMMAND "" INSTALL_COMMAND "" DEPENDS bfsdk bfelf_loader ) +if(ENABLE_UNITTESTING AND NOT WIN32) + add_dependencies(bfdriver bfsysroot) +endif() + # ------------------------------------------------------------------------------ # Extended APIs # ------------------------------------------------------------------------------ @@ -673,7 +677,7 @@ if(ENABLE_UNITTESTING) endif() add_custom_target(test - # COMMAND ${CMAKE_COMMAND} -E chdir ${CMAKE_BINARY_DIR}/bfdriver/build ctest + COMMAND ${CMAKE_COMMAND} -E chdir ${CMAKE_BINARY_DIR}/bfdriver/build ctest COMMAND ${CMAKE_COMMAND} -E chdir ${CMAKE_BINARY_DIR}/bfelf_loader/build ctest COMMAND ${CMAKE_COMMAND} -E chdir ${CMAKE_BINARY_DIR}/bfm/build ctest COMMAND ${CMAKE_COMMAND} -E chdir ${CMAKE_BINARY_DIR}/bfsdk/build ctest @@ -694,13 +698,13 @@ endif() if(ENABLE_TIDY AND NOT WIN32) add_custom_target(tidy - # COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR}/bfdriver/build --target tidy + COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR}/bfdriver/build --target tidy COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR}/bfm/build --target tidy COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR}/bfsdk/build --target tidy ) add_custom_target(tidy-all - # COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR}/bfdriver/build --target tidy-all + COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR}/bfdriver/build --target tidy-all COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR}/bfm/build --target tidy-all COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR}/bfsdk/build --target tidy-all ) diff --git a/bfdriver/CMakeLists.txt b/bfdriver/CMakeLists.txt index 87d7f1d12..cb4c9ecb5 100644 --- a/bfdriver/CMakeLists.txt +++ b/bfdriver/CMakeLists.txt @@ -7,7 +7,8 @@ include(${CMAKE_INSTALL_PREFIX}/cmake/CMakeGlobal_Project.txt) # Subdirectories # ------------------------------------------------------------------------------ -if(ENABLE_UNITTESTING) +if(NOT WIN32 AND ENABLE_UNITTESTING AND BUILD_SHARED_LIBS) + add_subdirectory(src) add_subdirectory(tests) endif() diff --git a/bfdriver/include/common.h b/bfdriver/include/common.h index 46684988f..c2eeb626a 100644 --- a/bfdriver/include/common.h +++ b/bfdriver/include/common.h @@ -46,10 +46,8 @@ common_vmm_status(void); * * This function should not be called directly. Instead, use common_unload. * This is only exposed publically for unit testing. - * - * @return will always return BF_SUCCESS */ -int64_t +void common_reset(void); /** @@ -58,10 +56,8 @@ common_reset(void); * This code should be run as part of the driver entry's init code. This * sets up some resources that are needed throughout the lifetime of the * driver entry. - * - * @return BF_SUCCESS on success, negative error code on failure */ -int64_t +void common_init(void); /** diff --git a/bfdriver/src/CMakeLists.txt b/bfdriver/src/CMakeLists.txt new file mode 100644 index 000000000..76bbe513a --- /dev/null +++ b/bfdriver/src/CMakeLists.txt @@ -0,0 +1,11 @@ +# ------------------------------------------------------------------------------ +# CMake Includes +# ------------------------------------------------------------------------------ + +include(${CMAKE_INSTALL_PREFIX}/cmake/CMakeGlobal_Includes.txt) + +# ------------------------------------------------------------------------------ +# Targets +# ------------------------------------------------------------------------------ + +add_library(bfdriver STATIC common.c arch/test/platform.c) diff --git a/bfdriver/src/arch/linux/entry.c b/bfdriver/src/arch/linux/entry.c index 3c538a8d8..4ae41434b 100644 --- a/bfdriver/src/arch/linux/entry.c +++ b/bfdriver/src/arch/linux/entry.c @@ -376,10 +376,7 @@ dev_init(void) return -EPERM; } - if (common_init() != 0) { - BFALERT("common_init failed\n"); - return -EPERM; - } + common_init(); BFDEBUG("dev_init succeeded\n"); return 0; diff --git a/bfdriver/src/arch/test/platform.c b/bfdriver/src/arch/test/platform.c index 49aa55d00..fd69a18c2 100644 --- a/bfdriver/src/arch/test/platform.c +++ b/bfdriver/src/arch/test/platform.c @@ -20,67 +20,46 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#define _POSIX_C_SOURCE 200809L - #include #include #include -#include -#include -#include - -int alloc_count_rw = 0; -int alloc_count_rwe = 0; -#define PAGE_ROUND_UP(x) ( (((uintptr_t)(x)) + MAX_PAGE_SIZE-1) & (~(MAX_PAGE_SIZE-1)) ) - -uint64_t g_malloc_fails = 0; -uint64_t g_set_afinity_fails = 0; -uint64_t g_vmcall = 0; +#include +#include +#include -int -verify_no_mem_leaks(void) -{ - printf("alloc_count_rw: %d\n", alloc_count_rw); - printf("alloc_count_rwe: %d\n", alloc_count_rwe); +#ifdef WIN64 +#include +#else +#include +#endif - return (alloc_count_rw == 0) && (alloc_count_rwe == 0); -} +#define PAGE_ROUND_UP(x) ( (((uintptr_t)(x)) + MAX_PAGE_SIZE-1) & (~(MAX_PAGE_SIZE-1)) ) void * platform_alloc_rw(uint64_t len) -{ - if (g_malloc_fails == len) { - return 0; - } - - alloc_count_rw++; - return malloc(len); -} - -#include +{ return malloc(len); } void * platform_alloc_rwe(uint64_t len) { void *addr = 0; - if (g_malloc_fails == len) { - return 0; - } +#ifdef WIN64 + DWORD oldProtect; +#else + int ret; +#endif len = PAGE_ROUND_UP(len); + addr = aligned_alloc(MAX_PAGE_SIZE, len); - if (posix_memalign(&addr, MAX_PAGE_SIZE, len) != 0) { - return 0; - } - - if (mprotect(addr, len, PROT_READ | PROT_WRITE | PROT_EXEC) == -1) { - platform_free_rw(addr, len); - return 0; - } - - alloc_count_rwe++; +#ifdef WIN64 + VirtualProtect(addr, len, PAGE_EXECUTE_READWRITE, &oldProtect); +#else + ret = mprotect(addr, len, PROT_READ | PROT_WRITE | PROT_EXEC); + bfignored(ret); +#endif return addr; } @@ -88,89 +67,60 @@ platform_alloc_rwe(uint64_t len) void platform_free_rw(void *addr, uint64_t len) { - (void)len; - - alloc_count_rw--; + bfignored(len); free(addr); } void platform_free_rwe(void *addr, uint64_t len) { - (void) len; - - alloc_count_rwe--; + bfignored(len); free(addr); } void * platform_virt_to_phys(void *virt) -{ - return virt; -} +{ return virt; } -void +void * platform_memset(void *ptr, char value, uint64_t num) -{ - if (!ptr) { - return; - } +{ return memset(ptr, value, num); } - memset(ptr, value, num); -} - -void +void * platform_memcpy(void *dst, const void *src, uint64_t num) -{ - if (!dst || !src) { - return; - } - - memcpy(dst, src, num); -} +{ return memcpy(dst, src, num); } void platform_start(void) -{ -} +{ } void platform_stop(void) -{ -} +{ } int64_t platform_num_cpus(void) -{ - return 1; -} +{ return 1; } int64_t platform_set_affinity(int64_t affinity) { - (void) affinity; - - if (g_set_afinity_fails != 0) { - return -1; - } - + bfignored(affinity); return 0; } void platform_restore_affinity(int64_t affinity) -{ - (void) affinity; -} +{ bfignored(affinity); } + +int64_t +platform_get_current_cpu_num(void) +{ return 0; } void -platform_vmcall(struct vmcall_registers_t *regs) -{ - regs->r01 = g_vmcall; -} +platform_restore_preemption(void) +{ } void -platform_vmcall_event(struct vmcall_registers_t *regs) -{ - regs->r01 = g_vmcall; -} +vmcall(struct vmcall_registers_t *regs) +{ regs->r01 = 0; } diff --git a/bfdriver/src/common.c b/bfdriver/src/common.c index dd2ff99f7..048972a1d 100644 --- a/bfdriver/src/common.c +++ b/bfdriver/src/common.c @@ -37,7 +37,7 @@ int64_t g_num_modules = 0; struct bfelf_binary_t g_modules[MAX_NUM_MODULES]; -_start_t _start; +_start_t _start_func = 0; struct crt_info_t g_info; struct bfelf_loader_t g_loader; @@ -91,24 +91,21 @@ call_vmm(uintptr_t request, uintptr_t arg1, uintptr_t arg2, uintptr_t arg3) { int64_t ret = 0; int64_t cpuid = 0; + int64_t ignored_ret = 0; struct thread_context_t *tc = (struct thread_context_t *)(g_stack_top - sizeof(struct thread_context_t)); - ret = bfelf_set_integer_args(&g_info, request, arg1, arg2, arg3); - if (ret != BF_SUCCESS) { - return ret; - } + ignored_ret = bfelf_set_integer_args(&g_info, request, arg1, arg2, arg3); + bfignored(ignored_ret); cpuid = platform_get_current_cpu_num(); - tc->cpuid = cpuid; - tc->tlsptr = (uint64_t)g_tls + (THREAD_LOCAL_STORAGE_SIZE * cpuid); + tc->cpuid = (uint64_t)cpuid; + tc->tlsptr = (uint64_t)g_tls + (THREAD_LOCAL_STORAGE_SIZE * (uint64_t)cpuid); - if (_start != 0) { - ret = _start((void *)(g_stack_top - sizeof(struct thread_context_t) - 1), &g_info); - } - else { - ret = BF_ERROR_UNKNOWN; - } + ret = _start_func((void *)(g_stack_top - sizeof(struct thread_context_t) - 1), &g_info); + + ignored_ret = bfelf_set_integer_args(&g_info, 0, 0, 0, 0); + bfignored(ignored_ret); platform_restore_preemption(); return ret; @@ -132,22 +129,12 @@ add_raw_md_to_memory_manager(uint64_t virt, uint64_t type) return BF_SUCCESS; } -// TODO -// -// Put this function into the ELF loader with a callback. This will be needed -// in the hyperkernel, but what it has to do will be different. -// - int64_t add_md_to_memory_manager(struct bfelf_binary_t *module) { int64_t ret = 0; bfelf64_word s = 0; - if (module == 0) { - return BF_ERROR_INVALID_ARG; - } - for (s = 0; s < bfelf_file_get_num_load_instrs(&module->ef); s++) { uint64_t exec_s = 0; @@ -155,9 +142,7 @@ add_md_to_memory_manager(struct bfelf_binary_t *module) const struct bfelf_load_instr *instr = 0; ret = bfelf_file_get_load_instr(&module->ef, s, &instr); - if (ret != BFELF_SUCCESS) { - return ret; - } + bfignored(ret); exec_s = (uint64_t)module->exec + instr->mem_offset; exec_e = (uint64_t)module->exec + instr->mem_offset + instr->memsz; @@ -181,6 +166,38 @@ add_md_to_memory_manager(struct bfelf_binary_t *module) return BF_SUCCESS; } +int64_t +add_tss_mdl(void) +{ + uint64_t i = 0; + int64_t ret = 0; + + for (i = 0; i < g_tls_size; i += MAX_PAGE_SIZE) { + ret = add_raw_md_to_memory_manager((uint64_t)g_tls + i, MEMORY_TYPE_R | MEMORY_TYPE_W); + if (ret != BF_SUCCESS) { + return ret; + } + } + + return BF_SUCCESS; +} + +int64_t +add_modules_mdl(void) +{ + int64_t i = 0; + int64_t ret = 0; + + for (i = 0; i < g_num_modules; i++) { + ret = add_md_to_memory_manager(&g_modules[i]); + if (ret != BF_SUCCESS) { + return ret; + } + } + + return BF_SUCCESS; +} + /* -------------------------------------------------------------------------- */ /* Implementation */ /* -------------------------------------------------------------------------- */ @@ -191,7 +208,7 @@ common_vmm_status(void) return g_vmm_status; } -int64_t +void common_reset(void) { int64_t i; @@ -207,7 +224,7 @@ common_reset(void) platform_memset(&g_info, 0, sizeof(struct crt_info_t)); platform_memset(&g_loader, 0, sizeof(struct bfelf_loader_t)); - _start = 0; + _start_func = 0; g_num_modules = 0; g_num_cpus_started = 0; @@ -224,14 +241,12 @@ common_reset(void) g_tls = 0; g_stack = 0; g_stack_top = 0; - - return BF_SUCCESS; } -int64_t +void common_init(void) { - return common_reset(); + common_reset(); } int64_t @@ -253,10 +268,8 @@ common_fini(void) return BF_ERROR_VMM_CORRUPTED; } - if (common_vmm_status() == VMM_UNLOADED && g_num_modules > 0) { - if (common_reset() != BF_SUCCESS) { - BFALERT("common_fini: failed to reset\n"); - } + if (g_num_modules > 0) { + common_reset(); } return BF_SUCCESS; @@ -287,10 +300,6 @@ common_add_module(const char *file, uint64_t fsize) g_modules[g_num_modules].file = file; g_modules[g_num_modules].file_size = fsize; - BFDEBUG("common_add_module [%d]:\n", (int)g_num_modules); - BFDEBUG(" addr = %p\n", (void *)file); - BFDEBUG(" size = %p\n", (void *)fsize); - g_num_modules++; return BF_SUCCESS; } @@ -298,7 +307,6 @@ common_add_module(const char *file, uint64_t fsize) int64_t common_load_vmm(void) { - int64_t i = 0; int64_t ret = 0; int64_t ignore_ret = 0; @@ -327,7 +335,7 @@ common_load_vmm(void) goto failure; } - ret = bfelf_load(g_modules, g_num_modules, (void **)&_start, &g_info, &g_loader); + ret = bfelf_load(g_modules, (uint64_t)g_num_modules, (void **)&_start_func, &g_info, &g_loader); if (ret != BF_SUCCESS) { goto failure; } @@ -337,30 +345,14 @@ common_load_vmm(void) goto failure; } - // TODO - // - // The following should be in their own functions so that they can be - // tested easier, and we need to send up an MDL and not each MD which will - // speed things up a lot. - // - - for (i = 0; i < g_num_modules; i++) { - ret = add_md_to_memory_manager(&g_modules[i]); - if (ret != BF_SUCCESS) { - goto failure; - } + ret = add_modules_mdl(); + if (ret != BF_SUCCESS) { + goto failure; } - { - uint64_t tlss = (uint64_t)g_tls; - uint64_t tlse = tlss + g_tls_size; - - for (; tlss <= tlse; tlss += MAX_PAGE_SIZE) { - ret = add_raw_md_to_memory_manager(tlss, MEMORY_TYPE_R | MEMORY_TYPE_W); - if (ret != BF_SUCCESS) { - return ret; - } - } + ret = add_tss_mdl(); + if (ret != BF_SUCCESS) { + goto failure; } g_vmm_status = VMM_LOADED; @@ -369,7 +361,7 @@ common_load_vmm(void) failure: ignore_ret = common_unload_vmm(); - (void) ignore_ret; + bfignored(ignore_ret); return ret; } @@ -381,7 +373,7 @@ common_unload_vmm(void) switch (common_vmm_status()) { case VMM_CORRUPT: - goto corrupted; + return BF_ERROR_VMM_CORRUPTED; case VMM_RUNNING: return BF_ERROR_VMM_INVALID_STATE; case VMM_UNLOADED: @@ -392,7 +384,6 @@ common_unload_vmm(void) ret = call_vmm(BF_REQUEST_FINI, 0, 0, 0); if (ret != BF_SUCCESS) { - BFALERT("call_vmm [BF_REQUEST_FINI] failed: %llx", ret); goto corrupted; } @@ -406,7 +397,7 @@ common_unload_vmm(void) corrupted: g_vmm_status = VMM_CORRUPT; - return BF_ERROR_VMM_CORRUPTED; + return ret; } int64_t @@ -462,7 +453,7 @@ common_start_vmm(void) failure: ignore_ret = common_stop_vmm(); - (void) ignore_ret; + bfignored(ignore_ret); return ret; } @@ -498,7 +489,8 @@ common_stop_vmm(void) vmcall(®s); if (regs.r01 != 0) { - return ENTRY_ERROR_VMM_STOP_FAILED; + ret = ENTRY_ERROR_VMM_STOP_FAILED; + goto corrupted; } ret = call_vmm(BF_REQUEST_VMM_FINI, (uint64_t)cpuid, 0, 0); diff --git a/bfdriver/tests/CMakeLists.txt b/bfdriver/tests/CMakeLists.txt index 09db7b1a8..cd451ea0c 100644 --- a/bfdriver/tests/CMakeLists.txt +++ b/bfdriver/tests/CMakeLists.txt @@ -8,11 +8,21 @@ include(${CMAKE_INSTALL_PREFIX}/cmake/CMakeGlobal_Includes.txt) # Targets # ------------------------------------------------------------------------------ -# add_library(test_support STATIC test_real_elf.cpp test_fake_elf.cpp) +add_library(test_support STATIC test_support.cpp) macro(do_test str) add_executable(test_${str} test_${str}.cpp) + target_link_libraries(test_${str} bfdriver) target_link_libraries(test_${str} test_support) target_link_libraries(test_${str} test_catch) add_test(bfelf_${str} test_${str}) endmacro(do_test) + +do_test(common_add_module) +do_test(common_dump) +do_test(common_fini) +do_test(common_init) +do_test(common_load) +do_test(common_start) +do_test(common_stop) +do_test(common_unload) diff --git a/bfdriver/tests/test.cpp b/bfdriver/tests/test.cpp deleted file mode 100644 index 686f11593..000000000 --- a/bfdriver/tests/test.cpp +++ /dev/null @@ -1,224 +0,0 @@ -// -// Bareflank Hypervisor -// -// Copyright (C) 2015 Assured Information Security, Inc. -// Author: Rian Quinn -// Author: Brendan Kerrigan -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -#include - -#include -#include - -const auto c_dummy_add_md_failure_filename = "../cross/libdummy_add_md_failure.so"; -const auto c_dummy_add_md_success_filename = "../cross/libdummy_add_md_success.so"; -const auto c_dummy_get_drr_failure_filename = "../cross/libdummy_get_drr_failure.so"; -const auto c_dummy_get_drr_success_filename = "../cross/libdummy_get_drr_success.so"; -const auto c_dummy_misc_filename = "../cross/libdummy_misc.so"; -const auto c_dummy_start_vmm_failure_filename = "../cross/libdummy_start_vmm_failure.so"; -const auto c_dummy_start_vmm_success_filename = "../cross/libdummy_start_vmm_success.so"; -const auto c_dummy_stop_vmm_failure_filename = "../cross/libdummy_stop_vmm_failure.so"; -const auto c_dummy_stop_vmm_success_filename = "../cross/libdummy_stop_vmm_success.so"; - -extern "C" int verify_no_mem_leaks(void); - -driver_entry_ut::driver_entry_ut() : - m_dummy_add_md_failure(nullptr), - m_dummy_add_md_success(nullptr), - m_dummy_get_drr_failure(nullptr), - m_dummy_get_drr_success(nullptr), - m_dummy_misc(nullptr), - m_dummy_start_vmm_failure(nullptr), - m_dummy_start_vmm_success(nullptr), - m_dummy_stop_vmm_failure(nullptr), - m_dummy_stop_vmm_success(nullptr), - m_dummy_add_md_failure_length(0), - m_dummy_add_md_success_length(0), - m_dummy_get_drr_failure_length(0), - m_dummy_get_drr_success_length(0), - m_dummy_misc_length(0), - m_dummy_start_vmm_failure_length(0), - m_dummy_start_vmm_success_length(0), - m_dummy_stop_vmm_failure_length(0), - m_dummy_stop_vmm_success_length(0) -{ -} - -bool -driver_entry_ut::init() -{ - std::ifstream dummy_add_md_failure_ifs(c_dummy_add_md_failure_filename, std::ifstream::ate); - std::ifstream dummy_add_md_success_ifs(c_dummy_add_md_success_filename, std::ifstream::ate); - std::ifstream dummy_get_drr_failure_ifs(c_dummy_get_drr_failure_filename, std::ifstream::ate); - std::ifstream dummy_get_drr_success_ifs(c_dummy_get_drr_success_filename, std::ifstream::ate); - std::ifstream dummy_misc_ifs(c_dummy_misc_filename, std::ifstream::ate); - std::ifstream dummy_start_vmm_failure_ifs(c_dummy_start_vmm_failure_filename, std::ifstream::ate); - std::ifstream dummy_start_vmm_success_ifs(c_dummy_start_vmm_success_filename, std::ifstream::ate); - std::ifstream dummy_stop_vmm_failure_ifs(c_dummy_stop_vmm_failure_filename, std::ifstream::ate); - std::ifstream dummy_stop_vmm_success_ifs(c_dummy_stop_vmm_success_filename, std::ifstream::ate); - - m_dummy_add_md_failure_length = static_cast(dummy_add_md_failure_ifs.tellg()); - m_dummy_add_md_success_length = static_cast(dummy_add_md_success_ifs.tellg()); - m_dummy_get_drr_failure_length = static_cast(dummy_get_drr_failure_ifs.tellg()); - m_dummy_get_drr_success_length = static_cast(dummy_get_drr_success_ifs.tellg()); - m_dummy_misc_length = static_cast(dummy_misc_ifs.tellg()); - m_dummy_start_vmm_failure_length = static_cast(dummy_start_vmm_failure_ifs.tellg()); - m_dummy_start_vmm_success_length = static_cast(dummy_start_vmm_success_ifs.tellg()); - m_dummy_stop_vmm_failure_length = static_cast(dummy_stop_vmm_failure_ifs.tellg()); - m_dummy_stop_vmm_success_length = static_cast(dummy_stop_vmm_success_ifs.tellg()); - - m_dummy_add_md_failure = std::make_unique(m_dummy_add_md_failure_length); - m_dummy_add_md_success = std::make_unique(m_dummy_add_md_success_length); - m_dummy_get_drr_failure = std::make_unique(m_dummy_get_drr_failure_length); - m_dummy_get_drr_success = std::make_unique(m_dummy_get_drr_success_length); - m_dummy_misc = std::make_unique(m_dummy_misc_length); - m_dummy_start_vmm_failure = std::make_unique(m_dummy_start_vmm_failure_length); - m_dummy_start_vmm_success = std::make_unique(m_dummy_start_vmm_success_length); - m_dummy_stop_vmm_failure = std::make_unique(m_dummy_stop_vmm_failure_length); - m_dummy_stop_vmm_success = std::make_unique(m_dummy_stop_vmm_success_length); - - dummy_add_md_failure_ifs.seekg(0); - dummy_add_md_success_ifs.seekg(0); - dummy_get_drr_failure_ifs.seekg(0); - dummy_get_drr_success_ifs.seekg(0); - dummy_misc_ifs.seekg(0); - dummy_start_vmm_failure_ifs.seekg(0); - dummy_start_vmm_success_ifs.seekg(0); - dummy_stop_vmm_failure_ifs.seekg(0); - dummy_stop_vmm_success_ifs.seekg(0); - - dummy_add_md_failure_ifs.read(m_dummy_add_md_failure.get(), static_cast(m_dummy_add_md_failure_length)); - dummy_add_md_success_ifs.read(m_dummy_add_md_success.get(), static_cast(m_dummy_add_md_success_length)); - dummy_get_drr_failure_ifs.read(m_dummy_get_drr_failure.get(), static_cast(m_dummy_get_drr_failure_length)); - dummy_get_drr_success_ifs.read(m_dummy_get_drr_success.get(), static_cast(m_dummy_get_drr_success_length)); - dummy_misc_ifs.read(m_dummy_misc.get(), static_cast(m_dummy_misc_length)); - dummy_start_vmm_failure_ifs.read(m_dummy_start_vmm_failure.get(), static_cast(m_dummy_start_vmm_failure_length)); - dummy_start_vmm_success_ifs.read(m_dummy_start_vmm_success.get(), static_cast(m_dummy_start_vmm_success_length)); - dummy_stop_vmm_failure_ifs.read(m_dummy_stop_vmm_failure.get(), static_cast(m_dummy_stop_vmm_failure_length)); - dummy_stop_vmm_success_ifs.read(m_dummy_stop_vmm_success.get(), static_cast(m_dummy_stop_vmm_success_length)); - - return true; -} - -bool -driver_entry_ut::fini() -{ - return true; -} - -bool -driver_entry_ut::list() -{ - this->test_common_init(); - - this->test_common_fini_unloaded(); - this->test_common_fini_successful_start(); - this->test_common_fini_successful_load(); - this->test_common_fini_successful_add_module(); - this->test_common_fini_corrupted(); - this->test_common_fini_failed_load(); - this->test_common_fini_failed_start(); - this->test_common_fini_unload_failed(); - this->test_common_fini_stop_failed(); - this->test_common_fini_reset_failed(); - - this->test_common_add_module_invalid_file(); - this->test_common_add_module_invalid_file_size(); - this->test_common_add_module_garbage_module(); - this->test_common_add_module_add_when_already_loaded(); - this->test_common_add_module_add_when_already_running(); - this->test_common_add_module_add_when_corrupt(); - this->test_common_add_module_add_too_many(); - this->test_common_add_module_platform_alloc_fails(); - this->test_common_add_module_load_elf_fails(); - - this->test_common_load_successful_load(); - this->test_common_load_load_when_already_loaded(); - this->test_common_load_load_when_already_running(); - this->test_common_load_load_when_corrupt(); - this->test_common_load_fail_due_to_relocation_error(); - this->test_common_load_fail_due_to_no_modules_added(); - this->test_common_load_add_md_failed(); - this->test_common_load_add_md_tls_failed(); - this->test_common_load_tls_platform_alloc_failed(); - this->test_common_load_stack_platform_alloc_failed(); - this->test_common_load_loader_add_failed(); - this->test_common_load_resolve_symbol_failed(); - this->test_common_load_execute_symbol_failed(); - - this->test_common_unload_unload_when_already_unloaded(); - this->test_common_unload_unload_when_running(); - this->test_common_unload_unload_when_corrupt(); - this->test_common_unload_execute_symbol_failed(); - - this->test_common_start_start_when_unloaded(); - this->test_common_start_start_when_already_running(); - this->test_common_start_start_when_corrupt(); - this->test_common_start_start_when_start_vmm_missing(); - this->test_common_start_start_vmm_failure(); - this->test_common_start_set_affinity_failed(); - this->test_common_start_vmcall_failed(); - - this->test_common_stop_stop_when_unloaded(); - this->test_common_stop_stop_when_not_running(); - this->test_common_stop_stop_when_alread_stopped(); - this->test_common_stop_stop_when_corrupt(); - this->test_common_stop_stop_vmm_missing(); - this->test_common_stop_stop_vmm_failure(); - this->test_common_stop_set_affinity_failed(); - this->test_common_stop_vmcall_failed(); - - this->test_common_dump_invalid_drr(); - this->test_common_dump_invalid_vcpuid(); - this->test_common_dump_dump_when_unloaded(); - this->test_common_dump_dump_when_corrupt(); - this->test_common_dump_dump_when_loaded(); - this->test_common_dump_get_drr_missing(); - this->test_common_dump_get_drr_failure(); - - this->test_common_vmcall_invalid_args(); - this->test_common_vmcall_set_affinity_failure(); - this->test_common_vmcall_success(); - this->test_common_vmcall_success_event(); - this->test_common_vmcall_vmcall_when_unloaded(); - this->test_common_vmcall_vmcall_when_corrupt(); - this->test_common_vmcall_vmcall_when_loaded(); - - this->test_helper_common_vmm_status(); - this->test_helper_get_file_invalid_index(); - this->test_helper_get_file_success(); - this->test_helper_symbol_length_null_symbol(); - this->test_helper_symbol_length_success(); - this->test_helper_resolve_symbol_invalid_name(); - this->test_helper_resolve_symbol_invalid_sym(); - this->test_helper_resolve_symbol_no_loaded_modules(); - this->test_helper_resolve_symbol_missing_symbol(); - this->test_helper_execute_symbol_invalid_arg(); - this->test_helper_execute_symbol_missing_symbol(); - this->test_helper_execute_symbol_sym_failed(); - this->test_helper_execute_symbol_sym_success(); - this->test_helper_add_md_to_memory_manager_null_module(); - this->test_helper_load_elf_file_null_module(); - - return verify_no_mem_leaks() != 0; -} - -int -main(int argc, char *argv[]) -{ - return RUN_ALL_TESTS(driver_entry_ut); -} diff --git a/bfdriver/tests/test.h b/bfdriver/tests/test.h deleted file mode 100644 index 669cb7d5e..000000000 --- a/bfdriver/tests/test.h +++ /dev/null @@ -1,156 +0,0 @@ -// -// Bareflank Hypervisor -// -// Copyright (C) 2015 Assured Information Security, Inc. -// Author: Rian Quinn -// Author: Brendan Kerrigan -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -#ifndef TEST_H -#define TEST_H - -#include - -class driver_entry_ut : public unittest -{ -public: - - driver_entry_ut(); - ~driver_entry_ut() override = default; - -protected: - - bool init() override; - bool fini() override; - bool list() override; - -private: - - void test_common_init(); - - void test_common_fini_unloaded(); - void test_common_fini_successful_start(); - void test_common_fini_successful_load(); - void test_common_fini_successful_add_module(); - void test_common_fini_corrupted(); - void test_common_fini_failed_load(); - void test_common_fini_failed_start(); - void test_common_fini_unload_failed(); - void test_common_fini_stop_failed(); - void test_common_fini_reset_failed(); - - void test_common_add_module_invalid_file(); - void test_common_add_module_invalid_file_size(); - void test_common_add_module_garbage_module(); - void test_common_add_module_add_when_already_loaded(); - void test_common_add_module_add_when_already_running(); - void test_common_add_module_add_when_corrupt(); - void test_common_add_module_add_too_many(); - void test_common_add_module_platform_alloc_fails(); - void test_common_add_module_load_elf_fails(); - - void test_common_load_successful_load(); - void test_common_load_load_when_already_loaded(); - void test_common_load_load_when_already_running(); - void test_common_load_load_when_corrupt(); - void test_common_load_fail_due_to_relocation_error(); - void test_common_load_fail_due_to_no_modules_added(); - void test_common_load_add_md_failed(); - void test_common_load_add_md_tls_failed(); - void test_common_load_tls_platform_alloc_failed(); - void test_common_load_stack_platform_alloc_failed(); - void test_common_load_loader_add_failed(); - void test_common_load_resolve_symbol_failed(); - void test_common_load_execute_symbol_failed(); - - void test_common_unload_unload_when_already_unloaded(); - void test_common_unload_unload_when_running(); - void test_common_unload_unload_when_corrupt(); - void test_common_unload_execute_symbol_failed(); - - void test_common_start_start_when_unloaded(); - void test_common_start_start_when_already_running(); - void test_common_start_start_when_corrupt(); - void test_common_start_start_when_start_vmm_missing(); - void test_common_start_start_vmm_failure(); - void test_common_start_set_affinity_failed(); - void test_common_start_vmcall_failed(); - - void test_common_stop_stop_when_unloaded(); - void test_common_stop_stop_when_not_running(); - void test_common_stop_stop_when_alread_stopped(); - void test_common_stop_stop_when_corrupt(); - void test_common_stop_stop_vmm_missing(); - void test_common_stop_stop_vmm_failure(); - void test_common_stop_set_affinity_failed(); - void test_common_stop_vmcall_failed(); - - void test_common_dump_invalid_drr(); - void test_common_dump_invalid_vcpuid(); - void test_common_dump_dump_when_unloaded(); - void test_common_dump_dump_when_corrupt(); - void test_common_dump_dump_when_loaded(); - void test_common_dump_get_drr_missing(); - void test_common_dump_get_drr_failure(); - - void test_common_vmcall_invalid_args(); - void test_common_vmcall_set_affinity_failure(); - void test_common_vmcall_success(); - void test_common_vmcall_success_event(); - void test_common_vmcall_vmcall_when_unloaded(); - void test_common_vmcall_vmcall_when_corrupt(); - void test_common_vmcall_vmcall_when_loaded(); - - void test_helper_common_vmm_status(); - void test_helper_get_file_invalid_index(); - void test_helper_get_file_success(); - void test_helper_symbol_length_null_symbol(); - void test_helper_symbol_length_success(); - void test_helper_resolve_symbol_invalid_name(); - void test_helper_resolve_symbol_invalid_sym(); - void test_helper_resolve_symbol_no_loaded_modules(); - void test_helper_resolve_symbol_missing_symbol(); - void test_helper_execute_symbol_invalid_arg(); - void test_helper_execute_symbol_missing_symbol(); - void test_helper_execute_symbol_sym_failed(); - void test_helper_execute_symbol_sym_success(); - void test_helper_add_md_to_memory_manager_null_module(); - void test_helper_load_elf_file_null_module(); - -private: - - std::unique_ptr m_dummy_add_md_failure; - std::unique_ptr m_dummy_add_md_success; - std::unique_ptr m_dummy_get_drr_failure; - std::unique_ptr m_dummy_get_drr_success; - std::unique_ptr m_dummy_misc; - std::unique_ptr m_dummy_start_vmm_failure; - std::unique_ptr m_dummy_start_vmm_success; - std::unique_ptr m_dummy_stop_vmm_failure; - std::unique_ptr m_dummy_stop_vmm_success; - - uint64_t m_dummy_add_md_failure_length; - uint64_t m_dummy_add_md_success_length; - uint64_t m_dummy_get_drr_failure_length; - uint64_t m_dummy_get_drr_success_length; - uint64_t m_dummy_misc_length; - uint64_t m_dummy_start_vmm_failure_length; - uint64_t m_dummy_start_vmm_success_length; - uint64_t m_dummy_stop_vmm_failure_length; - uint64_t m_dummy_stop_vmm_success_length; -}; - -#endif diff --git a/bfdriver/tests/test_common_add_module.cpp b/bfdriver/tests/test_common_add_module.cpp index 8135e0c11..949ffd4f5 100644 --- a/bfdriver/tests/test_common_add_module.cpp +++ b/bfdriver/tests/test_common_add_module.cpp @@ -19,116 +19,82 @@ // License along with this library; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -#include +#include +#include #include -#include -#include -#include +#include -// ----------------------------------------------------------------------------- -// Expose Private Functions -// ----------------------------------------------------------------------------- - -extern "C" +TEST_CASE("common_add_module: invalid file") { - int64_t load_elf_file(struct module_t *module); + CHECK(common_add_module(nullptr, 42) == BF_ERROR_INVALID_ARG); } -// ----------------------------------------------------------------------------- -// Tests -// ----------------------------------------------------------------------------- - -void -driver_entry_ut::test_common_add_module_invalid_file() +TEST_CASE("common_add_module: invalid size") { - this->expect_true(common_add_module(nullptr, m_dummy_misc_length) == BF_ERROR_INVALID_ARG); + binaries_info info{&g_file, g_filenames_success, false}; + CHECK(common_add_module(info.back().file, 0) == BF_ERROR_INVALID_ARG); } -void -driver_entry_ut::test_common_add_module_invalid_file_size() +TEST_CASE("common_add_module: success") { - this->expect_true(common_add_module(m_dummy_misc.get(), 0) == BF_ERROR_INVALID_ARG); + binaries_info info{&g_file, g_filenames_success, false}; + CHECK(common_add_module(info.back().file, info.back().file_size) == BF_SUCCESS); + + REQUIRE(common_fini() == BF_SUCCESS); } -void -driver_entry_ut::test_common_add_module_garbage_module() +TEST_CASE("common_add_module: already loaded") { - auto file = "this is clearly not an ELF file!!!"; + binaries_info info{&g_file, g_filenames_success, false}; - this->expect_true(common_add_module(file, strlen(file)) == BFELF_ERROR_INVALID_ARG); -} + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); + } -void -driver_entry_ut::test_common_add_module_add_when_already_loaded() -{ - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(common_vmm_status() == VMM_LOADED); - this->expect_true(common_add_module(m_dummy_get_drr_success.get(), m_dummy_get_drr_success_length) == BF_ERROR_VMM_INVALID_STATE); - this->expect_true(common_fini() == BF_SUCCESS); + CHECK(common_load_vmm() == BF_SUCCESS); + CHECK(common_add_module(info.front().file, info.front().file_size) == BF_ERROR_VMM_INVALID_STATE); \ + CHECK(common_fini() == BF_SUCCESS); } -void -driver_entry_ut::test_common_add_module_add_when_already_running() +TEST_CASE("common_add_module: already running") { - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(common_start_vmm() == BF_SUCCESS); - this->expect_true(common_vmm_status() == VMM_RUNNING); - this->expect_true(common_add_module(m_dummy_get_drr_success.get(), m_dummy_get_drr_success_length) == BF_ERROR_VMM_INVALID_STATE); - this->expect_true(common_fini() == BF_SUCCESS); -} + binaries_info info{&g_file, g_filenames_success, false}; -void -driver_entry_ut::test_common_add_module_add_when_corrupt() -{ - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_failure.get(), m_dummy_stop_vmm_failure_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(common_start_vmm() == BF_SUCCESS); - this->expect_true(common_fini() == BF_ERROR_VMM_CORRUPTED); - this->expect_true(common_vmm_status() == VMM_CORRUPT); - this->expect_true(common_add_module(m_dummy_get_drr_success.get(), m_dummy_get_drr_success_length) == BF_ERROR_VMM_CORRUPTED); + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); + } - common_reset(); + CHECK(common_load_vmm() == BF_SUCCESS); + CHECK(common_start_vmm() == BF_SUCCESS); + CHECK(common_add_module(info.front().file, info.front().file_size) == BF_ERROR_VMM_INVALID_STATE); + CHECK(common_fini() == BF_SUCCESS); } -void -driver_entry_ut::test_common_add_module_add_too_many() +TEST_CASE("common_add_module: corrupt") { - for (auto i = 0U; i < MAX_NUM_MODULES; i++) { - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - } + binaries_info info{&g_file, g_filenames_vmm_fini_fails, false}; - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_ERROR_MAX_MODULES_REACHED); - this->expect_true(common_fini() == BF_SUCCESS); -} + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); + } -void -driver_entry_ut::test_common_add_module_platform_alloc_fails() -{ - MockRepository mocks; - mocks.ExpectCallFunc(platform_alloc_rwe).Return(nullptr); + CHECK(common_load_vmm() == BF_SUCCESS); + CHECK(common_start_vmm() == BF_SUCCESS); + CHECK(common_fini() == BF_ERROR_VMM_CORRUPTED); + CHECK(common_add_module(info.front().file, info.front().file_size) == BF_ERROR_VMM_CORRUPTED); - RUN_UNITTEST_WITH_MOCKS(mocks, [&] { - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_ERROR_OUT_OF_MEMORY); - }); + common_reset(); } -void -driver_entry_ut::test_common_add_module_load_elf_fails() +TEST_CASE("common_add_module: too many modules") { - MockRepository mocks; - mocks.ExpectCallFunc(load_elf_file).Return(-1); + binaries_info info{&g_file, g_filenames_success, false}; + + for (auto i = 0; i < MAX_NUM_MODULES; i++) { + CHECK(common_add_module(info.back().file, info.back().file_size) == BF_SUCCESS); + } - RUN_UNITTEST_WITH_MOCKS(mocks, [&] { - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == -1); - }); + CHECK(common_add_module(info.front().file, info.front().file_size) == BF_ERROR_MAX_MODULES_REACHED); + REQUIRE(common_fini() == BF_SUCCESS); } diff --git a/bfdriver/tests/test_common_dump.cpp b/bfdriver/tests/test_common_dump.cpp index 2a9f735eb..6b5237c4f 100644 --- a/bfdriver/tests/test_common_dump.cpp +++ b/bfdriver/tests/test_common_dump.cpp @@ -19,97 +19,48 @@ // License along with this library; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -#include +#include + +#include +#include -#include #include -#include -#include +#include debug_ring_resources_t *g_drr; -void -driver_entry_ut::test_common_dump_invalid_drr() +TEST_CASE("common_add_module: invalid drr") { - this->expect_true(common_dump_vmm(nullptr, 0) == BF_ERROR_INVALID_ARG); + CHECK(common_dump_vmm(nullptr, 0) == BF_ERROR_INVALID_ARG); } -void -driver_entry_ut::test_common_dump_invalid_vcpuid() +TEST_CASE("common_add_module: unloaded") { - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_failure.get(), m_dummy_stop_vmm_failure_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_get_drr_success.get(), m_dummy_get_drr_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(common_dump_vmm(&g_drr, 100000) == BF_SUCCESS); - this->expect_true(common_fini() == BF_SUCCESS); + CHECK(common_dump_vmm(&g_drr, 0) == BF_ERROR_VMM_INVALID_STATE); } -void -driver_entry_ut::test_common_dump_dump_when_unloaded() +TEST_CASE("common_add_module: get drr fails") { - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_get_drr_success.get(), m_dummy_get_drr_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_dump_vmm(&g_drr, 0) == BF_ERROR_VMM_INVALID_STATE); - this->expect_true(common_fini() == BF_SUCCESS); -} + binaries_info info{&g_file, g_filenames_get_drr_fails, false}; -void -driver_entry_ut::test_common_dump_dump_when_corrupt() -{ - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_failure.get(), m_dummy_stop_vmm_failure_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_get_drr_success.get(), m_dummy_get_drr_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(common_start_vmm() == BF_SUCCESS); - this->expect_true(common_stop_vmm() == ENTRY_ERROR_VMM_STOP_FAILED); - this->expect_true(common_dump_vmm(&g_drr, 0) == BF_SUCCESS); - this->expect_true(common_fini() == BF_ERROR_VMM_CORRUPTED); + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); + } - common_reset(); + CHECK(common_load_vmm() == BF_SUCCESS); + CHECK(common_dump_vmm(&g_drr, 0) == ENTRY_ERROR_UNKNOWN); + CHECK(common_fini() == BF_SUCCESS); } -void -driver_entry_ut::test_common_dump_dump_when_loaded() +TEST_CASE("common_add_module: success") { - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_get_drr_success.get(), m_dummy_get_drr_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(common_dump_vmm(&g_drr, 0) == BF_SUCCESS); - this->expect_true(common_fini() == BF_SUCCESS); -} + binaries_info info{&g_file, g_filenames_success, false}; -void -driver_entry_ut::test_common_dump_get_drr_missing() -{ - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(common_dump_vmm(&g_drr, 0) == BFELF_ERROR_NO_SUCH_SYMBOL); - this->expect_true(common_fini() == BF_SUCCESS); -} + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); + } -void -driver_entry_ut::test_common_dump_get_drr_failure() -{ - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_get_drr_failure.get(), m_dummy_get_drr_failure_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(common_dump_vmm(&g_drr, 0) == GET_DRR_FAILURE); - this->expect_true(common_fini() == BF_SUCCESS); + CHECK(common_load_vmm() == BF_SUCCESS); + CHECK(common_dump_vmm(&g_drr, 0) == BF_SUCCESS); + CHECK(common_fini() == BF_SUCCESS); } diff --git a/bfdriver/tests/test_common_fini.cpp b/bfdriver/tests/test_common_fini.cpp index 57093dbf2..12c5996f2 100644 --- a/bfdriver/tests/test_common_fini.cpp +++ b/bfdriver/tests/test_common_fini.cpp @@ -19,160 +19,93 @@ // License along with this library; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -#include +#include +#include -#include #include -#include -#include +#include -void -driver_entry_ut::test_common_fini_unloaded() +TEST_CASE("common_fini: unloaded") { - this->expect_true(common_fini() == BF_SUCCESS); - this->expect_true(common_fini() == BF_SUCCESS); - this->expect_true(common_fini() == BF_SUCCESS); + CHECK(common_fini() == BF_SUCCESS); + CHECK(common_fini() == BF_SUCCESS); + CHECK(common_fini() == BF_SUCCESS); } -void -driver_entry_ut::test_common_fini_successful_start() +TEST_CASE("common_fini: add module") { - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(common_start_vmm() == BF_SUCCESS); - this->expect_true(common_fini() == BF_SUCCESS); - this->expect_true(common_vmm_status() == VMM_UNLOADED); -} + binaries_info info{&g_file, g_filenames_success, false}; -void -driver_entry_ut::test_common_fini_successful_load() -{ - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(common_fini() == BF_SUCCESS); - this->expect_true(common_vmm_status() == VMM_UNLOADED); -} + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); + } -void -driver_entry_ut::test_common_fini_successful_add_module() -{ - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_fini() == BF_SUCCESS); - this->expect_true(common_vmm_status() == VMM_UNLOADED); + CHECK(common_fini() == BF_SUCCESS); } -void -driver_entry_ut::test_common_fini_corrupted() +TEST_CASE("common_fini: load") { - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_failure.get(), m_dummy_stop_vmm_failure_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(common_start_vmm() == BF_SUCCESS); - this->expect_true(common_fini() == BF_ERROR_VMM_CORRUPTED); - this->expect_true(common_vmm_status() == VMM_CORRUPT); + binaries_info info{&g_file, g_filenames_success, false}; - common_reset(); -} + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); + } -void -driver_entry_ut::test_common_fini_failed_load() -{ - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BFELF_ERROR_NO_SUCH_SYMBOL); - this->expect_true(common_fini() == BF_SUCCESS); - this->expect_true(common_vmm_status() == VMM_UNLOADED); + CHECK(common_load_vmm() == BF_SUCCESS); + CHECK(common_fini() == BF_SUCCESS); } -void -driver_entry_ut::test_common_fini_failed_start() +TEST_CASE("common_fini: start") { - this->expect_true(common_add_module(m_dummy_start_vmm_failure.get(), m_dummy_start_vmm_failure_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(common_start_vmm() == ENTRY_ERROR_VMM_START_FAILED); - this->expect_true(common_fini() == BF_SUCCESS); - this->expect_true(common_vmm_status() == VMM_UNLOADED); + binaries_info info{&g_file, g_filenames_success, false}; + + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); + } + + CHECK(common_load_vmm() == BF_SUCCESS); + CHECK(common_start_vmm() == BF_SUCCESS); + CHECK(common_fini() == BF_SUCCESS); } -void -driver_entry_ut::test_common_fini_unload_failed() +TEST_CASE("common_fini: corrupt") { - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - - { - MockRepository mocks; - mocks.ExpectCallFunc(common_unload_vmm).Return(-1); - - RUN_UNITTEST_WITH_MOCKS(mocks, [&] { - this->expect_true(common_fini() == BF_SUCCESS); - }); + binaries_info info{&g_file, g_filenames_vmm_fini_fails, false}; + + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); } - this->expect_true(common_fini() == BF_SUCCESS); - this->expect_true(common_vmm_status() == VMM_UNLOADED); + CHECK(common_load_vmm() == BF_SUCCESS); + CHECK(common_start_vmm() == BF_SUCCESS); + CHECK(common_fini() == BF_ERROR_VMM_CORRUPTED); + + common_reset(); } -void -driver_entry_ut::test_common_fini_stop_failed() +TEST_CASE("common_fini: unload fails") { - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(common_start_vmm() == BF_SUCCESS); - - { - MockRepository mocks; - mocks.ExpectCallFunc(common_stop_vmm).Return(-1); - - RUN_UNITTEST_WITH_MOCKS(mocks, [&] { - this->expect_true(common_fini() == BF_SUCCESS); - }); + binaries_info info{&g_file, g_filenames_fini_fails, false}; + + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); } - this->expect_true(common_fini() == BF_SUCCESS); - this->expect_true(common_vmm_status() == VMM_UNLOADED); + CHECK(common_load_vmm() == BF_SUCCESS); + CHECK(common_fini() == BF_ERROR_VMM_CORRUPTED); + + common_reset(); } -void -driver_entry_ut::test_common_fini_reset_failed() +TEST_CASE("common_fini: stop fails") { - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(common_start_vmm() == BF_SUCCESS); - - { - MockRepository mocks; - mocks.ExpectCallFunc(common_reset).Return(-1); - mocks.ExpectCallFunc(common_reset).Return(-1); - - RUN_UNITTEST_WITH_MOCKS(mocks, [&] { - this->expect_true(common_fini() == BF_SUCCESS); - }); + binaries_info info{&g_file, g_filenames_vmm_fini_fails, false}; + + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); } - this->expect_true(common_fini() == BF_SUCCESS); - this->expect_true(common_vmm_status() == VMM_UNLOADED); + CHECK(common_load_vmm() == BF_SUCCESS); + CHECK(common_start_vmm() == BF_SUCCESS); + CHECK(common_fini() == BF_ERROR_VMM_CORRUPTED); } diff --git a/bfdriver/tests/test_common_init.cpp b/bfdriver/tests/test_common_init.cpp index a9ec51f25..62cd85e64 100644 --- a/bfdriver/tests/test_common_init.cpp +++ b/bfdriver/tests/test_common_init.cpp @@ -19,11 +19,13 @@ // License along with this library; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -#include +#include +#include + #include +#include -void -driver_entry_ut::test_common_init() +TEST_CASE("run init") { - this->expect_true(common_init() == BF_SUCCESS); + common_init(); } diff --git a/bfdriver/tests/test_common_load.cpp b/bfdriver/tests/test_common_load.cpp index 2c2fb9452..e1b5dddf7 100644 --- a/bfdriver/tests/test_common_load.cpp +++ b/bfdriver/tests/test_common_load.cpp @@ -19,227 +19,162 @@ // License along with this library; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -#include +#include +#include -#include +#include -#include #include -#include -#include +#include -// ----------------------------------------------------------------------------- -// Expose Private Functions -// ----------------------------------------------------------------------------- +#ifdef _HIPPOMOCKS__ENABLE_CFUNC_MOCKING_SUPPORT -extern "C" +TEST_CASE("common_load_vmm: success") { - struct module_t *get_module(uint64_t index); - int64_t resolve_symbol(const char *name, void **sym); - int64_t execute_symbol(const char *sym, uint64_t arg1, uint64_t arg2, uint64_t cpuid); - int64_t add_raw_md_to_memory_manager(uint64_t virt, uint64_t type); - int64_t add_md_to_memory_manager(struct module_t *module); -} - -extern uint64_t g_malloc_fails; + binaries_info info{&g_file, g_filenames_success, false}; -// ----------------------------------------------------------------------------- -// Tests -// ----------------------------------------------------------------------------- + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); + } -void -driver_entry_ut::test_common_load_successful_load() -{ - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(common_vmm_status() == VMM_LOADED); - this->expect_true(common_fini() == BF_SUCCESS); - this->expect_true(common_vmm_status() == VMM_UNLOADED); + CHECK(common_load_vmm() == BF_SUCCESS); + CHECK(common_fini() == BF_SUCCESS); } -void -driver_entry_ut::test_common_load_load_when_already_loaded() +TEST_CASE("common_load_vmm: already loaded") { - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(common_vmm_status() == VMM_LOADED); - this->expect_true(common_fini() == BF_SUCCESS); - this->expect_true(common_vmm_status() == VMM_UNLOADED); + binaries_info info{&g_file, g_filenames_success, false}; + + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); + } + + CHECK(common_load_vmm() == BF_SUCCESS); + CHECK(common_load_vmm() == BF_SUCCESS); + CHECK(common_fini() == BF_SUCCESS); } -void -driver_entry_ut::test_common_load_load_when_already_running() +TEST_CASE("common_load_vmm: already running") { - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(common_start_vmm() == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_ERROR_VMM_INVALID_STATE); - this->expect_true(common_vmm_status() == VMM_RUNNING); - this->expect_true(common_fini() == BF_SUCCESS); - this->expect_true(common_vmm_status() == VMM_UNLOADED); + binaries_info info{&g_file, g_filenames_success, false}; + + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); + } + + CHECK(common_load_vmm() == BF_SUCCESS); + CHECK(common_start_vmm() == BF_SUCCESS); + CHECK(common_load_vmm() == BF_ERROR_VMM_INVALID_STATE); + CHECK(common_fini() == BF_SUCCESS); } -void -driver_entry_ut::test_common_load_load_when_corrupt() +TEST_CASE("common_load_vmm: corrupt") { - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_failure.get(), m_dummy_stop_vmm_failure_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(common_start_vmm() == BF_SUCCESS); - this->expect_true(common_fini() == BF_ERROR_VMM_CORRUPTED); - this->expect_true(common_vmm_status() == VMM_CORRUPT); - this->expect_true(common_load_vmm() == BF_ERROR_VMM_CORRUPTED); + binaries_info info{&g_file, g_filenames_vmm_fini_fails, false}; + + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); + } + + CHECK(common_load_vmm() == BF_SUCCESS); + CHECK(common_start_vmm() == BF_SUCCESS); + CHECK(common_fini() == BF_ERROR_VMM_CORRUPTED); + CHECK(common_load_vmm() == BF_ERROR_VMM_CORRUPTED); common_reset(); } -void -driver_entry_ut::test_common_load_fail_due_to_relocation_error() +TEST_CASE("common_load_vmm: alloc stack fails") { - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BFELF_ERROR_NO_SUCH_SYMBOL); - this->expect_true(common_vmm_status() == VMM_UNLOADED); - this->expect_true(common_fini() == BF_SUCCESS); - this->expect_true(common_vmm_status() == VMM_UNLOADED); -} + binaries_info info{&g_file, g_filenames_success, false}; -void -driver_entry_ut::test_common_load_fail_due_to_no_modules_added() -{ - this->expect_true(common_load_vmm() == BF_ERROR_NO_MODULES_ADDED); - this->expect_true(common_vmm_status() == VMM_UNLOADED); - this->expect_true(common_fini() == BF_SUCCESS); - this->expect_true(common_vmm_status() == VMM_UNLOADED); -} + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); + } -void -driver_entry_ut::test_common_load_add_md_failed() -{ - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_failure.get(), m_dummy_add_md_failure_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == MEMORY_MANAGER_FAILURE); - this->expect_true(common_fini() == BF_SUCCESS); + MockRepository mocks; + mocks.ExpectCallFunc(platform_alloc_rw).Return(nullptr); + + CHECK(common_load_vmm() == BF_ERROR_OUT_OF_MEMORY); + CHECK(common_fini() == BF_SUCCESS); } -void -driver_entry_ut::test_common_load_add_md_tls_failed() +TEST_CASE("common_load_vmm: alloc tss fails") { - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - - { - MockRepository mocks; - mocks.OnCallFunc(add_md_to_memory_manager).Return(0); - mocks.ExpectCallFunc(add_raw_md_to_memory_manager).Return(-1); - - RUN_UNITTEST_WITH_MOCKS(mocks, [&] { - this->expect_true(common_load_vmm() == -1); - }); + binaries_info info{&g_file, g_filenames_success, false}; + + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); } - this->expect_true(common_fini() == BF_SUCCESS); + MockRepository mocks; + mocks.ExpectCallFunc(platform_alloc_rw).Do(malloc); + mocks.ExpectCallFunc(platform_alloc_rw).Return(nullptr); + + CHECK(common_load_vmm() == BF_ERROR_OUT_OF_MEMORY); + CHECK(common_fini() == BF_SUCCESS); } -void -driver_entry_ut::test_common_load_tls_platform_alloc_failed() +TEST_CASE("common_load_vmm: missing symbols") { - g_malloc_fails = THREAD_LOCAL_STORAGE_SIZE; + auto filenames = g_filenames_success; + filenames.pop_back(); + + binaries_info info{&g_file, filenames, false}; - auto ___ = gsl::finally([&] - { g_malloc_fails = 0; }); + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); + } - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_ERROR_OUT_OF_MEMORY); - this->expect_true(common_fini() == BF_SUCCESS); + CHECK(common_load_vmm() == BFELF_ERROR_NO_SUCH_SYMBOL); + CHECK(common_fini() == BF_SUCCESS); } -void -driver_entry_ut::test_common_load_stack_platform_alloc_failed() +TEST_CASE("common_load_vmm: no modules added") { - g_malloc_fails = STACK_SIZE * 2; - - auto ___ = gsl::finally([&] - { g_malloc_fails = 0; }); - - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_ERROR_OUT_OF_MEMORY); - this->expect_true(common_fini() == BF_SUCCESS); + CHECK(common_load_vmm() == BF_ERROR_NO_MODULES_ADDED); + CHECK(common_fini() == BF_SUCCESS); } -void -driver_entry_ut::test_common_load_loader_add_failed() +TEST_CASE("common_load_vmm: init fails") { - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); + binaries_info info{&g_file, g_filenames_init_fails, false}; - auto module = get_module(0); - module->file.added = 1; + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); + } - this->expect_true(common_load_vmm() == BFELF_ERROR_INVALID_ARG); - this->expect_true(common_fini() == BF_SUCCESS); + CHECK(common_load_vmm() == ENTRY_ERROR_UNKNOWN); + CHECK(common_fini() == BF_SUCCESS); } -void -driver_entry_ut::test_common_load_resolve_symbol_failed() +TEST_CASE("common_load_vmm: add modules mdl fails") { - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - - { - MockRepository mocks; - mocks.ExpectCallFunc(resolve_symbol).Return(-1); - - RUN_UNITTEST_WITH_MOCKS(mocks, [&] { - this->expect_true(common_load_vmm() == -1); - }); + binaries_info info{&g_file, g_filenames_add_mdl_fails, false}; + + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); } - this->expect_true(common_fini() == BF_SUCCESS); + CHECK(common_load_vmm() == ENTRY_ERROR_UNKNOWN); + CHECK(common_fini() == BF_SUCCESS); } -void -driver_entry_ut::test_common_load_execute_symbol_failed() +extern "C" int64_t add_modules_mdl(void); + +TEST_CASE("common_load_vmm: add tss mdl fails") { - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - - { - MockRepository mocks; - mocks.ExpectCallFunc(execute_symbol).Return(-1); - - RUN_UNITTEST_WITH_MOCKS(mocks, [&] { - this->expect_true(common_load_vmm() == -1); - }); + binaries_info info{&g_file, g_filenames_add_mdl_fails, false}; + + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); } - this->expect_true(common_fini() == BF_SUCCESS); + MockRepository mocks; + mocks.OnCallFunc(add_modules_mdl).Return(BF_SUCCESS); + + CHECK(common_load_vmm() == ENTRY_ERROR_UNKNOWN); + CHECK(common_fini() == BF_SUCCESS); } + +#endif diff --git a/bfdriver/tests/test_common_start.cpp b/bfdriver/tests/test_common_start.cpp index f4d8f1eec..c4f4af242 100644 --- a/bfdriver/tests/test_common_start.cpp +++ b/bfdriver/tests/test_common_start.cpp @@ -19,116 +19,114 @@ // License along with this library; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -#include +#include +#include + +#include -#include #include -#include -#include +#include + +#ifdef _HIPPOMOCKS__ENABLE_CFUNC_MOCKING_SUPPORT -void -driver_entry_ut::test_common_start_start_when_unloaded() +TEST_CASE("common_start_vmm: success") { - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_start_vmm() == BF_ERROR_VMM_INVALID_STATE); - this->expect_true(common_fini() == BF_SUCCESS); + binaries_info info{&g_file, g_filenames_success, false}; + + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); + } + + CHECK(common_load_vmm() == BF_SUCCESS); + CHECK(common_start_vmm() == BF_SUCCESS); + CHECK(common_fini() == BF_SUCCESS); } -void -driver_entry_ut::test_common_start_start_when_already_running() +TEST_CASE("common_start_vmm: unloaded") { - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(common_start_vmm() == BF_SUCCESS); - this->expect_true(common_start_vmm() == BF_SUCCESS); - this->expect_true(common_fini() == BF_SUCCESS); + binaries_info info{&g_file, g_filenames_success, false}; + + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); + } + + CHECK(common_start_vmm() == BF_ERROR_VMM_INVALID_STATE); + CHECK(common_fini() == BF_SUCCESS); } -void -driver_entry_ut::test_common_start_start_when_corrupt() +TEST_CASE("common_start_vmm: already running") { - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_failure.get(), m_dummy_stop_vmm_failure_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(common_start_vmm() == BF_SUCCESS); - this->expect_true(common_stop_vmm() == ENTRY_ERROR_VMM_STOP_FAILED); - this->expect_true(common_start_vmm() == BF_ERROR_VMM_CORRUPTED); - this->expect_true(common_vmm_status() == VMM_CORRUPT); + binaries_info info{&g_file, g_filenames_success, false}; - common_reset(); + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); + } + + CHECK(common_load_vmm() == BF_SUCCESS); + CHECK(common_start_vmm() == BF_SUCCESS); + CHECK(common_start_vmm() == BF_SUCCESS); + CHECK(common_fini() == BF_SUCCESS); } -void -driver_entry_ut::test_common_start_start_when_start_vmm_missing() +TEST_CASE("common_start_vmm: corrupt") { - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(common_start_vmm() == BFELF_ERROR_NO_SUCH_SYMBOL); - this->expect_true(common_fini() == BF_SUCCESS); + binaries_info info{&g_file, g_filenames_vmm_fini_fails, false}; + + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); + } + + CHECK(common_load_vmm() == BF_SUCCESS); + CHECK(common_start_vmm() == BF_SUCCESS); + CHECK(common_fini() == BF_ERROR_VMM_CORRUPTED); + CHECK(common_start_vmm() == BF_ERROR_VMM_CORRUPTED); + + common_reset(); } -void -driver_entry_ut::test_common_start_start_vmm_failure() +TEST_CASE("common_start_vmm: start fails") { - this->expect_true(common_add_module(m_dummy_start_vmm_failure.get(), m_dummy_start_vmm_failure_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(common_start_vmm() == ENTRY_ERROR_VMM_START_FAILED); - this->expect_true(common_fini() == BF_SUCCESS); + binaries_info info{&g_file, g_filenames_vmm_init_fails, false}; + + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); + } + + CHECK(common_load_vmm() == BF_SUCCESS); + CHECK(common_start_vmm() == ENTRY_ERROR_UNKNOWN); + CHECK(common_fini() == BF_SUCCESS); } -void -driver_entry_ut::test_common_start_set_affinity_failed() +TEST_CASE("common_start_vmm: set affinity fails") { - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - - { - MockRepository mocks; - mocks.ExpectCallFunc(platform_set_affinity).Return(-1); - - RUN_UNITTEST_WITH_MOCKS(mocks, [&] { - this->expect_true(common_start_vmm() == -1); - }); + binaries_info info{&g_file, g_filenames_success, false}; + + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); } - this->expect_true(common_fini() == BF_SUCCESS); + MockRepository mocks; + mocks.OnCallFunc(platform_set_affinity).Return(BF_ERROR_UNKNOWN); + + CHECK(common_load_vmm() == BF_SUCCESS); + CHECK(common_start_vmm() == BF_ERROR_UNKNOWN); + CHECK(common_fini() == BF_SUCCESS); } -void -driver_entry_ut::test_common_start_vmcall_failed() +TEST_CASE("common_start_vmm: vmcall fails") { - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - - { - MockRepository mocks; - mocks.ExpectCallFunc(platform_vmcall).Do([](auto regs) { - regs->r01 = 1; - }); - - RUN_UNITTEST_WITH_MOCKS(mocks, [&] { - this->expect_true(common_start_vmm() == ENTRY_ERROR_VMM_START_FAILED); - }); + binaries_info info{&g_file, g_filenames_success, false}; + + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); } - this->expect_true(common_fini() == BF_SUCCESS); + MockRepository mocks; + mocks.OnCallFunc(vmcall); + + CHECK(common_load_vmm() == BF_SUCCESS); + CHECK(common_start_vmm() == ENTRY_ERROR_VMM_START_FAILED); + CHECK(common_fini() == BF_SUCCESS); } + +#endif diff --git a/bfdriver/tests/test_common_stop.cpp b/bfdriver/tests/test_common_stop.cpp index f2068f081..bc8752e7a 100644 --- a/bfdriver/tests/test_common_stop.cpp +++ b/bfdriver/tests/test_common_stop.cpp @@ -19,136 +19,140 @@ // License along with this library; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -#include +#include +#include + +#include -#include #include -#include +#include + +#ifdef _HIPPOMOCKS__ENABLE_CFUNC_MOCKING_SUPPORT -void -driver_entry_ut::test_common_stop_stop_when_unloaded() +TEST_CASE("common_stop_vmm: success") { - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_stop_vmm() == BF_ERROR_VMM_INVALID_STATE); - this->expect_true(common_fini() == BF_SUCCESS); + binaries_info info{&g_file, g_filenames_success, false}; + + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); + } + + CHECK(common_load_vmm() == BF_SUCCESS); + CHECK(common_start_vmm() == BF_SUCCESS); + CHECK(common_stop_vmm() == BF_SUCCESS); + CHECK(common_fini() == BF_SUCCESS); } -void -driver_entry_ut::test_common_stop_stop_when_not_running() +TEST_CASE("common_stop_vmm: unloaded") { - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(common_stop_vmm() == BF_SUCCESS); - this->expect_true(common_fini() == BF_SUCCESS); + binaries_info info{&g_file, g_filenames_success, false}; + + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); + } + + CHECK(common_stop_vmm() == BF_ERROR_VMM_INVALID_STATE); + CHECK(common_fini() == BF_SUCCESS); } -void -driver_entry_ut::test_common_stop_stop_when_alread_stopped() +TEST_CASE("common_stop_vmm: not running") { - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(common_start_vmm() == BF_SUCCESS); - this->expect_true(common_stop_vmm() == BF_SUCCESS); - this->expect_true(common_stop_vmm() == BF_SUCCESS); - this->expect_true(common_fini() == BF_SUCCESS); + binaries_info info{&g_file, g_filenames_success, false}; + + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); + } + + CHECK(common_load_vmm() == BF_SUCCESS); + CHECK(common_stop_vmm() == BF_SUCCESS); + CHECK(common_fini() == BF_SUCCESS); } -void -driver_entry_ut::test_common_stop_stop_when_corrupt() +TEST_CASE("common_stop_vmm: already stopped") { - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_failure.get(), m_dummy_stop_vmm_failure_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(common_start_vmm() == BF_SUCCESS); - this->expect_true(common_stop_vmm() == ENTRY_ERROR_VMM_STOP_FAILED); - this->expect_true(common_stop_vmm() == BF_ERROR_VMM_CORRUPTED); - this->expect_true(common_fini() == BF_ERROR_VMM_CORRUPTED); + binaries_info info{&g_file, g_filenames_success, false}; - common_reset(); + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); + } + + CHECK(common_load_vmm() == BF_SUCCESS); + CHECK(common_start_vmm() == BF_SUCCESS); + CHECK(common_stop_vmm() == BF_SUCCESS); + CHECK(common_stop_vmm() == BF_SUCCESS); + CHECK(common_fini() == BF_SUCCESS); } -void -driver_entry_ut::test_common_stop_stop_vmm_missing() +TEST_CASE("common_stop_vmm: corrupt") { - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(common_start_vmm() == BF_SUCCESS); - this->expect_true(common_stop_vmm() == BFELF_ERROR_NO_SUCH_SYMBOL); - this->expect_true(common_fini() == BF_ERROR_VMM_CORRUPTED); + binaries_info info{&g_file, g_filenames_vmm_fini_fails, false}; + + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); + } + + CHECK(common_load_vmm() == BF_SUCCESS); + CHECK(common_start_vmm() == BF_SUCCESS); + CHECK(common_fini() == BF_ERROR_VMM_CORRUPTED); + CHECK(common_stop_vmm() == BF_ERROR_VMM_CORRUPTED); common_reset(); } -void -driver_entry_ut::test_common_stop_stop_vmm_failure() +TEST_CASE("common_start_vmm: stop fails") { - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_failure.get(), m_dummy_stop_vmm_failure_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(common_start_vmm() == BF_SUCCESS); - this->expect_true(common_stop_vmm() == ENTRY_ERROR_VMM_STOP_FAILED); - this->expect_true(common_fini() == BF_ERROR_VMM_CORRUPTED); + binaries_info info{&g_file, g_filenames_vmm_fini_fails, false}; + + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); + } + + CHECK(common_load_vmm() == BF_SUCCESS); + CHECK(common_start_vmm() == BF_SUCCESS); + CHECK(common_stop_vmm() == ENTRY_ERROR_UNKNOWN); + CHECK(common_fini() == BF_ERROR_VMM_CORRUPTED); common_reset(); } -void -driver_entry_ut::test_common_stop_set_affinity_failed() +TEST_CASE("common_stop_vmm: set affinity fails") { - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(common_start_vmm() == BF_SUCCESS); - - { - MockRepository mocks; - mocks.ExpectCallFunc(platform_set_affinity).Return(-1); - - RUN_UNITTEST_WITH_MOCKS(mocks, [&] { - this->expect_true(common_stop_vmm() == -1); - }); + binaries_info info{&g_file, g_filenames_success, false}; + + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); } + CHECK(common_load_vmm() == BF_SUCCESS); + CHECK(common_start_vmm() == BF_SUCCESS); + + MockRepository mocks; + mocks.OnCallFunc(platform_set_affinity).Return(BF_ERROR_UNKNOWN); + + CHECK(common_stop_vmm() == BF_ERROR_UNKNOWN); + CHECK(common_fini() == BF_ERROR_VMM_CORRUPTED); + common_reset(); } -void -driver_entry_ut::test_common_stop_vmcall_failed() +TEST_CASE("common_stop_vmm: vmcall fails") { - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(common_start_vmm() == BF_SUCCESS); - - { - MockRepository mocks; - mocks.ExpectCallFunc(platform_vmcall).Do([](auto regs) { - regs->r01 = 1; - }); - - RUN_UNITTEST_WITH_MOCKS(mocks, [&] { - this->expect_true(common_stop_vmm() == ENTRY_ERROR_VMM_STOP_FAILED); - }); + binaries_info info{&g_file, g_filenames_success, false}; + + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); } + CHECK(common_load_vmm() == BF_SUCCESS); + CHECK(common_start_vmm() == BF_SUCCESS); + + MockRepository mocks; + mocks.OnCallFunc(vmcall); + + CHECK(common_stop_vmm() == ENTRY_ERROR_VMM_STOP_FAILED); + CHECK(common_fini() == BF_ERROR_VMM_CORRUPTED); + common_reset(); } + +#endif diff --git a/bfdriver/tests/test_common_unload.cpp b/bfdriver/tests/test_common_unload.cpp index 02df737a8..6b5dde1e3 100644 --- a/bfdriver/tests/test_common_unload.cpp +++ b/bfdriver/tests/test_common_unload.cpp @@ -19,77 +19,102 @@ // License along with this library; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -#include +#include +#include + +#include #include -#include -#include +#include -// ----------------------------------------------------------------------------- -// Expose Private Functions -// ----------------------------------------------------------------------------- +#ifdef _HIPPOMOCKS__ENABLE_CFUNC_MOCKING_SUPPORT -extern "C" +TEST_CASE("common_unload_vmm: success") { - int64_t execute_symbol(const char *sym, uint64_t arg1, uint64_t arg2, uint64_t cpuid); + binaries_info info{&g_file, g_filenames_success, false}; + + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); + } + + CHECK(common_load_vmm() == BF_SUCCESS); + CHECK(common_start_vmm() == BF_SUCCESS); + CHECK(common_stop_vmm() == BF_SUCCESS); + CHECK(common_unload_vmm() == BF_SUCCESS); + CHECK(common_fini() == BF_SUCCESS); } -// ----------------------------------------------------------------------------- -// Tests -// ----------------------------------------------------------------------------- +TEST_CASE("common_unload_vmm: already unloaded") +{ + binaries_info info{&g_file, g_filenames_success, false}; -void -driver_entry_ut::test_common_unload_unload_when_already_unloaded() + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); + } + + CHECK(common_unload_vmm() == BF_SUCCESS); + CHECK(common_unload_vmm() == BF_SUCCESS); + CHECK(common_fini() == BF_SUCCESS); +} + +TEST_CASE("common_unload_vmm: loaded") { - this->expect_true(common_unload_vmm() == BF_SUCCESS); + binaries_info info{&g_file, g_filenames_success, false}; + + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); + } + + CHECK(common_load_vmm() == BF_SUCCESS); + CHECK(common_unload_vmm() == BF_SUCCESS); + CHECK(common_fini() == BF_SUCCESS); } -void -driver_entry_ut::test_common_unload_unload_when_running() +TEST_CASE("common_unload_vmm: running") { - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(common_start_vmm() == BF_SUCCESS); - this->expect_true(common_unload_vmm() == BF_ERROR_VMM_INVALID_STATE); - this->expect_true(common_fini() == BF_SUCCESS); + binaries_info info{&g_file, g_filenames_success, false}; + + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); + } + + CHECK(common_load_vmm() == BF_SUCCESS); + CHECK(common_start_vmm() == BF_SUCCESS); + CHECK(common_unload_vmm() == BF_ERROR_VMM_INVALID_STATE); + CHECK(common_fini() == BF_SUCCESS); } -void -driver_entry_ut::test_common_unload_unload_when_corrupt() +TEST_CASE("common_unload_vmm: corrupt") { - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_failure.get(), m_dummy_stop_vmm_failure_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(common_start_vmm() == BF_SUCCESS); - this->expect_true(common_fini() == BF_ERROR_VMM_CORRUPTED); - this->expect_true(common_vmm_status() == VMM_CORRUPT); - this->expect_true(common_unload_vmm() == BF_ERROR_VMM_CORRUPTED); + binaries_info info{&g_file, g_filenames_vmm_fini_fails, false}; + + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); + } + + CHECK(common_load_vmm() == BF_SUCCESS); + CHECK(common_start_vmm() == BF_SUCCESS); + CHECK(common_fini() == BF_ERROR_VMM_CORRUPTED); + CHECK(common_unload_vmm() == BF_ERROR_VMM_CORRUPTED); common_reset(); } -void -driver_entry_ut::test_common_unload_execute_symbol_failed() +TEST_CASE("common_start_vmm: unload fails") { - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_failure.get(), m_dummy_stop_vmm_failure_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - - { - MockRepository mocks; - mocks.ExpectCallFunc(execute_symbol).Return(-1); - - RUN_UNITTEST_WITH_MOCKS(mocks, [&] { - this->expect_true(common_unload_vmm() == -1); - }); + binaries_info info{&g_file, g_filenames_fini_fails, false}; + + for (const auto &binary : info.binaries()) { + REQUIRE(common_add_module(binary.file, binary.file_size) == BF_SUCCESS); } + CHECK(common_load_vmm() == BF_SUCCESS); + CHECK(common_start_vmm() == BF_SUCCESS); + CHECK(common_stop_vmm() == BF_SUCCESS); + CHECK(common_unload_vmm() == ENTRY_ERROR_UNKNOWN); + CHECK(common_fini() == BF_ERROR_VMM_CORRUPTED); + common_reset(); } + +#endif diff --git a/bfdriver/tests/test_common_vmcall.cpp b/bfdriver/tests/test_common_vmcall.cpp deleted file mode 100644 index 2b7f081dd..000000000 --- a/bfdriver/tests/test_common_vmcall.cpp +++ /dev/null @@ -1,154 +0,0 @@ -// -// Bareflank Hypervisor -// -// Copyright (C) 2015 Assured Information Security, Inc. -// Author: Rian Quinn -// Author: Brendan Kerrigan -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -#include - -#include - -#include -#include - -extern uint64_t g_set_afinity_fails; - -void -driver_entry_ut::test_common_vmcall_invalid_args() -{ - vmcall_registers_t regs{}; - - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(common_start_vmm() == BF_SUCCESS); - - this->expect_true(common_vmcall(nullptr, 0) == BF_ERROR_INVALID_ARG); - this->expect_true(common_vmcall(®s, 10) == BF_ERROR_INVALID_ARG); - - this->expect_true(common_fini() == BF_SUCCESS); -} - -void -driver_entry_ut::test_common_vmcall_set_affinity_failure() -{ - vmcall_registers_t regs{}; - - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(common_start_vmm() == BF_SUCCESS); - - g_set_afinity_fails = 1; - auto ___ = gsl::finally([&] { g_set_afinity_fails = 0; }); - - this->expect_true(common_vmcall(®s, 0) == -1); - - g_set_afinity_fails = 0; - - this->expect_true(common_fini() == BF_SUCCESS); -} - -void -driver_entry_ut::test_common_vmcall_success() -{ - vmcall_registers_t regs{}; - - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(common_start_vmm() == BF_SUCCESS); - - this->expect_true(common_vmcall(®s, 0) == BF_SUCCESS); - this->expect_true(common_vmcall(®s, 0xFFFFFFFFFFFFFFFF) == BF_SUCCESS); - - this->expect_true(common_fini() == BF_SUCCESS); -} - -void -driver_entry_ut::test_common_vmcall_success_event() -{ - vmcall_registers_t regs{}; - regs.r00 = VMCALL_EVENT; - - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(common_start_vmm() == BF_SUCCESS); - - this->expect_true(common_vmcall(®s, 0) == BF_SUCCESS); - this->expect_true(common_vmcall(®s, 0xFFFFFFFFFFFFFFFF) == BF_SUCCESS); - - this->expect_true(common_fini() == BF_SUCCESS); -} - -void -driver_entry_ut::test_common_vmcall_vmcall_when_unloaded() -{ - vmcall_registers_t regs{}; - - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_get_drr_success.get(), m_dummy_get_drr_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_vmcall(®s, 0) == BF_ERROR_VMM_INVALID_STATE); - this->expect_true(common_fini() == BF_SUCCESS); -} - -void -driver_entry_ut::test_common_vmcall_vmcall_when_corrupt() -{ - vmcall_registers_t regs{}; - - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_failure.get(), m_dummy_stop_vmm_failure_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_get_drr_success.get(), m_dummy_get_drr_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(common_start_vmm() == BF_SUCCESS); - this->expect_true(common_stop_vmm() == ENTRY_ERROR_VMM_STOP_FAILED); - this->expect_true(common_vmcall(®s, 0) == BF_ERROR_VMM_CORRUPTED); - this->expect_true(common_fini() == BF_ERROR_VMM_CORRUPTED); - - common_reset(); -} - -void -driver_entry_ut::test_common_vmcall_vmcall_when_loaded() -{ - vmcall_registers_t regs{}; - - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_get_drr_success.get(), m_dummy_get_drr_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(common_vmcall(®s, 0) == BF_ERROR_VMM_INVALID_STATE); - this->expect_true(common_fini() == BF_SUCCESS); -} diff --git a/bfdriver/tests/test_helpers.cpp b/bfdriver/tests/test_helpers.cpp deleted file mode 100644 index 755c7bb31..000000000 --- a/bfdriver/tests/test_helpers.cpp +++ /dev/null @@ -1,179 +0,0 @@ -// -// Bareflank Hypervisor -// -// Copyright (C) 2015 Assured Information Security, Inc. -// Author: Rian Quinn -// Author: Brendan Kerrigan -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -#include - -#include -#include -#include -#include - -// ----------------------------------------------------------------------------- -// Expose Private Functions -// ----------------------------------------------------------------------------- - -extern "C" -{ - struct module_t *get_module(uint64_t index); - int64_t symbol_length(const char *sym); - int64_t resolve_symbol(const char *name, void **sym); - int64_t execute_symbol(const char *sym, uint64_t arg1, uint64_t arg2, uint64_t cpuid); - int64_t add_md_to_memory_manager(struct module_t *module); - int64_t load_elf_file(struct module_t *module); -} - -// ----------------------------------------------------------------------------- -// Tests -// ----------------------------------------------------------------------------- - -void -driver_entry_ut::test_helper_common_vmm_status() -{ - this->expect_true(common_vmm_status() == VMM_UNLOADED); - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(common_vmm_status() == VMM_LOADED); - this->expect_true(common_start_vmm() == BF_SUCCESS); - this->expect_true(common_vmm_status() == VMM_RUNNING); - this->expect_true(common_stop_vmm() == BF_SUCCESS); - this->expect_true(common_vmm_status() == VMM_LOADED); - this->expect_true(common_unload_vmm() == BF_SUCCESS); - this->expect_true(common_vmm_status() == VMM_UNLOADED); -} - -void -driver_entry_ut::test_helper_get_file_invalid_index() -{ - this->expect_true(get_module(10000) == nullptr); -} - -void -driver_entry_ut::test_helper_get_file_success() -{ - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(get_module(0) != nullptr); - this->expect_true(common_fini() == BF_SUCCESS); -} - -void -driver_entry_ut::test_helper_symbol_length_null_symbol() -{ - this->expect_true(symbol_length(nullptr) == 0); -} - -void -driver_entry_ut::test_helper_symbol_length_success() -{ - this->expect_true(symbol_length("hello world") == 11); -} - -void -driver_entry_ut::test_helper_resolve_symbol_invalid_name() -{ - void *sym; - - this->expect_true(resolve_symbol(nullptr, &sym) == BF_ERROR_INVALID_ARG); -} - -void -driver_entry_ut::test_helper_resolve_symbol_invalid_sym() -{ - this->expect_true(resolve_symbol("sym", nullptr) == BF_ERROR_INVALID_ARG); -} - -void -driver_entry_ut::test_helper_resolve_symbol_no_loaded_modules() -{ - void *sym; - - this->expect_true(resolve_symbol("invalid_symbol", &sym) == BF_ERROR_NO_MODULES_ADDED); -} - -void -driver_entry_ut::test_helper_resolve_symbol_missing_symbol() -{ - void *sym; - - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(resolve_symbol("invalid_symbol", &sym) == BFELF_ERROR_NO_SUCH_SYMBOL); - this->expect_true(common_fini() == BF_SUCCESS); -} - -void -driver_entry_ut::test_helper_execute_symbol_invalid_arg() -{ - this->expect_true(execute_symbol(nullptr, 0, 0, 0) == BF_ERROR_INVALID_ARG); -} - -void -driver_entry_ut::test_helper_execute_symbol_missing_symbol() -{ - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(execute_symbol("invalid_symbol", 0, 0, 0) == BFELF_ERROR_NO_SUCH_SYMBOL); - this->expect_true(common_fini() == BF_SUCCESS); -} - -void -driver_entry_ut::test_helper_execute_symbol_sym_failed() -{ - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(execute_symbol("sym_that_returns_failure", 0, 0, 0) == -1); - this->expect_true(common_fini() == BF_SUCCESS); -} - -void -driver_entry_ut::test_helper_execute_symbol_sym_success() -{ - this->expect_true(common_add_module(m_dummy_start_vmm_success.get(), m_dummy_start_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_stop_vmm_success.get(), m_dummy_stop_vmm_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_add_md_success.get(), m_dummy_add_md_success_length) == BF_SUCCESS); - this->expect_true(common_add_module(m_dummy_misc.get(), m_dummy_misc_length) == BF_SUCCESS); - this->expect_true(common_load_vmm() == BF_SUCCESS); - this->expect_true(execute_symbol("sym_that_returns_success", 0, 0, 0) == 0); - this->expect_true(common_fini() == BF_SUCCESS); -} - -void -driver_entry_ut::test_helper_add_md_to_memory_manager_null_module() -{ - this->expect_true(add_md_to_memory_manager(nullptr) == BF_ERROR_INVALID_ARG); -} - -void -driver_entry_ut::test_helper_load_elf_file_null_module() -{ - this->expect_true(load_elf_file(nullptr) == BF_ERROR_INVALID_ARG); -} diff --git a/bfdriver/tests/test_support.cpp b/bfdriver/tests/test_support.cpp new file mode 100644 index 000000000..2e87d26b0 --- /dev/null +++ b/bfdriver/tests/test_support.cpp @@ -0,0 +1,112 @@ +// +// Bareflank Hypervisor +// +// Copyright (C) 2015 Assured Information Security, Inc. +// Author: Rian Quinn +// Author: Brendan Kerrigan +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +#include +#include + +#include +#include + +file g_file; + +std::vector g_filenames_success = { + BAREFLANK_SYSROOT_PATH + "/lib/libdummy_lib1.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libdummy_lib2.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libc.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libc++.so.1.0"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libc++abi.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libpthread.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libbfsyscall.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libbfunwind.so"_s, + BAREFLANK_SYSROOT_PATH + "/bin/dummy_main"_s, +}; + +std::vector g_filenames_init_fails = { + BAREFLANK_SYSROOT_PATH + "/lib/libdummy_lib1.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libdummy_lib2.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libc.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libc++.so.1.0"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libc++abi.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libpthread.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libbfsyscall.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libbfunwind.so"_s, + BAREFLANK_SYSROOT_PATH + "/bin/dummy_main_init_fails"_s, +}; + +std::vector g_filenames_fini_fails = { + BAREFLANK_SYSROOT_PATH + "/lib/libdummy_lib1.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libdummy_lib2.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libc.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libc++.so.1.0"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libc++abi.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libpthread.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libbfsyscall.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libbfunwind.so"_s, + BAREFLANK_SYSROOT_PATH + "/bin/dummy_main_fini_fails"_s, +}; + +std::vector g_filenames_add_mdl_fails = { + BAREFLANK_SYSROOT_PATH + "/lib/libdummy_lib1.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libdummy_lib2.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libc.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libc++.so.1.0"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libc++abi.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libpthread.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libbfsyscall.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libbfunwind.so"_s, + BAREFLANK_SYSROOT_PATH + "/bin/dummy_main_add_mdl_fails"_s, +}; + +std::vector g_filenames_get_drr_fails = { + BAREFLANK_SYSROOT_PATH + "/lib/libdummy_lib1.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libdummy_lib2.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libc.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libc++.so.1.0"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libc++abi.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libpthread.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libbfsyscall.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libbfunwind.so"_s, + BAREFLANK_SYSROOT_PATH + "/bin/dummy_main_get_drr_fails"_s, +}; + +std::vector g_filenames_vmm_init_fails = { + BAREFLANK_SYSROOT_PATH + "/lib/libdummy_lib1.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libdummy_lib2.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libc.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libc++.so.1.0"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libc++abi.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libpthread.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libbfsyscall.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libbfunwind.so"_s, + BAREFLANK_SYSROOT_PATH + "/bin/dummy_main_vmm_init_fails"_s, +}; + +std::vector g_filenames_vmm_fini_fails = { + BAREFLANK_SYSROOT_PATH + "/lib/libdummy_lib1.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libdummy_lib2.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libc.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libc++.so.1.0"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libc++abi.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libpthread.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libbfsyscall.so"_s, + BAREFLANK_SYSROOT_PATH + "/lib/libbfunwind.so"_s, + BAREFLANK_SYSROOT_PATH + "/bin/dummy_main_vmm_fini_fails"_s, +}; diff --git a/bfdriver/tests/test_support.h b/bfdriver/tests/test_support.h new file mode 100644 index 000000000..2d55ff061 --- /dev/null +++ b/bfdriver/tests/test_support.h @@ -0,0 +1,34 @@ +// +// Bareflank Hypervisor +// +// Copyright (C) 2015 Assured Information Security, Inc. +// Author: Rian Quinn +// Author: Brendan Kerrigan +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +#ifndef TEST_SUPPORT_H +#define TEST_SUPPORT_H + +extern file g_file; +extern std::vector g_filenames_success; +extern std::vector g_filenames_init_fails; +extern std::vector g_filenames_fini_fails; +extern std::vector g_filenames_add_mdl_fails; +extern std::vector g_filenames_get_drr_fails; +extern std::vector g_filenames_vmm_init_fails; +extern std::vector g_filenames_vmm_fini_fails; + +#endif diff --git a/bfelf_loader/include/bfelf_loader.h b/bfelf_loader/include/bfelf_loader.h index 70b1a54db..69a03b31b 100644 --- a/bfelf_loader/include/bfelf_loader.h +++ b/bfelf_loader/include/bfelf_loader.h @@ -2307,7 +2307,7 @@ class binaries_info * @param paths a list of paths to locate the ELF binary from */ binaries_info( - gsl::not_null f, const std::string &filename, const std::vector &paths) + gsl::not_null f, const std::string &filename, const std::vector &paths, bool load = true) { bfn::buffer data; bfelf_binary_t binary = {}; @@ -2321,7 +2321,9 @@ class binaries_info this->unload_binaries(); }); - this->load_binaries(); + if (load) { + this->load_binaries(); + } } /** @@ -2337,7 +2339,7 @@ class binaries_info * @param filenames the list of files to load */ binaries_info( - gsl::not_null f, const std::vector &filenames) + gsl::not_null f, const std::vector &filenames, bool load = true) { this->init_binaries(f, filenames); @@ -2345,7 +2347,9 @@ class binaries_info this->unload_binaries(); }); - this->load_binaries(); + if (load) { + this->load_binaries(); + } } /** @@ -2395,13 +2399,62 @@ class binaries_info * @expects index is valid * @ensures none * - * @param index the ELF binary to get + * @param index of the ELF binary to get * @return main binary */ auto & ef(index_type index) { return m_binaries.at(index).ef; } + /** + * Get A Specific Binary + * + * @expects none + * @ensures none + * + * @param index of the specific binary to get + * @return returns a specific binary + */ + auto & + at(index_type index) + { return m_binaries.at(index); } + + /** + * Get The First Binary + * + * @expects none + * @ensures none + * + * @return returns the first binary + */ + auto & + front() + { return m_binaries.front(); } + + /** + * Get The Last Binary + * + * @expects none + * @ensures none + * + * @return returns the last binary + */ + auto & + back() + { return m_binaries.back(); } + + /** + * Get Binaries + * + * @expects none + * @ensures none + * + * @return returns the Binaries + */ + auto & + binaries() + { return m_binaries; } + /** * Get CRT Info * @@ -2453,11 +2506,8 @@ class binaries_info expects(!filenames.empty()); for (const auto &filename : filenames) { - bfelf_binary_t binary = {}; - auto data = private_read_binary(f, filename, binary); - - this->push_binary(std::move(data), std::move(binary)); + this->push_binary(private_read_binary(f, filename, binary), std::move(binary)); } } @@ -2484,6 +2534,18 @@ class binaries_info std::vector m_binaries; std::vector m_datas; + +public: + + /** @cond */ + + binaries_info(binaries_info &&) noexcept = default; + binaries_info &operator=(binaries_info &&) noexcept = default; + + binaries_info(const binaries_info &) = delete; + binaries_info &operator=(const binaries_info &) = delete; + + /** @endcond */ }; #endif diff --git a/bfelf_loader/tests/test_binary.cpp b/bfelf_loader/tests/test_binary.cpp index 51bbb70f3..e5cb888f0 100644 --- a/bfelf_loader/tests/test_binary.cpp +++ b/bfelf_loader/tests/test_binary.cpp @@ -65,4 +65,76 @@ TEST_CASE("bfelf_binary: set args") CHECK_NOTHROW(info.set_args(0, nullptr)); } +TEST_CASE("bfelf_binary: ef") +{ + file f; + binaries_info info(&f, g_filenames); + + CHECK_NOTHROW(info.ef()); +} + +TEST_CASE("bfelf_binary: ef index") +{ + file f; + binaries_info info(&f, g_filenames); + + CHECK_NOTHROW(info.ef(0)); +} + +TEST_CASE("bfelf_binary: at") +{ + file f; + binaries_info info(&f, g_filenames); + + CHECK_NOTHROW(info.at(0)); +} + +TEST_CASE("bfelf_binary: front") +{ + file f; + binaries_info info(&f, g_filenames); + + CHECK_NOTHROW(info.front()); +} + +TEST_CASE("bfelf_binary: back") +{ + file f; + binaries_info info(&f, g_filenames); + + CHECK_NOTHROW(info.back()); +} + +TEST_CASE("bfelf_binary: binaries") +{ + file f; + binaries_info info(&f, g_filenames); + + CHECK_NOTHROW(info.binaries()); +} + +TEST_CASE("bfelf_binary: info") +{ + file f; + binaries_info info(&f, g_filenames); + + CHECK_NOTHROW(info.info()); +} + +TEST_CASE("bfelf_binary: entry") +{ + file f; + binaries_info info(&f, g_filenames); + + CHECK_NOTHROW(info.entry()); +} + +TEST_CASE("bfelf_binary: loader") +{ + file f; + binaries_info info(&f, g_filenames); + + CHECK_NOTHROW(info.loader()); +} + #endif diff --git a/bfsdk/cmake/CMakeGlobal_Includes.txt b/bfsdk/cmake/CMakeGlobal_Includes.txt index b17818e67..1eacb203f 100644 --- a/bfsdk/cmake/CMakeGlobal_Includes.txt +++ b/bfsdk/cmake/CMakeGlobal_Includes.txt @@ -18,6 +18,7 @@ list(APPEND INCLUDES ../include ../../include ../../../include + ../../../../include ) include_directories(${INCLUDES}) diff --git a/bfsdk/include/bfsupport.h b/bfsdk/include/bfsupport.h index f01d7ca55..a052017cd 100644 --- a/bfsdk/include/bfsupport.h +++ b/bfsdk/include/bfsupport.h @@ -29,6 +29,7 @@ #include #include +#include /** * @struct section_info_t diff --git a/bfsysroot/bfsupport/crt/src/crt.cpp b/bfsysroot/bfsupport/crt/src/crt.cpp index 9575906bf..e8ef9c3fe 100644 --- a/bfsysroot/bfsupport/crt/src/crt.cpp +++ b/bfsysroot/bfsupport/crt/src/crt.cpp @@ -113,13 +113,10 @@ __bareflank_register_eh_frame(const section_info_t *info) elem->size = info->eh_frame_size; } - -int count = 0; extern "C" void __bareflank_register_debug_info(const section_info_t *info) { auto elem = &gsl::at(__g_dwarf_sections, __g_dwarf_sections_num++); - printf("count: %d\n", __g_dwarf_sections_num); elem->debug_info_addr = info->debug_info_addr; elem->debug_info_size = info->debug_info_size; elem->debug_abbrev_addr = info->debug_abbrev_addr; diff --git a/bfsysroot/bfsupport/dummy_main/CMakeLists.txt b/bfsysroot/bfsupport/dummy_main/CMakeLists.txt index f32fb7c1d..24d90ae2e 100644 --- a/bfsysroot/bfsupport/dummy_main/CMakeLists.txt +++ b/bfsysroot/bfsupport/dummy_main/CMakeLists.txt @@ -14,22 +14,55 @@ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pie") # Targets # ------------------------------------------------------------------------------ +list(APPEND LIBRARIES + dummy_lib1 + dummy_lib2 + -Wl,--whole-archive bfcrt -Wl,--no-whole-archive + bfsyscall + bfunwind + c++ + c++abi + c + pthread + bfsyscall + bfunwind +) + add_executable(dummy_main dummy_main.cpp) +target_link_libraries(dummy_main ${LIBRARIES}) + +add_executable(dummy_main_init_fails dummy_main.cpp) +target_link_libraries(dummy_main_init_fails ${LIBRARIES}) +target_compile_definitions(dummy_main_init_fails PUBLIC REQUEST_INIT_FAILS) + +add_executable(dummy_main_fini_fails dummy_main.cpp) +target_link_libraries(dummy_main_fini_fails ${LIBRARIES}) +target_compile_definitions(dummy_main_fini_fails PUBLIC REQUEST_FINI_FAILS) + +add_executable(dummy_main_add_mdl_fails dummy_main.cpp) +target_link_libraries(dummy_main_add_mdl_fails ${LIBRARIES}) +target_compile_definitions(dummy_main_add_mdl_fails PUBLIC REQUEST_ADD_MDL_FAILS) + +add_executable(dummy_main_get_drr_fails dummy_main.cpp) +target_link_libraries(dummy_main_get_drr_fails ${LIBRARIES}) +target_compile_definitions(dummy_main_get_drr_fails PUBLIC REQUEST_GET_DRR_FAILS) + +add_executable(dummy_main_vmm_init_fails dummy_main.cpp) +target_link_libraries(dummy_main_vmm_init_fails ${LIBRARIES}) +target_compile_definitions(dummy_main_vmm_init_fails PUBLIC REQUEST_VMM_INIT_FAILS) -target_link_libraries(dummy_main dummy_lib1) -target_link_libraries(dummy_main dummy_lib2) -target_link_libraries(dummy_main -Wl,--whole-archive bfcrt -Wl,--no-whole-archive) -target_link_libraries(dummy_main bfsyscall) -target_link_libraries(dummy_main bfunwind) -target_link_libraries(dummy_main c++) -target_link_libraries(dummy_main c++abi) -target_link_libraries(dummy_main c) -target_link_libraries(dummy_main pthread) -target_link_libraries(dummy_main bfsyscall) -target_link_libraries(dummy_main bfunwind) +add_executable(dummy_main_vmm_fini_fails dummy_main.cpp) +target_link_libraries(dummy_main_vmm_fini_fails ${LIBRARIES}) +target_compile_definitions(dummy_main_vmm_fini_fails PUBLIC REQUEST_VMM_FINI_FAILS) # ------------------------------------------------------------------------------ # Install # ------------------------------------------------------------------------------ install(TARGETS dummy_main DESTINATION ${BAREFLANK_SYSROOT_PATH}/bin) +install(TARGETS dummy_main_init_fails DESTINATION ${BAREFLANK_SYSROOT_PATH}/bin) +install(TARGETS dummy_main_fini_fails DESTINATION ${BAREFLANK_SYSROOT_PATH}/bin) +install(TARGETS dummy_main_add_mdl_fails DESTINATION ${BAREFLANK_SYSROOT_PATH}/bin) +install(TARGETS dummy_main_get_drr_fails DESTINATION ${BAREFLANK_SYSROOT_PATH}/bin) +install(TARGETS dummy_main_vmm_init_fails DESTINATION ${BAREFLANK_SYSROOT_PATH}/bin) +install(TARGETS dummy_main_vmm_fini_fails DESTINATION ${BAREFLANK_SYSROOT_PATH}/bin) diff --git a/bfsysroot/bfsupport/dummy_main/dummy_main.cpp b/bfsysroot/bfsupport/dummy_main/dummy_main.cpp index 694b82f0f..b4bbdc85d 100644 --- a/bfsysroot/bfsupport/dummy_main/dummy_main.cpp +++ b/bfsysroot/bfsupport/dummy_main/dummy_main.cpp @@ -19,6 +19,42 @@ // License along with this library; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +#ifndef REQUEST_INIT_FAILS +#define REQUEST_INIT_RETURN ENTRY_SUCCESS +#else +#define REQUEST_INIT_RETURN ENTRY_ERROR_UNKNOWN +#endif + +#ifndef REQUEST_FINI_FAILS +#define REQUEST_FINI_RETURN ENTRY_SUCCESS +#else +#define REQUEST_FINI_RETURN ENTRY_ERROR_UNKNOWN +#endif + +#ifndef REQUEST_ADD_MDL_FAILS +#define REQUEST_ADD_MDL_RETURN ENTRY_SUCCESS +#else +#define REQUEST_ADD_MDL_RETURN ENTRY_ERROR_UNKNOWN +#endif + +#ifndef REQUEST_GET_DRR_FAILS +#define REQUEST_GET_DRR_RETURN ENTRY_SUCCESS +#else +#define REQUEST_GET_DRR_RETURN ENTRY_ERROR_UNKNOWN +#endif + +#ifndef REQUEST_VMM_INIT_FAILS +#define REQUEST_VMM_INIT_RETURN ENTRY_SUCCESS +#else +#define REQUEST_VMM_INIT_RETURN ENTRY_ERROR_UNKNOWN +#endif + +#ifndef REQUEST_VMM_FINI_FAILS +#define REQUEST_VMM_FINI_RETURN ENTRY_SUCCESS +#else +#define REQUEST_VMM_FINI_RETURN ENTRY_ERROR_UNKNOWN +#endif + #include #include #include @@ -54,20 +90,34 @@ main(int argc, char *argv[]) extern "C" int64_t bfmain(uintptr_t request, uintptr_t arg1, uintptr_t arg2, uintptr_t arg3) { + bfignored(arg1); + bfignored(arg2); bfignored(arg3); - if (request < BF_REQUEST_END) { - return 0; - } + switch (request) { + case BF_REQUEST_INIT: + return REQUEST_INIT_RETURN; - try { - throw std::runtime_error("test exceptions"); + case BF_REQUEST_FINI: + return REQUEST_FINI_RETURN; + + case BF_REQUEST_ADD_MDL: + return REQUEST_ADD_MDL_RETURN; + + case BF_REQUEST_GET_DRR: + return REQUEST_GET_DRR_RETURN; + + case BF_REQUEST_VMM_INIT: + return REQUEST_VMM_INIT_RETURN; + + case BF_REQUEST_VMM_FINI: + return REQUEST_VMM_FINI_RETURN; + + default: + break; } - catch (std::exception &) - { } - return g_derived1.foo(gsl::narrow_cast(arg1)) + - g_derived2.foo(gsl::narrow_cast(arg2)); + return ENTRY_ERROR_UNKNOWN; } // -----------------------------------------------------------------------------