VirtualBox

source: vbox/trunk/src/VBox/Runtime/testcase/tstRTUri.cpp@ 51230

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

Testcases: Short and fewer test names.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 12.8 KB
Line 
1/* $Id: tstRTUri.cpp 44198 2012-12-22 22:42:46Z vboxsync $ */
2/** @file
3 * IPRT Testcase - URI parsing and creation.
4 */
5
6/*
7 * Copyright (C) 2011-2012 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/uri.h>
31
32#include <iprt/string.h>
33#include <iprt/err.h>
34#include <iprt/mem.h>
35#include <iprt/test.h>
36
37/*******************************************************************************
38* Test data *
39*******************************************************************************/
40
41static const char *g_apcszTestURIs[] =
42{
43 "foo://tt:[email protected]:8042/over/%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60/there?name=%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60ferret#nose%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60",
44 "foo://tt:[email protected]:8042/over/%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60/there?name=%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60ferret",
45 "foo://tt:[email protected]:8042/over/%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60/there",
46 "foo:[email protected]",
47 "foo:/over/%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60/there?name=%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60ferret#nose%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60",
48 "foo:/over/%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60/there#nose%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60",
49 "urn:example:animal:ferret:nose",
50 "foo:?name=%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60ferret#nose%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60",
51 "foo:#nose%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60",
52 "foo://tt:[email protected]:8042/?name=%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60ferret#nose%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60",
53 "foo://tt:[email protected]:8042/",
54 "foo://tt:[email protected]:8042?name=%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60ferret#nose%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60",
55 "foo://tt:[email protected]:8042#nose%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60",
56 "foo://tt:[email protected]:8042",
57 "foo:///",
58 "foo://"
59};
60
61static const char *g_apcszSchemeResult[] =
62{
63 "foo",
64 "foo",
65 "foo",
66 "foo",
67 "foo",
68 "foo",
69 "urn",
70 "foo",
71 "foo",
72 "foo",
73 "foo",
74 "foo",
75 "foo",
76 "foo",
77 "foo",
78 "foo"
79};
80
81static const char *g_apcszAuthorityResult[] =
82{
83 "tt:[email protected]:8042",
84 "tt:[email protected]:8042",
85 "tt:[email protected]:8042",
86 NULL,
87 NULL,
88 NULL,
89 NULL,
90 NULL,
91 NULL,
92 "tt:[email protected]:8042",
93 "tt:[email protected]:8042",
94 "tt:[email protected]:8042",
95 "tt:[email protected]:8042",
96 "tt:[email protected]:8042",
97 NULL,
98 NULL
99};
100
101static const char *g_apcszPathResult[] =
102{
103 "/over/ <>#%\"{}|^[]`/there",
104 "/over/ <>#%\"{}|^[]`/there",
105 "/over/ <>#%\"{}|^[]`/there",
106 "[email protected]",
107 "/over/ <>#%\"{}|^[]`/there",
108 "/over/ <>#%\"{}|^[]`/there",
109 "example:animal:ferret:nose",
110 NULL,
111 NULL,
112 "/",
113 "/",
114 NULL,
115 NULL,
116 NULL,
117 "/",
118 NULL
119};
120
121static const char *g_apcszQueryResult[] =
122{
123 "name= <>#%\"{}|^[]`ferret",
124 "name= <>#%\"{}|^[]`ferret",
125 NULL,
126 NULL,
127 "name= <>#%\"{}|^[]`ferret",
128 NULL,
129 NULL,
130 "name= <>#%\"{}|^[]`ferret",
131 NULL,
132 "name= <>#%\"{}|^[]`ferret",
133 NULL,
134 "name= <>#%\"{}|^[]`ferret",
135 NULL,
136 NULL,
137 NULL,
138 NULL
139};
140
141static const char *g_apcszFragmentResult[] =
142{
143 "nose <>#%\"{}|^[]`",
144 NULL,
145 NULL,
146 NULL,
147 "nose <>#%\"{}|^[]`",
148 "nose <>#%\"{}|^[]`",
149 NULL,
150 "nose <>#%\"{}|^[]`",
151 "nose <>#%\"{}|^[]`",
152 "nose <>#%\"{}|^[]`",
153 NULL,
154 "nose <>#%\"{}|^[]`",
155 "nose <>#%\"{}|^[]`",
156 NULL,
157 NULL,
158 NULL
159};
160
161static const char *g_apcszCreateURIs[][5] =
162{
163 { "foo", "tt:[email protected]:8042", "/over/ <>#%\"{}|^[]`/there", "name= <>#%\"{}|^[]`ferret", "nose <>#%\"{}|^[]`" },
164 { "foo", "tt:[email protected]:8042", "/over/ <>#%\"{}|^[]`/there", "name= <>#%\"{}|^[]`ferret", NULL },
165 { "foo", "tt:[email protected]:8042", "/over/ <>#%\"{}|^[]`/there", NULL, NULL },
166 { "foo", NULL, "[email protected]", NULL, NULL },
167 { "foo", NULL, "/over/ <>#%\"{}|^[]`/there", "name= <>#%\"{}|^[]`ferret", "nose <>#%\"{}|^[]`" },
168 { "foo", NULL, "/over/ <>#%\"{}|^[]`/there", NULL, "nose <>#%\"{}|^[]`" },
169 { "urn", NULL, "example:animal:ferret:nose", NULL, NULL },
170 { "foo", NULL, NULL, "name= <>#%\"{}|^[]`ferret", "nose <>#%\"{}|^[]`" },
171 { "foo", NULL, NULL, NULL, "nose <>#%\"{}|^[]`" },
172 { "foo", "tt:[email protected]:8042", "/", "name= <>#%\"{}|^[]`ferret", "nose <>#%\"{}|^[]`" },
173 { "foo", "tt:[email protected]:8042", "/", NULL, NULL },
174 { "foo", "tt:[email protected]:8042", NULL, "name= <>#%\"{}|^[]`ferret", "nose <>#%\"{}|^[]`" },
175 { "foo", "tt:[email protected]:8042", NULL, NULL, "nose <>#%\"{}|^[]`" },
176 { "foo", "tt:[email protected]:8042", NULL, NULL, NULL },
177 { "foo", "", "/", NULL, NULL },
178 { "foo", "", NULL, NULL, NULL }
179};
180
181struct URIFILETEST
182{
183 const char *pcszPath;
184 const char *pcszUri;
185 uint32_t uFormat;
186}
187g_apCreateFileURIs[] =
188{
189 { "C:\\over\\ <>#%\"{}|^[]`\\there", "file:///C:%5Cover%5C%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60%5Cthere", URI_FILE_FORMAT_WIN },
190 { "/over/ <>#%\"{}|^[]`/there", "file:///over/%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60/there", URI_FILE_FORMAT_UNIX },
191 { "/", "file:///", URI_FILE_FORMAT_UNIX },
192 { "/C:/over/ <>#%\"{}|^[]`/there", "file:///C:%5Cover%5C%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60%5Cthere", URI_FILE_FORMAT_UNIX },
193 { "over\\ <>#%\"{}|^[]`\\there", "file:///over/%20%3C%3E%23%25%22%7B%7D%7C%5E%5B%5D%60/there", URI_FILE_FORMAT_WIN }
194};
195
196/**
197 * Basic API checks.
198 */
199static void tstScheme(size_t iCount, const char *pszUri, const char *pszTest)
200{
201 char *pszResult = RTUriScheme(pszUri);
202 if (pszTest)
203 {
204 RTTESTI_CHECK_MSG_RETV(pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
205 RTTESTI_CHECK_MSG(RTStrCmp(pszResult, pszTest) == 0, ("Result '%s' != '%s'", pszResult, pszTest));
206 }
207 else
208 RTTESTI_CHECK_MSG(!pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
209
210 if (pszResult)
211 RTStrFree(pszResult);
212}
213
214static void tstAuthority(size_t iCount, const char *pszUri, const char *pszTest)
215{
216 char *pszResult = RTUriAuthority(pszUri);
217 if (pszTest)
218 {
219 RTTESTI_CHECK_MSG_RETV(pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
220 RTTESTI_CHECK_MSG(RTStrCmp(pszResult, pszTest) == 0, ("Result '%s' != '%s'", pszResult, pszTest));
221 }
222 else
223 RTTESTI_CHECK_MSG(!pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
224
225 if (pszResult)
226 RTStrFree(pszResult);
227}
228
229static void tstPath(size_t iCount, const char *pszUri, const char *pszTest)
230{
231 char *pszResult = RTUriPath(pszUri);
232 if (pszTest)
233 {
234 RTTESTI_CHECK_MSG_RETV(pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
235 RTTESTI_CHECK_MSG(RTStrCmp(pszResult, pszTest) == 0, ("Result '%s' != '%s'", pszResult, pszTest));
236 }
237 else
238 RTTESTI_CHECK_MSG(!pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
239
240 if (pszResult)
241 RTStrFree(pszResult);
242}
243
244static void tstQuery(size_t iCount, const char *pszUri, const char *pszTest)
245{
246 char *pszResult = RTUriQuery(pszUri);
247 if (pszTest)
248 {
249 RTTESTI_CHECK_MSG_RETV(pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
250 RTTESTI_CHECK_MSG(RTStrCmp(pszResult, pszTest) == 0, ("Result '%s' != '%s'", pszResult, pszTest));
251 }
252 else
253 RTTESTI_CHECK_MSG(!pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
254
255 if (pszResult)
256 RTStrFree(pszResult);
257}
258
259static void tstFragment(size_t iCount, const char *pszUri, const char *pszTest)
260{
261 char *pszResult = RTUriFragment(pszUri);
262 if (pszTest)
263 {
264 RTTESTI_CHECK_MSG_RETV(pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
265 RTTESTI_CHECK_MSG(RTStrCmp(pszResult, pszTest) == 0, ("Result '%s' != '%s'", pszResult, pszTest));
266 }
267 else
268 RTTESTI_CHECK_MSG(!pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
269
270 if (pszResult)
271 RTStrFree(pszResult);
272}
273
274static void tstCreate(size_t iCount, const char *pszScheme, const char *pszAuthority, const char *pszPath, const char *pszQuery, const char *pszFragment, const char *pszTest)
275{
276 char *pszResult = RTUriCreate(pszScheme, pszAuthority, pszPath, pszQuery, pszFragment);
277 if (pszTest)
278 {
279 RTTESTI_CHECK_MSG_RETV(pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
280 RTTESTI_CHECK_MSG(RTStrCmp(pszResult, pszTest) == 0, ("Result '%s' != '%s'", pszResult, pszTest));
281 }
282 else
283 RTTESTI_CHECK_MSG(!pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
284
285 if (pszResult)
286 RTStrFree(pszResult);
287 return;
288}
289
290static void tstFileCreate(size_t iCount, const char *pszPath, const char *pszTest)
291{
292 char *pszResult = RTUriFileCreate(pszPath);
293 if (pszTest)
294 {
295 RTTESTI_CHECK_MSG_RETV(pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
296 RTTESTI_CHECK_MSG(RTStrCmp(pszResult, pszTest) == 0, ("Result '%s' != '%s'", pszResult, pszTest));
297 }
298 else
299 RTTESTI_CHECK_MSG(!pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
300
301 if (pszResult)
302 RTStrFree(pszResult);
303 return;
304}
305
306static void tstFilePath(size_t iCount, const char *pszUri, const char *pszTest, uint32_t uFormat)
307{
308 char *pszResult = RTUriFilePath(pszUri, uFormat);
309 if (pszTest)
310 {
311 RTTESTI_CHECK_MSG_RETV(pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
312 RTTESTI_CHECK_MSG(RTStrCmp(pszResult, pszTest) == 0, ("Result '%s' != '%s'", pszResult, pszTest));
313 }
314 else
315 RTTESTI_CHECK_MSG(!pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
316
317 if (pszResult)
318 RTStrFree(pszResult);
319 return;
320}
321
322int main()
323{
324 RTTEST hTest;
325 int rc = RTTestInitAndCreate("tstRTUri", &hTest);
326 if (rc)
327 return rc;
328 RTTestBanner(hTest);
329
330 /* Scheme */
331 RTTestISubF("RTUriScheme");
332 Assert(RT_ELEMENTS(g_apcszTestURIs) == RT_ELEMENTS(g_apcszSchemeResult));
333 for (size_t i = 0; i < RT_ELEMENTS(g_apcszTestURIs); ++i)
334 tstScheme(i+1, g_apcszTestURIs[i], g_apcszSchemeResult[i]);
335
336 /* Authority */
337 RTTestISubF("RTUriAuthority");
338 Assert(RT_ELEMENTS(g_apcszTestURIs) == RT_ELEMENTS(g_apcszAuthorityResult));
339 for (size_t i = 0; i < RT_ELEMENTS(g_apcszTestURIs); ++i)
340 tstAuthority(i+1, g_apcszTestURIs[i], g_apcszAuthorityResult[i]);
341
342 /* Path */
343 RTTestISubF("RTUriPath");
344 Assert(RT_ELEMENTS(g_apcszTestURIs) == RT_ELEMENTS(g_apcszPathResult));
345 for (size_t i = 0; i < RT_ELEMENTS(g_apcszTestURIs); ++i)
346 tstPath(i+1, g_apcszTestURIs[i], g_apcszPathResult[i]);
347
348 /* Query */
349 RTTestISubF("RTUriQuery");
350 Assert(RT_ELEMENTS(g_apcszTestURIs) == RT_ELEMENTS(g_apcszQueryResult));
351 for (size_t i = 0; i < RT_ELEMENTS(g_apcszTestURIs); ++i)
352 tstQuery(i+1, g_apcszTestURIs[i], g_apcszQueryResult[i]);
353
354 /* Fragment */
355 RTTestISubF("RTUriFragment");
356 Assert(RT_ELEMENTS(g_apcszTestURIs) == RT_ELEMENTS(g_apcszFragmentResult));
357 for (size_t i = 0; i < RT_ELEMENTS(g_apcszTestURIs); ++i)
358 tstFragment(i+1, g_apcszTestURIs[i], g_apcszFragmentResult[i]);
359
360 /* Creation */
361 RTTestISubF("RTUriCreate");
362 Assert(RT_ELEMENTS(g_apcszTestURIs) == RT_ELEMENTS(g_apcszCreateURIs));
363 for (size_t i = 0; i < RT_ELEMENTS(g_apcszTestURIs); ++i)
364 tstCreate(i+1, g_apcszCreateURIs[i][0], g_apcszCreateURIs[i][1], g_apcszCreateURIs[i][2],
365 g_apcszCreateURIs[i][3], g_apcszCreateURIs[i][4], g_apcszTestURIs[i]);
366
367 /* File Uri path */
368 RTTestISubF("RTUriFilePath");
369 for (size_t i = 0; i < RT_ELEMENTS(g_apCreateFileURIs); ++i)
370 tstFilePath(i+1, g_apCreateFileURIs[i].pcszUri, g_apCreateFileURIs[i].pcszPath, g_apCreateFileURIs[i].uFormat);
371
372 /* File Uri creation */
373 RTTestISubF("RTUriFileCreate");
374 for (size_t i = 0; i < 3; ++i)
375 tstFileCreate(i+1, g_apCreateFileURIs[i].pcszPath, g_apCreateFileURIs[i].pcszUri);
376
377 return RTTestSummaryAndDestroy(hTest);
378}
379
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