UriTest.cc 17 KB

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