llsdserialize_test.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:39k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llsdserialize_test.cpp
  3.  * @date 2006-04
  4.  * @brief LLSDSerialize unit tests
  5.  *
  6.  * $LicenseInfo:firstyear=2006&license=viewergpl$
  7.  * 
  8.  * Copyright (c) 2006-2010, Linden Research, Inc.
  9.  * 
  10.  * Second Life Viewer Source Code
  11.  * The source code in this file ("Source Code") is provided by Linden Lab
  12.  * to you under the terms of the GNU General Public License, version 2.0
  13.  * ("GPL"), unless you have obtained a separate licensing agreement
  14.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  15.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  16.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  17.  * 
  18.  * There are special exceptions to the terms and conditions of the GPL as
  19.  * it is applied to this Source Code. View the full text of the exception
  20.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  21.  * online at
  22.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  23.  * 
  24.  * By copying, modifying or distributing this software, you acknowledge
  25.  * that you have read and understood your obligations described above,
  26.  * and agree to abide by those obligations.
  27.  * 
  28.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  29.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  30.  * COMPLETENESS OR PERFORMANCE.
  31.  * $/LicenseInfo$
  32.  */
  33. #if !LL_WINDOWS
  34. #include <netinet/in.h>
  35. #endif
  36. #include "linden_common.h"
  37. #include "../llsd.h"
  38. #include "../llsdserialize.h"
  39. #include "../llformat.h"
  40. #include "../test/lltut.h"
  41. #if LL_WINDOWS
  42. #include <winsock2.h>
  43. typedef U32 uint32_t;
  44. #endif
  45. std::vector<U8> string_to_vector(std::string str)
  46. {
  47. // bc LLSD can't...
  48. size_t len = (size_t)str.length();
  49. std::vector<U8> v(len);
  50. for (size_t i = 0; i < len ; i++)
  51. {
  52. v[i] = str[i];
  53. }
  54. return v;
  55. }
  56. namespace tut
  57. {
  58. struct sd_xml_data
  59. {
  60. sd_xml_data()
  61. {
  62. mFormatter = new LLSDXMLFormatter;
  63. }
  64. LLSD mSD;
  65. LLPointer<LLSDXMLFormatter> mFormatter;
  66. void xml_test(const char* name, const std::string& expected)
  67. {
  68. std::ostringstream ostr;
  69. mFormatter->format(mSD, ostr);
  70. ensure_equals(name, ostr.str(), expected);
  71. }
  72. };
  73. typedef test_group<sd_xml_data> sd_xml_test;
  74. typedef sd_xml_test::object sd_xml_object;
  75. tut::sd_xml_test sd_xml_stream("sd_xml_serialization");
  76. template<> template<>
  77. void sd_xml_object::test<1>()
  78. {
  79. // random atomic tests
  80. std::string expected;
  81. expected = "<llsd><undef /></llsd>n";
  82. xml_test("undef", expected);
  83. mSD = 3463;
  84. expected = "<llsd><integer>3463</integer></llsd>n";
  85. xml_test("integer", expected);
  86. mSD = "";
  87. expected = "<llsd><string /></llsd>n";
  88. xml_test("empty string", expected);
  89. mSD = "foobar";
  90. expected = "<llsd><string>foobar</string></llsd>n";
  91. xml_test("string", expected);
  92. mSD = LLUUID::null;
  93. expected = "<llsd><uuid /></llsd>n";
  94. xml_test("null uuid", expected);
  95. mSD = LLUUID("c96f9b1e-f589-4100-9774-d98643ce0bed");
  96. expected = "<llsd><uuid>c96f9b1e-f589-4100-9774-d98643ce0bed</uuid></llsd>n";
  97. xml_test("uuid", expected);
  98. mSD = LLURI("https://secondlife.com/login");
  99. expected = "<llsd><uri>https://secondlife.com/login</uri></llsd>n";
  100. xml_test("uri", expected);
  101. mSD = LLDate("2006-04-24T16:11:33Z");
  102. expected = "<llsd><date>2006-04-24T16:11:33Z</date></llsd>n";
  103. xml_test("date", expected);
  104. // Generated by: echo -n 'hello' | openssl enc -e -base64
  105. std::vector<U8> hello;
  106. hello.push_back('h');
  107. hello.push_back('e');
  108. hello.push_back('l');
  109. hello.push_back('l');
  110. hello.push_back('o');
  111. mSD = hello;
  112. expected = "<llsd><binary encoding="base64">aGVsbG8=</binary></llsd>n";
  113. xml_test("binary", expected);
  114. }
  115. template<> template<>
  116. void sd_xml_object::test<2>()
  117. {
  118. // tests with boolean values.
  119. std::string expected;
  120. mFormatter->boolalpha(true);
  121. mSD = true;
  122. expected = "<llsd><boolean>true</boolean></llsd>n";
  123. xml_test("bool alpha true", expected);
  124. mSD = false;
  125. expected = "<llsd><boolean>false</boolean></llsd>n";
  126. xml_test("bool alpha false", expected);
  127. mFormatter->boolalpha(false);
  128. mSD = true;
  129. expected = "<llsd><boolean>1</boolean></llsd>n";
  130. xml_test("bool true", expected);
  131. mSD = false;
  132. expected = "<llsd><boolean>0</boolean></llsd>n";
  133. xml_test("bool false", expected);
  134. }
  135. template<> template<>
  136. void sd_xml_object::test<3>()
  137. {
  138. // tests with real values.
  139. std::string expected;
  140. mFormatter->realFormat("%.2f");
  141. mSD = 1.0;
  142. expected = "<llsd><real>1.00</real></llsd>n";
  143. xml_test("real 1", expected);
  144. mSD = -34379.0438;
  145. expected = "<llsd><real>-34379.04</real></llsd>n";
  146. xml_test("real reduced precision", expected);
  147. mFormatter->realFormat("%.4f");
  148. expected = "<llsd><real>-34379.0438</real></llsd>n";
  149. xml_test("higher precision", expected);
  150. mFormatter->realFormat("%.0f");
  151. mSD = 0.0;
  152. expected = "<llsd><real>0</real></llsd>n";
  153. xml_test("no decimal 0", expected);
  154. mSD = 3287.4387;
  155. expected = "<llsd><real>3287</real></llsd>n";
  156. xml_test("no decimal real number", expected);
  157. }
  158. template<> template<>
  159. void sd_xml_object::test<4>()
  160. {
  161. // tests with arrays
  162. std::string expected;
  163. mSD = LLSD::emptyArray();
  164. expected = "<llsd><array /></llsd>n";
  165. xml_test("empty array", expected);
  166. mSD.append(LLSD());
  167. expected = "<llsd><array><undef /></array></llsd>n";
  168. xml_test("1 element array", expected);
  169. mSD.append(1);
  170. expected = "<llsd><array><undef /><integer>1</integer></array></llsd>n";
  171. xml_test("2 element array", expected);
  172. }
  173. template<> template<>
  174. void sd_xml_object::test<5>()
  175. {
  176. // tests with arrays
  177. std::string expected;
  178. mSD = LLSD::emptyMap();
  179. expected = "<llsd><map /></llsd>n";
  180. xml_test("empty map", expected);
  181. mSD["foo"] = "bar";
  182. expected = "<llsd><map><key>foo</key><string>bar</string></map></llsd>n";
  183. xml_test("1 element map", expected);
  184. mSD["baz"] = LLSD();
  185. expected = "<llsd><map><key>baz</key><undef /><key>foo</key><string>bar</string></map></llsd>n";
  186. xml_test("2 element map", expected);
  187. }
  188. template<> template<>
  189. void sd_xml_object::test<6>()
  190. {
  191. // tests with binary
  192. std::string expected;
  193. // Generated by: echo -n 'hello' | openssl enc -e -base64
  194. mSD = string_to_vector("hello");
  195. expected = "<llsd><binary encoding="base64">aGVsbG8=</binary></llsd>n";
  196. xml_test("binary", expected);
  197. mSD = string_to_vector("6|6|asdfhappybox|60e44ec5-305c-43c2-9a19-b4b89b1ae2a6|60e44ec5-305c-43c2-9a19-b4b89b1ae2a6|60e44ec5-305c-43c2-9a19-b4b89b1ae2a6|00000000-0000-0000-0000-000000000000|7fffffff|7fffffff|0|0|82000|450fe394-2904-c9ad-214c-a07eb7feec29|(No Description)|0|10|0");
  198. expected = "<llsd><binary encoding="base64">Nnw2fGFzZGZoYXBweWJveHw2MGU0NGVjNS0zMDVjLTQzYzItOWExOS1iNGI4OWIxYWUyYTZ8NjBlNDRlYzUtMzA1Yy00M2MyLTlhMTktYjRiODliMWFlMmE2fDYwZTQ0ZWM1LTMwNWMtNDNjMi05YTE5LWI0Yjg5YjFhZTJhNnwwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDB8N2ZmZmZmZmZ8N2ZmZmZmZmZ8MHwwfDgyMDAwfDQ1MGZlMzk0LTI5MDQtYzlhZC0yMTRjLWEwN2ViN2ZlZWMyOXwoTm8gRGVzY3JpcHRpb24pfDB8MTB8MA==</binary></llsd>n";
  199. xml_test("binary", expected);
  200. }
  201. class TestLLSDSerializeData
  202. {
  203. public:
  204. TestLLSDSerializeData();
  205. ~TestLLSDSerializeData();
  206. void doRoundTripTests(const std::string&);
  207. void checkRoundTrip(const std::string&, const LLSD& v);
  208. LLPointer<LLSDFormatter> mFormatter;
  209. LLPointer<LLSDParser> mParser;
  210. };
  211. TestLLSDSerializeData::TestLLSDSerializeData()
  212. {
  213. }
  214. TestLLSDSerializeData::~TestLLSDSerializeData()
  215. {
  216. }
  217. void TestLLSDSerializeData::checkRoundTrip(const std::string& msg, const LLSD& v)
  218. {
  219. std::stringstream stream;
  220. mFormatter->format(v, stream);
  221. //llinfos << "checkRoundTrip: length " << stream.str().length() << llendl;
  222. LLSD w;
  223. mParser->reset(); // reset() call is needed since test code re-uses mParser
  224. mParser->parse(stream, w, stream.str().size());
  225. try
  226. {
  227. ensure_equals(msg.c_str(), w, v);
  228. }
  229. catch (...)
  230. {
  231. std::cerr << "the serialized string was:" << std::endl;
  232. std::cerr << stream.str() << std::endl;
  233. throw;
  234. }
  235. }
  236. static void fillmap(LLSD& root, U32 width, U32 depth)
  237. {
  238. if(depth == 0)
  239. {
  240. root["foo"] = "bar";
  241. return;
  242. }
  243. for(U32 i = 0; i < width; ++i)
  244. {
  245. std::string key = llformat("child %d", i);
  246. root[key] = LLSD::emptyMap();
  247. fillmap(root[key], width, depth - 1);
  248. }
  249. }
  250. void TestLLSDSerializeData::doRoundTripTests(const std::string& msg)
  251. {
  252. LLSD v;
  253. checkRoundTrip(msg + " undefined", v);
  254. v = true;
  255. checkRoundTrip(msg + " true bool", v);
  256. v = false;
  257. checkRoundTrip(msg + " false bool", v);
  258. v = 1;
  259. checkRoundTrip(msg + " positive int", v);
  260. v = 0;
  261. checkRoundTrip(msg + " zero int", v);
  262. v = -1;
  263. checkRoundTrip(msg + " negative int", v);
  264. v = 1234.5f;
  265. checkRoundTrip(msg + " positive float", v);
  266. v = 0.0f;
  267. checkRoundTrip(msg + " zero float", v);
  268. v = -1234.5f;
  269. checkRoundTrip(msg + " negative float", v);
  270. // FIXME: need a NaN test
  271. v = LLUUID::null;
  272. checkRoundTrip(msg + " null uuid", v);
  273. LLUUID newUUID;
  274. newUUID.generate();
  275. v = newUUID;
  276. checkRoundTrip(msg + " new uuid", v);
  277. v = "";
  278. checkRoundTrip(msg + " empty string", v);
  279. v = "some string";
  280. checkRoundTrip(msg + " non-empty string", v);
  281. v =
  282. "Second Life is a 3-D virtual world entirely built and owned by its residents. "
  283. "Since opening to the public in 2003, it has grown explosively and today is "
  284. "inhabited by nearly 100,000 people from around the globe.n"
  285. "n"
  286. "From the moment you enter the World you'll discover a vast digital continent, "
  287. "teeming with people, entertainment, experiences and opportunity. Once you've "
  288. "explored a bit, perhaps you'll find a perfect parcel of land to build your "
  289. "house or business.n"
  290. "n"
  291. "You'll also be surrounded by the Creations of your fellow residents. Because "
  292. "residents retain the rights to their digital creations, they can buy, sell "
  293. "and trade with other residents.n"
  294. "n"
  295. "The Marketplace currently supports millions of US dollars in monthly "
  296. "transactions. This commerce is handled with the in-world currency, the Linden "
  297. "dollar, which can be converted to US dollars at several thriving online "
  298. "currency exchanges.n"
  299. "n"
  300. "Welcome to Second Life. We look forward to seeing you in-world!n"
  301. ;
  302. checkRoundTrip(msg + " long string", v);
  303. static const U32 block_size = 0x000020;
  304. for (U32 block = 0x000000; block <= 0x10ffff; block += block_size)
  305. {
  306. std::ostringstream out;
  307. for (U32 c = block; c < block + block_size; ++c)
  308. {
  309. if (c <= 0x000001f
  310. && c != 0x000009
  311. && c != 0x00000a)
  312. {
  313. // see XML standard, sections 2.2 and 4.1
  314. continue;
  315. }
  316. if (0x00d800 <= c  &&  c <= 0x00dfff) { continue; }
  317. if (0x00fdd0 <= c  &&  c <= 0x00fdef) { continue; }
  318. if ((c & 0x00fffe) == 0x00fffe) { continue; }
  319. // see Unicode standard, section 15.8 
  320. if (c <= 0x00007f)
  321. {
  322. out << (char)(c & 0x7f);
  323. }
  324. else if (c <= 0x0007ff)
  325. {
  326. out << (char)(0xc0 | ((c >> 6) & 0x1f));
  327. out << (char)(0x80 | ((c >> 0) & 0x3f));
  328. }
  329. else if (c <= 0x00ffff)
  330. {
  331. out << (char)(0xe0 | ((c >> 12) & 0x0f));
  332. out << (char)(0x80 | ((c >>  6) & 0x3f));
  333. out << (char)(0x80 | ((c >>  0) & 0x3f));
  334. }
  335. else
  336. {
  337. out << (char)(0xf0 | ((c >> 18) & 0x07));
  338. out << (char)(0x80 | ((c >> 12) & 0x3f));
  339. out << (char)(0x80 | ((c >>  6) & 0x3f));
  340. out << (char)(0x80 | ((c >>  0) & 0x3f));
  341. }
  342. }
  343. v = out.str();
  344. std::ostringstream blockmsg;
  345. blockmsg << msg << " unicode string block 0x" << std::hex << block; 
  346. checkRoundTrip(blockmsg.str(), v);
  347. }
  348. LLDate epoch;
  349. v = epoch;
  350. checkRoundTrip(msg + " epoch date", v);
  351. LLDate aDay("2002-12-07T05:07:15.00Z");
  352. v = aDay;
  353. checkRoundTrip(msg + " date", v);
  354. LLURI path("http://slurl.com/secondlife/Ambleside/57/104/26/");
  355. v = path;
  356. checkRoundTrip(msg + " url", v);
  357. const char source[] = "it must be a blue moon again";
  358. std::vector<U8> data;
  359. copy(&source[0], &source[sizeof(source)], back_inserter(data));
  360. v = data;
  361. checkRoundTrip(msg + " binary", v);
  362. v = LLSD::emptyMap();
  363. checkRoundTrip(msg + " empty map", v);
  364. v = LLSD::emptyMap();
  365. v["name"] = "luke"; //v.insert("name", "luke");
  366. v["age"] = 3; //v.insert("age", 3);
  367. checkRoundTrip(msg + " map", v);
  368. v.clear();
  369. v["a"]["1"] = true;
  370. v["b"]["0"] = false;
  371. checkRoundTrip(msg + " nested maps", v);
  372. v = LLSD::emptyArray();
  373. checkRoundTrip(msg + " empty array", v);
  374. v = LLSD::emptyArray();
  375. v.append("ali");
  376. v.append(28);
  377. checkRoundTrip(msg + " array", v);
  378. v.clear();
  379. v[0][0] = true;
  380. v[1][0] = false;
  381. checkRoundTrip(msg + " nested arrays", v);
  382. v = LLSD::emptyMap();
  383. fillmap(v, 10, 6); // 10^6 maps
  384. checkRoundTrip(msg + " many nested maps", v);
  385. }
  386. typedef tut::test_group<TestLLSDSerializeData> TestLLSDSerialzeGroup;
  387. typedef TestLLSDSerialzeGroup::object TestLLSDSerializeObject;
  388. TestLLSDSerialzeGroup gTestLLSDSerializeGroup("llsd serialization");
  389. template<> template<> 
  390. void TestLLSDSerializeObject::test<1>()
  391. {
  392. mFormatter = new LLSDNotationFormatter();
  393. mParser = new LLSDNotationParser();
  394. doRoundTripTests("notation serialization");
  395. }
  396. template<> template<> 
  397. void TestLLSDSerializeObject::test<2>()
  398. {
  399. mFormatter = new LLSDXMLFormatter();
  400. mParser = new LLSDXMLParser();
  401. doRoundTripTests("xml serialization");
  402. }
  403. template<> template<> 
  404. void TestLLSDSerializeObject::test<3>()
  405. {
  406. mFormatter = new LLSDBinaryFormatter();
  407. mParser = new LLSDBinaryParser();
  408. doRoundTripTests("binary serialization");
  409. }
  410. /**
  411.  * @class TestLLSDParsing
  412.  * @brief Base class for of a parse tester.
  413.  */
  414. template <class parser_t>
  415. class TestLLSDParsing
  416. {
  417. public:
  418. TestLLSDParsing()
  419. {
  420. mParser = new parser_t;
  421. }
  422. void ensureParse(
  423. const std::string& msg,
  424. const std::string& in,
  425. const LLSD& expected_value,
  426. S32 expected_count)
  427. {
  428. std::stringstream input;
  429. input.str(in);
  430. LLSD parsed_result;
  431. mParser->reset(); // reset() call is needed since test code re-uses mParser
  432. S32 parsed_count = mParser->parse(input, parsed_result, in.size());
  433. ensure_equals(msg.c_str(), parsed_result, expected_value);
  434. // This count check is really only useful for expected
  435. // parse failures, since the ensures equal will already
  436. // require eqality.
  437. std::string count_msg(msg);
  438. count_msg += " (count)";
  439. ensure_equals(count_msg, parsed_count, expected_count);
  440. }
  441. LLPointer<parser_t> mParser;
  442. };
  443. /**
  444.  * @class TestLLSDXMLParsing
  445.  * @brief Concrete instance of a parse tester.
  446.  */
  447. class TestLLSDXMLParsing : public TestLLSDParsing<LLSDXMLParser>
  448. {
  449. public:
  450. TestLLSDXMLParsing() {}
  451. };
  452. typedef tut::test_group<TestLLSDXMLParsing> TestLLSDXMLParsingGroup;
  453. typedef TestLLSDXMLParsingGroup::object TestLLSDXMLParsingObject;
  454. TestLLSDXMLParsingGroup gTestLLSDXMLParsingGroup("llsd XML parsing");
  455. template<> template<> 
  456. void TestLLSDXMLParsingObject::test<1>()
  457. {
  458. // test handling of xml not recognized as llsd results in an
  459. // LLSD Undefined
  460. ensureParse(
  461. "malformed xml",
  462. "<llsd><string>ha ha</string>",
  463. LLSD(),
  464. LLSDParser::PARSE_FAILURE);
  465. ensureParse(
  466. "not llsd",
  467. "<html><body><p>ha ha</p></body></html>",
  468. LLSD(),
  469. LLSDParser::PARSE_FAILURE);
  470. ensureParse(
  471. "value without llsd",
  472. "<string>ha ha</string>",
  473. LLSD(),
  474. LLSDParser::PARSE_FAILURE);
  475. ensureParse(
  476. "key without llsd",
  477. "<key>ha ha</key>",
  478. LLSD(),
  479. LLSDParser::PARSE_FAILURE);
  480. }
  481. template<> template<> 
  482. void TestLLSDXMLParsingObject::test<2>()
  483. {
  484. // test handling of unrecognized or unparseable llsd values
  485. LLSD v;
  486. v["amy"] = 23;
  487. v["bob"] = LLSD();
  488. v["cam"] = 1.23;
  489. ensureParse(
  490. "unknown data type",
  491. "<llsd><map>"
  492. "<key>amy</key><integer>23</integer>"
  493. "<key>bob</key><bigint>99999999999999999</bigint>"
  494. "<key>cam</key><real>1.23</real>"
  495. "</map></llsd>",
  496. v,
  497. v.size() + 1);
  498. }
  499. template<> template<> 
  500. void TestLLSDXMLParsingObject::test<3>()
  501. {
  502. // test handling of nested bad data
  503. LLSD v;
  504. v["amy"] = 23;
  505. v["cam"] = 1.23;
  506. ensureParse(
  507. "map with html",
  508. "<llsd><map>"
  509. "<key>amy</key><integer>23</integer>"
  510. "<html><body>ha ha</body></html>"
  511. "<key>cam</key><real>1.23</real>"
  512. "</map></llsd>",
  513. v,
  514. v.size() + 1);
  515. v.clear();
  516. v["amy"] = 23;
  517. v["cam"] = 1.23;
  518. ensureParse(
  519. "map with value for key",
  520. "<llsd><map>"
  521. "<key>amy</key><integer>23</integer>"
  522. "<string>ha ha</string>"
  523. "<key>cam</key><real>1.23</real>"
  524. "</map></llsd>",
  525. v,
  526. v.size() + 1);
  527. v.clear();
  528. v["amy"] = 23;
  529. v["bob"] = LLSD::emptyMap();
  530. v["cam"] = 1.23;
  531. ensureParse(
  532. "map with map of html",
  533. "<llsd><map>"
  534. "<key>amy</key><integer>23</integer>"
  535. "<key>bob</key>"
  536. "<map>"
  537. "<html><body>ha ha</body></html>"
  538. "</map>"
  539. "<key>cam</key><real>1.23</real>"
  540. "</map></llsd>",
  541. v,
  542. v.size() + 1);
  543. v.clear();
  544. v[0] = 23;
  545. v[1] = LLSD();
  546. v[2] = 1.23;
  547. ensureParse(
  548. "array value of html",
  549. "<llsd><array>"
  550. "<integer>23</integer>"
  551. "<html><body>ha ha</body></html>"
  552. "<real>1.23</real>"
  553. "</array></llsd>",
  554. v,
  555. v.size() + 1);
  556. v.clear();
  557. v[0] = 23;
  558. v[1] = LLSD::emptyMap();
  559. v[2] = 1.23;
  560. ensureParse(
  561. "array with map of html",
  562. "<llsd><array>"
  563. "<integer>23</integer>"
  564. "<map>"
  565. "<html><body>ha ha</body></html>"
  566. "</map>"
  567. "<real>1.23</real>"
  568. "</array></llsd>",
  569. v,
  570. v.size() + 1);
  571. }
  572. template<> template<> 
  573. void TestLLSDXMLParsingObject::test<4>()
  574. {
  575. // test handling of binary object in XML
  576. std::string xml;
  577. LLSD expected;
  578. // Generated by: echo -n 'hello' | openssl enc -e -base64
  579. expected = string_to_vector("hello");
  580. xml = "<llsd><binary encoding="base64">aGVsbG8=</binary></llsd>n";
  581. ensureParse(
  582. "the word 'hello' packed in binary encoded base64",
  583. xml,
  584. expected,
  585. 1);
  586. expected = string_to_vector("6|6|asdfhappybox|60e44ec5-305c-43c2-9a19-b4b89b1ae2a6|60e44ec5-305c-43c2-9a19-b4b89b1ae2a6|60e44ec5-305c-43c2-9a19-b4b89b1ae2a6|00000000-0000-0000-0000-000000000000|7fffffff|7fffffff|0|0|82000|450fe394-2904-c9ad-214c-a07eb7feec29|(No Description)|0|10|0");
  587. xml = "<llsd><binary encoding="base64">Nnw2fGFzZGZoYXBweWJveHw2MGU0NGVjNS0zMDVjLTQzYzItOWExOS1iNGI4OWIxYWUyYTZ8NjBlNDRlYzUtMzA1Yy00M2MyLTlhMTktYjRiODliMWFlMmE2fDYwZTQ0ZWM1LTMwNWMtNDNjMi05YTE5LWI0Yjg5YjFhZTJhNnwwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDB8N2ZmZmZmZmZ8N2ZmZmZmZmZ8MHwwfDgyMDAwfDQ1MGZlMzk0LTI5MDQtYzlhZC0yMTRjLWEwN2ViN2ZlZWMyOXwoTm8gRGVzY3JpcHRpb24pfDB8MTB8MA==</binary></llsd>n";
  588. ensureParse(
  589. "a common binary blob for object -> agent offline inv transfer",
  590. xml,
  591. expected,
  592. 1);
  593. expected = string_to_vector("6|6|asdfhappybox|60e44ec5-305c-43c2-9a19-b4b89b1ae2a6|60e44ec5-305c-43c2-9a19-b4b89b1ae2a6|60e44ec5-305c-43c2-9a19-b4b89b1ae2a6|00000000-0000-0000-0000-000000000000|7fffffff|7fffffff|0|0|82000|450fe394-2904-c9ad-214c-a07eb7feec29|(No Description)|0|10|0");
  594. xml = "<llsd><binary encoding="base64">Nnw2fGFzZGZoYXBweWJveHw2MGU0NGVjNS0zMDVjLTQzYzItOWExOS1iNGI4OWIxYWUyYTZ8NjBln";
  595. xml += "NDRlYzUtMzA1Yy00M2MyLTlhMTktYjRiODliMWFlMmE2fDYwZTQ0ZWM1LTMwNWMtNDNjMi05YTE5n";
  596. xml += "LWI0Yjg5YjFhZTJhNnwwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDB8N2ZmZmZmn";
  597. xml += "ZmZ8N2ZmZmZmZmZ8MHwwfDgyMDAwfDQ1MGZlMzk0LTI5MDQtYzlhZC0yMTRjLWEwN2ViN2ZlZWMyn";
  598. xml += "OXwoTm8gRGVzY3JpcHRpb24pfDB8MTB8MA==</binary></llsd>n";
  599. ensureParse(
  600. "a common binary blob for object -> agent offline inv transfer",
  601. xml,
  602. expected,
  603. 1);
  604. }
  605. /*
  606. TODO:
  607. test XML parsing
  608. binary with unrecognized encoding
  609. nested LLSD tags
  610. multiple values inside an LLSD
  611. */
  612. /**
  613.  * @class TestLLSDNotationParsing
  614.  * @brief Concrete instance of a parse tester.
  615.  */
  616. class TestLLSDNotationParsing : public TestLLSDParsing<LLSDNotationParser>
  617. {
  618. public:
  619. TestLLSDNotationParsing() {}
  620. };
  621. typedef tut::test_group<TestLLSDNotationParsing> TestLLSDNotationParsingGroup;
  622. typedef TestLLSDNotationParsingGroup::object TestLLSDNotationParsingObject;
  623. TestLLSDNotationParsingGroup gTestLLSDNotationParsingGroup(
  624. "llsd notation parsing");
  625. template<> template<> 
  626. void TestLLSDNotationParsingObject::test<1>()
  627. {
  628. // test handling of xml not recognized as llsd results in an
  629. // LLSD Undefined
  630. ensureParse(
  631. "malformed notation map",
  632. "{'ha ha'",
  633. LLSD(),
  634. LLSDParser::PARSE_FAILURE);
  635. ensureParse(
  636. "malformed notation array",
  637. "['ha ha'",
  638. LLSD(),
  639. LLSDParser::PARSE_FAILURE);
  640. ensureParse(
  641. "malformed notation string",
  642. "'ha ha",
  643. LLSD(),
  644. LLSDParser::PARSE_FAILURE);
  645. ensureParse(
  646. "bad notation noise",
  647. "g48ejlnfr",
  648. LLSD(),
  649. LLSDParser::PARSE_FAILURE);
  650. }
  651. template<> template<> 
  652. void TestLLSDNotationParsingObject::test<2>()
  653. {
  654. ensureParse("valid undef", "!", LLSD(), 1);
  655. }
  656. template<> template<> 
  657. void TestLLSDNotationParsingObject::test<3>()
  658. {
  659. LLSD val = false;
  660. ensureParse("valid boolean false 0", "false", val, 1);
  661. ensureParse("valid boolean false 1", "f", val, 1);
  662. ensureParse("valid boolean false 2", "0", val, 1);
  663. ensureParse("valid boolean false 3", "F", val, 1);
  664. ensureParse("valid boolean false 4", "FALSE", val, 1);
  665. val = true;
  666. ensureParse("valid boolean true 0", "true", val, 1);
  667. ensureParse("valid boolean true 1", "t", val, 1);
  668. ensureParse("valid boolean true 2", "1", val, 1);
  669. ensureParse("valid boolean true 3", "T", val, 1);
  670. ensureParse("valid boolean true 4", "TRUE", val, 1);
  671. val.clear();
  672. ensureParse("invalid true", "TR", val, LLSDParser::PARSE_FAILURE);
  673. ensureParse("invalid false", "FAL", val, LLSDParser::PARSE_FAILURE);
  674. }
  675. template<> template<> 
  676. void TestLLSDNotationParsingObject::test<4>()
  677. {
  678. LLSD val = 123;
  679. ensureParse("valid integer", "i123", val, 1);
  680. val.clear();
  681. ensureParse("invalid integer", "421", val, LLSDParser::PARSE_FAILURE);
  682. }
  683. template<> template<> 
  684. void TestLLSDNotationParsingObject::test<5>()
  685. {
  686. LLSD val = 456.7;
  687. ensureParse("valid real", "r456.7", val, 1);
  688. val.clear();
  689. ensureParse("invalid real", "456.7", val, LLSDParser::PARSE_FAILURE);
  690. }
  691. template<> template<> 
  692. void TestLLSDNotationParsingObject::test<6>()
  693. {
  694. LLUUID id;
  695. LLSD val = id;
  696. ensureParse(
  697. "unparseable uuid",
  698. "u123",
  699. LLSD(),
  700. LLSDParser::PARSE_FAILURE);
  701. id.generate();
  702. val = id;
  703. std::string uuid_str("u");
  704. uuid_str += id.asString();
  705. ensureParse("valid uuid", uuid_str.c_str(), val, 1);
  706. }
  707. template<> template<> 
  708. void TestLLSDNotationParsingObject::test<7>()
  709. {
  710. LLSD val = std::string("foolish");
  711. ensureParse("valid string 1", ""foolish"", val, 1);
  712. val = std::string("g'day");
  713. ensureParse("valid string 2", ""g'day"", val, 1);
  714. val = std::string("have a "nice" day");
  715. ensureParse("valid string 3", "'have a "nice" day'", val, 1);
  716. val = std::string("whatever");
  717. ensureParse("valid string 4", "s(8)"whatever"", val, 1);
  718. }
  719. template<> template<> 
  720. void TestLLSDNotationParsingObject::test<8>()
  721. {
  722. ensureParse(
  723. "invalid string 1",
  724. "s(7)"whatever"",
  725. LLSD(),
  726. LLSDParser::PARSE_FAILURE);
  727. ensureParse(
  728. "invalid string 2",
  729. "s(9)"whatever"",
  730. LLSD(),
  731. LLSDParser::PARSE_FAILURE);
  732. }
  733. template<> template<> 
  734. void TestLLSDNotationParsingObject::test<9>()
  735. {
  736. LLSD val = LLURI("http://www.google.com");
  737. ensureParse("valid uri", "l"http://www.google.com"", val, 1);
  738. }
  739. template<> template<> 
  740. void TestLLSDNotationParsingObject::test<10>()
  741. {
  742. LLSD val = LLDate("2007-12-28T09:22:53.10Z");
  743. ensureParse("valid date", "d"2007-12-28T09:22:53.10Z"", val, 1);
  744. }
  745. template<> template<> 
  746. void TestLLSDNotationParsingObject::test<11>()
  747. {
  748. std::vector<U8> vec;
  749. vec.push_back((U8)'a'); vec.push_back((U8)'b'); vec.push_back((U8)'c');
  750. vec.push_back((U8)'3'); vec.push_back((U8)'2'); vec.push_back((U8)'1');
  751. LLSD val = vec;
  752. ensureParse("valid binary b64", "b64"YWJjMzIx"", val, 1);
  753. ensureParse("valid bainry b16", "b16"616263333231"", val, 1);
  754. ensureParse("valid bainry raw", "b(6)"abc321"", val, 1);
  755. }
  756. template<> template<> 
  757. void TestLLSDNotationParsingObject::test<12>()
  758. {
  759. ensureParse(
  760. "invalid -- binary length specified too long",
  761. "b(7)"abc321"",
  762. LLSD(),
  763. LLSDParser::PARSE_FAILURE);
  764. ensureParse(
  765. "invalid -- binary length specified way too long",
  766. "b(1000000)"abc321"",
  767. LLSD(),
  768. LLSDParser::PARSE_FAILURE);
  769. }
  770. template<> template<> 
  771. void TestLLSDNotationParsingObject::test<13>()
  772. {
  773. LLSD val;
  774. val["amy"] = 23;
  775. val["bob"] = LLSD();
  776. val["cam"] = 1.23;
  777. ensureParse("simple map", "{'amy':i23,'bob':!,'cam':r1.23}", val, 4);
  778. val["bob"] = LLSD::emptyMap();
  779. val["bob"]["vehicle"] = std::string("bicycle");
  780. ensureParse(
  781. "nested map",
  782. "{'amy':i23,'bob':{'vehicle':'bicycle'},'cam':r1.23}",
  783. val,
  784. 5);
  785. }
  786. template<> template<> 
  787. void TestLLSDNotationParsingObject::test<14>()
  788. {
  789. LLSD val;
  790. val.append(23);
  791. val.append(LLSD());
  792. val.append(1.23);
  793. ensureParse("simple array", "[i23,!,r1.23]", val, 4);
  794. val[1] = LLSD::emptyArray();
  795. val[1].append("bicycle");
  796. ensureParse("nested array", "[i23,['bicycle'],r1.23]", val, 5);
  797. }
  798. template<> template<> 
  799. void TestLLSDNotationParsingObject::test<15>()
  800. {
  801. LLSD val;
  802. val["amy"] = 23;
  803. val["bob"]["dogs"] = LLSD::emptyArray();
  804. val["bob"]["dogs"].append(LLSD::emptyMap());
  805. val["bob"]["dogs"][0]["name"] = std::string("groove");
  806. val["bob"]["dogs"][0]["breed"] = std::string("samoyed");
  807. val["bob"]["dogs"].append(LLSD::emptyMap());
  808. val["bob"]["dogs"][1]["name"] = std::string("greyley");
  809. val["bob"]["dogs"][1]["breed"] = std::string("chow/husky");
  810. val["cam"] = 1.23;
  811. ensureParse(
  812. "nested notation",
  813. "{'amy':i23,"
  814. " 'bob':{'dogs':["
  815.          "{'name':'groove', 'breed':'samoyed'},"
  816.          "{'name':'greyley', 'breed':'chow/husky'}]},"
  817. " 'cam':r1.23}",
  818. val,
  819. 11);
  820. }
  821. template<> template<> 
  822. void TestLLSDNotationParsingObject::test<16>()
  823. {
  824. // text to make sure that incorrect sizes bail because 
  825. std::string bad_str("s(5)"hi"");
  826. ensureParse(
  827. "size longer than bytes left",
  828. bad_str,
  829. LLSD(),
  830. LLSDParser::PARSE_FAILURE);
  831. }
  832. template<> template<> 
  833. void TestLLSDNotationParsingObject::test<17>()
  834. {
  835. // text to make sure that incorrect sizes bail because 
  836. std::string bad_bin("b(5)"hi"");
  837. ensureParse(
  838. "size longer than bytes left",
  839. bad_bin,
  840. LLSD(),
  841. LLSDParser::PARSE_FAILURE);
  842. }
  843. /**
  844.  * @class TestLLSDBinaryParsing
  845.  * @brief Concrete instance of a parse tester.
  846.  */
  847. class TestLLSDBinaryParsing : public TestLLSDParsing<LLSDBinaryParser>
  848. {
  849. public:
  850. TestLLSDBinaryParsing() {}
  851. };
  852. typedef tut::test_group<TestLLSDBinaryParsing> TestLLSDBinaryParsingGroup;
  853. typedef TestLLSDBinaryParsingGroup::object TestLLSDBinaryParsingObject;
  854. TestLLSDBinaryParsingGroup gTestLLSDBinaryParsingGroup(
  855. "llsd binary parsing");
  856. template<> template<> 
  857. void TestLLSDBinaryParsingObject::test<1>()
  858. {
  859. std::vector<U8> vec;
  860. vec.resize(6);
  861. vec[0] = 'a'; vec[1] = 'b'; vec[2] = 'c';
  862. vec[3] = '3'; vec[4] = '2'; vec[5] = '1';
  863. std::string string_expected((char*)&vec[0], vec.size());
  864. LLSD value = string_expected;
  865. vec.resize(11);
  866. vec[0] = 's'; // for string
  867. vec[5] = 'a'; vec[6] = 'b'; vec[7] = 'c';
  868. vec[8] = '3'; vec[9] = '2'; vec[10] = '1';
  869. uint32_t size = htonl(6);
  870. memcpy(&vec[1], &size, sizeof(uint32_t));
  871. std::string str_good((char*)&vec[0], vec.size());
  872. ensureParse("correct string parse", str_good, value, 1);
  873. size = htonl(7);
  874. memcpy(&vec[1], &size, sizeof(uint32_t));
  875. std::string str_bad_1((char*)&vec[0], vec.size());
  876. ensureParse(
  877. "incorrect size string parse",
  878. str_bad_1,
  879. LLSD(),
  880. LLSDParser::PARSE_FAILURE);
  881. size = htonl(100000);
  882. memcpy(&vec[1], &size, sizeof(uint32_t));
  883. std::string str_bad_2((char*)&vec[0], vec.size());
  884. ensureParse(
  885. "incorrect size string parse",
  886. str_bad_2,
  887. LLSD(),
  888. LLSDParser::PARSE_FAILURE);
  889. }
  890. template<> template<> 
  891. void TestLLSDBinaryParsingObject::test<2>()
  892. {
  893. std::vector<U8> vec;
  894. vec.resize(6);
  895. vec[0] = 'a'; vec[1] = 'b'; vec[2] = 'c';
  896. vec[3] = '3'; vec[4] = '2'; vec[5] = '1';
  897. LLSD value = vec;
  898. vec.resize(11);
  899. vec[0] = 'b';  // for binary
  900. vec[5] = 'a'; vec[6] = 'b'; vec[7] = 'c';
  901. vec[8] = '3'; vec[9] = '2'; vec[10] = '1';
  902. uint32_t size = htonl(6);
  903. memcpy(&vec[1], &size, sizeof(uint32_t));
  904. std::string str_good((char*)&vec[0], vec.size());
  905. ensureParse("correct binary parse", str_good, value, 1);
  906. size = htonl(7);
  907. memcpy(&vec[1], &size, sizeof(uint32_t));
  908. std::string str_bad_1((char*)&vec[0], vec.size());
  909. ensureParse(
  910. "incorrect size binary parse 1",
  911. str_bad_1,
  912. LLSD(),
  913. LLSDParser::PARSE_FAILURE);
  914. size = htonl(100000);
  915. memcpy(&vec[1], &size, sizeof(uint32_t));
  916. std::string str_bad_2((char*)&vec[0], vec.size());
  917. ensureParse(
  918. "incorrect size binary parse 2",
  919. str_bad_2,
  920. LLSD(),
  921. LLSDParser::PARSE_FAILURE);
  922. }
  923. template<> template<> 
  924. void TestLLSDBinaryParsingObject::test<3>()
  925. {
  926. // test handling of xml not recognized as llsd results in an
  927. // LLSD Undefined
  928. ensureParse(
  929. "malformed binary map",
  930. "{'ha ha'",
  931. LLSD(),
  932. LLSDParser::PARSE_FAILURE);
  933. ensureParse(
  934. "malformed binary array",
  935. "['ha ha'",
  936. LLSD(),
  937. LLSDParser::PARSE_FAILURE);
  938. ensureParse(
  939. "malformed binary string",
  940. "'ha ha",
  941. LLSD(),
  942. LLSDParser::PARSE_FAILURE);
  943. ensureParse(
  944. "bad noise",
  945. "g48ejlnfr",
  946. LLSD(),
  947. LLSDParser::PARSE_FAILURE);
  948. }
  949. template<> template<> 
  950. void TestLLSDBinaryParsingObject::test<4>()
  951. {
  952. ensureParse("valid undef", "!", LLSD(), 1);
  953. }
  954. template<> template<> 
  955. void TestLLSDBinaryParsingObject::test<5>()
  956. {
  957. LLSD val = false;
  958. ensureParse("valid boolean false 2", "0", val, 1);
  959. val = true;
  960. ensureParse("valid boolean true 2", "1", val, 1);
  961. val.clear();
  962. ensureParse("invalid true", "t", val, LLSDParser::PARSE_FAILURE);
  963. ensureParse("invalid false", "f", val, LLSDParser::PARSE_FAILURE);
  964. }
  965. template<> template<> 
  966. void TestLLSDBinaryParsingObject::test<6>()
  967. {
  968. std::vector<U8> vec;
  969. vec.push_back('{');
  970. vec.resize(vec.size() + 4);
  971. uint32_t size = htonl(1);
  972. memcpy(&vec[1], &size, sizeof(uint32_t));
  973. vec.push_back('k');
  974. int key_size_loc = vec.size();
  975. size = htonl(1); // 1 too short
  976. vec.resize(vec.size() + 4);
  977. memcpy(&vec[key_size_loc], &size, sizeof(uint32_t));
  978. vec.push_back('a'); vec.push_back('m'); vec.push_back('y');
  979. vec.push_back('i');
  980. int integer_loc = vec.size();
  981. vec.resize(vec.size() + 4);
  982. uint32_t val_int = htonl(23);
  983. memcpy(&vec[integer_loc], &val_int, sizeof(uint32_t));
  984. std::string str_bad_1((char*)&vec[0], vec.size());
  985. ensureParse(
  986. "invalid key size",
  987. str_bad_1,
  988. LLSD(),
  989. LLSDParser::PARSE_FAILURE);
  990. // check with correct size, but unterminated map (missing '}')
  991. size = htonl(3); // correct size
  992. memcpy(&vec[key_size_loc], &size, sizeof(uint32_t));
  993. std::string str_bad_2((char*)&vec[0], vec.size());
  994. ensureParse(
  995. "valid key size, unterminated map",
  996. str_bad_2,
  997. LLSD(),
  998. LLSDParser::PARSE_FAILURE);
  999. // check w/ correct size and correct map termination
  1000. LLSD val;
  1001. val["amy"] = 23;
  1002. vec.push_back('}');
  1003. std::string str_good((char*)&vec[0], vec.size());
  1004. ensureParse(
  1005. "valid map",
  1006. str_good,
  1007. val,
  1008. 2);
  1009. // check w/ incorrect sizes and correct map termination
  1010. size = htonl(0); // 1 too few (for the map entry)
  1011. memcpy(&vec[1], &size, sizeof(uint32_t));
  1012. std::string str_bad_3((char*)&vec[0], vec.size());
  1013. ensureParse(
  1014. "invalid map too long",
  1015. str_bad_3,
  1016. LLSD(),
  1017. LLSDParser::PARSE_FAILURE);
  1018. size = htonl(2); // 1 too many
  1019. memcpy(&vec[1], &size, sizeof(uint32_t));
  1020. std::string str_bad_4((char*)&vec[0], vec.size());
  1021. ensureParse(
  1022. "invalid map too short",
  1023. str_bad_4,
  1024. LLSD(),
  1025. LLSDParser::PARSE_FAILURE);
  1026. }
  1027. template<> template<> 
  1028. void TestLLSDBinaryParsingObject::test<7>()
  1029. {
  1030. std::vector<U8> vec;
  1031. vec.push_back('[');
  1032. vec.resize(vec.size() + 4);
  1033. uint32_t size = htonl(1); // 1 too short
  1034. memcpy(&vec[1], &size, sizeof(uint32_t));
  1035. vec.push_back('"'); vec.push_back('a'); vec.push_back('m');
  1036. vec.push_back('y'); vec.push_back('"'); vec.push_back('i');
  1037. int integer_loc = vec.size();
  1038. vec.resize(vec.size() + 4);
  1039. uint32_t val_int = htonl(23);
  1040. memcpy(&vec[integer_loc], &val_int, sizeof(uint32_t));
  1041. std::string str_bad_1((char*)&vec[0], vec.size());
  1042. ensureParse(
  1043. "invalid array size",
  1044. str_bad_1,
  1045. LLSD(),
  1046. LLSDParser::PARSE_FAILURE);
  1047. // check with correct size, but unterminated map (missing ']')
  1048. size = htonl(2); // correct size
  1049. memcpy(&vec[1], &size, sizeof(uint32_t));
  1050. std::string str_bad_2((char*)&vec[0], vec.size());
  1051. ensureParse(
  1052. "unterminated array",
  1053. str_bad_2,
  1054. LLSD(),
  1055. LLSDParser::PARSE_FAILURE);
  1056. // check w/ correct size and correct map termination
  1057. LLSD val;
  1058. val.append("amy");
  1059. val.append(23);
  1060. vec.push_back(']');
  1061. std::string str_good((char*)&vec[0], vec.size());
  1062. ensureParse(
  1063. "valid array",
  1064. str_good,
  1065. val,
  1066. 3);
  1067. // check with too many elements
  1068. size = htonl(3); // 1 too long
  1069. memcpy(&vec[1], &size, sizeof(uint32_t));
  1070. std::string str_bad_3((char*)&vec[0], vec.size());
  1071. ensureParse(
  1072. "array too short",
  1073. str_bad_3,
  1074. LLSD(),
  1075. LLSDParser::PARSE_FAILURE);
  1076. }
  1077. template<> template<> 
  1078. void TestLLSDBinaryParsingObject::test<8>()
  1079. {
  1080. std::vector<U8> vec;
  1081. vec.push_back('{');
  1082. vec.resize(vec.size() + 4);
  1083. memset(&vec[1], 0, 4);
  1084. vec.push_back('}');
  1085. std::string str_good((char*)&vec[0], vec.size());
  1086. LLSD val = LLSD::emptyMap();
  1087. ensureParse(
  1088. "empty map",
  1089. str_good,
  1090. val,
  1091. 1);
  1092. }
  1093. template<> template<> 
  1094. void TestLLSDBinaryParsingObject::test<9>()
  1095. {
  1096. std::vector<U8> vec;
  1097. vec.push_back('[');
  1098. vec.resize(vec.size() + 4);
  1099. memset(&vec[1], 0, 4);
  1100. vec.push_back(']');
  1101. std::string str_good((char*)&vec[0], vec.size());
  1102. LLSD val = LLSD::emptyArray();
  1103. ensureParse(
  1104. "empty array",
  1105. str_good,
  1106. val,
  1107. 1);
  1108. }
  1109. template<> template<> 
  1110. void TestLLSDBinaryParsingObject::test<10>()
  1111. {
  1112. std::vector<U8> vec;
  1113. vec.push_back('l');
  1114. vec.resize(vec.size() + 4);
  1115. uint32_t size = htonl(14); // 1 too long
  1116. memcpy(&vec[1], &size, sizeof(uint32_t));
  1117. vec.push_back('h'); vec.push_back('t'); vec.push_back('t');
  1118. vec.push_back('p'); vec.push_back(':'); vec.push_back('/');
  1119. vec.push_back('/'); vec.push_back('s'); vec.push_back('l');
  1120. vec.push_back('.'); vec.push_back('c'); vec.push_back('o');
  1121. vec.push_back('m');
  1122. std::string str_bad((char*)&vec[0], vec.size());
  1123. ensureParse(
  1124. "invalid uri length size",
  1125. str_bad,
  1126. LLSD(),
  1127. LLSDParser::PARSE_FAILURE);
  1128. LLSD val;
  1129. val = LLURI("http://sl.com");
  1130. size = htonl(13); // correct length
  1131. memcpy(&vec[1], &size, sizeof(uint32_t));
  1132. std::string str_good((char*)&vec[0], vec.size());
  1133. ensureParse(
  1134. "valid key size",
  1135. str_good,
  1136. val,
  1137. 1);
  1138. }
  1139. /*
  1140. template<> template<> 
  1141. void TestLLSDBinaryParsingObject::test<11>()
  1142. {
  1143. }
  1144. */
  1145.    /**
  1146.  * @class TestLLSDCrossCompatible
  1147.  * @brief Miscellaneous serialization and parsing tests
  1148.  */
  1149. class TestLLSDCrossCompatible
  1150. {
  1151. public:
  1152. TestLLSDCrossCompatible() {}
  1153. void ensureBinaryAndNotation(
  1154. const std::string& msg,
  1155. const LLSD& input)
  1156. {
  1157. // to binary, and back again
  1158. std::stringstream str1;
  1159. S32 count1 = LLSDSerialize::toBinary(input, str1);
  1160. LLSD actual_value_bin;
  1161. S32 count2 = LLSDSerialize::fromBinary(
  1162. actual_value_bin,
  1163. str1,
  1164. LLSDSerialize::SIZE_UNLIMITED);
  1165. ensure_equals(
  1166. "ensureBinaryAndNotation binary count",
  1167. count2,
  1168. count1);
  1169. // to notation and back again
  1170. std::stringstream str2;
  1171. S32 count3 = LLSDSerialize::toNotation(actual_value_bin, str2);
  1172. ensure_equals(
  1173. "ensureBinaryAndNotation notation count1",
  1174. count3,
  1175. count2);
  1176. LLSD actual_value_notation;
  1177. S32 count4 = LLSDSerialize::fromNotation(
  1178. actual_value_notation,
  1179. str2,
  1180. LLSDSerialize::SIZE_UNLIMITED);
  1181. ensure_equals(
  1182. "ensureBinaryAndNotation notation count2",
  1183. count4,
  1184. count3);
  1185. ensure_equals(
  1186. (msg + " (binaryandnotation)").c_str(),
  1187. actual_value_notation,
  1188. input);
  1189. }
  1190. void ensureBinaryAndXML(
  1191. const std::string& msg,
  1192. const LLSD& input)
  1193. {
  1194. // to binary, and back again
  1195. std::stringstream str1;
  1196. S32 count1 = LLSDSerialize::toBinary(input, str1);
  1197. LLSD actual_value_bin;
  1198. S32 count2 = LLSDSerialize::fromBinary(
  1199. actual_value_bin,
  1200. str1,
  1201. LLSDSerialize::SIZE_UNLIMITED);
  1202. ensure_equals(
  1203. "ensureBinaryAndXML binary count",
  1204. count2,
  1205. count1);
  1206. // to xml and back again
  1207. std::stringstream str2;
  1208. S32 count3 = LLSDSerialize::toXML(actual_value_bin, str2);
  1209. ensure_equals(
  1210. "ensureBinaryAndXML xml count1",
  1211. count3,
  1212. count2);
  1213. LLSD actual_value_xml;
  1214. S32 count4 = LLSDSerialize::fromXML(actual_value_xml, str2);
  1215. ensure_equals(
  1216. "ensureBinaryAndXML xml count2",
  1217. count4,
  1218. count3);
  1219. ensure_equals((msg + " (binaryandxml)").c_str(), actual_value_xml, input);
  1220. }
  1221. };
  1222. typedef tut::test_group<TestLLSDCrossCompatible> TestLLSDCompatibleGroup;
  1223. typedef TestLLSDCompatibleGroup::object TestLLSDCompatibleObject;
  1224. TestLLSDCompatibleGroup gTestLLSDCompatibleGroup(
  1225. "llsd serialize compatible");
  1226. template<> template<> 
  1227. void TestLLSDCompatibleObject::test<1>()
  1228. {
  1229. LLSD test;
  1230. ensureBinaryAndNotation("undef", test);
  1231. ensureBinaryAndXML("undef", test);
  1232. test = true;
  1233. ensureBinaryAndNotation("boolean true", test);
  1234. ensureBinaryAndXML("boolean true", test);
  1235. test = false;
  1236. ensureBinaryAndNotation("boolean false", test);
  1237. ensureBinaryAndXML("boolean false", test);
  1238. test = 0;
  1239. ensureBinaryAndNotation("integer zero", test);
  1240. ensureBinaryAndXML("integer zero", test);
  1241. test = 1;
  1242. ensureBinaryAndNotation("integer positive", test);
  1243. ensureBinaryAndXML("integer positive", test);
  1244. test = -234567;
  1245. ensureBinaryAndNotation("integer negative", test);
  1246. ensureBinaryAndXML("integer negative", test);
  1247. test = 0.0;
  1248. ensureBinaryAndNotation("real zero", test);
  1249. ensureBinaryAndXML("real zero", test);
  1250. test = 1.0;
  1251. ensureBinaryAndNotation("real positive", test);
  1252. ensureBinaryAndXML("real positive", test);
  1253. test = -1.0;
  1254. ensureBinaryAndNotation("real negative", test);
  1255. ensureBinaryAndXML("real negative", test);
  1256. }
  1257. template<> template<> 
  1258. void TestLLSDCompatibleObject::test<2>()
  1259. {
  1260. LLSD test;
  1261. test = "foobar";
  1262. ensureBinaryAndNotation("string", test);
  1263. ensureBinaryAndXML("string", test);
  1264. }
  1265. template<> template<> 
  1266. void TestLLSDCompatibleObject::test<3>()
  1267. {
  1268. LLSD test;
  1269. LLUUID id;
  1270. id.generate();
  1271. test = id;
  1272. ensureBinaryAndNotation("uuid", test);
  1273. ensureBinaryAndXML("uuid", test);
  1274. }
  1275. template<> template<> 
  1276. void TestLLSDCompatibleObject::test<4>()
  1277. {
  1278. LLSD test;
  1279. test = LLDate(12345.0);
  1280. ensureBinaryAndNotation("date", test);
  1281. ensureBinaryAndXML("date", test);
  1282. }
  1283. template<> template<> 
  1284. void TestLLSDCompatibleObject::test<5>()
  1285. {
  1286. LLSD test;
  1287. test = LLURI("http://www.secondlife.com/");
  1288. ensureBinaryAndNotation("uri", test);
  1289. ensureBinaryAndXML("uri", test);
  1290. }
  1291. template<> template<> 
  1292. void TestLLSDCompatibleObject::test<6>()
  1293. {
  1294. LLSD test;
  1295. typedef std::vector<U8> buf_t;
  1296. buf_t val;
  1297. for(int ii = 0; ii < 100; ++ii)
  1298. {
  1299. srand(ii); /* Flawfinder: ignore */
  1300. S32 size = rand() % 100 + 10;
  1301. std::generate_n(
  1302. std::back_insert_iterator<buf_t>(val),
  1303. size,
  1304. rand);
  1305. }
  1306. test = val;
  1307. ensureBinaryAndNotation("binary", test);
  1308. ensureBinaryAndXML("binary", test);
  1309. }
  1310. template<> template<> 
  1311. void TestLLSDCompatibleObject::test<7>()
  1312. {
  1313. LLSD test;
  1314. test = LLSD::emptyArray();
  1315. test.append(1);
  1316. test.append("hello");
  1317. ensureBinaryAndNotation("array", test);
  1318. ensureBinaryAndXML("array", test);
  1319. }
  1320. template<> template<> 
  1321. void TestLLSDCompatibleObject::test<8>()
  1322. {
  1323. LLSD test;
  1324. test = LLSD::emptyArray();
  1325. test["foo"] = "bar";
  1326. test["baz"] = 100;
  1327. ensureBinaryAndNotation("map", test);
  1328. ensureBinaryAndXML("map", test);
  1329. }
  1330. }