1/* 2 * Copyright (c) 2021-2023 The Khronos Group Inc. 3 * Copyright (c) 2021-2023 Valve Corporation 4 * Copyright (c) 2021-2023 LunarG, Inc. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a copy 7 * of this software and/or associated documentation files (the "Materials"), to 8 * deal in the Materials without restriction, including without limitation the 9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 10 * sell copies of the Materials, and to permit persons to whom the Materials are 11 * furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice(s) and this permission notice shall be included in 14 * all copies or substantial portions of the Materials. 15 * 16 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 * 20 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 21 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 22 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE 23 * USE OR OTHER DEALINGS IN THE MATERIALS. 24 * 25 * Author: Charles Giessen <charles@lunarg.com> 26 */ 27 28#include "test_environment.h" 29 30// Makes any failed assertion throw, allowing for graceful cleanup of resources instead of hard aborts 31class ThrowListener : public testing::EmptyTestEventListener { 32 void OnTestPartResult(const testing::TestPartResult& result) override { 33 if (result.type() == testing::TestPartResult::kFatalFailure) { 34 // We need to make sure an exception wasn't already thrown so we dont throw another exception at the same time 35 std::exception_ptr ex = std::current_exception(); 36 if (ex) { 37 return; 38 } 39 throw testing::AssertionException(result); 40 } 41 } 42}; 43 44int main(int argc, char** argv) { 45#if defined(_WIN32) 46 // Avoid "Abort, Retry, Ignore" dialog boxes 47 _set_error_mode(_OUT_TO_STDERR); 48 _set_abort_behavior(0, _WRITE_ABORT_MSG | _CALL_REPORTFAULT); 49 SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX); 50 _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE); 51 _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR); 52 _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE); 53 _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR); 54 _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE); 55 _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR); 56#endif 57 58 // clean up folders from old test 59 fs::delete_folder(fs::path(FRAMEWORK_BUILD_DIRECTORY) / "null_dir"); 60 fs::delete_folder(fs::path(FRAMEWORK_BUILD_DIRECTORY) / "icd_manifests"); 61 fs::delete_folder(fs::path(FRAMEWORK_BUILD_DIRECTORY) / "icd_env_vars_manifests"); 62 fs::delete_folder(fs::path(FRAMEWORK_BUILD_DIRECTORY) / "explicit_layer_manifests"); 63 fs::delete_folder(fs::path(FRAMEWORK_BUILD_DIRECTORY) / "explicit_env_var_layer_folder"); 64 fs::delete_folder(fs::path(FRAMEWORK_BUILD_DIRECTORY) / "explicit_add_env_var_layer_folder"); 65 fs::delete_folder(fs::path(FRAMEWORK_BUILD_DIRECTORY) / "implicit_layer_manifests"); 66 fs::delete_folder(fs::path(FRAMEWORK_BUILD_DIRECTORY) / "override_layer_manifests"); 67 fs::delete_folder(fs::path(FRAMEWORK_BUILD_DIRECTORY) / "app_package_manifests"); 68 fs::delete_folder(fs::path(FRAMEWORK_BUILD_DIRECTORY) / "macos_bundle"); 69 70 // make sure the tests don't find these env-vars if they were set on the system 71 EnvVarWrapper vk_icd_filenames_env_var{"VK_ICD_FILENAMES"}; 72 EnvVarWrapper vk_driver_files_env_var{"VK_DRIVER_FILES"}; 73 EnvVarWrapper vk_add_driver_files_env_var{"VK_ADD_DRIVER_FILES"}; 74 EnvVarWrapper vk_layer_path_env_var{"VK_LAYER_PATH"}; 75 EnvVarWrapper vk_add_layer_path_env_var{"VK_ADD_LAYER_PATH"}; 76 EnvVarWrapper vk_instance_layers_env_var{"VK_INSTANCE_LAYERS"}; 77 EnvVarWrapper vk_loader_drivers_select_env_var{"VK_LOADER_DRIVERS_SELECT"}; 78 EnvVarWrapper vk_loader_drivers_disable_env_var{"VK_LOADER_DRIVERS_DISABLE"}; 79 EnvVarWrapper vk_loader_layers_enable_env_var{"VK_LOADER_LAYERS_ENABLE"}; 80 EnvVarWrapper vk_loader_layers_disable_env_var{"VK_LOADER_LAYERS_DISABLE"}; 81 EnvVarWrapper vk_loader_debug_env_var{"VK_LOADER_DEBUG"}; 82 EnvVarWrapper vk_loader_disable_inst_ext_filter_env_var{"VK_LOADER_DISABLE_INST_EXT_FILTER"}; 83 84#if COMMON_UNIX_PLATFORMS 85 // Set only one of the 4 XDG variables to /etc, let everything else be empty 86 EnvVarWrapper xdg_config_home_env_var{"XDG_CONFIG_HOME", ETC_DIR}; 87 EnvVarWrapper xdg_config_dirs_env_var{"XDG_CONFIG_DIRS"}; 88 EnvVarWrapper xdg_data_home_env_var{"XDG_DATA_HOME"}; 89 EnvVarWrapper xdg_data_dirs_env_var{"XDG_DATA_DIRS"}; 90 EnvVarWrapper home_env_var{"HOME", HOME_DIR}; 91#endif 92 ::testing::InitGoogleTest(&argc, argv); 93 ::testing::UnitTest::GetInstance()->listeners().Append(new ThrowListener); 94 int result = RUN_ALL_TESTS(); 95 96 return result; 97} 98