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