| // | |
| // Copyright 2025 The ANGLE Project Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| // | |
| // ANGLETestCL: | |
| // Implementation of ANGLE CL testing fixture. | |
| // | |
| #include "ANGLETestCL.h" | |
| #include <algorithm> | |
| #include <cstdlib> | |
| #include "common/PackedEnums.h" | |
| #include "common/platform.h" | |
| #include "gpu_info_util/SystemInfo.h" | |
| #include "test_expectations/GPUTestConfig.h" | |
| #include "util/EGLWindow.h" | |
| #include "util/OSWindow.h" | |
| #include "util/random_utils.h" | |
| #include "util/test_utils.h" | |
| #if defined(ANGLE_PLATFORM_WINDOWS) | |
| # include <VersionHelpers.h> | |
| #endif // defined(ANGLE_PLATFORM_WINDOWS) | |
| #if defined(ANGLE_HAS_RAPIDJSON) | |
| # include "test_utils/runner/TestSuite.h" | |
| #endif // defined(ANGLE_HAS_RAPIDJSON) | |
| using namespace angle; | |
| template <> | |
| ANGLETestCL<PlatformParameters>::ANGLETestCL(const PlatformParameters ¶ms) | |
| : mSetUpCalled(false), mIsSetUp(false), mTearDownCalled(false) | |
| { | |
| // Override the default platform methods with the ANGLE test methods pointer. | |
| mCurrentParams = params; | |
| mCurrentParams.eglParameters.platformMethods = &gDefaultPlatformMethods; | |
| if (mCurrentParams.getRenderer() == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE) | |
| { | |
| #if defined(ANGLE_ENABLE_VULKAN_VALIDATION_LAYERS) | |
| mCurrentParams.eglParameters.debugLayersEnabled = true; | |
| #else | |
| mCurrentParams.eglParameters.debugLayersEnabled = false; | |
| #endif | |
| } | |
| if (gEnableRenderDocCapture) | |
| { | |
| mRenderDoc.attach(); | |
| } | |
| } | |
| template <> | |
| void ANGLETestCL<angle::PlatformParameters>::SetUp() | |
| { | |
| mSetUpCalled = true; | |
| // Delay test startup to allow a debugger to attach. | |
| if (GetTestStartDelaySeconds()) | |
| { | |
| angle::Sleep(GetTestStartDelaySeconds() * 1000); | |
| } | |
| const testing::TestInfo *testInfo = testing::UnitTest::GetInstance()->current_test_info(); | |
| // Check the skip list. | |
| angle::GPUTestConfig::API api = GetTestConfigAPIFromRenderer( | |
| mCurrentParams.driver, mCurrentParams.getRenderer(), mCurrentParams.getDeviceType()); | |
| GPUTestConfig testConfig = GPUTestConfig(api, 0); | |
| std::stringstream fullTestNameStr; | |
| fullTestNameStr << testInfo->test_suite_name() << "." << testInfo->name(); | |
| std::string fullTestName = fullTestNameStr.str(); | |
| // TODO(b/279980674): TestSuite depends on rapidjson which we don't have in aosp builds, | |
| // for now disable both TestSuite and expectations. | |
| #if defined(ANGLE_HAS_RAPIDJSON) | |
| TestSuite *testSuite = TestSuite::GetInstance(); | |
| int32_t testExpectation = | |
| testSuite->getTestExpectationWithConfigAndUpdateTimeout(testConfig, fullTestName); | |
| if (testExpectation == GPUTestExpectationsParser::kGpuTestSkip) | |
| { | |
| GTEST_SKIP() << "Test skipped on this config"; | |
| } | |
| #endif | |
| if (IsWindows()) | |
| { | |
| WriteDebugMessage("Entering %s\n", fullTestName.c_str()); | |
| } | |
| if (gEnableANGLEPerTestCaptureLabel) | |
| { | |
| std::string testName = std::string{testInfo->name()}; | |
| std::replace(testName.begin(), testName.end(), '/', '_'); | |
| SetEnvironmentVar("ANGLE_CAPTURE_LABEL", | |
| (std::string{testInfo->test_suite_name()} + "_" + testName).c_str()); | |
| } | |
| mIsSetUp = true; | |
| testSetUp(); | |
| } | |
| template <> | |
| void ANGLETestCL<angle::PlatformParameters>::TearDown() | |
| { | |
| if (mIsSetUp) | |
| { | |
| testTearDown(); | |
| } | |
| mTearDownCalled = true; | |
| if (IsWindows()) | |
| { | |
| const testing::TestInfo *info = testing::UnitTest::GetInstance()->current_test_info(); | |
| WriteDebugMessage("Exiting %s.%s\n", info->test_suite_name(), info->name()); | |
| } | |
| } |