Path: blob/main_old/src/tests/test_utils/runner/TestSuite_unittest.cpp
1694 views
//1// Copyright 2019 The ANGLE Project Authors. All rights reserved.2// Use of this source code is governed by a BSD-style license that can be3// found in the LICENSE file.4//5// TestSuite_unittest.cpp: Unit tests for ANGLE's test harness.6//78#include <gtest/gtest.h>910#include "../angle_test_instantiate.h"11#include "TestSuite.h"12#include "common/debug.h"13#include "common/system_utils.h"14#include "util/test_utils.h"15#include "util/test_utils_unittest_helper.h"1617#include <rapidjson/document.h>1819using namespace angle;2021namespace js = rapidjson;2223// This file is included in both angle_unittests and test_utils_unittest_helper. This variable is24// defined separately in each test target's main file.25extern bool gVerbose;2627namespace28{29constexpr char kTestHelperExecutable[] = "test_utils_unittest_helper";30constexpr int kFlakyRetries = 3;3132class TestSuiteTest : public testing::Test33{34protected:35void TearDown() override36{37if (!mTempFileName.empty())38{39angle::DeleteFile(mTempFileName.c_str());40}41}4243bool runTestSuite(const std::vector<std::string> &extraArgs,44TestResults *actualResults,45bool validateStderr)46{47std::string executablePath = GetExecutableDirectory();48EXPECT_NE(executablePath, "");49executablePath += std::string("/") + kTestHelperExecutable + GetExecutableExtension();5051constexpr uint32_t kMaxTempDirLen = 100;52char tempDirName[kMaxTempDirLen * 2];5354if (!GetTempDir(tempDirName, kMaxTempDirLen))55{56return false;57}5859std::stringstream tempFNameStream;60tempFNameStream << tempDirName << GetPathSeparator() << "test_temp_" << rand() << ".json";61mTempFileName = tempFNameStream.str();6263std::string resultsFileName = "--results-file=" + mTempFileName;6465std::vector<const char *> args = {66executablePath.c_str(), kRunTestSuite, "--gtest_also_run_disabled_tests",67"--bot-mode", "--test-timeout=5", resultsFileName.c_str()};6869for (const std::string &arg : extraArgs)70{71args.push_back(arg.c_str());72}7374if (gVerbose)75{76printf("Test arguments:\n");77for (const char *arg : args)78{79printf("%s ", arg);80}81printf("\n");82}8384ProcessHandle process(args, ProcessOutputCapture::StdoutAndStderrSeparately);85EXPECT_TRUE(process->started());86EXPECT_TRUE(process->finish());87EXPECT_TRUE(process->finished());8889if (validateStderr)90{91EXPECT_EQ(process->getStderr(), "");92}9394if (gVerbose)95{96printf("stdout:\n%s\n", process->getStdout().c_str());97}9899return GetTestResultsFromFile(mTempFileName.c_str(), actualResults);100}101102std::string mTempFileName;103};104105// Tests the ANGLE standalone testing harness. Runs four tests with different ending conditions.106// Verifies that Pass, Fail, Crash and Timeout are all handled correctly.107TEST_F(TestSuiteTest, RunMockTests)108{109std::vector<std::string> extraArgs = {"--gtest_filter=MockTestSuiteTest.DISABLED_*"};110111TestResults actual;112ASSERT_TRUE(runTestSuite(extraArgs, &actual, true));113114std::map<TestIdentifier, TestResult> expectedResults = {115{{"MockTestSuiteTest", "DISABLED_Pass"}, {TestResultType::Pass, 0.0}},116{{"MockTestSuiteTest", "DISABLED_Fail"}, {TestResultType::Fail, 0.0}},117{{"MockTestSuiteTest", "DISABLED_Skip"}, {TestResultType::Skip, 0.0}},118{{"MockTestSuiteTest", "DISABLED_Timeout"}, {TestResultType::Timeout, 0.0}},119};120121EXPECT_EQ(expectedResults, actual.results);122}123124// Verifies the flaky retry feature works as expected.125TEST_F(TestSuiteTest, RunFlakyTests)126{127std::vector<std::string> extraArgs = {"--gtest_filter=MockFlakyTestSuiteTest.DISABLED_Flaky",128"--flaky-retries=" + std::to_string(kFlakyRetries)};129130TestResults actual;131ASSERT_TRUE(runTestSuite(extraArgs, &actual, true));132133std::map<TestIdentifier, TestResult> expectedResults = {134{{"MockFlakyTestSuiteTest", "DISABLED_Flaky"},135{TestResultType::Pass, 0.0, kFlakyRetries - 1}}};136137EXPECT_EQ(expectedResults, actual.results);138}139140// Verifies that crashes are handled even without the crash handler.141TEST_F(TestSuiteTest, RunCrashingTests)142{143std::vector<std::string> extraArgs = {144"--gtest_filter=MockTestSuiteTest.DISABLED_Pass:MockTestSuiteTest.DISABLED_Fail:"145"MockTestSuiteTest.DISABLED_Skip:"146"MockCrashTestSuiteTest.DISABLED_*",147"--disable-crash-handler"};148149TestResults actual;150ASSERT_TRUE(runTestSuite(extraArgs, &actual, false));151152std::map<TestIdentifier, TestResult> expectedResults = {153{{"MockTestSuiteTest", "DISABLED_Pass"}, {TestResultType::Pass, 0.0}},154{{"MockTestSuiteTest", "DISABLED_Fail"}, {TestResultType::Fail, 0.0}},155{{"MockTestSuiteTest", "DISABLED_Skip"}, {TestResultType::Skip, 0.0}},156{{"MockCrashTestSuiteTest", "DISABLED_Crash"}, {TestResultType::Crash, 0.0}},157{{"MockCrashTestSuiteTest", "DISABLED_PassAfterCrash"}, {TestResultType::Pass, 0.0}},158{{"MockCrashTestSuiteTest", "DISABLED_SkipAfterCrash"}, {TestResultType::Skip, 0.0}},159};160161EXPECT_EQ(expectedResults, actual.results);162}163164// Normal passing test.165TEST(MockTestSuiteTest, DISABLED_Pass)166{167EXPECT_TRUE(true);168}169170// Normal failing test.171TEST(MockTestSuiteTest, DISABLED_Fail)172{173EXPECT_TRUE(false);174}175176// Trigger a test timeout.177TEST(MockTestSuiteTest, DISABLED_Timeout)178{179angle::Sleep(20000);180}181182// Trigger a test skip.183TEST(MockTestSuiteTest, DISABLED_Skip)184{185GTEST_SKIP() << "Test skipped.";186}187188// Trigger a flaky test failure.189TEST(MockFlakyTestSuiteTest, DISABLED_Flaky)190{191constexpr uint32_t kMaxTempDirLen = 100;192char tempDirName[kMaxTempDirLen * 2];193ASSERT_TRUE(GetTempDir(tempDirName, kMaxTempDirLen));194195std::stringstream tempFNameStream;196tempFNameStream << tempDirName << GetPathSeparator() << "flaky_temp.txt";197std::string tempFileName = tempFNameStream.str();198199int fails = 0;200{201FILE *fp = fopen(tempFileName.c_str(), "r");202if (fp)203{204ASSERT_EQ(fscanf(fp, "%d", &fails), 1);205fclose(fp);206}207}208209if (fails >= kFlakyRetries - 1)210{211angle::DeleteFile(tempFileName.c_str());212}213else214{215EXPECT_TRUE(false);216217FILE *fp = fopen(tempFileName.c_str(), "w");218ASSERT_NE(fp, nullptr);219220fprintf(fp, "%d", fails + 1);221fclose(fp);222}223}224225// Trigger a test crash.226TEST(MockCrashTestSuiteTest, DISABLED_Crash)227{228ANGLE_CRASH();229}230231// This test runs after the crash test.232TEST(MockCrashTestSuiteTest, DISABLED_PassAfterCrash)233{234EXPECT_TRUE(true);235}236237// This test runs after the crash test.238TEST(MockCrashTestSuiteTest, DISABLED_SkipAfterCrash)239{240GTEST_SKIP() << "Test skipped.";241}242} // namespace243244245