VirtualBox

source: vbox/trunk/src/VBox/Runtime/testcase/tstPath.cpp@ 16684

Last change on this file since 16684 was 15813, checked in by vboxsync, 16 years ago

RTPathAbs: When the path is empty we return VERR_INVALID_PARAMETER like elsewhere, not the current directory.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 10.0 KB
Line 
1/* $Id: tstPath.cpp 15813 2009-01-05 16:06:55Z vboxsync $ */
2/** @file
3 * IPRT Testcase - Test various path functions.
4 */
5
6/*
7 * Copyright (C) 2006-2007 Sun Microsystems, Inc.
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 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
27 * Clara, CA 95054 USA or visit http://www.sun.com if you need
28 * additional information or have any questions.
29 */
30
31/*******************************************************************************
32* Header Files *
33*******************************************************************************/
34#include <iprt/path.h>
35#include <iprt/process.h>
36#include <iprt/initterm.h>
37#include <iprt/stream.h>
38#include <iprt/string.h>
39#include <iprt/err.h>
40#include <iprt/param.h>
41
42
43#define CHECK_RC(method) \
44 do { \
45 rc = method; \
46 if (RT_FAILURE(rc)) \
47 { \
48 cErrors++; \
49 RTPrintf("\ntstPath: FAILED calling " #method " at line %d: rc=%Rrc\n", __LINE__, rc); \
50 } \
51 } while (0)
52
53int main()
54{
55 /*
56 * Init RT.
57 */
58 int rc;
59 int cErrors = 0;
60 CHECK_RC(RTR3Init());
61 if (RT_FAILURE(rc))
62 return 1;
63
64 /*
65 * RTPathProgram, RTPathUserHome and RTProcGetExecutableName.
66 */
67 char szPath[RTPATH_MAX];
68 CHECK_RC(RTPathProgram(szPath, sizeof(szPath)));
69 if (RT_SUCCESS(rc))
70 RTPrintf("Program={%s}\n", szPath);
71 CHECK_RC(RTPathUserHome(szPath, sizeof(szPath)));
72 if (RT_SUCCESS(rc))
73 RTPrintf("UserHome={%s}\n", szPath);
74 if (RTProcGetExecutableName(szPath, sizeof(szPath)) == szPath)
75 RTPrintf("ExecutableName={%s}\n", szPath);
76 else
77 {
78 RTPrintf("tstPath: FAILED - RTProcGetExecutableName\n");
79 cErrors++;
80 }
81
82
83 /*
84 * RTPathAbsEx
85 */
86 RTPrintf("tstPath: TESTING RTPathAbsEx()\n");
87 static const struct
88 {
89 const char *pcszInputBase;
90 const char *pcszInputPath;
91 int rc;
92 const char *pcszOutput;
93 }
94 s_aRTPathAbsExTests[] =
95 {
96#if defined (RT_OS_OS2) || defined (RT_OS_WINDOWS)
97 { NULL, "", VERR_INVALID_PARAMETER, NULL },
98 { NULL, ".", VINF_SUCCESS, "%p" },
99 { NULL, "\\", VINF_SUCCESS, "%d\\" },
100 { NULL, "\\..", VINF_SUCCESS, "%d\\" },
101 { NULL, "/absolute/..", VINF_SUCCESS, "%d\\" },
102 { NULL, "/absolute\\\\../..", VINF_SUCCESS, "%d\\" },
103 { NULL, "/absolute//../path\\", VINF_SUCCESS, "%d\\path" },
104 { NULL, "/absolute/../../path", VINF_SUCCESS, "%d\\path" },
105 { NULL, "relative/../dir\\.\\.\\.\\file.txt", VINF_SUCCESS, "%p\\dir\\file.txt" },
106 { NULL, "\\data\\", VINF_SUCCESS, "%d\\data" },
107 { "relative_base/dir\\", "\\from_root", VINF_SUCCESS, "%d\\from_root" },
108 { "relative_base/dir/", "relative_also", VINF_SUCCESS, "%p\\relative_base\\dir\\relative_also" },
109#else
110 { NULL, "", VERR_INVALID_PARAMETER, NULL },
111 { NULL, ".", VINF_SUCCESS, "%p" },
112 { NULL, "/", VINF_SUCCESS, "/" },
113 { NULL, "/..", VINF_SUCCESS, "/" },
114 { NULL, "/absolute/..", VINF_SUCCESS, "/" },
115 { NULL, "/absolute\\\\../..", VINF_SUCCESS, "/" },
116 { NULL, "/absolute//../path/", VINF_SUCCESS, "/path" },
117 { NULL, "/absolute/../../path", VINF_SUCCESS, "/path" },
118 { NULL, "relative/../dir/./././file.txt", VINF_SUCCESS, "%p/dir/file.txt" },
119 { NULL, "relative/../dir\\.\\.\\.\\file.txt", VINF_SUCCESS, "%p/dir\\.\\.\\.\\file.txt" }, /* linux-specific */
120 { NULL, "/data/", VINF_SUCCESS, "/data" },
121 { "relative_base/dir/", "/from_root", VINF_SUCCESS, "/from_root" },
122 { "relative_base/dir/", "relative_also", VINF_SUCCESS, "%p/relative_base/dir/relative_also" },
123#endif
124#if defined (RT_OS_OS2) || defined (RT_OS_WINDOWS)
125 { NULL, "C:\\", VINF_SUCCESS, "C:\\" },
126 { "C:\\", "..", VINF_SUCCESS, "C:\\" },
127 { "C:\\temp", "..", VINF_SUCCESS, "C:\\" },
128 { "C:\\VirtualBox/Machines", "..\\VirtualBox.xml", VINF_SUCCESS, "C:\\VirtualBox\\VirtualBox.xml" },
129 { "C:\\MustDie", "\\from_root/dir/..", VINF_SUCCESS, "C:\\from_root" },
130 { "C:\\temp", "D:\\data", VINF_SUCCESS, "D:\\data" },
131 { NULL, "\\\\server\\..\\share", VINF_SUCCESS, "\\\\server\\..\\share" /* kind of strange */ },
132 { NULL, "\\\\server/", VINF_SUCCESS, "\\\\server" },
133 { NULL, "\\\\", VINF_SUCCESS, "\\\\" },
134 { NULL, "\\\\\\something", VINF_SUCCESS, "\\\\\\something" /* kind of strange */ },
135 { "\\\\server\\share_as_base", "/from_root", VINF_SUCCESS, "\\\\server\\from_root" },
136 { "\\\\just_server", "/from_root", VINF_SUCCESS, "\\\\just_server\\from_root" },
137 { "\\\\server\\share_as_base", "relative\\data", VINF_SUCCESS, "\\\\server\\share_as_base\\relative\\data" },
138 { "base", "\\\\?\\UNC\\relative/edwef/..", VINF_SUCCESS, "\\\\?\\UNC\\relative" },
139 { "\\\\?\\UNC\\base", "/from_root", VERR_INVALID_NAME, NULL },
140#else
141 { "/temp", "..", VINF_SUCCESS, "/" },
142 { "/VirtualBox/Machines", "../VirtualBox.xml", VINF_SUCCESS, "/VirtualBox/VirtualBox.xml" },
143 { "/MustDie", "/from_root/dir/..", VINF_SUCCESS, "/from_root" },
144 { "\\temp", "\\data", VINF_SUCCESS, "%p/\\temp/\\data" },
145#endif
146 };
147
148 for (unsigned i = 0; i < RT_ELEMENTS(s_aRTPathAbsExTests); ++ i)
149 {
150 rc = RTPathAbsEx(s_aRTPathAbsExTests[i].pcszInputBase,
151 s_aRTPathAbsExTests[i].pcszInputPath,
152 szPath, sizeof(szPath));
153 if (rc != s_aRTPathAbsExTests[i].rc)
154 {
155 RTPrintf("tstPath: RTPathAbsEx unexpected result code!\n"
156 " input base: '%s'\n"
157 " input path: '%s'\n"
158 " output: '%s'\n"
159 " rc: %Rrc\n"
160 " expected rc: %Rrc\n",
161 s_aRTPathAbsExTests[i].pcszInputBase,
162 s_aRTPathAbsExTests[i].pcszInputPath,
163 szPath, rc,
164 s_aRTPathAbsExTests[i].rc);
165 cErrors++;
166 continue;
167 }
168
169 char szTmp[RTPATH_MAX];
170 char *pszExpected = NULL;
171 if (s_aRTPathAbsExTests[i].pcszOutput != NULL)
172 {
173 if (s_aRTPathAbsExTests[i].pcszOutput[0] == '%')
174 {
175 rc = RTPathGetCurrent(szTmp, sizeof(szTmp));
176 if (RT_FAILURE(rc))
177 {
178 RTPrintf("tstPath: RTPathGetCurrent failed with rc=%Rrc!\n", rc);
179 cErrors++;
180 break;
181 }
182
183 pszExpected = szTmp;
184
185 if (s_aRTPathAbsExTests[i].pcszOutput[1] == 'p')
186 {
187 size_t 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 RTPrintf("tstPath: RTPathAbsEx failed!\n"
208 " input base: '%s'\n"
209 " input path: '%s'\n"
210 " output: '%s'\n"
211 " expected: '%s'\n",
212 s_aRTPathAbsExTests[i].pcszInputBase,
213 s_aRTPathAbsExTests[i].pcszInputPath,
214 szPath,
215 s_aRTPathAbsExTests[i].pcszOutput);
216 cErrors++;
217 }
218 }
219 }
220
221 /*
222 * RTPathStripFilename
223 */
224 RTPrintf("tstPath: RTPathStripFilename...\n");
225 static const char *s_apszStripFilenameTests[] =
226 {
227 "/usr/include///", "/usr/include//",
228 "/usr/include/", "/usr/include",
229 "/usr/include", "/usr",
230 "/usr", "/",
231 "usr", ".",
232#if defined (RT_OS_OS2) || defined (RT_OS_WINDOWS)
233 "c:/windows", "c:/",
234 "c:/", "c:/",
235 "D:", "D:",
236 "C:\\OS2\\DLLS", "C:\\OS2",
237#endif
238 };
239 for (unsigned i = 0; i < RT_ELEMENTS(s_apszStripFilenameTests); i += 2)
240 {
241 const char *pszInput = s_apszStripFilenameTests[i];
242 const char *pszExpect = s_apszStripFilenameTests[i + 1];
243 char szPath[RTPATH_MAX];
244 strcpy(szPath, pszInput);
245 RTPathStripFilename(szPath);
246 if (strcmp(szPath, pszExpect))
247 {
248 RTPrintf("tstPath: RTPathStripFilename failed!\n"
249 " input: '%s'\n"
250 " output: '%s'\n"
251 "expected: '%s'\n",
252 pszInput, szPath, pszExpect);
253 cErrors++;
254 }
255 }
256
257 /*
258 * Summary.
259 */
260 if (!cErrors)
261 RTPrintf("tstPath: SUCCESS\n");
262 else
263 RTPrintf("tstPath: FAILURE %d errors\n", cErrors);
264 return !!cErrors;
265}
266
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