UriTest.cc 17 KB

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