Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/angle
Path: blob/main_old/src/tests/test_utils/runner/TestSuite_unittest.cpp
1694 views
1
//
2
// Copyright 2019 The ANGLE Project Authors. All rights reserved.
3
// Use of this source code is governed by a BSD-style license that can be
4
// found in the LICENSE file.
5
//
6
// TestSuite_unittest.cpp: Unit tests for ANGLE's test harness.
7
//
8
9
#include <gtest/gtest.h>
10
11
#include "../angle_test_instantiate.h"
12
#include "TestSuite.h"
13
#include "common/debug.h"
14
#include "common/system_utils.h"
15
#include "util/test_utils.h"
16
#include "util/test_utils_unittest_helper.h"
17
18
#include <rapidjson/document.h>
19
20
using namespace angle;
21
22
namespace js = rapidjson;
23
24
// This file is included in both angle_unittests and test_utils_unittest_helper. This variable is
25
// defined separately in each test target's main file.
26
extern bool gVerbose;
27
28
namespace
29
{
30
constexpr char kTestHelperExecutable[] = "test_utils_unittest_helper";
31
constexpr int kFlakyRetries = 3;
32
33
class TestSuiteTest : public testing::Test
34
{
35
protected:
36
void TearDown() override
37
{
38
if (!mTempFileName.empty())
39
{
40
angle::DeleteFile(mTempFileName.c_str());
41
}
42
}
43
44
bool runTestSuite(const std::vector<std::string> &extraArgs,
45
TestResults *actualResults,
46
bool validateStderr)
47
{
48
std::string executablePath = GetExecutableDirectory();
49
EXPECT_NE(executablePath, "");
50
executablePath += std::string("/") + kTestHelperExecutable + GetExecutableExtension();
51
52
constexpr uint32_t kMaxTempDirLen = 100;
53
char tempDirName[kMaxTempDirLen * 2];
54
55
if (!GetTempDir(tempDirName, kMaxTempDirLen))
56
{
57
return false;
58
}
59
60
std::stringstream tempFNameStream;
61
tempFNameStream << tempDirName << GetPathSeparator() << "test_temp_" << rand() << ".json";
62
mTempFileName = tempFNameStream.str();
63
64
std::string resultsFileName = "--results-file=" + mTempFileName;
65
66
std::vector<const char *> args = {
67
executablePath.c_str(), kRunTestSuite, "--gtest_also_run_disabled_tests",
68
"--bot-mode", "--test-timeout=5", resultsFileName.c_str()};
69
70
for (const std::string &arg : extraArgs)
71
{
72
args.push_back(arg.c_str());
73
}
74
75
if (gVerbose)
76
{
77
printf("Test arguments:\n");
78
for (const char *arg : args)
79
{
80
printf("%s ", arg);
81
}
82
printf("\n");
83
}
84
85
ProcessHandle process(args, ProcessOutputCapture::StdoutAndStderrSeparately);
86
EXPECT_TRUE(process->started());
87
EXPECT_TRUE(process->finish());
88
EXPECT_TRUE(process->finished());
89
90
if (validateStderr)
91
{
92
EXPECT_EQ(process->getStderr(), "");
93
}
94
95
if (gVerbose)
96
{
97
printf("stdout:\n%s\n", process->getStdout().c_str());
98
}
99
100
return GetTestResultsFromFile(mTempFileName.c_str(), actualResults);
101
}
102
103
std::string mTempFileName;
104
};
105
106
// Tests the ANGLE standalone testing harness. Runs four tests with different ending conditions.
107
// Verifies that Pass, Fail, Crash and Timeout are all handled correctly.
108
TEST_F(TestSuiteTest, RunMockTests)
109
{
110
std::vector<std::string> extraArgs = {"--gtest_filter=MockTestSuiteTest.DISABLED_*"};
111
112
TestResults actual;
113
ASSERT_TRUE(runTestSuite(extraArgs, &actual, true));
114
115
std::map<TestIdentifier, TestResult> expectedResults = {
116
{{"MockTestSuiteTest", "DISABLED_Pass"}, {TestResultType::Pass, 0.0}},
117
{{"MockTestSuiteTest", "DISABLED_Fail"}, {TestResultType::Fail, 0.0}},
118
{{"MockTestSuiteTest", "DISABLED_Skip"}, {TestResultType::Skip, 0.0}},
119
{{"MockTestSuiteTest", "DISABLED_Timeout"}, {TestResultType::Timeout, 0.0}},
120
};
121
122
EXPECT_EQ(expectedResults, actual.results);
123
}
124
125
// Verifies the flaky retry feature works as expected.
126
TEST_F(TestSuiteTest, RunFlakyTests)
127
{
128
std::vector<std::string> extraArgs = {"--gtest_filter=MockFlakyTestSuiteTest.DISABLED_Flaky",
129
"--flaky-retries=" + std::to_string(kFlakyRetries)};
130
131
TestResults actual;
132
ASSERT_TRUE(runTestSuite(extraArgs, &actual, true));
133
134
std::map<TestIdentifier, TestResult> expectedResults = {
135
{{"MockFlakyTestSuiteTest", "DISABLED_Flaky"},
136
{TestResultType::Pass, 0.0, kFlakyRetries - 1}}};
137
138
EXPECT_EQ(expectedResults, actual.results);
139
}
140
141
// Verifies that crashes are handled even without the crash handler.
142
TEST_F(TestSuiteTest, RunCrashingTests)
143
{
144
std::vector<std::string> extraArgs = {
145
"--gtest_filter=MockTestSuiteTest.DISABLED_Pass:MockTestSuiteTest.DISABLED_Fail:"
146
"MockTestSuiteTest.DISABLED_Skip:"
147
"MockCrashTestSuiteTest.DISABLED_*",
148
"--disable-crash-handler"};
149
150
TestResults actual;
151
ASSERT_TRUE(runTestSuite(extraArgs, &actual, false));
152
153
std::map<TestIdentifier, TestResult> expectedResults = {
154
{{"MockTestSuiteTest", "DISABLED_Pass"}, {TestResultType::Pass, 0.0}},
155
{{"MockTestSuiteTest", "DISABLED_Fail"}, {TestResultType::Fail, 0.0}},
156
{{"MockTestSuiteTest", "DISABLED_Skip"}, {TestResultType::Skip, 0.0}},
157
{{"MockCrashTestSuiteTest", "DISABLED_Crash"}, {TestResultType::Crash, 0.0}},
158
{{"MockCrashTestSuiteTest", "DISABLED_PassAfterCrash"}, {TestResultType::Pass, 0.0}},
159
{{"MockCrashTestSuiteTest", "DISABLED_SkipAfterCrash"}, {TestResultType::Skip, 0.0}},
160
};
161
162
EXPECT_EQ(expectedResults, actual.results);
163
}
164
165
// Normal passing test.
166
TEST(MockTestSuiteTest, DISABLED_Pass)
167
{
168
EXPECT_TRUE(true);
169
}
170
171
// Normal failing test.
172
TEST(MockTestSuiteTest, DISABLED_Fail)
173
{
174
EXPECT_TRUE(false);
175
}
176
177
// Trigger a test timeout.
178
TEST(MockTestSuiteTest, DISABLED_Timeout)
179
{
180
angle::Sleep(20000);
181
}
182
183
// Trigger a test skip.
184
TEST(MockTestSuiteTest, DISABLED_Skip)
185
{
186
GTEST_SKIP() << "Test skipped.";
187
}
188
189
// Trigger a flaky test failure.
190
TEST(MockFlakyTestSuiteTest, DISABLED_Flaky)
191
{
192
constexpr uint32_t kMaxTempDirLen = 100;
193
char tempDirName[kMaxTempDirLen * 2];
194
ASSERT_TRUE(GetTempDir(tempDirName, kMaxTempDirLen));
195
196
std::stringstream tempFNameStream;
197
tempFNameStream << tempDirName << GetPathSeparator() << "flaky_temp.txt";
198
std::string tempFileName = tempFNameStream.str();
199
200
int fails = 0;
201
{
202
FILE *fp = fopen(tempFileName.c_str(), "r");
203
if (fp)
204
{
205
ASSERT_EQ(fscanf(fp, "%d", &fails), 1);
206
fclose(fp);
207
}
208
}
209
210
if (fails >= kFlakyRetries - 1)
211
{
212
angle::DeleteFile(tempFileName.c_str());
213
}
214
else
215
{
216
EXPECT_TRUE(false);
217
218
FILE *fp = fopen(tempFileName.c_str(), "w");
219
ASSERT_NE(fp, nullptr);
220
221
fprintf(fp, "%d", fails + 1);
222
fclose(fp);
223
}
224
}
225
226
// Trigger a test crash.
227
TEST(MockCrashTestSuiteTest, DISABLED_Crash)
228
{
229
ANGLE_CRASH();
230
}
231
232
// This test runs after the crash test.
233
TEST(MockCrashTestSuiteTest, DISABLED_PassAfterCrash)
234
{
235
EXPECT_TRUE(true);
236
}
237
238
// This test runs after the crash test.
239
TEST(MockCrashTestSuiteTest, DISABLED_SkipAfterCrash)
240
{
241
GTEST_SKIP() << "Test skipped.";
242
}
243
} // namespace
244
245