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 // system_utils_unittest.cpp: Unit tests for ANGLE's system utility functions
7
8 #include "gmock/gmock.h"
9 #include "gtest/gtest.h"
10
11 #include "common/system_utils.h"
12 #include "util/test_utils.h"
13
14 #include <vector>
15
16 using namespace angle;
17
18 namespace
19 {
20 // Test getting the executable path
TEST(SystemUtils,ExecutablePath)21 TEST(SystemUtils, ExecutablePath)
22 {
23 // TODO: fuchsia support. http://anglebug.com/3161
24 #if !defined(ANGLE_PLATFORM_FUCHSIA)
25 std::string executablePath = GetExecutablePath();
26 EXPECT_NE("", executablePath);
27 #endif
28 }
29
30 // Test getting the executable directory
TEST(SystemUtils,ExecutableDir)31 TEST(SystemUtils, ExecutableDir)
32 {
33 // TODO: fuchsia support. http://anglebug.com/3161
34 #if !defined(ANGLE_PLATFORM_FUCHSIA)
35 std::string executableDir = GetExecutableDirectory();
36 EXPECT_NE("", executableDir);
37
38 std::string executablePath = GetExecutablePath();
39 EXPECT_LT(executableDir.size(), executablePath.size());
40 EXPECT_EQ(0, strncmp(executableDir.c_str(), executablePath.c_str(), executableDir.size()));
41 #endif
42 }
43
44 // Test setting environment variables
TEST(SystemUtils,Environment)45 TEST(SystemUtils, Environment)
46 {
47 constexpr char kEnvVarName[] = "UNITTEST_ENV_VARIABLE";
48 constexpr char kEnvVarValue[] = "The quick brown fox jumps over the lazy dog";
49
50 bool setEnvDone = SetEnvironmentVar(kEnvVarName, kEnvVarValue);
51 EXPECT_TRUE(setEnvDone);
52
53 std::string readback = GetEnvironmentVar(kEnvVarName);
54 EXPECT_EQ(kEnvVarValue, readback);
55
56 bool unsetEnvDone = UnsetEnvironmentVar(kEnvVarName);
57 EXPECT_TRUE(unsetEnvDone);
58
59 readback = GetEnvironmentVar(kEnvVarName);
60 EXPECT_EQ("", readback);
61 }
62
63 // Test CPU time measurement with a small operation
64 // (pretty much the measurement itself)
TEST(SystemUtils,CpuTimeSmallOp)65 TEST(SystemUtils, CpuTimeSmallOp)
66 {
67 double cpuTimeStart = GetCurrentProcessCpuTime();
68 double cpuTimeEnd = GetCurrentProcessCpuTime();
69 EXPECT_GE(cpuTimeEnd, cpuTimeStart);
70 }
71
72 // Test CPU time measurement with a sleepy operation
TEST(SystemUtils,CpuTimeSleepy)73 TEST(SystemUtils, CpuTimeSleepy)
74 {
75 double cpuTimeStart = GetCurrentProcessCpuTime();
76 angle::Sleep(1);
77 double cpuTimeEnd = GetCurrentProcessCpuTime();
78 EXPECT_GE(cpuTimeEnd, cpuTimeStart);
79 }
80
81 // Test CPU time measurement with a heavy operation
TEST(SystemUtils,CpuTimeHeavyOp)82 TEST(SystemUtils, CpuTimeHeavyOp)
83 {
84 constexpr size_t bufferSize = 1048576;
85 std::vector<uint8_t> buffer(bufferSize, 1);
86 double cpuTimeStart = GetCurrentProcessCpuTime();
87 memset(buffer.data(), 0, bufferSize);
88 double cpuTimeEnd = GetCurrentProcessCpuTime();
89 EXPECT_GE(cpuTimeEnd, cpuTimeStart);
90 }
91
92 #if defined(ANGLE_PLATFORM_POSIX)
TEST(SystemUtils,ConcatenatePathSimple)93 TEST(SystemUtils, ConcatenatePathSimple)
94 {
95 std::string path1 = "/this/is/path1";
96 std::string path2 = "this/is/path2";
97 std::string expected = "/this/is/path1/this/is/path2";
98 EXPECT_EQ(ConcatenatePath(path1, path2), expected);
99 }
100
TEST(SystemUtils,ConcatenatePath1Empty)101 TEST(SystemUtils, ConcatenatePath1Empty)
102 {
103 std::string path1 = "";
104 std::string path2 = "this/is/path2";
105 std::string expected = "this/is/path2";
106 EXPECT_EQ(ConcatenatePath(path1, path2), expected);
107 }
108
TEST(SystemUtils,ConcatenatePath2Empty)109 TEST(SystemUtils, ConcatenatePath2Empty)
110 {
111 std::string path1 = "/this/is/path1";
112 std::string path2 = "";
113 std::string expected = "/this/is/path1";
114 EXPECT_EQ(ConcatenatePath(path1, path2), expected);
115 }
116
TEST(SystemUtils,ConcatenatePath2FullPath)117 TEST(SystemUtils, ConcatenatePath2FullPath)
118 {
119 std::string path1 = "/this/is/path1";
120 std::string path2 = "/this/is/path2";
121 std::string expected = "/this/is/path2";
122 EXPECT_EQ(ConcatenatePath(path1, path2), expected);
123 }
124
TEST(SystemUtils,ConcatenatePathRedundantSeparators)125 TEST(SystemUtils, ConcatenatePathRedundantSeparators)
126 {
127 std::string path1 = "/this/is/path1/";
128 std::string path2 = "this/is/path2";
129 std::string expected = "/this/is/path1/this/is/path2";
130 EXPECT_EQ(ConcatenatePath(path1, path2), expected);
131 }
132
TEST(SystemUtils,IsFullPath)133 TEST(SystemUtils, IsFullPath)
134 {
135 std::string path1 = "/this/is/path1/";
136 std::string path2 = "this/is/path2";
137 EXPECT_TRUE(IsFullPath(path1));
138 EXPECT_FALSE(IsFullPath(path2));
139 }
140 #elif defined(ANGLE_PLATFORM_WINDOWS)
TEST(SystemUtils,ConcatenatePathSimple)141 TEST(SystemUtils, ConcatenatePathSimple)
142 {
143 std::string path1 = "C:\\this\\is\\path1";
144 std::string path2 = "this\\is\\path2";
145 std::string expected = "C:\\this\\is\\path1\\this\\is\\path2";
146 EXPECT_EQ(ConcatenatePath(path1, path2), expected);
147 }
148
TEST(SystemUtils,ConcatenatePath1Empty)149 TEST(SystemUtils, ConcatenatePath1Empty)
150 {
151 std::string path1 = "";
152 std::string path2 = "this\\is\\path2";
153 std::string expected = "this\\is\\path2";
154 EXPECT_EQ(ConcatenatePath(path1, path2), expected);
155 }
156
TEST(SystemUtils,ConcatenatePath2Empty)157 TEST(SystemUtils, ConcatenatePath2Empty)
158 {
159 std::string path1 = "C:\\this\\is\\path1";
160 std::string path2 = "";
161 std::string expected = "C:\\this\\is\\path1";
162 EXPECT_EQ(ConcatenatePath(path1, path2), expected);
163 }
164
TEST(SystemUtils,ConcatenatePath2FullPath)165 TEST(SystemUtils, ConcatenatePath2FullPath)
166 {
167 std::string path1 = "C:\\this\\is\\path1";
168 std::string path2 = "C:\\this\\is\\path2";
169 std::string expected = "C:\\this\\is\\path2";
170 EXPECT_EQ(ConcatenatePath(path1, path2), expected);
171 }
172
TEST(SystemUtils,ConcatenatePathRedundantSeparators)173 TEST(SystemUtils, ConcatenatePathRedundantSeparators)
174 {
175 std::string path1 = "C:\\this\\is\\path1\\";
176 std::string path2 = "this\\is\\path2";
177 std::string expected = "C:\\this\\is\\path1\\this\\is\\path2";
178 EXPECT_EQ(ConcatenatePath(path1, path2), expected);
179 }
180
TEST(SystemUtils,ConcatenatePathRedundantSeparators2)181 TEST(SystemUtils, ConcatenatePathRedundantSeparators2)
182 {
183 std::string path1 = "C:\\this\\is\\path1\\";
184 std::string path2 = "\\this\\is\\path2";
185 std::string expected = "C:\\this\\is\\path1\\this\\is\\path2";
186 EXPECT_EQ(ConcatenatePath(path1, path2), expected);
187 }
188
TEST(SystemUtils,ConcatenatePathRedundantSeparators3)189 TEST(SystemUtils, ConcatenatePathRedundantSeparators3)
190 {
191 std::string path1 = "C:\\this\\is\\path1";
192 std::string path2 = "\\this\\is\\path2";
193 std::string expected = "C:\\this\\is\\path1\\this\\is\\path2";
194 EXPECT_EQ(ConcatenatePath(path1, path2), expected);
195 }
196
TEST(SystemUtils,IsFullPath)197 TEST(SystemUtils, IsFullPath)
198 {
199 std::string path1 = "C:\\this\\is\\path1\\";
200 std::string path2 = "this\\is\\path2";
201 EXPECT_TRUE(IsFullPath(path1));
202 EXPECT_FALSE(IsFullPath(path2));
203 }
204 #endif
205
206 } // anonymous namespace
207