From 1d3a966106bf7d4077cab88b7421f902bc357c85 Mon Sep 17 00:00:00 2001 From: David Neto Date: Wed, 5 Oct 2016 10:25:09 -0400 Subject: [PATCH] Gtests can be run on another source tree The gtest executable accepts a --test-root option to specify a root directory for test files. It defaults to the Test directory in the source tree from which the executable is built. For example, this lets us run test exectuables built with MinGW on Linux on a Windows machine with its own copy of the source tree. --- gtests/AST.FromFile.cpp | 2 +- gtests/BuiltInResource.FromFile.cpp | 2 +- gtests/CMakeLists.txt | 9 +++++++-- gtests/Config.FromFile.cpp | 6 +++--- gtests/Hlsl.FromFile.cpp | 4 ++-- gtests/Link.FromFile.cpp | 4 ++-- gtests/Pp.FromFile.cpp | 2 +- gtests/Remap.FromFile.cpp | 6 +++--- gtests/Settings.cpp | 12 +++++++++++- gtests/Settings.h | 4 ++++ gtests/Spv.FromFile.cpp | 16 ++++++++-------- gtests/TestFixture.h | 8 -------- gtests/main.cpp | 15 +++++++++++++-- 13 files changed, 56 insertions(+), 34 deletions(-) diff --git a/gtests/AST.FromFile.cpp b/gtests/AST.FromFile.cpp index 7c31df013..a2e961e81 100644 --- a/gtests/AST.FromFile.cpp +++ b/gtests/AST.FromFile.cpp @@ -43,7 +43,7 @@ using CompileToAstTest = GlslangTest<::testing::TestWithParam>; TEST_P(CompileToAstTest, FromFile) { - loadFileCompileAndCheck(GLSLANG_TEST_DIRECTORY, GetParam(), + loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(), Source::GLSL, Semantics::OpenGL, Target::AST); } diff --git a/gtests/BuiltInResource.FromFile.cpp b/gtests/BuiltInResource.FromFile.cpp index 4d68d873b..da81fe98c 100644 --- a/gtests/BuiltInResource.FromFile.cpp +++ b/gtests/BuiltInResource.FromFile.cpp @@ -46,7 +46,7 @@ using DefaultResourceTest = GlslangTest<::testing::Test>; TEST_F(DefaultResourceTest, FromFile) { - const std::string path = GLSLANG_TEST_DIRECTORY "/baseResults/test.conf"; + const std::string path = GlobalTestSettings.testRoot + "/baseResults/test.conf"; std::string expectedConfig; tryLoadFile(path, "expected resource limit", &expectedConfig); const std::string realConfig = glslang::GetDefaultTBuiltInResourceString(); diff --git a/gtests/CMakeLists.txt b/gtests/CMakeLists.txt index a7cba22b4..268caff7f 100644 --- a/gtests/CMakeLists.txt +++ b/gtests/CMakeLists.txt @@ -29,8 +29,12 @@ if (TARGET gmock) install(TARGETS glslangtests RUNTIME DESTINATION bin) + set(GLSLANG_TEST_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../Test") + # Supply a default test root directory, so that manual testing + # doesn't have to specify the --test-root option in the normal + # case that you want to use the tests from the same source tree. target_compile_definitions(glslangtests - PRIVATE GLSLANG_TEST_DIRECTORY="${CMAKE_CURRENT_SOURCE_DIR}/../Test") + PRIVATE GLSLANG_TEST_DIRECTORY="${GLSLANG_TEST_DIRECTORY}") target_include_directories(glslangtests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${PROJECT_SOURCE_DIR} @@ -39,5 +43,6 @@ if (TARGET gmock) target_link_libraries(glslangtests PRIVATE SPVRemapper glslang OSDependent OGLCompiler HLSL glslang SPIRV glslang-default-resource-limits gmock) - add_test(NAME glslang-gtests COMMAND glslangtests) + add_test(NAME glslang-gtests + COMMAND glslangtests --test-root "${GLSLANG_TEST_DIRECTORY}") endif() diff --git a/gtests/Config.FromFile.cpp b/gtests/Config.FromFile.cpp index 7bc6a70e2..a6e93dcfa 100644 --- a/gtests/Config.FromFile.cpp +++ b/gtests/Config.FromFile.cpp @@ -54,8 +54,8 @@ TEST_P(ConfigTest, FromFile) // Get the contents for input shader and limit configurations. std::string shaderContents, configContents; - tryLoadFile(GLSLANG_TEST_DIRECTORY "/" + testCase.input, "input", &shaderContents); - tryLoadFile(GLSLANG_TEST_DIRECTORY "/" + testCase.config, "limits config", &configContents); + tryLoadFile(GlobalTestSettings.testRoot + "/" + testCase.input, "input", &shaderContents); + tryLoadFile(GlobalTestSettings.testRoot + "/" + testCase.config, "limits config", &configContents); // Decode limit configurations. TBuiltInResource resources = {}; @@ -86,7 +86,7 @@ TEST_P(ConfigTest, FromFile) // Check with expected results. const std::string expectedOutputFname = - GLSLANG_TEST_DIRECTORY "/baseResults/" + testCase.output; + GlobalTestSettings.testRoot + "/baseResults/" + testCase.output; std::string expectedOutput; tryLoadFile(expectedOutputFname, "expected output", &expectedOutput); diff --git a/gtests/Hlsl.FromFile.cpp b/gtests/Hlsl.FromFile.cpp index 51be19ddb..b587b0d6e 100644 --- a/gtests/Hlsl.FromFile.cpp +++ b/gtests/Hlsl.FromFile.cpp @@ -64,14 +64,14 @@ using HlslCompileAndFlattenTest = GlslangTest<::testing::TestWithParam> shaders; for (size_t i = 0; i < fileCount; ++i) { std::string contents; - tryLoadFile(GLSLANG_TEST_DIRECTORY "/" + fileNames[i], + tryLoadFile(GlobalTestSettings.testRoot + "/" + fileNames[i], "input", &contents); shaders.emplace_back( new glslang::TShader(GetShaderStage(GetSuffix(fileNames[i])))); @@ -77,7 +77,7 @@ TEST_P(LinkTest, FromFile) // Check with expected results. const std::string expectedOutputFname = - GLSLANG_TEST_DIRECTORY "/baseResults/" + fileNames.front() + ".out"; + GlobalTestSettings.testRoot + "/baseResults/" + fileNames.front() + ".out"; std::string expectedOutput; tryLoadFile(expectedOutputFname, "expected output", &expectedOutput); diff --git a/gtests/Pp.FromFile.cpp b/gtests/Pp.FromFile.cpp index 04ac3f757..13daac0d6 100644 --- a/gtests/Pp.FromFile.cpp +++ b/gtests/Pp.FromFile.cpp @@ -43,7 +43,7 @@ using PreprocessingTest = GlslangTest<::testing::TestWithParam>; TEST_P(PreprocessingTest, FromFile) { - loadFilePreprocessAndCheck(GLSLANG_TEST_DIRECTORY, GetParam()); + loadFilePreprocessAndCheck(GlobalTestSettings.testRoot, GetParam()); } // clang-format off diff --git a/gtests/Remap.FromFile.cpp b/gtests/Remap.FromFile.cpp index cd246ea2f..9f25a6f22 100644 --- a/gtests/Remap.FromFile.cpp +++ b/gtests/Remap.FromFile.cpp @@ -60,17 +60,17 @@ std::string FileNameAsCustomTestSuffix( using RemapTest = GlslangTest<::testing::TestWithParam>; -// Remapping SPIR-V modules. +// Remapping SPIR-V modules. TEST_P(RemapTest, FromFile) { if (GetSuffix(GetParam().fileName) == "spv") { - loadFileRemapAndCheck(GLSLANG_TEST_DIRECTORY, GetParam().fileName, + loadFileRemapAndCheck(GlobalTestSettings.testRoot, GetParam().fileName, GetParam().sourceLanguage, Semantics::Vulkan, Target::Spv, GetParam().remapOpts); } else { - loadFileCompileRemapAndCheck(GLSLANG_TEST_DIRECTORY, GetParam().fileName, + loadFileCompileRemapAndCheck(GlobalTestSettings.testRoot, GetParam().fileName, GetParam().sourceLanguage, Semantics::Vulkan, Target::Spv, diff --git a/gtests/Settings.cpp b/gtests/Settings.cpp index 4ba7989b4..0ac58449c 100644 --- a/gtests/Settings.cpp +++ b/gtests/Settings.cpp @@ -36,6 +36,16 @@ namespace glslangtest { -GTestSettings GlobalTestSettings = {nullptr, false}; +// We need CMake to provide us the absolute path to the directory containing +// test files, so we are certain to find those files no matter where the test +// harness binary is generated. This provides out-of-source build capability. +// This will be used as the default test root, but can be overridden with +// the --test-root argument. +#ifndef GLSLANG_TEST_DIRECTORY +#error \ + "GLSLANG_TEST_DIRECTORY needs to be defined for gtest to locate test files." +#endif + +GTestSettings GlobalTestSettings = {nullptr, false, GLSLANG_TEST_DIRECTORY}; } // namespace glslangtest diff --git a/gtests/Settings.h b/gtests/Settings.h index 30056a7ba..c38474ccf 100644 --- a/gtests/Settings.h +++ b/gtests/Settings.h @@ -35,6 +35,8 @@ #ifndef GLSLANG_GTESTS_SETTINGS_H #define GLSLANG_GTESTS_SETTINGS_H +#include + namespace glslangtest { class GlslangInitializer; @@ -45,6 +47,8 @@ struct GTestSettings { // An indicator of whether GTest should write real output to the file for // the expected output. bool updateMode; + // The root directory for test files. + std::string testRoot; }; extern GTestSettings GlobalTestSettings; diff --git a/gtests/Spv.FromFile.cpp b/gtests/Spv.FromFile.cpp index ee27db2b1..533733df5 100644 --- a/gtests/Spv.FromFile.cpp +++ b/gtests/Spv.FromFile.cpp @@ -75,7 +75,7 @@ using CompileVulkanToSpirvTestAMD = GlslangTest<::testing::TestWithParam +#include #include @@ -49,9 +50,19 @@ int main(int argc, char** argv) glslangtest::GlobalTestSettings.initializer = initializer.get(); for (int i = 1; i < argc; ++i) { - if (!strncmp("--update-mode", argv[i], 13)) { + if (std::string("--update-mode") == argv[i]) { glslangtest::GlobalTestSettings.updateMode = true; - break; + } + if (std::string("--test-root") == argv[i]) { + // Allow the user set the tets root directory. This is useful + // for testing with files from another source tree. + if (i + 1 < argc) { + glslangtest::GlobalTestSettings.testRoot = argv[i + 1]; + i++; + } else { + printf("error: --test-root requires an argument\n"); + return 1; + } } }