1 #include "uri.h"
2
3 #include <cppunit/extensions/HelperMacros.h>
4
5 namespace aria2 {
6
7 namespace uri {
8
9 class UriTest : public CppUnit::TestFixture {
10
11 CPPUNIT_TEST_SUITE(UriTest);
12 CPPUNIT_TEST(testSetUri1);
13 CPPUNIT_TEST(testSetUri2);
14 CPPUNIT_TEST(testSetUri3);
15 CPPUNIT_TEST(testSetUri4);
16 CPPUNIT_TEST(testSetUri5);
17 CPPUNIT_TEST(testSetUri6);
18 CPPUNIT_TEST(testSetUri7);
19 CPPUNIT_TEST(testSetUri8);
20 CPPUNIT_TEST(testSetUri9);
21 CPPUNIT_TEST(testSetUri10);
22 CPPUNIT_TEST(testSetUri11);
23 CPPUNIT_TEST(testSetUri12);
24 CPPUNIT_TEST(testSetUri13);
25 CPPUNIT_TEST(testSetUri14);
26 CPPUNIT_TEST(testSetUri15);
27 CPPUNIT_TEST(testSetUri16);
28 CPPUNIT_TEST(testSetUri18);
29 CPPUNIT_TEST(testSetUri19);
30 CPPUNIT_TEST(testSetUri20);
31 CPPUNIT_TEST(testSetUri_username);
32 CPPUNIT_TEST(testSetUri_usernamePassword);
33 CPPUNIT_TEST(testSetUri_zeroUsername);
34 CPPUNIT_TEST(testSetUri_ipv6);
35 CPPUNIT_TEST(testInnerLink);
36 CPPUNIT_TEST(testConstruct);
37 CPPUNIT_TEST(testSwap);
38 CPPUNIT_TEST(testJoinUri);
39 CPPUNIT_TEST(testJoinPath);
40 CPPUNIT_TEST_SUITE_END();
41
42 public:
43 void testSetUri1();
44 void testSetUri2();
45 void testSetUri3();
46 void testSetUri4();
47 void testSetUri5();
48 void testSetUri6();
49 void testSetUri7();
50 void testSetUri8();
51 void testSetUri9();
52 void testSetUri10();
53 void testSetUri11();
54 void testSetUri12();
55 void testSetUri13();
56 void testSetUri14();
57 void testSetUri15();
58 void testSetUri16();
59 void testSetUri18();
60 void testSetUri19();
61 void testSetUri20();
62 void testSetUri_username();
63 void testSetUri_usernamePassword();
64 void testSetUri_zeroUsername();
65 void testSetUri_ipv6();
66 void testInnerLink();
67 void testConstruct();
68 void testSwap();
69 void testJoinUri();
70 void testJoinPath();
71 };
72
73 CPPUNIT_TEST_SUITE_REGISTRATION(UriTest);
74
testSetUri1()75 void UriTest::testSetUri1()
76 {
77 UriStruct us;
78 bool v = parse(us, "http://aria.rednoah.com/");
79
80 CPPUNIT_ASSERT(v);
81 CPPUNIT_ASSERT_EQUAL(std::string("http"), us.protocol);
82 CPPUNIT_ASSERT_EQUAL((uint16_t)80, us.port);
83 CPPUNIT_ASSERT_EQUAL(std::string("aria.rednoah.com"), us.host);
84 CPPUNIT_ASSERT_EQUAL(std::string("/"), us.dir);
85 CPPUNIT_ASSERT_EQUAL(std::string(""), us.file);
86 CPPUNIT_ASSERT_EQUAL(std::string(""), us.query);
87 CPPUNIT_ASSERT_EQUAL(std::string(""), us.username);
88 CPPUNIT_ASSERT_EQUAL(std::string(""), us.password);
89 CPPUNIT_ASSERT(!us.ipv6LiteralAddress);
90 }
91
testSetUri2()92 void UriTest::testSetUri2()
93 {
94 UriStruct us;
95 bool v = parse(us, "http://aria.rednoah.com:8080/index.html");
96
97 CPPUNIT_ASSERT(v);
98 CPPUNIT_ASSERT_EQUAL(std::string("http"), us.protocol);
99 CPPUNIT_ASSERT_EQUAL((uint16_t)8080, us.port);
100 CPPUNIT_ASSERT_EQUAL(std::string("aria.rednoah.com"), us.host);
101 CPPUNIT_ASSERT_EQUAL(std::string("/"), us.dir);
102 CPPUNIT_ASSERT_EQUAL(std::string("index.html"), us.file);
103 CPPUNIT_ASSERT_EQUAL(std::string(""), us.query);
104 }
105
testSetUri3()106 void UriTest::testSetUri3()
107 {
108 UriStruct us;
109 bool v = parse(us, "http://aria.rednoah.com/aria2/index.html");
110
111 CPPUNIT_ASSERT(v);
112 CPPUNIT_ASSERT_EQUAL(std::string("http"), us.protocol);
113 CPPUNIT_ASSERT_EQUAL((uint16_t)80, us.port);
114 CPPUNIT_ASSERT_EQUAL(std::string("aria.rednoah.com"), us.host);
115 CPPUNIT_ASSERT_EQUAL(std::string("/aria2/"), us.dir);
116 CPPUNIT_ASSERT_EQUAL(std::string("index.html"), us.file);
117 CPPUNIT_ASSERT_EQUAL(std::string(""), us.query);
118 }
119
testSetUri4()120 void UriTest::testSetUri4()
121 {
122 UriStruct us;
123 bool v = parse(us, "http://aria.rednoah.com/aria2/aria3/index.html");
124
125 CPPUNIT_ASSERT(v);
126 CPPUNIT_ASSERT_EQUAL(std::string("http"), us.protocol);
127 CPPUNIT_ASSERT_EQUAL((uint16_t)80, us.port);
128 CPPUNIT_ASSERT_EQUAL(std::string("aria.rednoah.com"), us.host);
129 CPPUNIT_ASSERT_EQUAL(std::string("/aria2/aria3/"), us.dir);
130 CPPUNIT_ASSERT_EQUAL(std::string("index.html"), us.file);
131 CPPUNIT_ASSERT_EQUAL(std::string(""), us.query);
132 }
133
testSetUri5()134 void UriTest::testSetUri5()
135 {
136 UriStruct us;
137 bool v = parse(us, "http://aria.rednoah.com/aria2/aria3/");
138
139 CPPUNIT_ASSERT(v);
140 CPPUNIT_ASSERT_EQUAL(std::string("http"), us.protocol);
141 CPPUNIT_ASSERT_EQUAL((uint16_t)80, us.port);
142 CPPUNIT_ASSERT_EQUAL(std::string("aria.rednoah.com"), us.host);
143 CPPUNIT_ASSERT_EQUAL(std::string("/aria2/aria3/"), us.dir);
144 CPPUNIT_ASSERT_EQUAL(std::string(""), us.file);
145 CPPUNIT_ASSERT_EQUAL(std::string(""), us.query);
146 }
147
testSetUri6()148 void UriTest::testSetUri6()
149 {
150 UriStruct us;
151 bool v = parse(us, "http://aria.rednoah.com/aria2/aria3");
152
153 CPPUNIT_ASSERT(v);
154 CPPUNIT_ASSERT_EQUAL(std::string("http"), us.protocol);
155 CPPUNIT_ASSERT_EQUAL((uint16_t)80, us.port);
156 CPPUNIT_ASSERT_EQUAL(std::string("aria.rednoah.com"), us.host);
157 CPPUNIT_ASSERT_EQUAL(std::string("/aria2/"), us.dir);
158 CPPUNIT_ASSERT_EQUAL(std::string("aria3"), us.file);
159 CPPUNIT_ASSERT_EQUAL(std::string(""), us.query);
160 }
161
testSetUri7()162 void UriTest::testSetUri7()
163 {
164 UriStruct us;
165 bool v = parse(us, "http://");
166
167 CPPUNIT_ASSERT(!v);
168 }
169
testSetUri8()170 void UriTest::testSetUri8()
171 {
172 UriStruct us;
173 bool v = parse(us, "http:/aria.rednoah.com");
174
175 CPPUNIT_ASSERT(!v);
176 }
177
testSetUri9()178 void UriTest::testSetUri9()
179 {
180 UriStruct us;
181 bool v = parse(us, "h");
182
183 CPPUNIT_ASSERT(!v);
184 }
185
testSetUri10()186 void UriTest::testSetUri10()
187 {
188 UriStruct us;
189 bool v = parse(us, "");
190
191 CPPUNIT_ASSERT(!v);
192 }
193
testSetUri11()194 void UriTest::testSetUri11()
195 {
196 UriStruct us;
197 bool v = parse(us, "http://host?query/");
198
199 CPPUNIT_ASSERT(v);
200 CPPUNIT_ASSERT_EQUAL(std::string("http"), us.protocol);
201 CPPUNIT_ASSERT_EQUAL(std::string("host"), us.host);
202 CPPUNIT_ASSERT_EQUAL(std::string("/"), us.dir);
203 CPPUNIT_ASSERT_EQUAL(std::string(""), us.file);
204 CPPUNIT_ASSERT_EQUAL(std::string("?query/"), us.query);
205 }
206
testSetUri12()207 void UriTest::testSetUri12()
208 {
209 UriStruct us;
210 bool v = parse(us, "http://host?query");
211
212 CPPUNIT_ASSERT(v);
213 CPPUNIT_ASSERT_EQUAL(std::string("http"), us.protocol);
214 CPPUNIT_ASSERT_EQUAL(std::string("host"), us.host);
215 CPPUNIT_ASSERT_EQUAL(std::string("/"), us.dir);
216 CPPUNIT_ASSERT_EQUAL(std::string(""), us.file);
217 CPPUNIT_ASSERT_EQUAL(std::string("?query"), us.query);
218 }
219
testSetUri13()220 void UriTest::testSetUri13()
221 {
222 UriStruct us;
223 bool v = parse(us, "http://host/?query");
224
225 CPPUNIT_ASSERT(v);
226 CPPUNIT_ASSERT_EQUAL(std::string("http"), us.protocol);
227 CPPUNIT_ASSERT_EQUAL(std::string("host"), us.host);
228 CPPUNIT_ASSERT_EQUAL(std::string("/"), us.dir);
229 CPPUNIT_ASSERT_EQUAL(std::string(""), us.file);
230 CPPUNIT_ASSERT_EQUAL(std::string("?query"), us.query);
231 }
232
testSetUri14()233 void UriTest::testSetUri14()
234 {
235 UriStruct us;
236 bool v = parse(us, "http://host:8080/abc?query");
237
238 CPPUNIT_ASSERT(v);
239 CPPUNIT_ASSERT_EQUAL(std::string("http"), us.protocol);
240 CPPUNIT_ASSERT_EQUAL(std::string("host"), us.host);
241 CPPUNIT_ASSERT_EQUAL((uint16_t)8080, us.port);
242 CPPUNIT_ASSERT_EQUAL(std::string("/"), us.dir);
243 CPPUNIT_ASSERT_EQUAL(std::string("abc"), us.file);
244 CPPUNIT_ASSERT_EQUAL(std::string("?query"), us.query);
245 }
246
testSetUri15()247 void UriTest::testSetUri15()
248 {
249 UriStruct us;
250 // 2 slashes after host name and dir
251 bool v = parse(us, "http://host//dir1/dir2//file");
252 CPPUNIT_ASSERT(v);
253 CPPUNIT_ASSERT_EQUAL(std::string("http"), us.protocol);
254 CPPUNIT_ASSERT_EQUAL(std::string("host"), us.host);
255 CPPUNIT_ASSERT_EQUAL(std::string("//dir1/dir2//"), us.dir);
256 CPPUNIT_ASSERT_EQUAL(std::string("file"), us.file);
257 CPPUNIT_ASSERT_EQUAL(std::string(""), us.query);
258 }
259
testSetUri16()260 void UriTest::testSetUri16()
261 {
262 UriStruct us;
263 // 2 slashes before file
264 bool v = parse(us, "http://host//file");
265 CPPUNIT_ASSERT(v);
266 CPPUNIT_ASSERT_EQUAL(std::string("http"), us.protocol);
267 CPPUNIT_ASSERT_EQUAL(std::string("host"), us.host);
268 CPPUNIT_ASSERT_EQUAL(std::string("//"), us.dir);
269 CPPUNIT_ASSERT_EQUAL(std::string("file"), us.file);
270 CPPUNIT_ASSERT_EQUAL(std::string(""), us.query);
271 }
272
testSetUri18()273 void UriTest::testSetUri18()
274 {
275 UriStruct us;
276 bool v = parse(us, "http://1/");
277
278 CPPUNIT_ASSERT(v);
279 }
280
testSetUri19()281 void UriTest::testSetUri19()
282 {
283 UriStruct us;
284 // No host
285 bool v = parse(us, "http://user@");
286
287 CPPUNIT_ASSERT(!v);
288 }
289
testSetUri20()290 void UriTest::testSetUri20()
291 {
292 UriStruct us;
293 bool v;
294 // Invalid port
295 v = parse(us, "http://localhost:65536");
296 CPPUNIT_ASSERT(!v);
297 v = parse(us, "http://localhost:65535");
298 CPPUNIT_ASSERT(v);
299 v = parse(us, "http://localhost:-80");
300 CPPUNIT_ASSERT(!v);
301 }
302
testSetUri_zeroUsername()303 void UriTest::testSetUri_zeroUsername()
304 {
305 UriStruct us;
306 CPPUNIT_ASSERT(!parse(us, "ftp://@localhost/download/aria2-1.0.0.tar.bz2"));
307
308 CPPUNIT_ASSERT(!parse(us, "ftp://:@localhost/download/aria2-1.0.0.tar.bz2"));
309
310 CPPUNIT_ASSERT(
311 !parse(us, "ftp://:pass@localhost/download/aria2-1.0.0.tar.bz2"));
312 }
313
testSetUri_username()314 void UriTest::testSetUri_username()
315 {
316 UriStruct us;
317 CPPUNIT_ASSERT(
318 parse(us, "ftp://aria2@user@localhost/download/aria2-1.0.0.tar.bz2"));
319 CPPUNIT_ASSERT_EQUAL(std::string("ftp"), us.protocol);
320 CPPUNIT_ASSERT_EQUAL((uint16_t)21, us.port);
321 CPPUNIT_ASSERT_EQUAL(std::string("localhost"), us.host);
322 CPPUNIT_ASSERT_EQUAL(std::string("/download/"), us.dir);
323 CPPUNIT_ASSERT_EQUAL(std::string("aria2-1.0.0.tar.bz2"), us.file);
324 CPPUNIT_ASSERT_EQUAL(std::string("aria2@user"), us.username);
325 CPPUNIT_ASSERT_EQUAL(std::string(""), us.password);
326 }
327
testSetUri_usernamePassword()328 void UriTest::testSetUri_usernamePassword()
329 {
330 UriStruct us;
331 CPPUNIT_ASSERT(parse(us,
332 "ftp://aria2@user%40:aria2@pass%40@localhost/download/"
333 "aria2-1.0.0.tar.bz2"));
334 CPPUNIT_ASSERT_EQUAL(std::string("ftp"), us.protocol);
335 CPPUNIT_ASSERT_EQUAL((uint16_t)21, us.port);
336 CPPUNIT_ASSERT_EQUAL(std::string("pass%40@localhost"), us.host);
337 CPPUNIT_ASSERT_EQUAL(std::string("/download/"), us.dir);
338 CPPUNIT_ASSERT_EQUAL(std::string("aria2-1.0.0.tar.bz2"), us.file);
339 CPPUNIT_ASSERT_EQUAL(std::string("aria2@user@"), us.username);
340 CPPUNIT_ASSERT_EQUAL(std::string("aria2"), us.password);
341
342 // make sure that after new uri is set, username and password are updated.
343 CPPUNIT_ASSERT(parse(us, "ftp://localhost/download/aria2-1.0.0.tar.bz2"));
344 CPPUNIT_ASSERT_EQUAL(std::string(""), us.username);
345 CPPUNIT_ASSERT_EQUAL(std::string(""), us.password);
346 }
347
testSetUri_ipv6()348 void UriTest::testSetUri_ipv6()
349 {
350 UriStruct us;
351 CPPUNIT_ASSERT(!parse(us, "http://[::1"));
352 CPPUNIT_ASSERT(parse(us, "http://[::1]"));
353 CPPUNIT_ASSERT_EQUAL(std::string("::1"), us.host);
354
355 CPPUNIT_ASSERT(parse(us, "http://[::1]:8000/dir/file"));
356 CPPUNIT_ASSERT_EQUAL(std::string("::1"), us.host);
357 CPPUNIT_ASSERT_EQUAL((uint16_t)8000, us.port);
358 CPPUNIT_ASSERT_EQUAL(std::string("/dir/"), us.dir);
359 CPPUNIT_ASSERT_EQUAL(std::string("file"), us.file);
360 CPPUNIT_ASSERT(us.ipv6LiteralAddress);
361 }
362
testInnerLink()363 void UriTest::testInnerLink()
364 {
365 UriStruct us;
366 bool v = parse(us, "http://aria.rednoah.com/index.html#download");
367 CPPUNIT_ASSERT(v);
368 CPPUNIT_ASSERT_EQUAL(std::string("index.html"), us.file);
369 CPPUNIT_ASSERT_EQUAL(std::string(""), us.query);
370 }
371
testConstruct()372 void UriTest::testConstruct()
373 {
374 {
375 UriStruct us;
376 CPPUNIT_ASSERT(parse(us, "http://host/dir/file?q=abc#foo"));
377 CPPUNIT_ASSERT_EQUAL(std::string("http://host/dir/file?q=abc"),
378 construct(us));
379 }
380 {
381 UriStruct us;
382 CPPUNIT_ASSERT(parse(us, "http://host/dir/file"));
383 CPPUNIT_ASSERT_EQUAL(std::string("http://host/dir/file"), construct(us));
384 }
385 {
386 UriStruct us;
387 CPPUNIT_ASSERT(parse(us, "http://host/dir/"));
388 CPPUNIT_ASSERT_EQUAL(std::string("http://host/dir/"), construct(us));
389 }
390 {
391 UriStruct us;
392 CPPUNIT_ASSERT(parse(us, "http://host/dir"));
393 CPPUNIT_ASSERT_EQUAL(std::string("http://host/dir"), construct(us));
394 }
395 {
396 UriStruct us;
397 CPPUNIT_ASSERT(parse(us, "http://host/"));
398 CPPUNIT_ASSERT_EQUAL(std::string("http://host/"), construct(us));
399 }
400 {
401 UriStruct us;
402 CPPUNIT_ASSERT(parse(us, "http://host"));
403 CPPUNIT_ASSERT_EQUAL(std::string("http://host/"), construct(us));
404 }
405 {
406 UriStruct us;
407 us.protocol = "http";
408 us.host = "host";
409 us.file = "foo.xml";
410 CPPUNIT_ASSERT_EQUAL(std::string("http://host/foo.xml"), construct(us));
411 }
412 {
413 UriStruct us;
414 CPPUNIT_ASSERT(parse(us, "http://host:80"));
415 CPPUNIT_ASSERT_EQUAL(std::string("http://host/"), construct(us));
416 }
417 {
418 UriStruct us;
419 CPPUNIT_ASSERT(parse(us, "http://host:8080"));
420 CPPUNIT_ASSERT_EQUAL(std::string("http://host:8080/"), construct(us));
421 }
422 {
423 UriStruct us;
424 CPPUNIT_ASSERT(parse(us, "http://[::1]:8000/dir/file"));
425 CPPUNIT_ASSERT_EQUAL(std::string("http://[::1]:8000/dir/file"),
426 construct(us));
427 }
428 {
429 UriStruct us;
430 CPPUNIT_ASSERT(parse(us, "ftp://user%40@host/dir/file"));
431 CPPUNIT_ASSERT_EQUAL(std::string("ftp://user%40@host/dir/file"),
432 construct(us));
433 }
434 {
435 UriStruct us;
436 CPPUNIT_ASSERT(parse(us, "ftp://user:@host/dir/file"));
437 CPPUNIT_ASSERT_EQUAL(std::string("ftp://user:@host/dir/file"),
438 construct(us));
439 }
440 {
441 UriStruct us;
442 CPPUNIT_ASSERT(parse(us, "ftp://user:passwd%40@host/dir/file"));
443 CPPUNIT_ASSERT_EQUAL(std::string("ftp://user:passwd%40@host/dir/file"),
444 construct(us));
445 }
446 }
447
testSwap()448 void UriTest::testSwap()
449 {
450 UriStruct us1;
451 CPPUNIT_ASSERT(parse(us1, "http://u1:p1@[::1]/dir1/file1?k1=v1"));
452 UriStruct us2;
453 CPPUNIT_ASSERT(parse(us2, "ftp://host2/dir2/file2?k2=v2"));
454 us1.swap(us2);
455 CPPUNIT_ASSERT_EQUAL(std::string("ftp://host2/dir2/file2?k2=v2"),
456 construct(us1));
457 CPPUNIT_ASSERT_EQUAL(std::string("http://u1:p1@[::1]/dir1/file1?k1=v1"),
458 construct(us2));
459 }
460
testJoinUri()461 void UriTest::testJoinUri()
462 {
463 CPPUNIT_ASSERT_EQUAL(std::string("http://host/dir/file"),
464 joinUri("http://base/d/f", "http://host/dir/file"));
465
466 CPPUNIT_ASSERT_EQUAL(std::string("http://base/dir/file"),
467 joinUri("http://base/d/f", "/dir/file"));
468
469 CPPUNIT_ASSERT_EQUAL(std::string("http://base/d/dir/file"),
470 joinUri("http://base/d/f", "dir/file"));
471
472 CPPUNIT_ASSERT_EQUAL(std::string("http://base/d/"),
473 joinUri("http://base/d/f", ""));
474
475 CPPUNIT_ASSERT_EQUAL(std::string("http://base/d/dir/file?q=k"),
476 joinUri("http://base/d/f", "dir/file?q=k"));
477
478 CPPUNIT_ASSERT_EQUAL(std::string("dir/file"), joinUri("baduri", "dir/file"));
479
480 CPPUNIT_ASSERT_EQUAL(std::string("http://base/a/b/d/file"),
481 joinUri("http://base/a/b/c/x", "../d/file"));
482
483 CPPUNIT_ASSERT_EQUAL(std::string("http://base/a/b/file"),
484 joinUri("http://base/c/x", "../../a/b/file"));
485
486 CPPUNIT_ASSERT_EQUAL(std::string("http://base/"),
487 joinUri("http://base/c/x", "../.."));
488
489 CPPUNIT_ASSERT_EQUAL(std::string("http://base/"),
490 joinUri("http://base/c/x", ".."));
491
492 CPPUNIT_ASSERT_EQUAL(std::string("http://base/a/file"),
493 joinUri("http://base/b/c/x", "/a/x/../file"));
494
495 CPPUNIT_ASSERT_EQUAL(std::string("http://base/file"),
496 joinUri("http://base/f/?q=k", "/file"));
497
498 CPPUNIT_ASSERT_EQUAL(std::string("http://base/file?q=/"),
499 joinUri("http://base/", "/file?q=/"));
500
501 CPPUNIT_ASSERT_EQUAL(std::string("http://base/file?q=v"),
502 joinUri("http://base/", "/file?q=v#a?q=x"));
503
504 CPPUNIT_ASSERT_EQUAL(std::string("http://base/file"),
505 joinUri("http://base/", "/file#a?q=x"));
506 }
507
testJoinPath()508 void UriTest::testJoinPath()
509 {
510 CPPUNIT_ASSERT_EQUAL(std::string("/b"), joinPath("/a", "/b"));
511 CPPUNIT_ASSERT_EQUAL(std::string("/alpha/bravo"),
512 joinPath("/alpha", "bravo"));
513 CPPUNIT_ASSERT_EQUAL(std::string("/bravo"),
514 joinPath("/a", "/alpha/../bravo"));
515 CPPUNIT_ASSERT_EQUAL(std::string("/alpha/charlie/"),
516 joinPath("/a", "/alpha/bravo/../charlie/"));
517 CPPUNIT_ASSERT_EQUAL(std::string("/alpha/bravo/"),
518 joinPath("/a", "/alpha////bravo//"));
519 CPPUNIT_ASSERT_EQUAL(std::string("/alpha/bravo/"),
520 joinPath("/a", "/alpha/././bravo/"));
521 CPPUNIT_ASSERT_EQUAL(std::string("/alpha/bravo/"),
522 joinPath("/a", "/alpha/bravo/./"));
523 CPPUNIT_ASSERT_EQUAL(std::string("/alpha/bravo/"),
524 joinPath("/a", "/alpha/bravo/."));
525 CPPUNIT_ASSERT_EQUAL(std::string("/alpha/"),
526 joinPath("/a", "/alpha/bravo/.."));
527 CPPUNIT_ASSERT_EQUAL(std::string("/alpha/"), joinPath("/", "../alpha/"));
528 CPPUNIT_ASSERT_EQUAL(std::string("/bravo/"), joinPath("/alpha", "../bravo/"));
529 CPPUNIT_ASSERT_EQUAL(std::string("/bravo/"),
530 joinPath("/alpha", "../../bravo/"));
531 // If neither paths do not start with '/', the resulting path also
532 // does not start with '/'.
533 CPPUNIT_ASSERT_EQUAL(std::string("alpha/bravo"), joinPath("alpha", "bravo"));
534 CPPUNIT_ASSERT_EQUAL(std::string("bravo/"),
535 joinPath("alpha", "../../bravo/"));
536 }
537
538 } // namespace uri
539
540 } // namespace aria2
541