OptionParserTest.cc 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. #include "OptionParser.h"
  2. #include <cstring>
  3. #include <sstream>
  4. #include <cppunit/extensions/HelperMacros.h>
  5. #include "OptionHandlerImpl.h"
  6. #include "Exception.h"
  7. #include "util.h"
  8. #include "Option.h"
  9. #include "array_fun.h"
  10. #include "prefs.h"
  11. #include "help_tags.h"
  12. namespace aria2 {
  13. class OptionParserTest:public CppUnit::TestFixture {
  14. CPPUNIT_TEST_SUITE(OptionParserTest);
  15. CPPUNIT_TEST(testFindAll);
  16. CPPUNIT_TEST(testFindByNameSubstring);
  17. CPPUNIT_TEST(testFindByTag);
  18. CPPUNIT_TEST(testFind);
  19. CPPUNIT_TEST(testFindByShortName);
  20. CPPUNIT_TEST(testFindById);
  21. CPPUNIT_TEST(testParseDefaultValues);
  22. CPPUNIT_TEST(testParseArg);
  23. CPPUNIT_TEST(testParse);
  24. CPPUNIT_TEST(testParseKeyVals);
  25. CPPUNIT_TEST_SUITE_END();
  26. private:
  27. std::shared_ptr<OptionParser> oparser_;
  28. public:
  29. void setUp()
  30. {
  31. oparser_.reset(new OptionParser());
  32. OptionHandler* timeout
  33. (new DefaultOptionHandler(PREF_TIMEOUT, NO_DESCRIPTION, "ALPHA", "",
  34. OptionHandler::REQ_ARG, 'A'));
  35. timeout->addTag(TAG_BASIC);
  36. timeout->setEraseAfterParse(true);
  37. oparser_->addOptionHandler(timeout);
  38. OptionHandler* dir(new DefaultOptionHandler(PREF_DIR));
  39. dir->addTag(TAG_BASIC);
  40. dir->addTag(TAG_HTTP);
  41. dir->addTag(TAG_FILE);
  42. oparser_->addOptionHandler(dir);
  43. DefaultOptionHandler* daemon
  44. (new DefaultOptionHandler(PREF_DAEMON, NO_DESCRIPTION, "CHARLIE", "",
  45. OptionHandler::REQ_ARG, 'C'));
  46. daemon->hide();
  47. daemon->addTag(TAG_FILE);
  48. oparser_->addOptionHandler(daemon);
  49. OptionHandler* out
  50. (new UnitNumberOptionHandler(PREF_OUT, NO_DESCRIPTION, "1M",
  51. -1, -1, 'D'));
  52. out->addTag(TAG_FILE);
  53. oparser_->addOptionHandler(out);
  54. }
  55. void tearDown() {}
  56. void testFindAll();
  57. void testFindByNameSubstring();
  58. void testFindByTag();
  59. void testFind();
  60. void testFindByShortName();
  61. void testFindById();
  62. void testParseDefaultValues();
  63. void testParseArg();
  64. void testParse();
  65. void testParseKeyVals();
  66. };
  67. CPPUNIT_TEST_SUITE_REGISTRATION(OptionParserTest);
  68. void OptionParserTest::testFindAll()
  69. {
  70. std::vector<const OptionHandler*> res = oparser_->findAll();
  71. CPPUNIT_ASSERT_EQUAL((size_t)3, res.size());
  72. CPPUNIT_ASSERT_EQUAL(std::string("timeout"), std::string(res[0]->getName()));
  73. CPPUNIT_ASSERT_EQUAL(std::string("dir"), std::string(res[1]->getName()));
  74. CPPUNIT_ASSERT_EQUAL(std::string("out"), std::string(res[2]->getName()));
  75. }
  76. void OptionParserTest::testFindByNameSubstring()
  77. {
  78. std::vector<const OptionHandler*> res = oparser_->findByNameSubstring("i");
  79. CPPUNIT_ASSERT_EQUAL((size_t)2, res.size());
  80. CPPUNIT_ASSERT_EQUAL(std::string("timeout"), std::string(res[0]->getName()));
  81. CPPUNIT_ASSERT_EQUAL(std::string("dir"), std::string(res[1]->getName()));
  82. }
  83. void OptionParserTest::testFindByTag()
  84. {
  85. std::vector<const OptionHandler*> res = oparser_->findByTag(TAG_FILE);
  86. CPPUNIT_ASSERT_EQUAL((size_t)2, res.size());
  87. CPPUNIT_ASSERT_EQUAL(std::string("dir"), std::string(res[0]->getName()));
  88. CPPUNIT_ASSERT_EQUAL(std::string("out"), std::string(res[1]->getName()));
  89. }
  90. void OptionParserTest::testFind()
  91. {
  92. const OptionHandler* dir = oparser_->find(PREF_DIR);
  93. CPPUNIT_ASSERT(dir);
  94. CPPUNIT_ASSERT_EQUAL(std::string("dir"), std::string(dir->getName()));
  95. const OptionHandler* daemon = oparser_->find(PREF_DAEMON);
  96. CPPUNIT_ASSERT(!daemon);
  97. const OptionHandler* log = oparser_->find(PREF_LOG);
  98. CPPUNIT_ASSERT(!log);
  99. }
  100. void OptionParserTest::testFindByShortName()
  101. {
  102. const OptionHandler* timeout = oparser_->findByShortName('A');
  103. CPPUNIT_ASSERT(timeout);
  104. CPPUNIT_ASSERT_EQUAL(std::string("timeout"), std::string(timeout->getName()));
  105. CPPUNIT_ASSERT(!oparser_->findByShortName('C'));
  106. }
  107. void OptionParserTest::testFindById()
  108. {
  109. const OptionHandler* timeout = oparser_->findById(PREF_TIMEOUT->i);
  110. CPPUNIT_ASSERT(timeout);
  111. CPPUNIT_ASSERT_EQUAL(std::string("timeout"), std::string(timeout->getName()));
  112. CPPUNIT_ASSERT(!oparser_->findById(9999));
  113. }
  114. void OptionParserTest::testParseDefaultValues()
  115. {
  116. Option option;
  117. oparser_->parseDefaultValues(option);
  118. CPPUNIT_ASSERT_EQUAL(std::string("ALPHA"), option.get(PREF_TIMEOUT));
  119. CPPUNIT_ASSERT_EQUAL(std::string("1048576"), option.get(PREF_OUT));
  120. CPPUNIT_ASSERT_EQUAL(std::string("CHARLIE"), option.get(PREF_DAEMON));
  121. CPPUNIT_ASSERT(!option.defined(PREF_DIR));
  122. }
  123. void OptionParserTest::testParseArg()
  124. {
  125. Option option;
  126. char prog[7];
  127. strncpy(prog, "aria2c", sizeof(prog));
  128. char optionTimeout[3];
  129. strncpy(optionTimeout, "-A", sizeof(optionTimeout));
  130. char argTimeout[6];
  131. strncpy(argTimeout, "ALPHA", sizeof(argTimeout));
  132. char optionDir[8];
  133. strncpy(optionDir, "--dir", sizeof(optionDir));
  134. char argDir[6];
  135. strncpy(argDir, "BRAVO", sizeof(argDir));
  136. char nonopt1[8];
  137. strncpy(nonopt1, "nonopt1", sizeof(nonopt1));
  138. char nonopt2[8];
  139. strncpy(nonopt2, "nonopt2", sizeof(nonopt2));
  140. char* argv[] = { prog, optionTimeout, argTimeout, optionDir, argDir,
  141. nonopt1, nonopt2 };
  142. int argc = arraySize(argv);
  143. std::stringstream s;
  144. std::vector<std::string> nonopts;
  145. oparser_->parseArg(s, nonopts, argc, argv);
  146. CPPUNIT_ASSERT_EQUAL(std::string("timeout=ALPHA\n"
  147. "dir=BRAVO\n"), s.str());
  148. CPPUNIT_ASSERT_EQUAL((size_t)2, nonopts.size());
  149. CPPUNIT_ASSERT_EQUAL(std::string("nonopt1"), nonopts[0]);
  150. CPPUNIT_ASSERT_EQUAL(std::string("nonopt2"), nonopts[1]);
  151. CPPUNIT_ASSERT_EQUAL(std::string("*****"), std::string(argTimeout));
  152. }
  153. void OptionParserTest::testParse()
  154. {
  155. Option option;
  156. std::istringstream in("timeout=Hello\n"
  157. "UNKNOWN=x\n"
  158. "\n"
  159. "dir=World");
  160. oparser_->parse(option, in);
  161. CPPUNIT_ASSERT_EQUAL(std::string("Hello"), option.get(PREF_TIMEOUT));
  162. CPPUNIT_ASSERT_EQUAL(std::string("World"), option.get(PREF_DIR));
  163. }
  164. void OptionParserTest::testParseKeyVals()
  165. {
  166. Option option;
  167. KeyVals kv;
  168. kv.push_back(std::make_pair("timeout", "Hello"));
  169. kv.push_back(std::make_pair("UNKNOWN", "x"));
  170. kv.push_back(std::make_pair("dir", "World"));
  171. oparser_->parse(option, kv);
  172. CPPUNIT_ASSERT_EQUAL(std::string("Hello"), option.get(PREF_TIMEOUT));
  173. CPPUNIT_ASSERT_EQUAL(std::string("World"), option.get(PREF_DIR));
  174. }
  175. } // namespace aria2