VirtualBox

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

Last change on this file since 39872 was 39447, checked in by vboxsync, 13 years ago

Runtime: add Uniform Resource Identifier handling support

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 13.3 KB
Line 
1/* $Id: tstRTUri.cpp 39447 2011-11-29 10:02:42Z vboxsync $ */
2/** @file
3 * IPRT Testcase - URI parsing and creation.
4 */
5
6/*
7 * Copyright (C) 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/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 *gs_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 *gs_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 *gs_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 *gs_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 *gs_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 *gs_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 *gs_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}
187gs_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 RTTestISubF("Uri scheme parsing %2u: '%s' -> '%s'", iCount, pszUri, pszTest);
202
203 char *pszResult = RTUriScheme(pszUri);
204 if (pszTest)
205 {
206 RTTESTI_CHECK_MSG_RETV(pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
207 RTTESTI_CHECK_MSG(RTStrCmp(pszResult, pszTest) == 0, ("Result '%s' != '%s'", pszResult, pszTest));
208 }else
209 RTTESTI_CHECK_MSG(!pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
210
211 if (pszResult)
212 RTStrFree(pszResult);
213}
214
215static void tstAuthority(size_t iCount, const char *pszUri, const char *pszTest)
216{
217 RTTestISubF("Uri authority parsing %2u: '%s' -> '%s'", iCount, pszUri, pszTest);
218
219 char *pszResult = RTUriAuthority(pszUri);
220 if (pszTest)
221 {
222 RTTESTI_CHECK_MSG_RETV(pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
223 RTTESTI_CHECK_MSG(RTStrCmp(pszResult, pszTest) == 0, ("Result '%s' != '%s'", pszResult, pszTest));
224 }else
225 RTTESTI_CHECK_MSG(!pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
226
227 if (pszResult)
228 RTStrFree(pszResult);
229}
230
231static void tstPath(size_t iCount, const char *pszUri, const char *pszTest)
232{
233 RTTestISubF("Uri path parsing %2u: '%s' -> '%s'", iCount, pszUri, pszTest);
234
235 char *pszResult = RTUriPath(pszUri);
236 if (pszTest)
237 {
238 RTTESTI_CHECK_MSG_RETV(pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
239 RTTESTI_CHECK_MSG(RTStrCmp(pszResult, pszTest) == 0, ("Result '%s' != '%s'", pszResult, pszTest));
240 }else
241 RTTESTI_CHECK_MSG(!pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
242
243 if (pszResult)
244 RTStrFree(pszResult);
245}
246
247static void tstQuery(size_t iCount, const char *pszUri, const char *pszTest)
248{
249 RTTestISubF("Uri query parsing %2u: '%s' -> '%s'", iCount, pszUri, pszTest);
250
251 char *pszResult = RTUriQuery(pszUri);
252 if (pszTest)
253 {
254 RTTESTI_CHECK_MSG_RETV(pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
255 RTTESTI_CHECK_MSG(RTStrCmp(pszResult, pszTest) == 0, ("Result '%s' != '%s'", pszResult, pszTest));
256 }else
257 RTTESTI_CHECK_MSG(!pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
258
259 if (pszResult)
260 RTStrFree(pszResult);
261}
262
263static void tstFragment(size_t iCount, const char *pszUri, const char *pszTest)
264{
265 RTTestISubF("Uri fragment parsing %2u: '%s' -> '%s'", iCount, pszUri, pszTest);
266
267 char *pszResult = RTUriFragment(pszUri);
268 if (pszTest)
269 {
270 RTTESTI_CHECK_MSG_RETV(pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
271 RTTESTI_CHECK_MSG(RTStrCmp(pszResult, pszTest) == 0, ("Result '%s' != '%s'", pszResult, pszTest));
272 }else
273 RTTESTI_CHECK_MSG(!pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
274
275 if (pszResult)
276 RTStrFree(pszResult);
277}
278
279static void tstCreate(size_t iCount, const char *pszScheme, const char *pszAuthority, const char *pszPath, const char *pszQuery, const char *pszFragment, const char *pszTest)
280{
281 RTTestISubF("Uri creating %2u: Scheme: '%s', Authority: '%s', Path: '%s', Query: '%s', Fragment: '%s'", iCount, pszScheme, pszAuthority, pszPath, pszQuery, pszFragment);
282
283 char *pszResult = RTUriCreate(pszScheme, pszAuthority, pszPath, pszQuery, pszFragment);
284 if (pszTest)
285 {
286 RTTESTI_CHECK_MSG_RETV(pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
287 RTTESTI_CHECK_MSG(RTStrCmp(pszResult, pszTest) == 0, ("Result '%s' != '%s'", pszResult, pszTest));
288 }else
289 RTTESTI_CHECK_MSG(!pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
290
291 if (pszResult)
292 RTStrFree(pszResult);
293 return;
294}
295
296static void tstFileCreate(size_t iCount, const char *pszPath, const char *pszTest)
297{
298 RTTestISubF("Uri file creating %2u: Path: '%s'", iCount, pszPath);
299
300 char *pszResult = RTUriFileCreate(pszPath);
301 if (pszTest)
302 {
303 RTTESTI_CHECK_MSG_RETV(pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
304 RTTESTI_CHECK_MSG(RTStrCmp(pszResult, pszTest) == 0, ("Result '%s' != '%s'", pszResult, pszTest));
305 }else
306 RTTESTI_CHECK_MSG(!pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
307
308 if (pszResult)
309 RTStrFree(pszResult);
310 return;
311}
312
313static void tstFilePath(size_t iCount, const char *pszUri, const char *pszTest, uint32_t uFormat)
314{
315 RTTestISubF("Uri file path parsing %2u: '%s' -> '%s'", iCount, pszUri, pszTest);
316
317 char *pszResult = RTUriFilePath(pszUri, uFormat);
318 if (pszTest)
319 {
320 RTTESTI_CHECK_MSG_RETV(pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
321 RTTESTI_CHECK_MSG(RTStrCmp(pszResult, pszTest) == 0, ("Result '%s' != '%s'", pszResult, pszTest));
322 }else
323 RTTESTI_CHECK_MSG(!pszResult, ("Result '%s' != '%s'", pszResult, pszTest));
324
325 if (pszResult)
326 RTStrFree(pszResult);
327 return;
328}
329
330int main()
331{
332 RTTEST hTest;
333 int rc = RTTestInitAndCreate("tstRTUri", &hTest);
334 if (rc)
335 return rc;
336 RTTestBanner(hTest);
337
338 /* Scheme */
339 Assert(RT_ELEMENTS(gs_apcszTestURIs) == RT_ELEMENTS(gs_apcszSchemeResult));
340 for (size_t i = 0; i < RT_ELEMENTS(gs_apcszTestURIs); ++i)
341 tstScheme(i+1, gs_apcszTestURIs[i], gs_apcszSchemeResult[i]);
342
343 /* Authority */
344 Assert(RT_ELEMENTS(gs_apcszTestURIs) == RT_ELEMENTS(gs_apcszAuthorityResult));
345 for (size_t i = 0; i < RT_ELEMENTS(gs_apcszTestURIs); ++i)
346 tstAuthority(i+1, gs_apcszTestURIs[i], gs_apcszAuthorityResult[i]);
347
348 /* Path */
349 Assert(RT_ELEMENTS(gs_apcszTestURIs) == RT_ELEMENTS(gs_apcszPathResult));
350 for (size_t i = 0; i < RT_ELEMENTS(gs_apcszTestURIs); ++i)
351 tstPath(i+1, gs_apcszTestURIs[i], gs_apcszPathResult[i]);
352
353 /* Query */
354 Assert(RT_ELEMENTS(gs_apcszTestURIs) == RT_ELEMENTS(gs_apcszQueryResult));
355 for (size_t i = 0; i < RT_ELEMENTS(gs_apcszTestURIs); ++i)
356 tstQuery(i+1, gs_apcszTestURIs[i], gs_apcszQueryResult[i]);
357
358 /* Fragment */
359 Assert(RT_ELEMENTS(gs_apcszTestURIs) == RT_ELEMENTS(gs_apcszFragmentResult));
360 for (size_t i = 0; i < RT_ELEMENTS(gs_apcszTestURIs); ++i)
361 tstFragment(i+1, gs_apcszTestURIs[i], gs_apcszFragmentResult[i]);
362
363 /* Creation */
364 Assert(RT_ELEMENTS(gs_apcszTestURIs) == RT_ELEMENTS(gs_apcszCreateURIs));
365 for (size_t i = 0; i < RT_ELEMENTS(gs_apcszTestURIs); ++i)
366 tstCreate(i+1, gs_apcszCreateURIs[i][0], gs_apcszCreateURIs[i][1], gs_apcszCreateURIs[i][2], gs_apcszCreateURIs[i][3], gs_apcszCreateURIs[i][4], gs_apcszTestURIs[i]);
367
368 /* File Uri path */
369 for (size_t i = 0; i < RT_ELEMENTS(gs_apCreateFileURIs); ++i)
370 tstFilePath(i+1, gs_apCreateFileURIs[i].pcszUri, gs_apCreateFileURIs[i].pcszPath, gs_apCreateFileURIs[i].uFormat);
371
372 /* File Uri creation */
373 for (size_t i = 0; i < 3; ++i)
374 tstFileCreate(i+1, gs_apCreateFileURIs[i].pcszPath, gs_apCreateFileURIs[i].pcszUri);
375
376 return RTTestSummaryAndDestroy(hTest);
377}
378
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