OptionHandlerTest.cc 15 KB

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