JsonTest.cc 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #include "json.h"
  2. #include <cppunit/extensions/HelperMacros.h>
  3. #include "RecoverableException.h"
  4. #include "util.h"
  5. #include "array_fun.h"
  6. #include "base64.h"
  7. namespace aria2 {
  8. class JsonTest:public CppUnit::TestFixture {
  9. CPPUNIT_TEST_SUITE(JsonTest);
  10. CPPUNIT_TEST(testEncode);
  11. CPPUNIT_TEST(testDecodeGetParams);
  12. CPPUNIT_TEST_SUITE_END();
  13. private:
  14. public:
  15. void testEncode();
  16. void testDecodeGetParams();
  17. };
  18. CPPUNIT_TEST_SUITE_REGISTRATION( JsonTest );
  19. void JsonTest::testEncode()
  20. {
  21. {
  22. auto dict = Dict::g();
  23. dict->put("name", String::g("aria2"));
  24. dict->put("loc", Integer::g(80000));
  25. auto files = List::g();
  26. files->append(String::g("aria2c"));
  27. dict->put("files", std::move(files));
  28. auto attrs = Dict::g();
  29. attrs->put("license", String::g("GPL"));
  30. dict->put("attrs", std::move(attrs));
  31. CPPUNIT_ASSERT_EQUAL(std::string("{\"attrs\":{\"license\":\"GPL\"},"
  32. "\"files\":[\"aria2c\"],"
  33. "\"loc\":80000,"
  34. "\"name\":\"aria2\"}"),
  35. json::encode(dict.get()));
  36. }
  37. {
  38. auto list = List::g();
  39. list->append("\"\\/\b\f\n\r\t");
  40. CPPUNIT_ASSERT_EQUAL(std::string("[\"\\\"\\\\\\/\\b\\f\\n\\r\\t\"]"),
  41. json::encode(list.get()));
  42. }
  43. {
  44. auto list = List::g();
  45. std::string s;
  46. s += 0x1Fu;
  47. list->append(s);
  48. CPPUNIT_ASSERT_EQUAL(std::string("[\"\\u001F\"]"),
  49. json::encode(list.get()));
  50. }
  51. {
  52. auto list = List::g();
  53. list->append(Bool::gTrue());
  54. list->append(Bool::gFalse());
  55. list->append(Null::g());
  56. CPPUNIT_ASSERT_EQUAL(std::string("[true,false,null]"),
  57. json::encode(list.get()));
  58. }
  59. }
  60. void JsonTest::testDecodeGetParams()
  61. {
  62. {
  63. std::string s = "[1,2,3]";
  64. std::string param = util::percentEncode(base64::encode(s.begin(), s.end()));
  65. std::string query = "?params=";
  66. query += param;
  67. query += '&';
  68. query += "method=sum&";
  69. query += "id=300&";
  70. query += "jsoncallback=cb";
  71. json::JsonGetParam gparam = json::decodeGetParams(query);
  72. CPPUNIT_ASSERT_EQUAL(std::string("{\"method\":\"sum\","
  73. "\"id\":\"300\","
  74. "\"params\":[1,2,3]}"),
  75. gparam.request);
  76. CPPUNIT_ASSERT_EQUAL(std::string("cb"), gparam.callback);
  77. }
  78. {
  79. std::string s = "[{}]";
  80. std::string query = "?params=";
  81. query += util::percentEncode(base64::encode(s.begin(), s.end()));
  82. query += '&';
  83. query += "jsoncallback=cb";
  84. json::JsonGetParam gparam = json::decodeGetParams(query);
  85. CPPUNIT_ASSERT_EQUAL(std::string("[{}]"), gparam.request);
  86. CPPUNIT_ASSERT_EQUAL(std::string("cb"), gparam.callback);
  87. }
  88. {
  89. std::string query = "?method=sum&id=300";
  90. json::JsonGetParam gparam = json::decodeGetParams(query);
  91. CPPUNIT_ASSERT_EQUAL(std::string("{\"method\":\"sum\","
  92. "\"id\":\"300\"}"),
  93. gparam.request);
  94. CPPUNIT_ASSERT_EQUAL(std::string(), gparam.callback);
  95. }
  96. }
  97. } // namespace aria2