VirtualBox

source: vbox/trunk/src/VBox/Runtime/testcase/tstRTPath.cpp@ 44615

Last change on this file since 44615 was 44615, checked in by vboxsync, 12 years ago

Runtime/path: Add RTPathCreateRelative to create a relative path between two absolute ones

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 24.6 KB
Line 
1/* $Id: tstRTPath.cpp 44615 2013-02-10 18:10:50Z vboxsync $ */
2/** @file
3 * IPRT Testcase - Test various path functions.
4 */
5
6/*
7 * Copyright (C) 2006-2011 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * The contents of this file may alternatively be used under the terms
18 * of the Common Development and Distribution License Version 1.0
19 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20 * VirtualBox OSE distribution, in which case the provisions of the
21 * CDDL are applicable instead of those of the GPL.
22 *
23 * You may elect to license modified versions of this file under the
24 * terms and conditions of either the GPL or the CDDL or both.
25 */
26
27/*******************************************************************************
28* Header Files *
29*******************************************************************************/
30#include <iprt/path.h>
31
32#include <iprt/err.h>
33#include <iprt/initterm.h>
34#include <iprt/param.h>
35#include <iprt/process.h>
36#include <iprt/stream.h>
37#include <iprt/string.h>
38#include <iprt/test.h>
39
40
41int main()
42{
43 char szPath[RTPATH_MAX];
44
45 /*
46 * Init RT+Test.
47 */
48 RTTEST hTest;
49 int rc = RTTestInitAndCreate("tstRTPath", &hTest);
50 if (rc)
51 return rc;
52 RTTestBanner(hTest);
53
54 /*
55 * RTPathExecDir, RTPathUserHome and RTProcGetExecutablePath.
56 */
57 RTTestSub(hTest, "RTPathExecDir");
58 RTTESTI_CHECK_RC(rc = RTPathExecDir(szPath, sizeof(szPath)), VINF_SUCCESS);
59 if (RT_SUCCESS(rc))
60 RTTestIPrintf(RTTESTLVL_INFO, "ExecDir={%s}\n", szPath);
61
62 RTTestSub(hTest, "RTProcGetExecutablePath");
63 if (RTProcGetExecutablePath(szPath, sizeof(szPath)) == szPath)
64 RTTestIPrintf(RTTESTLVL_INFO, "ExecutableName={%s}\n", szPath);
65 else
66 RTTestIFailed("RTProcGetExecutablePath -> NULL");
67
68 RTTestSub(hTest, "RTPathUserHome");
69 RTTESTI_CHECK_RC(rc = RTPathUserHome(szPath, sizeof(szPath)), VINF_SUCCESS);
70 if (RT_SUCCESS(rc))
71 RTTestIPrintf(RTTESTLVL_INFO, "UserHome={%s}\n", szPath);
72
73 RTTestSub(hTest, "RTPathUserDocuments");
74 RTTESTI_CHECK_RC(rc = RTPathUserDocuments(szPath, sizeof(szPath)), VINF_SUCCESS);
75 if (RT_SUCCESS(rc))
76 RTTestIPrintf(RTTESTLVL_INFO, "UserDocuments={%s}\n", szPath);
77
78 RTTestSub(hTest, "RTPathTemp");
79 RTTESTI_CHECK_RC(rc = RTPathTemp(szPath, sizeof(szPath)), VINF_SUCCESS);
80 if (RT_SUCCESS(rc))
81 RTTestIPrintf(RTTESTLVL_INFO, "PathTemp={%s}\n", szPath);
82 size_t cch = strlen(szPath);
83 RTTESTI_CHECK_RC(RTPathTemp(szPath, cch), VERR_BUFFER_OVERFLOW);
84 RTTESTI_CHECK_RC(RTPathTemp(szPath, cch+1), VINF_SUCCESS);
85 RTTESTI_CHECK_RC(RTPathTemp(szPath, cch+2), VINF_SUCCESS);
86
87
88 /*
89 * RTPathAbsEx
90 */
91 RTTestSub(hTest, "RTPathAbsEx");
92 static const struct
93 {
94 const char *pcszInputBase;
95 const char *pcszInputPath;
96 int rc;
97 const char *pcszOutput;
98 }
99 s_aRTPathAbsExTests[] =
100 {
101#if defined (RT_OS_OS2) || defined (RT_OS_WINDOWS)
102 { NULL, "", VERR_INVALID_PARAMETER, NULL },
103 { NULL, ".", VINF_SUCCESS, "%p" },
104 { NULL, "\\", VINF_SUCCESS, "%d\\" },
105 { NULL, "\\..", VINF_SUCCESS, "%d\\" },
106 { NULL, "/absolute/..", VINF_SUCCESS, "%d\\" },
107 { NULL, "/absolute\\\\../..", VINF_SUCCESS, "%d\\" },
108 { NULL, "/absolute//../path\\", VINF_SUCCESS, "%d\\path" },
109 { NULL, "/absolute/../../path", VINF_SUCCESS, "%d\\path" },
110 { NULL, "relative/../dir\\.\\.\\.\\file.txt", VINF_SUCCESS, "%p\\dir\\file.txt" },
111 { NULL, "\\data\\", VINF_SUCCESS, "%d\\data" },
112 { "relative_base/dir\\", "\\from_root", VINF_SUCCESS, "%d\\from_root" },
113 { "relative_base/dir/", "relative_also", VINF_SUCCESS, "%p\\relative_base\\dir\\relative_also" },
114#else
115 { NULL, "", VERR_INVALID_PARAMETER, NULL },
116 { NULL, ".", VINF_SUCCESS, "%p" },
117 { NULL, "/", VINF_SUCCESS, "/" },
118 { NULL, "/..", VINF_SUCCESS, "/" },
119 { NULL, "/absolute/..", VINF_SUCCESS, "/" },
120 { NULL, "/absolute\\\\../..", VINF_SUCCESS, "/" },
121 { NULL, "/absolute//../path/", VINF_SUCCESS, "/path" },
122 { NULL, "/absolute/../../path", VINF_SUCCESS, "/path" },
123 { NULL, "relative/../dir/./././file.txt", VINF_SUCCESS, "%p/dir/file.txt" },
124 { NULL, "relative/../dir\\.\\.\\.\\file.txt", VINF_SUCCESS, "%p/dir\\.\\.\\.\\file.txt" }, /* linux-specific */
125 { NULL, "/data/", VINF_SUCCESS, "/data" },
126 { "relative_base/dir/", "/from_root", VINF_SUCCESS, "/from_root" },
127 { "relative_base/dir/", "relative_also", VINF_SUCCESS, "%p/relative_base/dir/relative_also" },
128#endif
129#if defined (RT_OS_OS2) || defined (RT_OS_WINDOWS)
130 { NULL, "C:\\", VINF_SUCCESS, "C:\\" },
131 { "C:\\", "..", VINF_SUCCESS, "C:\\" },
132 { "C:\\temp", "..", VINF_SUCCESS, "C:\\" },
133 { "C:\\VirtualBox/Machines", "..\\VirtualBox.xml", VINF_SUCCESS, "C:\\VirtualBox\\VirtualBox.xml" },
134 { "C:\\MustDie", "\\from_root/dir/..", VINF_SUCCESS, "C:\\from_root" },
135 { "C:\\temp", "D:\\data", VINF_SUCCESS, "D:\\data" },
136 { NULL, "\\\\server\\..\\share", VINF_SUCCESS, "\\\\server\\..\\share" /* kind of strange */ },
137 { NULL, "\\\\server/", VINF_SUCCESS, "\\\\server" },
138 { NULL, "\\\\", VINF_SUCCESS, "\\\\" },
139 { NULL, "\\\\\\something", VINF_SUCCESS, "\\\\\\something" /* kind of strange */ },
140 { "\\\\server\\share_as_base", "/from_root", VINF_SUCCESS, "\\\\server\\from_root" },
141 { "\\\\just_server", "/from_root", VINF_SUCCESS, "\\\\just_server\\from_root" },
142 { "\\\\server\\share_as_base", "relative\\data", VINF_SUCCESS, "\\\\server\\share_as_base\\relative\\data" },
143 { "base", "\\\\?\\UNC\\relative/edwef/..", VINF_SUCCESS, "\\\\?\\UNC\\relative" },
144 { "\\\\?\\UNC\\base", "/from_root", VERR_INVALID_NAME, NULL },
145#else
146 { "/temp", "..", VINF_SUCCESS, "/" },
147 { "/VirtualBox/Machines", "../VirtualBox.xml", VINF_SUCCESS, "/VirtualBox/VirtualBox.xml" },
148 { "/MustDie", "/from_root/dir/..", VINF_SUCCESS, "/from_root" },
149 { "\\temp", "\\data", VINF_SUCCESS, "%p/\\temp/\\data" },
150#endif
151 };
152
153 for (unsigned i = 0; i < RT_ELEMENTS(s_aRTPathAbsExTests); ++ i)
154 {
155 rc = RTPathAbsEx(s_aRTPathAbsExTests[i].pcszInputBase,
156 s_aRTPathAbsExTests[i].pcszInputPath,
157 szPath, sizeof(szPath));
158 if (rc != s_aRTPathAbsExTests[i].rc)
159 {
160 RTTestIFailed("unexpected result code!\n"
161 " input base: '%s'\n"
162 " input path: '%s'\n"
163 " output: '%s'\n"
164 " rc: %Rrc\n"
165 " expected rc: %Rrc",
166 s_aRTPathAbsExTests[i].pcszInputBase,
167 s_aRTPathAbsExTests[i].pcszInputPath,
168 szPath, rc,
169 s_aRTPathAbsExTests[i].rc);
170 continue;
171 }
172
173 char szTmp[RTPATH_MAX];
174 char *pszExpected = NULL;
175 if (s_aRTPathAbsExTests[i].pcszOutput != NULL)
176 {
177 if (s_aRTPathAbsExTests[i].pcszOutput[0] == '%')
178 {
179 RTTESTI_CHECK_RC(rc = RTPathGetCurrent(szTmp, sizeof(szTmp)), VINF_SUCCESS);
180 if (RT_FAILURE(rc))
181 break;
182
183 pszExpected = szTmp;
184
185 if (s_aRTPathAbsExTests[i].pcszOutput[1] == 'p')
186 {
187 cch = strlen(szTmp);
188 if (cch + strlen(s_aRTPathAbsExTests[i].pcszOutput) - 2 <= sizeof(szTmp))
189 strcpy(szTmp + cch, s_aRTPathAbsExTests[i].pcszOutput + 2);
190 }
191#if defined(RT_OS_OS2) || defined(RT_OS_WINDOWS)
192 else if (s_aRTPathAbsExTests[i].pcszOutput[1] == 'd')
193 {
194 if (2 + strlen(s_aRTPathAbsExTests[i].pcszOutput) - 2 <= sizeof(szTmp))
195 strcpy(szTmp + 2, s_aRTPathAbsExTests[i].pcszOutput + 2);
196 }
197#endif
198 }
199 else
200 {
201 strcpy(szTmp, s_aRTPathAbsExTests[i].pcszOutput);
202 pszExpected = szTmp;
203 }
204
205 if (strcmp(szPath, pszExpected))
206 {
207 RTTestIFailed("Unexpected result\n"
208 " input base: '%s'\n"
209 " input path: '%s'\n"
210 " output: '%s'\n"
211 " expected: '%s'",
212 s_aRTPathAbsExTests[i].pcszInputBase,
213 s_aRTPathAbsExTests[i].pcszInputPath,
214 szPath,
215 s_aRTPathAbsExTests[i].pcszOutput);
216 }
217 }
218 }
219
220 /*
221 * RTPathStripFilename
222 */
223 RTTestSub(hTest, "RTPathStripFilename");
224 static const char *s_apszStripFilenameTests[] =
225 {
226 "/usr/include///", "/usr/include//",
227 "/usr/include/", "/usr/include",
228 "/usr/include", "/usr",
229 "/usr", "/",
230 "usr", ".",
231#if defined (RT_OS_OS2) || defined (RT_OS_WINDOWS)
232 "c:/windows", "c:/",
233 "c:/", "c:/",
234 "D:", "D:",
235 "C:\\OS2\\DLLS", "C:\\OS2",
236#endif
237 };
238 for (unsigned i = 0; i < RT_ELEMENTS(s_apszStripFilenameTests); i += 2)
239 {
240 const char *pszInput = s_apszStripFilenameTests[i];
241 const char *pszExpect = s_apszStripFilenameTests[i + 1];
242 strcpy(szPath, pszInput);
243 RTPathStripFilename(szPath);
244 if (strcmp(szPath, pszExpect))
245 {
246 RTTestIFailed("Unexpected result\n"
247 " input: '%s'\n"
248 " output: '%s'\n"
249 "expected: '%s'",
250 pszInput, szPath, pszExpect);
251 }
252 }
253
254 /*
255 * RTPathAppend.
256 */
257 RTTestSub(hTest, "RTPathAppend");
258 static const char *s_apszAppendTests[] =
259 {
260 /* base append result */
261 "/", "", "/",
262 "", "/", "/",
263 "/", "/", "/",
264 "/x", "", "/x",
265 "/x", "/", "/x/",
266 "/", "x", "/x",
267 "dir", "file", "dir/file",
268 "dir", "/file", "dir/file",
269 "dir", "//file", "dir/file",
270 "dir", "///file", "dir/file",
271 "dir/", "/file", "dir/file",
272 "dir/", "//file", "dir/file",
273 "dir/", "///file", "dir/file",
274 "dir//", "file", "dir/file",
275 "dir//", "/file", "dir/file",
276 "dir//", "//file", "dir/file",
277 "dir///", "///file", "dir/file",
278 "/bin/testcase", "foo.r0", "/bin/testcase/foo.r0",
279#if defined (RT_OS_OS2) || defined (RT_OS_WINDOWS)
280 "/", "\\", "/",
281 "\\", "/", "\\",
282 "\\\\srv\\shr", "dir//", "\\\\srv\\shr/dir//",
283 "\\\\srv\\shr", "dir//file", "\\\\srv\\shr/dir//file",
284 "\\\\srv\\shr", "//dir//", "\\\\srv\\shr/dir//",
285 "\\\\srv\\shr", "/\\dir//", "\\\\srv\\shr\\dir//",
286 "\\\\", "not-srv/not-shr/file", "\\not-srv/not-shr/file",
287 "C:", "autoexec.bat", "C:autoexec.bat",
288 "C:", "/autoexec.bat", "C:/autoexec.bat",
289 "C:", "\\autoexec.bat", "C:\\autoexec.bat",
290 "C:\\", "/autoexec.bat", "C:\\autoexec.bat",
291 "C:\\\\", "autoexec.bat", "C:\\autoexec.bat",
292 "E:\\bin\\testcase", "foo.r0", "E:\\bin\\testcase/foo.r0",
293#endif
294 };
295 for (unsigned i = 0; i < RT_ELEMENTS(s_apszAppendTests); i += 3)
296 {
297 const char *pszInput = s_apszAppendTests[i];
298 const char *pszAppend = s_apszAppendTests[i + 1];
299 const char *pszExpect = s_apszAppendTests[i + 2];
300 strcpy(szPath, pszInput);
301 RTTESTI_CHECK_RC(rc = RTPathAppend(szPath, sizeof(szPath), pszAppend), VINF_SUCCESS);
302 if (RT_FAILURE(rc))
303 continue;
304 if (strcmp(szPath, pszExpect))
305 {
306 RTTestIFailed("Unexpected result\n"
307 " input: '%s'\n"
308 " append: '%s'\n"
309 " output: '%s'\n"
310 "expected: '%s'",
311 pszInput, pszAppend, szPath, pszExpect);
312 }
313 else
314 {
315 size_t const cchResult = strlen(szPath);
316
317 strcpy(szPath, pszInput);
318 RTTESTI_CHECK_RC(rc = RTPathAppend(szPath, cchResult + 2, pszAppend), VINF_SUCCESS);
319 RTTESTI_CHECK(RT_FAILURE(rc) || !strcmp(szPath, pszExpect));
320
321 strcpy(szPath, pszInput);
322 RTTESTI_CHECK_RC(rc = RTPathAppend(szPath, cchResult + 1, pszAppend), VINF_SUCCESS);
323 RTTESTI_CHECK(RT_FAILURE(rc) || !strcmp(szPath, pszExpect));
324
325 if (strlen(pszInput) < cchResult)
326 {
327 strcpy(szPath, pszInput);
328 RTTESTI_CHECK_RC(RTPathAppend(szPath, cchResult, pszAppend), VERR_BUFFER_OVERFLOW);
329 }
330 }
331 }
332
333 /*
334 * RTPathJoin - reuse the append tests.
335 */
336 RTTestSub(hTest, "RTPathJoin");
337 for (unsigned i = 0; i < RT_ELEMENTS(s_apszAppendTests); i += 3)
338 {
339 const char *pszInput = s_apszAppendTests[i];
340 const char *pszAppend = s_apszAppendTests[i + 1];
341 const char *pszExpect = s_apszAppendTests[i + 2];
342
343 memset(szPath, 'a', sizeof(szPath)); szPath[sizeof(szPath) - 1] = '\0';
344
345 RTTESTI_CHECK_RC(rc = RTPathJoin(szPath, sizeof(szPath), pszInput, pszAppend), VINF_SUCCESS);
346 if (RT_FAILURE(rc))
347 continue;
348 if (strcmp(szPath, pszExpect))
349 {
350 RTTestIFailed("Unexpected result\n"
351 " input: '%s'\n"
352 " append: '%s'\n"
353 " output: '%s'\n"
354 "expected: '%s'",
355 pszInput, pszAppend, szPath, pszExpect);
356 }
357 else
358 {
359 size_t const cchResult = strlen(szPath);
360
361 memset(szPath, 'a', sizeof(szPath)); szPath[sizeof(szPath) - 1] = '\0';
362 RTTESTI_CHECK_RC(rc = RTPathJoin(szPath, cchResult + 2, pszInput, pszAppend), VINF_SUCCESS);
363 RTTESTI_CHECK(RT_FAILURE(rc) || !strcmp(szPath, pszExpect));
364
365 memset(szPath, 'a', sizeof(szPath)); szPath[sizeof(szPath) - 1] = '\0';
366 RTTESTI_CHECK_RC(rc = RTPathJoin(szPath, cchResult + 1, pszInput, pszAppend), VINF_SUCCESS);
367 RTTESTI_CHECK(RT_FAILURE(rc) || !strcmp(szPath, pszExpect));
368
369 RTTESTI_CHECK_RC(rc = RTPathJoin(szPath, cchResult, pszInput, pszAppend), VERR_BUFFER_OVERFLOW);
370 }
371 }
372
373 /*
374 * RTPathJoinA - reuse the append tests.
375 */
376 RTTestSub(hTest, "RTPathJoinA");
377 for (unsigned i = 0; i < RT_ELEMENTS(s_apszAppendTests); i += 3)
378 {
379 const char *pszInput = s_apszAppendTests[i];
380 const char *pszAppend = s_apszAppendTests[i + 1];
381 const char *pszExpect = s_apszAppendTests[i + 2];
382
383 char *pszPathDst;
384 RTTESTI_CHECK(pszPathDst = RTPathJoinA(pszInput, pszAppend));
385 if (!pszPathDst)
386 continue;
387 if (strcmp(pszPathDst, pszExpect))
388 {
389 RTTestIFailed("Unexpected result\n"
390 " input: '%s'\n"
391 " append: '%s'\n"
392 " output: '%s'\n"
393 "expected: '%s'",
394 pszInput, pszAppend, pszPathDst, pszExpect);
395 }
396 RTStrFree(pszPathDst);
397 }
398
399 /*
400 * RTPathStripTrailingSlash
401 */
402 static const char *s_apszStripTrailingSlash[] =
403 {
404 /* input result */
405 "/", "/",
406 "//", "/",
407 "////////////////////", "/",
408 "/tmp", "/tmp",
409 "/tmp////////////////", "/tmp",
410 "tmp", "tmp",
411 "tmp////////////////", "tmp",
412 "./", ".",
413#if defined (RT_OS_OS2) || defined (RT_OS_WINDOWS)
414 "////////////////////", "/",
415 "D:", "D:",
416 "D:/", "D:/",
417 "D:\\", "D:\\",
418 "D:\\/\\", "D:\\",
419 "D:/\\/\\", "D:/",
420 "C:/Temp", "D:/Temp",
421 "C:/Temp/", "D:/Temp/",
422 "C:/Temp\\/", "D:/Temp",
423#endif
424 };
425 for (unsigned i = 0; i < RT_ELEMENTS(s_apszStripTrailingSlash); i += 2)
426 {
427 const char *pszInput = s_apszStripTrailingSlash[i];
428 const char *pszExpect = s_apszStripTrailingSlash[i + 1];
429
430 strcpy(szPath, pszInput);
431 cch = RTPathStripTrailingSlash(szPath);
432 if (strcmp(szPath, pszExpect))
433 RTTestIFailed("Unexpected result\n"
434 " input: '%s'\n"
435 " output: '%s'\n"
436 "expected: '%s'",
437 pszInput, szPath, pszExpect);
438 else
439 RTTESTI_CHECK(cch == strlen(szPath));
440 }
441
442 /*
443 * RTPathCountComponents
444 */
445 RTTestSub(hTest, "RTPathCountComponents");
446 RTTESTI_CHECK(RTPathCountComponents("") == 0);
447 RTTESTI_CHECK(RTPathCountComponents("/") == 1);
448 RTTESTI_CHECK(RTPathCountComponents("//") == 1);
449 RTTESTI_CHECK(RTPathCountComponents("//////////////") == 1);
450 RTTESTI_CHECK(RTPathCountComponents("//////////////bin") == 2);
451 RTTESTI_CHECK(RTPathCountComponents("//////////////bin/") == 2);
452 RTTESTI_CHECK(RTPathCountComponents("//////////////bin/////") == 2);
453 RTTESTI_CHECK(RTPathCountComponents("..") == 1);
454 RTTESTI_CHECK(RTPathCountComponents("../") == 1);
455 RTTESTI_CHECK(RTPathCountComponents("../..") == 2);
456 RTTESTI_CHECK(RTPathCountComponents("../../") == 2);
457#if defined (RT_OS_OS2) || defined (RT_OS_WINDOWS)
458 RTTESTI_CHECK(RTPathCountComponents("d:") == 1);
459 RTTESTI_CHECK(RTPathCountComponents("d:/") == 1);
460 RTTESTI_CHECK(RTPathCountComponents("d:/\\") == 1);
461 RTTESTI_CHECK(RTPathCountComponents("d:\\") == 1);
462 RTTESTI_CHECK(RTPathCountComponents("c:\\config.sys") == 2);
463 RTTESTI_CHECK(RTPathCountComponents("c:\\windows") == 2);
464 RTTESTI_CHECK(RTPathCountComponents("c:\\windows\\") == 2);
465 RTTESTI_CHECK(RTPathCountComponents("c:\\windows\\system32") == 3);
466 RTTESTI_CHECK(RTPathCountComponents("//./C$") == 1);
467 RTTESTI_CHECK(RTPathCountComponents("\\\\.\\C$") == 1);
468 RTTESTI_CHECK(RTPathCountComponents("/\\.\\C$") == 1);
469 RTTESTI_CHECK(RTPathCountComponents("//myserver") == 1);
470 RTTESTI_CHECK(RTPathCountComponents("//myserver/") == 1);
471 RTTESTI_CHECK(RTPathCountComponents("//myserver/share") == 1);
472 RTTESTI_CHECK(RTPathCountComponents("//myserver/share/") == 1);
473 RTTESTI_CHECK(RTPathCountComponents("//myserver/share\\") == 1);
474 RTTESTI_CHECK(RTPathCountComponents("//myserver/share\\x") == 2);
475 RTTESTI_CHECK(RTPathCountComponents("//myserver/share\\x\\y") == 3);
476 RTTESTI_CHECK(RTPathCountComponents("//myserver/share\\x\\y\\") == 3);
477#endif
478
479 /*
480 * RTPathCopyComponents
481 */
482 struct
483 {
484 const char *pszSrc;
485 size_t cComponents;
486 const char *pszResult;
487 } s_aCopyComponents[] =
488 {
489 { "", 0, "" },
490 { "", 5, "" },
491 { "/", 0, "" },
492 { "/", 1, "/" },
493 { "/", 2, "/" },
494 { "/usr/bin/sed", 0, "" },
495 { "/usr/bin/sed", 1, "/" },
496 { "/usr/bin/sed", 2, "/usr/" },
497 { "/usr/bin/sed", 3, "/usr/bin/" },
498 { "/usr/bin/sed", 4, "/usr/bin/sed" },
499 { "/usr/bin/sed", 5, "/usr/bin/sed" },
500 { "/usr/bin/sed", 6, "/usr/bin/sed" },
501 { "/usr///bin/sed", 2, "/usr///" },
502 };
503 for (unsigned i = 0; i < RT_ELEMENTS(s_aCopyComponents); i++)
504 {
505 const char *pszInput = s_aCopyComponents[i].pszSrc;
506 size_t cComponents = s_aCopyComponents[i].cComponents;
507 const char *pszResult = s_aCopyComponents[i].pszResult;
508
509 memset(szPath, 'a', sizeof(szPath));
510 rc = RTPathCopyComponents(szPath, sizeof(szPath), pszInput, cComponents);
511 RTTESTI_CHECK_RC(rc, VINF_SUCCESS);
512 if (RT_SUCCESS(rc) && strcmp(szPath, pszResult))
513 RTTestIFailed("Unexpected result\n"
514 " input: '%s' cComponents=%u\n"
515 " output: '%s'\n"
516 "expected: '%s'",
517 pszInput, cComponents, szPath, pszResult);
518 else if (RT_SUCCESS(rc))
519 {
520 RTTESTI_CHECK_RC(RTPathCopyComponents(szPath, strlen(pszResult) + 1, pszInput, cComponents), VINF_SUCCESS);
521 RTTESTI_CHECK_RC(RTPathCopyComponents(szPath, strlen(pszResult), pszInput, cComponents), VERR_BUFFER_OVERFLOW);
522 }
523 }
524
525
526 /*
527 * RTPathStripExt
528 */
529 RTTestSub(hTest, "RTPathStripExt");
530 struct
531 {
532 const char *pszSrc;
533 const char *pszResult;
534 } s_aStripExt[] =
535 {
536 { "filename.ext", "filename" },
537 { "filename.ext1.ext2.ext3", "filename.ext1.ext2" },
538 { "filename..ext", "filename." },
539 { "filename.ext.", "filename.ext" }, /** @todo This is a bit weird/wrong, but not half as weird as the way Windows+OS/2 deals with a trailing dots. */
540 };
541 for (unsigned i = 0; i < RT_ELEMENTS(s_aStripExt); i++)
542 {
543 const char *pszInput = s_aStripExt[i].pszSrc;
544 const char *pszResult = s_aStripExt[i].pszResult;
545
546 strcpy(szPath, pszInput);
547 RTPathStripExt(szPath);
548 if (strcmp(szPath, pszResult))
549 RTTestIFailed("Unexpected result\n"
550 " input: '%s'\n"
551 " output: '%s'\n"
552 "expected: '%s'",
553 pszInput, szPath, pszResult);
554 }
555
556 /*
557 * RTPathCreateRelative
558 */
559 RTTestSub(hTest, "RTPathCreateRelative");
560 struct
561 {
562 const char *pszFrom;
563 const char *pszTo;
564 int rc;
565 const char *pszExpected;
566 } s_aRelPath[] =
567 {
568 { "/home/test.ext", "/home/test2.ext", VINF_SUCCESS, "test2.ext"},
569 { "/dir/test.ext", "/dir/dir2/test2.ext", VINF_SUCCESS, "dir2/test2.ext"},
570 { "/dir/dir2/test.ext", "/dir/test2.ext", VINF_SUCCESS, "../test2.ext"},
571 { "/dir/dir2/test.ext", "/dir/dir3/test2.ext", VINF_SUCCESS, "../dir3/test2.ext"},
572#if defined (RT_OS_OS2) || defined (RT_OS_WINDOWS)
573 { "\\\\server\\share\\test.ext", "\\\\server\\share2\\test2.ext", VERR_NOT_SUPPORTED, ""},
574 { "c:\\dir\\test.ext", "f:\\dir\\test.ext", VERR_NOT_SUPPORTED, ""}
575#endif
576 };
577 for (unsigned i = 0; i < RT_ELEMENTS(s_aRelPath); i++)
578 {
579 const char *pszFrom = s_aRelPath[i].pszFrom;
580 const char *pszTo = s_aRelPath[i].pszTo;
581
582 rc = RTPathCreateRelative(szPath, sizeof(szPath), pszFrom, pszTo);
583 if (rc != s_aRelPath[i].rc)
584 RTTestIFailed("Unexpected return code\n"
585 " got: %Rrc\n"
586 "expected: %Rrc",
587 rc, s_aRelPath[i].rc);
588 else if ( RT_SUCCESS(rc)
589 && strcmp(szPath, s_aRelPath[i].pszExpected))
590 RTTestIFailed("Unexpected result\n"
591 " from: '%s'\n"
592 " to: '%s'\n"
593 " output: '%s'\n"
594 "expected: '%s'",
595 pszFrom, pszTo, szPath, s_aRelPath[i].pszExpected);
596 }
597
598 /*
599 * Summary.
600 */
601 return RTTestSummaryAndDestroy(hTest);
602}
603
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette