OptionHandlerTest.cc 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  1. #include "OptionHandlerImpl.h"
  2. #include <cppunit/extensions/HelperMacros.h>
  3. #include "prefs.h"
  4. #include "Exception.h"
  5. namespace aria2 {
  6. class OptionHandlerTest:public CppUnit::TestFixture {
  7. CPPUNIT_TEST_SUITE(OptionHandlerTest);
  8. CPPUNIT_TEST(testNullOptionHandler);
  9. CPPUNIT_TEST(testBooleanOptionHandler);
  10. CPPUNIT_TEST(testNumberOptionHandler);
  11. CPPUNIT_TEST(testNumberOptionHandler_min);
  12. CPPUNIT_TEST(testNumberOptionHandler_max);
  13. CPPUNIT_TEST(testNumberOptionHandler_min_max);
  14. CPPUNIT_TEST(testUnitNumberOptionHandler);
  15. CPPUNIT_TEST(testParameterOptionHandler_1argInit);
  16. CPPUNIT_TEST(testParameterOptionHandler_2argsInit);
  17. CPPUNIT_TEST(testParameterOptionHandler_listInit);
  18. CPPUNIT_TEST(testDefaultOptionHandler);
  19. CPPUNIT_TEST(testFloatNumberOptionHandler);
  20. CPPUNIT_TEST(testFloatNumberOptionHandler_min);
  21. CPPUNIT_TEST(testFloatNumberOptionHandler_max);
  22. CPPUNIT_TEST(testFloatNumberOptionHandler_min_max);
  23. CPPUNIT_TEST(testHttpProxyOptionHandler);
  24. CPPUNIT_TEST(testHttpProxyUserOptionHandler);
  25. CPPUNIT_TEST(testHttpProxyPasswdOptionHandler);
  26. CPPUNIT_TEST_SUITE_END();
  27. public:
  28. void testNullOptionHandler();
  29. void testBooleanOptionHandler();
  30. void testNumberOptionHandler();
  31. void testNumberOptionHandler_min();
  32. void testNumberOptionHandler_max();
  33. void testNumberOptionHandler_min_max();
  34. void testUnitNumberOptionHandler();
  35. void testParameterOptionHandler_1argInit();
  36. void testParameterOptionHandler_2argsInit();
  37. void testParameterOptionHandler_listInit();
  38. void testDefaultOptionHandler();
  39. void testFloatNumberOptionHandler();
  40. void testFloatNumberOptionHandler_min();
  41. void testFloatNumberOptionHandler_max();
  42. void testFloatNumberOptionHandler_min_max();
  43. void testHttpProxyOptionHandler();
  44. void testHttpProxyUserOptionHandler();
  45. void testHttpProxyPasswdOptionHandler();
  46. };
  47. CPPUNIT_TEST_SUITE_REGISTRATION( OptionHandlerTest );
  48. void OptionHandlerTest::testNullOptionHandler()
  49. {
  50. NullOptionHandler handler;
  51. CPPUNIT_ASSERT(handler.canHandle("foo"));
  52. Option option;
  53. handler.parse(option, "bar");
  54. CPPUNIT_ASSERT(!option.defined("bar"));
  55. }
  56. void OptionHandlerTest::testBooleanOptionHandler()
  57. {
  58. BooleanOptionHandler handler("foo");
  59. CPPUNIT_ASSERT(handler.canHandle("foo"));
  60. CPPUNIT_ASSERT(!handler.canHandle("foobar"));
  61. Option option;
  62. handler.parse(option, A2_V_TRUE);
  63. CPPUNIT_ASSERT_EQUAL(std::string(A2_V_TRUE), option.get("foo"));
  64. handler.parse(option, A2_V_FALSE);
  65. CPPUNIT_ASSERT_EQUAL(std::string(A2_V_FALSE), option.get("foo"));
  66. try {
  67. handler.parse(option, "hello");
  68. CPPUNIT_FAIL("exception must be thrown.");
  69. } catch(Exception& e) {}
  70. CPPUNIT_ASSERT_EQUAL(std::string("true,false"),
  71. handler.createPossibleValuesString());
  72. }
  73. void OptionHandlerTest::testNumberOptionHandler()
  74. {
  75. NumberOptionHandler handler("foo");
  76. CPPUNIT_ASSERT(handler.canHandle("foo"));
  77. CPPUNIT_ASSERT(!handler.canHandle("foobar"));
  78. Option option;
  79. handler.parse(option, "0");
  80. CPPUNIT_ASSERT_EQUAL(std::string("0"), option.get("foo"));
  81. CPPUNIT_ASSERT_EQUAL(std::string("*-*"),
  82. handler.createPossibleValuesString());
  83. }
  84. void OptionHandlerTest::testNumberOptionHandler_min()
  85. {
  86. NumberOptionHandler handler("foo", "", "", 1);
  87. Option option;
  88. handler.parse(option, "1");
  89. CPPUNIT_ASSERT_EQUAL(std::string("1"), option.get("foo"));
  90. try {
  91. handler.parse(option, "0");
  92. CPPUNIT_FAIL("exception must be thrown.");
  93. } catch(Exception& e) {}
  94. CPPUNIT_ASSERT_EQUAL(std::string("1-*"),
  95. handler.createPossibleValuesString());
  96. }
  97. void OptionHandlerTest::testNumberOptionHandler_max()
  98. {
  99. NumberOptionHandler handler("foo", "", "", -1, 100);
  100. Option option;
  101. handler.parse(option, "100");
  102. CPPUNIT_ASSERT_EQUAL(std::string("100"), option.get("foo"));
  103. try {
  104. handler.parse(option, "101");
  105. CPPUNIT_FAIL("exception must be thrown.");
  106. } catch(Exception& e) {}
  107. CPPUNIT_ASSERT_EQUAL(std::string("*-100"),
  108. handler.createPossibleValuesString());
  109. }
  110. void OptionHandlerTest::testNumberOptionHandler_min_max()
  111. {
  112. NumberOptionHandler handler("foo", "", "", 1, 100);
  113. Option option;
  114. handler.parse(option, "1");
  115. CPPUNIT_ASSERT_EQUAL(std::string("1"), option.get("foo"));
  116. handler.parse(option, "100");
  117. CPPUNIT_ASSERT_EQUAL(std::string("100"), option.get("foo"));
  118. try {
  119. handler.parse(option, "0");
  120. CPPUNIT_FAIL("exception must be thrown.");
  121. } catch(Exception& e) {}
  122. try {
  123. handler.parse(option, "101");
  124. CPPUNIT_FAIL("exception must be thrown.");
  125. } catch(Exception& e) {}
  126. CPPUNIT_ASSERT_EQUAL(std::string("1-100"),
  127. handler.createPossibleValuesString());
  128. }
  129. void OptionHandlerTest::testUnitNumberOptionHandler()
  130. {
  131. UnitNumberOptionHandler handler("foo");
  132. CPPUNIT_ASSERT(handler.canHandle("foo"));
  133. CPPUNIT_ASSERT(!handler.canHandle("foobar"));
  134. Option option;
  135. handler.parse(option, "4294967296");
  136. CPPUNIT_ASSERT_EQUAL(std::string("4294967296"), option.get("foo"));
  137. handler.parse(option, "4096M");
  138. CPPUNIT_ASSERT_EQUAL(std::string("4294967296"), option.get("foo"));
  139. handler.parse(option, "4096K");
  140. CPPUNIT_ASSERT_EQUAL(std::string("4194304"), option.get("foo"));
  141. try {
  142. handler.parse(option, "K");
  143. CPPUNIT_FAIL("exception must be thrown.");
  144. } catch(Exception& e) {}
  145. try {
  146. handler.parse(option, "M");
  147. } catch(Exception& e) {}
  148. try {
  149. handler.parse(option, "");
  150. CPPUNIT_FAIL("exception must be thrown.");
  151. } catch(Exception& e) {}
  152. }
  153. void OptionHandlerTest::testParameterOptionHandler_1argInit()
  154. {
  155. ParameterOptionHandler handler("foo", "", "", "value1");
  156. CPPUNIT_ASSERT(handler.canHandle("foo"));
  157. CPPUNIT_ASSERT(!handler.canHandle("foobar"));
  158. Option option;
  159. handler.parse(option, "value1");
  160. CPPUNIT_ASSERT_EQUAL(std::string("value1"), option.get("foo"));
  161. try {
  162. handler.parse(option, "value3");
  163. CPPUNIT_FAIL("exception must be thrown.");
  164. } catch(Exception& e) {}
  165. CPPUNIT_ASSERT_EQUAL(std::string("value1"),
  166. handler.createPossibleValuesString());
  167. }
  168. void OptionHandlerTest::testParameterOptionHandler_2argsInit()
  169. {
  170. ParameterOptionHandler handler("foo", "", "", "value1", "value2");
  171. CPPUNIT_ASSERT(handler.canHandle("foo"));
  172. CPPUNIT_ASSERT(!handler.canHandle("foobar"));
  173. Option option;
  174. handler.parse(option, "value1");
  175. CPPUNIT_ASSERT_EQUAL(std::string("value1"), option.get("foo"));
  176. handler.parse(option, "value2");
  177. CPPUNIT_ASSERT_EQUAL(std::string("value2"), option.get("foo"));
  178. try {
  179. handler.parse(option, "value3");
  180. CPPUNIT_FAIL("exception must be thrown.");
  181. } catch(Exception& e) {}
  182. CPPUNIT_ASSERT_EQUAL(std::string("value1,value2"),
  183. handler.createPossibleValuesString());
  184. }
  185. void OptionHandlerTest::testParameterOptionHandler_listInit()
  186. {
  187. std::vector<std::string> validValues;
  188. validValues.push_back("value1");
  189. validValues.push_back("value2");
  190. ParameterOptionHandler handler("foo", "", "", validValues);
  191. CPPUNIT_ASSERT(handler.canHandle("foo"));
  192. CPPUNIT_ASSERT(!handler.canHandle("foobar"));
  193. Option option;
  194. handler.parse(option, "value1");
  195. CPPUNIT_ASSERT_EQUAL(std::string("value1"), option.get("foo"));
  196. handler.parse(option, "value2");
  197. CPPUNIT_ASSERT_EQUAL(std::string("value2"), option.get("foo"));
  198. try {
  199. handler.parse(option, "value3");
  200. CPPUNIT_FAIL("exception must be thrown.");
  201. } catch(Exception& e) {}
  202. CPPUNIT_ASSERT_EQUAL(std::string("value1,value2"),
  203. handler.createPossibleValuesString());
  204. }
  205. void OptionHandlerTest::testDefaultOptionHandler()
  206. {
  207. DefaultOptionHandler handler("foo");
  208. CPPUNIT_ASSERT(handler.canHandle("foo"));
  209. CPPUNIT_ASSERT(!handler.canHandle("foobar"));
  210. Option option;
  211. handler.parse(option, "bar");
  212. CPPUNIT_ASSERT_EQUAL(std::string("bar"), option.get("foo"));
  213. handler.parse(option, "");
  214. CPPUNIT_ASSERT_EQUAL(std::string(""), option.get("foo"));
  215. CPPUNIT_ASSERT_EQUAL(std::string(""), handler.createPossibleValuesString());
  216. handler.addTag("apple");
  217. CPPUNIT_ASSERT_EQUAL(std::string("apple"), handler.toTagString());
  218. handler.addTag("orange");
  219. CPPUNIT_ASSERT_EQUAL(std::string("apple, orange"), handler.toTagString());
  220. CPPUNIT_ASSERT(handler.hasTag("apple"));
  221. CPPUNIT_ASSERT(handler.hasTag("orange"));
  222. CPPUNIT_ASSERT(!handler.hasTag("pineapple"));
  223. }
  224. void OptionHandlerTest::testFloatNumberOptionHandler()
  225. {
  226. FloatNumberOptionHandler handler("foo");
  227. CPPUNIT_ASSERT(handler.canHandle("foo"));
  228. CPPUNIT_ASSERT(!handler.canHandle("foobar"));
  229. Option option;
  230. handler.parse(option, "1.0");
  231. CPPUNIT_ASSERT_EQUAL(std::string("1.0"), option.get("foo"));
  232. CPPUNIT_ASSERT_EQUAL(std::string("*-*"),
  233. handler.createPossibleValuesString());
  234. }
  235. void OptionHandlerTest::testFloatNumberOptionHandler_min()
  236. {
  237. FloatNumberOptionHandler handler("foo", "", "", 0.0);
  238. Option option;
  239. handler.parse(option, "0.0");
  240. CPPUNIT_ASSERT_EQUAL(std::string("0.0"), option.get("foo"));
  241. try {
  242. handler.parse(option, "-0.1");
  243. CPPUNIT_FAIL("exception must be thrown.");
  244. } catch(Exception& e) {}
  245. CPPUNIT_ASSERT_EQUAL(std::string("0.0-*"),
  246. handler.createPossibleValuesString());
  247. }
  248. void OptionHandlerTest::testFloatNumberOptionHandler_max()
  249. {
  250. FloatNumberOptionHandler handler("foo", "", "", -1, 10.0);
  251. Option option;
  252. handler.parse(option, "10.0");
  253. CPPUNIT_ASSERT_EQUAL(std::string("10.0"), option.get("foo"));
  254. try {
  255. handler.parse(option, "10.1");
  256. CPPUNIT_FAIL("exception must be thrown.");
  257. } catch(Exception& e) {}
  258. CPPUNIT_ASSERT_EQUAL(std::string("*-10.0"),
  259. handler.createPossibleValuesString());
  260. }
  261. void OptionHandlerTest::testFloatNumberOptionHandler_min_max()
  262. {
  263. FloatNumberOptionHandler handler("foo", "", "", 0.0, 10.0);
  264. Option option;
  265. handler.parse(option, "0.0");
  266. CPPUNIT_ASSERT_EQUAL(std::string("0.0"), option.get("foo"));
  267. handler.parse(option, "10.0");
  268. CPPUNIT_ASSERT_EQUAL(std::string("10.0"), option.get("foo"));
  269. try {
  270. handler.parse(option, "-0.1");
  271. CPPUNIT_FAIL("exception must be thrown.");
  272. } catch(Exception& e) {}
  273. try {
  274. handler.parse(option, "10.1");
  275. CPPUNIT_FAIL("exception must be thrown.");
  276. } catch(Exception& e) {}
  277. CPPUNIT_ASSERT_EQUAL(std::string("0.0-10.0"),
  278. handler.createPossibleValuesString());
  279. }
  280. void OptionHandlerTest::testHttpProxyOptionHandler()
  281. {
  282. HttpProxyOptionHandler handler(PREF_HTTP_PROXY, "", "");
  283. CPPUNIT_ASSERT(handler.canHandle(PREF_HTTP_PROXY));
  284. CPPUNIT_ASSERT(!handler.canHandle("foobar"));
  285. Option option;
  286. handler.parse(option, "proxy:65535");
  287. CPPUNIT_ASSERT_EQUAL(std::string("http://proxy:65535"),
  288. option.get(PREF_HTTP_PROXY));
  289. handler.parse(option, "http://proxy:8080");
  290. CPPUNIT_ASSERT_EQUAL(std::string("http://proxy:8080"),
  291. option.get(PREF_HTTP_PROXY));
  292. handler.parse(option, "");
  293. CPPUNIT_ASSERT(option.defined(PREF_HTTP_PROXY));
  294. CPPUNIT_ASSERT(option.blank(PREF_HTTP_PROXY));
  295. try {
  296. handler.parse(option, "http://bar:65536");
  297. CPPUNIT_FAIL("exception must be thrown.");
  298. } catch(Exception& e) {}
  299. CPPUNIT_ASSERT_EQUAL(std::string("[http://][USER:PASSWORD@]HOST[:PORT]"),
  300. handler.createPossibleValuesString());
  301. handler.parse(option, "http://user%40:passwd%40@proxy:8080");
  302. CPPUNIT_ASSERT_EQUAL(std::string("http://user%40:passwd%40@proxy:8080"),
  303. option.get(PREF_HTTP_PROXY));
  304. option.put(PREF_HTTP_PROXY_USER, "proxy@user");
  305. handler.parse(option, "http://proxy:8080");
  306. CPPUNIT_ASSERT_EQUAL(std::string("http://proxy%40user@proxy:8080"),
  307. option.get(PREF_HTTP_PROXY));
  308. option.put(PREF_HTTP_PROXY_PASSWD, "proxy@passwd");
  309. handler.parse(option, "http://proxy:8080");
  310. CPPUNIT_ASSERT_EQUAL
  311. (std::string("http://proxy%40user:proxy%40passwd@proxy:8080"),
  312. option.get(PREF_HTTP_PROXY));
  313. handler.parse(option, "http://user:passwd@proxy:8080");
  314. CPPUNIT_ASSERT_EQUAL(std::string("http://user:passwd@proxy:8080"),
  315. option.get(PREF_HTTP_PROXY));
  316. option.put(PREF_HTTP_PROXY_USER, "");
  317. handler.parse(option, "http://proxy:8080");
  318. CPPUNIT_ASSERT_EQUAL(std::string("http://:proxy%40passwd@proxy:8080"),
  319. option.get(PREF_HTTP_PROXY));
  320. option.put(PREF_HTTP_PROXY_PASSWD, "");
  321. handler.parse(option, "http://proxy:8080");
  322. CPPUNIT_ASSERT_EQUAL(std::string("http://:@proxy:8080"),
  323. option.get(PREF_HTTP_PROXY));
  324. }
  325. void OptionHandlerTest::testHttpProxyUserOptionHandler()
  326. {
  327. HttpProxyUserOptionHandler handler(PREF_HTTP_PROXY_USER, "", "");
  328. Option option;
  329. handler.parse(option, "proxyuser");
  330. CPPUNIT_ASSERT_EQUAL(std::string("proxyuser"),
  331. option.get(PREF_HTTP_PROXY_USER));
  332. option.put(PREF_HTTP_PROXY, "http://proxy:8080");
  333. handler.parse(option, "proxy@user");
  334. CPPUNIT_ASSERT_EQUAL(std::string("proxy@user"),
  335. option.get(PREF_HTTP_PROXY_USER));
  336. CPPUNIT_ASSERT_EQUAL(std::string("http://proxy%40user@proxy:8080"),
  337. option.get(PREF_HTTP_PROXY));
  338. option.put(PREF_HTTP_PROXY, "http://user@proxy:8080");
  339. handler.parse(option, "proxyuser");
  340. CPPUNIT_ASSERT_EQUAL(std::string("http://proxyuser@proxy:8080"),
  341. option.get(PREF_HTTP_PROXY));
  342. option.put(PREF_HTTP_PROXY, "http://user:passwd%40@proxy:8080");
  343. handler.parse(option, "proxyuser");
  344. CPPUNIT_ASSERT_EQUAL(std::string("http://proxyuser:passwd%40@proxy:8080"),
  345. option.get(PREF_HTTP_PROXY));
  346. handler.parse(option, "");
  347. CPPUNIT_ASSERT_EQUAL(std::string("http://:passwd%40@proxy:8080"),
  348. option.get(PREF_HTTP_PROXY));
  349. }
  350. void OptionHandlerTest::testHttpProxyPasswdOptionHandler()
  351. {
  352. HttpProxyPasswdOptionHandler handler(PREF_HTTP_PROXY_PASSWD, "", "");
  353. Option option;
  354. handler.parse(option, "proxypasswd");
  355. CPPUNIT_ASSERT_EQUAL(std::string("proxypasswd"),
  356. option.get(PREF_HTTP_PROXY_PASSWD));
  357. option.put(PREF_HTTP_PROXY, "http://proxy:8080");
  358. handler.parse(option, "proxy@passwd");
  359. CPPUNIT_ASSERT_EQUAL(std::string("proxy@passwd"),
  360. option.get(PREF_HTTP_PROXY_PASSWD));
  361. CPPUNIT_ASSERT_EQUAL(std::string("http://:proxy%40passwd@proxy:8080"),
  362. option.get(PREF_HTTP_PROXY));
  363. option.put(PREF_HTTP_PROXY, "http://:pass@proxy:8080");
  364. handler.parse(option, "proxypasswd");
  365. CPPUNIT_ASSERT_EQUAL(std::string("http://:proxypasswd@proxy:8080"),
  366. option.get(PREF_HTTP_PROXY));
  367. option.put(PREF_HTTP_PROXY, "http://user%40:pass@proxy:8080");
  368. handler.parse(option, "proxypasswd");
  369. CPPUNIT_ASSERT_EQUAL(std::string("http://user%40:proxypasswd@proxy:8080"),
  370. option.get(PREF_HTTP_PROXY));
  371. handler.parse(option, "");
  372. CPPUNIT_ASSERT_EQUAL(std::string("http://user%40:@proxy:8080"),
  373. option.get(PREF_HTTP_PROXY));
  374. }
  375. } // namespace aria2