XmlRpcRequestProcessorTest.cc 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. #include "XmlRpcRequestProcessor.h"
  2. #include <cppunit/extensions/HelperMacros.h>
  3. #include "XmlRpcRequestParserStateMachine.h"
  4. #include "RecoverableException.h"
  5. namespace aria2 {
  6. namespace rpc {
  7. class XmlRpcRequestProcessorTest:public CppUnit::TestFixture {
  8. CPPUNIT_TEST_SUITE(XmlRpcRequestProcessorTest);
  9. CPPUNIT_TEST(testParseMemory);
  10. CPPUNIT_TEST(testParseMemory_shouldFail);
  11. CPPUNIT_TEST(testParseMemory_withoutStringTag);
  12. CPPUNIT_TEST_SUITE_END();
  13. public:
  14. void setUp() {}
  15. void tearDown() {}
  16. void testParseMemory();
  17. void testParseMemory_shouldFail();
  18. void testParseMemory_withoutStringTag();
  19. };
  20. CPPUNIT_TEST_SUITE_REGISTRATION(XmlRpcRequestProcessorTest);
  21. void XmlRpcRequestProcessorTest::testParseMemory()
  22. {
  23. XmlRpcRequestProcessor proc;
  24. RpcRequest req =
  25. proc.parseMemory("<?xml version=\"1.0\"?>"
  26. "<methodCall>"
  27. " <methodName>aria2.addURI</methodName>"
  28. " <params>"
  29. " <param>"
  30. " <value><i4>100</i4></value>"
  31. " </param>"
  32. " <param>"
  33. " <value>"
  34. " <struct>"
  35. " <member>"
  36. " <name>max-count</name>"
  37. " <value><i4>65535</i4></value>"
  38. " </member>"
  39. " <member>"
  40. " <name>seed-ratio</name>"
  41. " <value><double>0.99</double></value>"
  42. " </member>"
  43. " </struct>"
  44. " </value>"
  45. " </param>"
  46. " <param>"
  47. " <value>"
  48. " <array>"
  49. " <data>"
  50. " <value><string>pudding</string></value>"
  51. " <value><base64>aGVsbG8gd29ybGQ=</base64></value>"
  52. " </data>"
  53. " </array>"
  54. " </value>"
  55. " </param>"
  56. " </params>"
  57. "</methodCall>");
  58. CPPUNIT_ASSERT_EQUAL(std::string("aria2.addURI"), req.methodName);
  59. CPPUNIT_ASSERT_EQUAL((size_t)3, req.params->size());
  60. CPPUNIT_ASSERT_EQUAL((Integer::ValueType)100,
  61. asInteger(req.params->get(0))->i());
  62. const Dict* dict = asDict(req.params->get(1));
  63. CPPUNIT_ASSERT_EQUAL((Integer::ValueType)65535,
  64. asInteger(dict->get("max-count"))->i());
  65. // Current implementation handles double as string.
  66. CPPUNIT_ASSERT_EQUAL(std::string("0.99"),
  67. asString(dict->get("seed-ratio"))->s());
  68. const List* list = asList(req.params->get(2));
  69. CPPUNIT_ASSERT_EQUAL(std::string("pudding"), asString(list->get(0))->s());
  70. CPPUNIT_ASSERT_EQUAL(std::string("hello world"), asString(list->get(1))->s());
  71. }
  72. void XmlRpcRequestProcessorTest::testParseMemory_shouldFail()
  73. {
  74. XmlRpcRequestProcessor proc;
  75. try {
  76. proc.parseMemory("<methodCall>"
  77. " <methodName>aria2.addURI</methodName>"
  78. " <params>"
  79. " <param>"
  80. " <value><i4>100</i4></value>"
  81. " </param>");
  82. CPPUNIT_FAIL("exception must be thrown.");
  83. } catch(RecoverableException& e) {
  84. // success
  85. }
  86. {
  87. RpcRequest req =
  88. proc.parseMemory("<methodCall>"
  89. " <methodName>aria2.addURI</methodName>"
  90. " <params>"
  91. " </params>"
  92. "</methodCall>");
  93. CPPUNIT_ASSERT(req.params);
  94. }
  95. try {
  96. RpcRequest req =
  97. proc.parseMemory("<methodCall>"
  98. " <methodName>aria2.addURI</methodName>"
  99. "</methodCall>");
  100. CPPUNIT_FAIL("exception must be thrown.");
  101. } catch(RecoverableException& e) {
  102. // success
  103. }
  104. }
  105. void XmlRpcRequestProcessorTest::testParseMemory_withoutStringTag()
  106. {
  107. XmlRpcRequestProcessor proc;
  108. RpcRequest req =
  109. proc.parseMemory("<?xml version=\"1.0\"?>"
  110. "<methodCall>"
  111. " <methodName>aria2.addUri</methodName>"
  112. " <params>"
  113. " <param>"
  114. " <value>http://aria2.sourceforge.net</value>"
  115. " </param>"
  116. " <param>"
  117. " <value>http://aria2.<foo/>sourceforge.net</value>"
  118. " </param>"
  119. " <param>"
  120. " <value>"
  121. " <struct>"
  122. " <member>"
  123. " <name>hello</name>"
  124. " <value>world</value>"
  125. " </member>"
  126. " </struct>"
  127. " </value>"
  128. " </param>"
  129. " <param>"
  130. " <value>"
  131. " <array>"
  132. " <data>"
  133. " <value>apple</value>"
  134. " <value>banana</value>"
  135. " <value><string>lemon</string>peanuts</value>"
  136. " </data>"
  137. " </array>"
  138. " </value>"
  139. " </param>"
  140. " </params>"
  141. "</methodCall>");
  142. CPPUNIT_ASSERT_EQUAL((size_t)4, req.params->size());
  143. CPPUNIT_ASSERT_EQUAL(std::string("http://aria2.sourceforge.net"),
  144. asString(req.params->get(0))->s());
  145. CPPUNIT_ASSERT_EQUAL(std::string("http://aria2.sourceforge.net"),
  146. asString(req.params->get(1))->s());
  147. const Dict* dict = asDict(req.params->get(2));
  148. CPPUNIT_ASSERT_EQUAL(std::string("world"),
  149. asString(dict->get("hello"))->s());
  150. const List* list = asList(req.params->get(3));
  151. CPPUNIT_ASSERT_EQUAL(std::string("apple"), asString(list->get(0))->s());
  152. CPPUNIT_ASSERT_EQUAL(std::string("banana"), asString(list->get(1))->s());
  153. CPPUNIT_ASSERT_EQUAL(std::string("lemon"), asString(list->get(2))->s());
  154. }
  155. } // namespace rpc
  156. } // namespace aria2