• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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