1 // Copyright 2010 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/nix/xdg_util.h"
6
7 #include "base/base_paths.h"
8 #include "base/environment.h"
9 #include "base/files/file_path.h"
10 #include "base/test/scoped_path_override.h"
11 #include "testing/gmock/include/gmock/gmock.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13
14 using ::testing::_;
15 using ::testing::DoAll;
16 using ::testing::Eq;
17 using ::testing::Return;
18 using ::testing::SetArgPointee;
19
20 namespace base {
21 namespace nix {
22
23 namespace {
24
25 class MockEnvironment : public Environment {
26 public:
27 MOCK_METHOD2(GetVar, bool(StringPiece, std::string* result));
28 MOCK_METHOD2(SetVar, bool(StringPiece, const std::string& new_value));
29 MOCK_METHOD1(UnSetVar, bool(StringPiece));
30 };
31
32 // Needs to be const char* to make gmock happy.
33 const char* const kDesktopGnome = "gnome";
34 const char* const kDesktopGnomeFallback = "gnome-fallback";
35 const char* const kDesktopMATE = "mate";
36 const char* const kDesktopKDE4 = "kde4";
37 const char* const kDesktopKDE = "kde";
38 const char* const kDesktopXFCE = "xfce";
39 const char* const kXdgDesktopCinnamon = "X-Cinnamon";
40 const char* const kXdgDesktopDeepin = "Deepin";
41 const char* const kXdgDesktopGNOME = "GNOME";
42 const char* const kXdgDesktopGNOMEClassic = "GNOME:GNOME-Classic";
43 const char* const kXdgDesktopKDE = "KDE";
44 const char* const kXdgDesktopPantheon = "Pantheon";
45 const char* const kXdgDesktopUKUI = "UKUI";
46 const char* const kXdgDesktopUnity = "Unity";
47 const char* const kXdgDesktopUnity7 = "Unity:Unity7";
48 const char* const kXdgDesktopUnity8 = "Unity:Unity8";
49 const char* const kKDESessionKDE5 = "5";
50 const char* const kKDESessionKDE6 = "6";
51
52 const char kDesktopSession[] = "DESKTOP_SESSION";
53 const char kKDESession[] = "KDE_SESSION_VERSION";
54
55 const char* const kSessionUnknown = "invalid session";
56 const char* const kSessionUnspecified = "unspecified";
57 const char* const kSessionTty = "tty";
58 const char* const kSessionMir = "mir";
59 const char* const kSessionX11 = "x11";
60 const char* const kSessionWayland = "wayland";
61 const char* const kSessionWaylandCapital = "Wayland";
62 const char* const kSessionWaylandWhitespace = "wayland ";
63
64 // This helps EXPECT_THAT(..., ElementsAre(...)) print out more meaningful
65 // failure messages.
FilePathsToStrings(const std::vector<base::FilePath> & paths)66 std::vector<std::string> FilePathsToStrings(
67 const std::vector<base::FilePath>& paths) {
68 std::vector<std::string> values;
69 for (const auto& path : paths) {
70 values.push_back(path.value());
71 }
72 return values;
73 }
74
75 } // namespace
76
TEST(XDGUtilTest,GetXDGDataWriteLocation)77 TEST(XDGUtilTest, GetXDGDataWriteLocation) {
78 // Test that it returns $XDG_DATA_HOME.
79 {
80 MockEnvironment getter;
81 EXPECT_CALL(getter, GetVar(Eq("XDG_DATA_HOME"), _))
82 .WillOnce(DoAll(SetArgPointee<1>("/user/path"), Return(true)));
83
84 ScopedPathOverride home_override(DIR_HOME, FilePath("/home/user"),
85 /*is_absolute=*/true, /*create=*/false);
86 FilePath path = GetXDGDataWriteLocation(&getter);
87 EXPECT_EQ("/user/path", path.value());
88 }
89
90 // Test that $XDG_DATA_HOME falls back to $HOME/.local/share.
91 {
92 MockEnvironment getter;
93 EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
94 ScopedPathOverride home_override(DIR_HOME, FilePath("/home/user"),
95 /*is_absolute=*/true, /*create=*/false);
96 FilePath path = GetXDGDataWriteLocation(&getter);
97 EXPECT_EQ("/home/user/.local/share", path.value());
98 }
99 }
100
TEST(XDGUtilTest,GetXDGDataSearchLocations)101 TEST(XDGUtilTest, GetXDGDataSearchLocations) {
102 // Test that it returns $XDG_DATA_HOME + $XDG_DATA_DIRS.
103 {
104 MockEnvironment getter;
105 EXPECT_CALL(getter, GetVar(Eq("XDG_DATA_HOME"), _))
106 .WillOnce(DoAll(SetArgPointee<1>("/user/path"), Return(true)));
107 EXPECT_CALL(getter, GetVar(Eq("XDG_DATA_DIRS"), _))
108 .WillOnce(DoAll(SetArgPointee<1>("/system/path/1:/system/path/2"),
109 Return(true)));
110 ScopedPathOverride home_override(DIR_HOME, FilePath("/home/user"),
111 /*is_absolute=*/true, /*create=*/false);
112 EXPECT_THAT(
113 FilePathsToStrings(GetXDGDataSearchLocations(&getter)),
114 testing::ElementsAre("/user/path", "/system/path/1", "/system/path/2"));
115 }
116
117 // Test that $XDG_DATA_HOME falls back to $HOME/.local/share.
118 {
119 MockEnvironment getter;
120 EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
121 EXPECT_CALL(getter, GetVar(Eq("XDG_DATA_DIRS"), _))
122 .WillOnce(DoAll(SetArgPointee<1>("/system/path/1:/system/path/2"),
123 Return(true)));
124
125 ScopedPathOverride home_override(DIR_HOME, FilePath("/home/user"),
126 /*is_absolute=*/true, /*create=*/false);
127 EXPECT_THAT(FilePathsToStrings(GetXDGDataSearchLocations(&getter)),
128 testing::ElementsAre("/home/user/.local/share",
129 "/system/path/1", "/system/path/2"));
130 }
131
132 // Test that if neither $XDG_DATA_HOME nor $HOME are specified, it still
133 // succeeds.
134 {
135 MockEnvironment getter;
136 EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
137 EXPECT_CALL(getter, GetVar(Eq("XDG_DATA_DIRS"), _))
138 .WillOnce(DoAll(SetArgPointee<1>("/system/path/1:/system/path/2"),
139 Return(true)));
140 std::vector<std::string> results =
141 FilePathsToStrings(GetXDGDataSearchLocations(&getter));
142 ASSERT_EQ(3U, results.size());
143 EXPECT_FALSE(results[0].empty());
144 EXPECT_EQ("/system/path/1", results[1]);
145 EXPECT_EQ("/system/path/2", results[2]);
146 }
147
148 // Test that $XDG_DATA_DIRS falls back to the two default paths.
149 {
150 MockEnvironment getter;
151 EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
152 EXPECT_CALL(getter, GetVar(Eq("XDG_DATA_HOME"), _))
153 .WillOnce(DoAll(SetArgPointee<1>("/user/path"), Return(true)));
154 ScopedPathOverride home_override(DIR_HOME, FilePath("/home/user"),
155 /*is_absolute=*/true, /*create=*/false);
156 EXPECT_THAT(
157 FilePathsToStrings(GetXDGDataSearchLocations(&getter)),
158 testing::ElementsAre("/user/path", "/usr/local/share", "/usr/share"));
159 }
160 }
161
TEST(XDGUtilTest,GetDesktopEnvironmentGnome)162 TEST(XDGUtilTest, GetDesktopEnvironmentGnome) {
163 MockEnvironment getter;
164 EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
165 EXPECT_CALL(getter, GetVar(Eq(kDesktopSession), _))
166 .WillOnce(DoAll(SetArgPointee<1>(kDesktopGnome), Return(true)));
167
168 EXPECT_EQ(DESKTOP_ENVIRONMENT_GNOME, GetDesktopEnvironment(&getter));
169 }
170
TEST(XDGUtilTest,GetDesktopEnvironmentMATE)171 TEST(XDGUtilTest, GetDesktopEnvironmentMATE) {
172 MockEnvironment getter;
173 EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
174 EXPECT_CALL(getter, GetVar(Eq(kDesktopSession), _))
175 .WillOnce(DoAll(SetArgPointee<1>(kDesktopMATE), Return(true)));
176
177 EXPECT_EQ(DESKTOP_ENVIRONMENT_GNOME, GetDesktopEnvironment(&getter));
178 }
179
TEST(XDGUtilTest,GetDesktopEnvironmentKDE4)180 TEST(XDGUtilTest, GetDesktopEnvironmentKDE4) {
181 MockEnvironment getter;
182 EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
183 EXPECT_CALL(getter, GetVar(Eq(kDesktopSession), _))
184 .WillOnce(DoAll(SetArgPointee<1>(kDesktopKDE4), Return(true)));
185
186 EXPECT_EQ(DESKTOP_ENVIRONMENT_KDE4, GetDesktopEnvironment(&getter));
187 }
188
TEST(XDGUtilTest,GetDesktopEnvironmentKDE3)189 TEST(XDGUtilTest, GetDesktopEnvironmentKDE3) {
190 MockEnvironment getter;
191 EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
192 EXPECT_CALL(getter, GetVar(Eq(kDesktopSession), _))
193 .WillOnce(DoAll(SetArgPointee<1>(kDesktopKDE), Return(true)));
194
195 EXPECT_EQ(DESKTOP_ENVIRONMENT_KDE3, GetDesktopEnvironment(&getter));
196 }
197
TEST(XDGUtilTest,GetDesktopEnvironmentXFCE)198 TEST(XDGUtilTest, GetDesktopEnvironmentXFCE) {
199 MockEnvironment getter;
200 EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
201 EXPECT_CALL(getter, GetVar(Eq(kDesktopSession), _))
202 .WillOnce(DoAll(SetArgPointee<1>(kDesktopXFCE), Return(true)));
203
204 EXPECT_EQ(DESKTOP_ENVIRONMENT_XFCE, GetDesktopEnvironment(&getter));
205 }
206
TEST(XDGUtilTest,GetXdgDesktopCinnamon)207 TEST(XDGUtilTest, GetXdgDesktopCinnamon) {
208 MockEnvironment getter;
209 EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
210 EXPECT_CALL(getter, GetVar(Eq(kXdgCurrentDesktopEnvVar), _))
211 .WillOnce(DoAll(SetArgPointee<1>(kXdgDesktopCinnamon), Return(true)));
212
213 EXPECT_EQ(DESKTOP_ENVIRONMENT_CINNAMON, GetDesktopEnvironment(&getter));
214 }
215
TEST(XDGUtilTest,GetXdgDesktopDeepin)216 TEST(XDGUtilTest, GetXdgDesktopDeepin) {
217 MockEnvironment getter;
218 EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
219 EXPECT_CALL(getter, GetVar(Eq(kXdgCurrentDesktopEnvVar), _))
220 .WillOnce(DoAll(SetArgPointee<1>(kXdgDesktopDeepin), Return(true)));
221
222 EXPECT_EQ(DESKTOP_ENVIRONMENT_DEEPIN, GetDesktopEnvironment(&getter));
223 }
224
TEST(XDGUtilTest,GetXdgDesktopGnome)225 TEST(XDGUtilTest, GetXdgDesktopGnome) {
226 MockEnvironment getter;
227 EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
228 EXPECT_CALL(getter, GetVar(Eq(kXdgCurrentDesktopEnvVar), _))
229 .WillOnce(DoAll(SetArgPointee<1>(kXdgDesktopGNOME), Return(true)));
230
231 EXPECT_EQ(DESKTOP_ENVIRONMENT_GNOME, GetDesktopEnvironment(&getter));
232 }
233
TEST(XDGUtilTest,GetXdgDesktopGnomeClassic)234 TEST(XDGUtilTest, GetXdgDesktopGnomeClassic) {
235 MockEnvironment getter;
236 EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
237 EXPECT_CALL(getter, GetVar(Eq(kXdgCurrentDesktopEnvVar), _))
238 .WillOnce(DoAll(SetArgPointee<1>(kXdgDesktopGNOMEClassic), Return(true)));
239
240 EXPECT_EQ(DESKTOP_ENVIRONMENT_GNOME, GetDesktopEnvironment(&getter));
241 }
242
TEST(XDGUtilTest,GetXdgDesktopGnomeFallback)243 TEST(XDGUtilTest, GetXdgDesktopGnomeFallback) {
244 MockEnvironment getter;
245 EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
246 EXPECT_CALL(getter, GetVar(Eq(kXdgCurrentDesktopEnvVar), _))
247 .WillOnce(DoAll(SetArgPointee<1>(kXdgDesktopUnity), Return(true)));
248 EXPECT_CALL(getter, GetVar(Eq(kDesktopSession), _))
249 .WillOnce(DoAll(SetArgPointee<1>(kDesktopGnomeFallback), Return(true)));
250
251 EXPECT_EQ(DESKTOP_ENVIRONMENT_GNOME, GetDesktopEnvironment(&getter));
252 }
253
TEST(XDGUtilTest,GetXdgDesktopKDE5)254 TEST(XDGUtilTest, GetXdgDesktopKDE5) {
255 MockEnvironment getter;
256 EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
257 EXPECT_CALL(getter, GetVar(Eq(kXdgCurrentDesktopEnvVar), _))
258 .WillOnce(DoAll(SetArgPointee<1>(kXdgDesktopKDE), Return(true)));
259 EXPECT_CALL(getter, GetVar(Eq(kKDESession), _))
260 .WillOnce(DoAll(SetArgPointee<1>(kKDESessionKDE5), Return(true)));
261
262 EXPECT_EQ(DESKTOP_ENVIRONMENT_KDE5, GetDesktopEnvironment(&getter));
263 }
264
TEST(XDGUtilTest,GetXdgDesktopKDE6)265 TEST(XDGUtilTest, GetXdgDesktopKDE6) {
266 MockEnvironment getter;
267 EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
268 EXPECT_CALL(getter, GetVar(Eq(kXdgCurrentDesktopEnvVar), _))
269 .WillOnce(DoAll(SetArgPointee<1>(kXdgDesktopKDE), Return(true)));
270 EXPECT_CALL(getter, GetVar(Eq(kKDESession), _))
271 .WillOnce(DoAll(SetArgPointee<1>(kKDESessionKDE6), Return(true)));
272
273 EXPECT_EQ(DESKTOP_ENVIRONMENT_KDE6, GetDesktopEnvironment(&getter));
274 }
275
TEST(XDGUtilTest,GetXdgDesktopKDE4)276 TEST(XDGUtilTest, GetXdgDesktopKDE4) {
277 MockEnvironment getter;
278 EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
279 EXPECT_CALL(getter, GetVar(Eq(kXdgCurrentDesktopEnvVar), _))
280 .WillOnce(DoAll(SetArgPointee<1>(kXdgDesktopKDE), Return(true)));
281
282 EXPECT_EQ(DESKTOP_ENVIRONMENT_KDE4, GetDesktopEnvironment(&getter));
283 }
284
TEST(XDGUtilTest,GetXdgDesktopPantheon)285 TEST(XDGUtilTest, GetXdgDesktopPantheon) {
286 MockEnvironment getter;
287 EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
288 EXPECT_CALL(getter, GetVar(Eq(kXdgCurrentDesktopEnvVar), _))
289 .WillOnce(DoAll(SetArgPointee<1>(kXdgDesktopPantheon), Return(true)));
290
291 EXPECT_EQ(DESKTOP_ENVIRONMENT_PANTHEON, GetDesktopEnvironment(&getter));
292 }
293
TEST(XDGUtilTest,GetXdgDesktopUKUI)294 TEST(XDGUtilTest, GetXdgDesktopUKUI) {
295 MockEnvironment getter;
296 EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
297 EXPECT_CALL(getter, GetVar(Eq(kXdgCurrentDesktopEnvVar), _))
298 .WillOnce(DoAll(SetArgPointee<1>(kXdgDesktopUKUI), Return(true)));
299
300 EXPECT_EQ(DESKTOP_ENVIRONMENT_UKUI, GetDesktopEnvironment(&getter));
301 }
302
TEST(XDGUtilTest,GetXdgDesktopUnity)303 TEST(XDGUtilTest, GetXdgDesktopUnity) {
304 MockEnvironment getter;
305 EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
306 EXPECT_CALL(getter, GetVar(Eq(kXdgCurrentDesktopEnvVar), _))
307 .WillOnce(DoAll(SetArgPointee<1>(kXdgDesktopUnity), Return(true)));
308
309 EXPECT_EQ(DESKTOP_ENVIRONMENT_UNITY, GetDesktopEnvironment(&getter));
310 }
311
TEST(XDGUtilTest,GetXdgDesktopUnity7)312 TEST(XDGUtilTest, GetXdgDesktopUnity7) {
313 MockEnvironment getter;
314 EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
315 EXPECT_CALL(getter, GetVar(Eq(kXdgCurrentDesktopEnvVar), _))
316 .WillOnce(DoAll(SetArgPointee<1>(kXdgDesktopUnity7), Return(true)));
317
318 EXPECT_EQ(DESKTOP_ENVIRONMENT_UNITY, GetDesktopEnvironment(&getter));
319 }
320
TEST(XDGUtilTest,GetXdgDesktopUnity8)321 TEST(XDGUtilTest, GetXdgDesktopUnity8) {
322 MockEnvironment getter;
323 EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
324 EXPECT_CALL(getter, GetVar(Eq(kXdgCurrentDesktopEnvVar), _))
325 .WillOnce(DoAll(SetArgPointee<1>(kXdgDesktopUnity8), Return(true)));
326
327 EXPECT_EQ(DESKTOP_ENVIRONMENT_UNITY, GetDesktopEnvironment(&getter));
328 }
329
TEST(XDGUtilTest,GetXdgSessiontypeUnset)330 TEST(XDGUtilTest, GetXdgSessiontypeUnset) {
331 MockEnvironment getter;
332 EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
333
334 EXPECT_EQ(SessionType::kUnset, GetSessionType(getter));
335 }
336
TEST(XDGUtilTest,GetXdgSessionTypeOther)337 TEST(XDGUtilTest, GetXdgSessionTypeOther) {
338 MockEnvironment getter;
339 EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
340 EXPECT_CALL(getter, GetVar(Eq(kXdgSessionTypeEnvVar), _))
341 .WillOnce(DoAll(SetArgPointee<1>(kSessionUnknown), Return(true)));
342
343 EXPECT_EQ(SessionType::kOther, GetSessionType(getter));
344 }
345
TEST(XDGUtilTest,GetXdgSessionTypeUnspecified)346 TEST(XDGUtilTest, GetXdgSessionTypeUnspecified) {
347 MockEnvironment getter;
348 EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
349 EXPECT_CALL(getter, GetVar(Eq(kXdgSessionTypeEnvVar), _))
350 .WillOnce(DoAll(SetArgPointee<1>(kSessionUnspecified), Return(true)));
351
352 EXPECT_EQ(SessionType::kUnspecified, GetSessionType(getter));
353 }
354
TEST(XDGUtilTest,GetXdgSessionTypeTty)355 TEST(XDGUtilTest, GetXdgSessionTypeTty) {
356 MockEnvironment getter;
357 EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
358 EXPECT_CALL(getter, GetVar(Eq(kXdgSessionTypeEnvVar), _))
359 .WillOnce(DoAll(SetArgPointee<1>(kSessionTty), Return(true)));
360
361 EXPECT_EQ(SessionType::kTty, GetSessionType(getter));
362 }
363
TEST(XDGUtilTest,GetXdgSessionTypeMir)364 TEST(XDGUtilTest, GetXdgSessionTypeMir) {
365 MockEnvironment getter;
366 EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
367 EXPECT_CALL(getter, GetVar(Eq(kXdgSessionTypeEnvVar), _))
368 .WillOnce(DoAll(SetArgPointee<1>(kSessionMir), Return(true)));
369
370 EXPECT_EQ(SessionType::kMir, GetSessionType(getter));
371 }
372
TEST(XDGUtilTest,GetXdgSessionTypeX11)373 TEST(XDGUtilTest, GetXdgSessionTypeX11) {
374 MockEnvironment getter;
375 EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
376 EXPECT_CALL(getter, GetVar(Eq(kXdgSessionTypeEnvVar), _))
377 .WillOnce(DoAll(SetArgPointee<1>(kSessionX11), Return(true)));
378
379 EXPECT_EQ(SessionType::kX11, GetSessionType(getter));
380 }
381
TEST(XDGUtilTest,GetXdgSessionTypeWayland)382 TEST(XDGUtilTest, GetXdgSessionTypeWayland) {
383 MockEnvironment getter;
384 EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
385 EXPECT_CALL(getter, GetVar(Eq(kXdgSessionTypeEnvVar), _))
386 .WillOnce(DoAll(SetArgPointee<1>(kSessionWayland), Return(true)));
387
388 EXPECT_EQ(SessionType::kWayland, GetSessionType(getter));
389 }
390
TEST(XDGUtilTest,GetXdgSessionTypeWaylandCapital)391 TEST(XDGUtilTest, GetXdgSessionTypeWaylandCapital) {
392 MockEnvironment getter;
393 EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
394 EXPECT_CALL(getter, GetVar(Eq(kXdgSessionTypeEnvVar), _))
395 .WillOnce(DoAll(SetArgPointee<1>(kSessionWaylandCapital), Return(true)));
396
397 EXPECT_EQ(SessionType::kWayland, GetSessionType(getter));
398 }
399
TEST(XDGUtilTest,GetXdgSessionTypeWaylandWhitespace)400 TEST(XDGUtilTest, GetXdgSessionTypeWaylandWhitespace) {
401 MockEnvironment getter;
402 EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
403 EXPECT_CALL(getter, GetVar(Eq(kXdgSessionTypeEnvVar), _))
404 .WillOnce(
405 DoAll(SetArgPointee<1>(kSessionWaylandWhitespace), Return(true)));
406
407 EXPECT_EQ(SessionType::kWayland, GetSessionType(getter));
408 }
409
410 } // namespace nix
411 } // namespace base
412