UriTest.cc 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532
  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(!parse(us, "ftp://:@localhost/download/aria2-1.0.0.tar.bz2"));
  263. CPPUNIT_ASSERT(!parse(us,
  264. "ftp://:pass@localhost/download/aria2-1.0.0.tar.bz2"));
  265. }
  266. void UriTest::testSetUri_username()
  267. {
  268. UriStruct us;
  269. CPPUNIT_ASSERT
  270. (parse(us, "ftp://aria2@user@localhost/download/aria2-1.0.0.tar.bz2"));
  271. CPPUNIT_ASSERT_EQUAL(std::string("ftp"), us.protocol);
  272. CPPUNIT_ASSERT_EQUAL((uint16_t)21, us.port);
  273. CPPUNIT_ASSERT_EQUAL(std::string("localhost"), us.host);
  274. CPPUNIT_ASSERT_EQUAL(std::string("/download/"), us.dir);
  275. CPPUNIT_ASSERT_EQUAL(std::string("aria2-1.0.0.tar.bz2"), us.file);
  276. CPPUNIT_ASSERT_EQUAL(std::string("aria2@user"), us.username);
  277. CPPUNIT_ASSERT_EQUAL(std::string(""), us.password);
  278. }
  279. void UriTest::testSetUri_usernamePassword()
  280. {
  281. UriStruct us;
  282. CPPUNIT_ASSERT(parse(us,
  283. "ftp://aria2@user%40:aria2@pass%40@localhost/download/"
  284. "aria2-1.0.0.tar.bz2"));
  285. CPPUNIT_ASSERT_EQUAL(std::string("ftp"), us.protocol);
  286. CPPUNIT_ASSERT_EQUAL((uint16_t)21, us.port);
  287. CPPUNIT_ASSERT_EQUAL(std::string("pass%40@localhost"), us.host);
  288. CPPUNIT_ASSERT_EQUAL(std::string("/download/"), us.dir);
  289. CPPUNIT_ASSERT_EQUAL(std::string("aria2-1.0.0.tar.bz2"), us.file);
  290. CPPUNIT_ASSERT_EQUAL(std::string("aria2@user@"), us.username);
  291. CPPUNIT_ASSERT_EQUAL(std::string("aria2"), us.password);
  292. // make sure that after new uri is set, username and password are updated.
  293. CPPUNIT_ASSERT(parse(us, "ftp://localhost/download/aria2-1.0.0.tar.bz2"));
  294. CPPUNIT_ASSERT_EQUAL(std::string(""), us.username);
  295. CPPUNIT_ASSERT_EQUAL(std::string(""), us.password);
  296. }
  297. void UriTest::testSetUri_ipv6()
  298. {
  299. UriStruct us;
  300. CPPUNIT_ASSERT(!parse(us, "http://[::1"));
  301. CPPUNIT_ASSERT(parse(us, "http://[::1]"));
  302. CPPUNIT_ASSERT_EQUAL(std::string("::1"), us.host);
  303. CPPUNIT_ASSERT(parse(us, "http://[::1]:8000/dir/file"));
  304. CPPUNIT_ASSERT_EQUAL(std::string("::1"), us.host);
  305. CPPUNIT_ASSERT_EQUAL((uint16_t)8000, us.port);
  306. CPPUNIT_ASSERT_EQUAL(std::string("/dir/"), us.dir);
  307. CPPUNIT_ASSERT_EQUAL(std::string("file"), us.file);
  308. CPPUNIT_ASSERT(us.ipv6LiteralAddress);
  309. }
  310. void UriTest::testInnerLink()
  311. {
  312. UriStruct us;
  313. bool v = parse(us, "http://aria.rednoah.com/index.html#download");
  314. CPPUNIT_ASSERT(v);
  315. CPPUNIT_ASSERT_EQUAL(std::string("index.html"), us.file);
  316. CPPUNIT_ASSERT_EQUAL(std::string(""), us.query);
  317. }
  318. void UriTest::testConstruct()
  319. {
  320. {
  321. UriStruct us;
  322. CPPUNIT_ASSERT(parse(us, "http://host/dir/file?q=abc#foo"));
  323. CPPUNIT_ASSERT_EQUAL(std::string("http://host/dir/file?q=abc"),
  324. construct(us));
  325. }
  326. {
  327. UriStruct us;
  328. CPPUNIT_ASSERT(parse(us, "http://host/dir/file"));
  329. CPPUNIT_ASSERT_EQUAL(std::string("http://host/dir/file"),
  330. construct(us));
  331. }
  332. {
  333. UriStruct us;
  334. CPPUNIT_ASSERT(parse(us, "http://host/dir/"));
  335. CPPUNIT_ASSERT_EQUAL(std::string("http://host/dir/"),
  336. construct(us));
  337. }
  338. {
  339. UriStruct us;
  340. CPPUNIT_ASSERT(parse(us, "http://host/dir"));
  341. CPPUNIT_ASSERT_EQUAL(std::string("http://host/dir"),
  342. construct(us));
  343. }
  344. {
  345. UriStruct us;
  346. CPPUNIT_ASSERT(parse(us, "http://host/"));
  347. CPPUNIT_ASSERT_EQUAL(std::string("http://host/"),
  348. construct(us));
  349. }
  350. {
  351. UriStruct us;
  352. CPPUNIT_ASSERT(parse(us, "http://host"));
  353. CPPUNIT_ASSERT_EQUAL(std::string("http://host/"),
  354. construct(us));
  355. }
  356. {
  357. UriStruct us;
  358. us.protocol = "http";
  359. us.host = "host";
  360. us.file = "foo.xml";
  361. CPPUNIT_ASSERT_EQUAL(std::string("http://host/foo.xml"),
  362. construct(us));
  363. }
  364. {
  365. UriStruct us;
  366. CPPUNIT_ASSERT(parse(us, "http://host:80"));
  367. CPPUNIT_ASSERT_EQUAL(std::string("http://host/"),
  368. construct(us));
  369. }
  370. {
  371. UriStruct us;
  372. CPPUNIT_ASSERT(parse(us, "http://host:8080"));
  373. CPPUNIT_ASSERT_EQUAL(std::string("http://host:8080/"),
  374. construct(us));
  375. }
  376. {
  377. UriStruct us;
  378. CPPUNIT_ASSERT(parse(us, "http://[::1]:8000/dir/file"));
  379. CPPUNIT_ASSERT_EQUAL(std::string("http://[::1]:8000/dir/file"),
  380. construct(us));
  381. }
  382. {
  383. UriStruct us;
  384. CPPUNIT_ASSERT(parse(us, "ftp://user%40@host/dir/file"));
  385. CPPUNIT_ASSERT_EQUAL(std::string("ftp://user%40@host/dir/file"),
  386. construct(us));
  387. }
  388. {
  389. UriStruct us;
  390. CPPUNIT_ASSERT(parse(us, "ftp://user:@host/dir/file"));
  391. CPPUNIT_ASSERT_EQUAL(std::string("ftp://user:@host/dir/file"),
  392. construct(us));
  393. }
  394. {
  395. UriStruct us;
  396. CPPUNIT_ASSERT(parse(us, "ftp://user:passwd%40@host/dir/file"));
  397. CPPUNIT_ASSERT_EQUAL(std::string("ftp://user:passwd%40@host/dir/file"),
  398. construct(us));
  399. }
  400. }
  401. void UriTest::testSwap()
  402. {
  403. UriStruct us1;
  404. CPPUNIT_ASSERT(parse(us1, "http://u1:p1@[::1]/dir1/file1?k1=v1"));
  405. UriStruct us2;
  406. CPPUNIT_ASSERT(parse(us2, "ftp://host2/dir2/file2?k2=v2"));
  407. us1.swap(us2);
  408. CPPUNIT_ASSERT_EQUAL(std::string("ftp://host2/dir2/file2?k2=v2"),
  409. construct(us1));
  410. CPPUNIT_ASSERT_EQUAL(std::string("http://u1:p1@[::1]/dir1/file1?k1=v1"),
  411. construct(us2));
  412. }
  413. void UriTest::testJoinUri()
  414. {
  415. CPPUNIT_ASSERT_EQUAL(std::string("http://host/dir/file"),
  416. joinUri("http://base/d/f",
  417. "http://host/dir/file"));
  418. CPPUNIT_ASSERT_EQUAL(std::string("http://base/dir/file"),
  419. joinUri("http://base/d/f",
  420. "/dir/file"));
  421. CPPUNIT_ASSERT_EQUAL(std::string("http://base/d/dir/file"),
  422. joinUri("http://base/d/f",
  423. "dir/file"));
  424. CPPUNIT_ASSERT_EQUAL(std::string("http://base/d/"),
  425. joinUri("http://base/d/f",
  426. ""));
  427. CPPUNIT_ASSERT_EQUAL(std::string("http://base/d/dir/file?q=k"),
  428. joinUri("http://base/d/f",
  429. "dir/file?q=k"));
  430. CPPUNIT_ASSERT_EQUAL(std::string("dir/file"),
  431. joinUri("baduri", "dir/file"));
  432. CPPUNIT_ASSERT_EQUAL(std::string("http://base/a/b/d/file"),
  433. joinUri("http://base/a/b/c/x",
  434. "../d/file"));
  435. CPPUNIT_ASSERT_EQUAL(std::string("http://base/a/b/file"),
  436. joinUri("http://base/c/x",
  437. "../../a/b/file"));
  438. CPPUNIT_ASSERT_EQUAL(std::string("http://base/"),
  439. joinUri("http://base/c/x",
  440. "../.."));
  441. CPPUNIT_ASSERT_EQUAL(std::string("http://base/"),
  442. joinUri("http://base/c/x",
  443. ".."));
  444. CPPUNIT_ASSERT_EQUAL(std::string("http://base/a/file"),
  445. joinUri("http://base/b/c/x",
  446. "/a/x/../file"));
  447. CPPUNIT_ASSERT_EQUAL(std::string("http://base/file"),
  448. joinUri("http://base/f/?q=k",
  449. "/file"));
  450. CPPUNIT_ASSERT_EQUAL(std::string("http://base/file?q=/"),
  451. joinUri("http://base/",
  452. "/file?q=/"));
  453. CPPUNIT_ASSERT_EQUAL(std::string("http://base/file?q=v"),
  454. joinUri("http://base/",
  455. "/file?q=v#a?q=x"));
  456. CPPUNIT_ASSERT_EQUAL(std::string("http://base/file"),
  457. joinUri("http://base/",
  458. "/file#a?q=x"));
  459. }
  460. } // namespace uri
  461. } // namespace aria2