testtemplatedpathresolver.cpp
1 //------------------------------------------------------------------------------
2 // testtemplatedpathresolver.cpp
3 //------------------------------------------------------------------------------
4 //
5 // This library is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU Lesser General Public
7 // License as published by the Free Software Foundation; either
8 // version 2.1 of the License, or (at your option) any later version.
9 //
10 // This library is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 // Lesser General Public License for more details.
14 //
15 // You should have received a copy of the GNU Lesser General Public
16 // License along with this library; if not, write to the Free Software
17 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18 // 02110-1301 USA
19 //
20 //------------------------------------------------------------------------------
21 // Copyright (C) 2010 "Zalewa" <zalewapl@gmail.com>
22 //------------------------------------------------------------------------------
23 #include "testtemplatedpathresolver.h"
24 
25 #include "templatedpathresolver.h"
26 #include "strings.hpp"
27 
28 #include <QCoreApplication>
29 #include <QDir>
30 #include <QProcessEnvironment>
31 
32 #ifdef Q_OS_UNIX
33 #include <sys/types.h>
34 #include <pwd.h>
35 #endif
36 
37 TestTemplatedPathResolver::TestTemplatedPathResolver()
38  : TestUnitBase("Templated Path Resolver")
39 {
40 }
41 
42 bool TestTemplatedPathResolver::executeTest()
43 {
44  TemplatedPathResolver resolver;
45  resolver.setEnvVarsEnabled(true);
46  resolver.setProgdirEnabled(true);
47  resolver.setUserHomeEnabled(true);
48 
49  // PROGDIR
50  const QString PROGDIR_VALUE = "this env. var should be ignored";
51  qputenv("PROGDIR", PROGDIR_VALUE.toUtf8());
52  QString exeLocation = QCoreApplication::applicationDirPath();
53  if (resolver.resolve("$PROGDIR") != exeLocation)
54  {
55  testLog << QString("simple $PROGDIR resolution failure: %1 != %2")
56  .arg(resolver.resolve("$PROGDIR"), exeLocation);
57  return false;
58  }
59 
60  // PROGDIR suffixed
61  if (resolver.resolve("$PROGDIR/logs") != Strings::combinePaths(exeLocation, "logs"))
62  {
63  testLog << QString("suffixed $PROGDIR resolution failure: %1 != %2")
64  .arg(resolver.resolve("$PROGDIR/logs"), Strings::combinePaths(exeLocation, "logs"));
65  return false;
66  }
67 
68  // Do resolve PROGDIR in the middle of the path, even if it's wrong
69  if (resolver.resolve("/home/alice/$PROGDIR/logs") != "/home/alice/"
70  + Strings::combinePaths(exeLocation, "logs"))
71  {
72  testLog << QString("$PROGDIR in the middle of the path failure: %1 != %2")
73  .arg(resolver.resolve("/home/alice/$PROGDIR/logs"),
74  "/home/alice/" + Strings::combinePaths(exeLocation, "logs"));
75  return false;
76  }
77 
78  // Just home
79  if (resolver.resolve("~") != QDir::homePath())
80  {
81  testLog << QString("Home resolution failed: %1 != %2")
82  .arg(resolver.resolve("~"), QDir::homePath());
83  return false;
84  }
85 
86 #ifdef DOOMSEEKER_TEMPLATED_PATH_RESOLVER_TILDEUSER
87  // Home of someone else
88  const struct passwd *pwent = getpwnam("root");
89  if (pwent == nullptr)
90  {
91  testLog << "Unable to retrieve home dir for root";
92  return false;
93  }
94  const QString rootHome = pwent->pw_dir;
95  if (resolver.resolve("~root") != rootHome)
96  {
97  testLog << QString("Home resolution of root failed: %1 != %2")
98  .arg(resolver.resolve("~root"), rootHome);
99  return false;
100  }
101  if (resolver.resolve("~root/") != rootHome + "/")
102  {
103  testLog << QString("Home resolution of root/ failed: %1 != %2")
104  .arg(resolver.resolve("~root/"), rootHome + "/");
105  return false;
106  }
107  if (resolver.resolve("~root/extra/more") != rootHome + "/extra/more")
108  {
109  testLog << QString("Home resolution of root/extra failed: %1 != %2")
110  .arg(resolver.resolve("~root/extra/more"), rootHome + "/extra/more");
111  return false;
112  }
113 
114  // Home of user who doesn't exist
115  QString noUser = "~noUser";
116  while (getpwnam(noUser.toLatin1().constData()) != nullptr)
117  {
118  noUser += "1";
119  }
120  if (resolver.resolve(noUser) != noUser)
121  {
122  testLog << QString("Home resolution of user who doesn't exist failed: %1 != %2")
123  .arg(resolver.resolve(noUser), noUser);
124  return false;
125  }
126  noUser += "/";
127  if (resolver.resolve(noUser) != noUser)
128  {
129  testLog << QString("Home resolution of user who doesn't exist with / failed: %1 != %2")
130  .arg(resolver.resolve(noUser), noUser);
131  return false;
132  }
133  noUser += "extra";
134  if (resolver.resolve(noUser) != noUser)
135  {
136  testLog << QString("Home resolution of user who doesn't exist with /extra failed: %1 != %2")
137  .arg(resolver.resolve(noUser), noUser);
138  return false;
139  }
140 #else
141  const QString noUser = "~guest/stuff";
142  if (resolver.resolve(noUser) != noUser)
143  {
144  testLog << QString("Home resolution of a named user failed: %1 != %2")
145  .arg(resolver.resolve(noUser), noUser);
146  return false;
147  }
148 #endif
149 
150  // Complex resolution
151  qputenv("G00dV4r", "/data/is/mine");
152  qputenv("an0ther", "ok");
153  {
154  QString templated = "~/logs/$an0ther/$G00dV4r/$an0ther/$badvar44/done";
155  QString expected = QDir::homePath() + "/logs/ok//data/is/mine/ok//done";
156  if (resolver.resolve(templated) != expected)
157  {
158  testLog << QString("complex env resolution failure: %1 != %2")
159  .arg(resolver.resolve(templated), expected);
160  return false;
161  }
162  }
163 
164  // Variable which name starts with PROGDIR
165  qputenv("PROGDIRECTORY", "some/folder");
166  if (resolver.resolve("$PROGDIRECTORY/logs") != "some/folder/logs")
167  {
168  testLog << QString("$PROGDIRECTORY resolution failure: %1 != %2")
169  .arg(resolver.resolve("$PROGDIRECTORY/logs"), "some/folder/logs");
170  return false;
171  }
172 
173  // Now meddle a bit with the settings.
174 
175  // Env vars disabled.
176  resolver.setEnvVarsEnabled(false);
177  qputenv("PROGDIRECTORY", "some/folder");
178  if (resolver.resolve("$PROGDIRECTORY/logs") != "$PROGDIRECTORY/logs")
179  {
180  testLog << QString("Env disabled - $PROGDIRECTORY should not be resolved: %1 != %2")
181  .arg(resolver.resolve("$PROGDIRECTORY/logs"), "$PROGDIRECTORY/logs");
182  return false;
183  }
184  if (resolver.resolve("$PROGDIR") != exeLocation)
185  {
186  testLog << QString("Env disabled - $PROGDIR should still be resolved: %1 != %2")
187  .arg(resolver.resolve("$PROGDIR"), exeLocation);
188  return false;
189  }
190 
191  // Progdir disabled.
192  resolver.setEnvVarsEnabled(true);
193  resolver.setProgdirEnabled(false);
194  qputenv("PROGDIRECTORY", "some/folder");
195  if (resolver.resolve("$PROGDIRECTORY/logs") != "some/folder/logs")
196  {
197  testLog << QString("$PROGDIR disabled - $PROGDIRECTORY should still be resolved: %1 != %2")
198  .arg(resolver.resolve("$PROGDIRECTORY/logs"), "some/folder/logs");
199  return false;
200  }
201  if (resolver.resolve("$PROGDIR") != PROGDIR_VALUE)
202  {
203  testLog << QString("$PROGDIR disabled - $PROGDIR should still be resolved: %1 != %2")
204  .arg(resolver.resolve("$PROGDIR"), PROGDIR_VALUE);
205  return false;
206  }
207 
208  // Both env and progdir disabled.
209  resolver.setEnvVarsEnabled(false);
210  resolver.setProgdirEnabled(false);
211 
212  qputenv("PROGDIRECTORY", "some/folder");
213  if (resolver.resolve("$PROGDIRECTORY/logs") != "$PROGDIRECTORY/logs")
214  {
215  testLog << QString("$PROGDIR and env disabled - $PROGDIRECTORY should not be resolved: %1 != %2")
216  .arg(resolver.resolve("$PROGDIRECTORY/logs"), "$PROGDIRECTORY/logs");
217  return false;
218  }
219  if (resolver.resolve("$PROGDIR") != "$PROGDIR")
220  {
221  testLog << QString("$PROGDIR and env disabled - $PROGDIR should not be resolved: %1 != %2")
222  .arg(resolver.resolve("$PROGDIR"), "$PROGDIR");
223  return false;
224  }
225 
226  // User home disabled.
227  resolver.setEnvVarsEnabled(true);
228  resolver.setProgdirEnabled(true);
229  resolver.setUserHomeEnabled(false);
230  if (resolver.resolve("~") != "~")
231  {
232  testLog << QString("Home resolution disabled - ~ failed: %1 != %2")
233  .arg(resolver.resolve("~"), "~");
234  return false;
235  }
236 
237  if (resolver.resolve("~root") != "~root")
238  {
239  testLog << QString("Home resolution disabled - ~root failed: %1 != %2")
240  .arg(resolver.resolve("~root"), "~root");
241  return false;
242  }
243 
244  // All disabled.
245  resolver.setEnvVarsEnabled(false);
246  resolver.setProgdirEnabled(false);
247  resolver.setUserHomeEnabled(false);
248 
249  qputenv("PROGDIRECTORY", "some/folder");
250  if (resolver.resolve("~/$PROGDIR/$PROGDIRECTORY/log.txt") != "~/$PROGDIR/$PROGDIRECTORY/log.txt")
251  {
252  testLog << QString("All disabled failed: %1 != %2")
253  .arg(resolver.resolve("~/$PROGDIR/$PROGDIRECTORY/log.txt"), "~/$PROGDIR/$PROGDIRECTORY/log.txt");
254  return false;
255  }
256 
257  return true;
258 }