UriTest.cc 14 KB

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