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

游戏引擎

开发平台:

C++ Builder

  1. /**
  2.  * @file lltemplatemessagebuilder_tut.cpp
  3.  * @date 2007-04
  4.  * @brief Tests for building messages.
  5.  *
  6.  * $LicenseInfo:firstyear=2007&license=viewergpl$
  7.  * 
  8.  * Copyright (c) 2007-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. #include <tut/tut.hpp>
  34. #include "linden_common.h"
  35. #include "lltut.h"
  36. #include "llapr.h"
  37. #include "llmessagetemplate.h"
  38. #include "llquaternion.h"
  39. #include "lltemplatemessagebuilder.h"
  40. #include "lltemplatemessagereader.h"
  41. #include "llversionserver.h"
  42. #include "message_prehash.h"
  43. #include "u64.h"
  44. #include "v3dmath.h"
  45. #include "v3math.h"
  46. #include "v4math.h"
  47. namespace tut
  48. {
  49. static LLTemplateMessageBuilder::message_template_name_map_t nameMap;
  50. static LLTemplateMessageReader::message_template_number_map_t numberMap;
  51. struct LLTemplateMessageBuilderTestData 
  52. {
  53. static LLMessageTemplate defaultTemplate()
  54. {
  55. static bool init = false;
  56. if(! init)
  57. {
  58. ll_init_apr();
  59. const F32 circuit_heartbeat_interval=5;
  60. const F32 circuit_timeout=100;
  61. start_messaging_system("notafile", 13035,
  62.    LL_VERSION_MAJOR,
  63.    LL_VERSION_MINOR,        
  64.    LL_VERSION_PATCH,        
  65.    FALSE,        
  66.    "notasharedsecret",
  67.    NULL,
  68.    false,
  69.    circuit_heartbeat_interval,
  70.    circuit_timeout);
  71. //init_prehash_data();
  72. init = true;
  73. }
  74. return LLMessageTemplate(_PREHASH_TestMessage, 1, MFT_HIGH);
  75. }
  76. static LLMessageBlock* defaultBlock(const EMsgVariableType type = MVT_NULL, const S32 size = 0, EMsgBlockType block = MBT_VARIABLE)
  77. {
  78. return createBlock(_PREHASH_Test0, type, size, block);
  79. }
  80. static LLMessageBlock* createBlock(char* name, const EMsgVariableType type = MVT_NULL, const S32 size = 0, EMsgBlockType block = MBT_VARIABLE)
  81. {
  82. LLMessageBlock* result = new LLMessageBlock(name, block);
  83. if(type != MVT_NULL)
  84. {
  85. result->addVariable(_PREHASH_Test0, type, size);
  86. }
  87. return result;
  88. }
  89. static LLTemplateMessageBuilder* defaultBuilder(LLMessageTemplate& messageTemplate, char* name = _PREHASH_Test0)
  90. {
  91. nameMap[_PREHASH_TestMessage] = &messageTemplate;
  92. LLTemplateMessageBuilder* builder = new LLTemplateMessageBuilder(nameMap);
  93. builder->newMessage(_PREHASH_TestMessage);
  94. builder->nextBlock(name);
  95. return builder;
  96. }
  97. /** Takes ownership of builder */
  98. static LLTemplateMessageReader* setReader(
  99. LLMessageTemplate& messageTemplate,
  100. LLTemplateMessageBuilder* builder,
  101. U8 offset = 0)
  102. {
  103. numberMap[1] = &messageTemplate;
  104. const U32 bufferSize = 1024;
  105. U8 buffer[bufferSize];
  106. // zero out the packet ID field
  107. memset(buffer, 0, LL_PACKET_ID_SIZE);
  108. U32 builtSize = builder->buildMessage(buffer, bufferSize, offset);
  109. delete builder;
  110. LLTemplateMessageReader* reader = new LLTemplateMessageReader(numberMap);
  111. reader->validateMessage(buffer, builtSize, LLHost());
  112. reader->readMessage(buffer, LLHost());
  113. return reader;
  114. }
  115. };
  116. typedef test_group<LLTemplateMessageBuilderTestData> LLTemplateMessageBuilderTestGroup;
  117. typedef LLTemplateMessageBuilderTestGroup::object LLTemplateMessageBuilderTestObject;
  118. LLTemplateMessageBuilderTestGroup templateMessageBuilderTestGroup("LLTemplateMessageBuilder");
  119. template<> template<>
  120. void LLTemplateMessageBuilderTestObject::test<1>()
  121. // construction and test of undefined
  122. {
  123. LLMessageTemplate messageTemplate = defaultTemplate();
  124. messageTemplate.addBlock(defaultBlock());
  125. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  126. LLTemplateMessageReader* reader = setReader(messageTemplate, builder);
  127. delete reader;
  128. }
  129. template<> template<>
  130. void LLTemplateMessageBuilderTestObject::test<2>()
  131.  // BOOL
  132. {
  133. LLMessageTemplate messageTemplate = defaultTemplate();
  134. messageTemplate.addBlock(defaultBlock(MVT_BOOL, 1));
  135. BOOL outValue, inValue = TRUE;
  136. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  137. builder->addBOOL(_PREHASH_Test0, inValue);
  138. LLTemplateMessageReader* reader = setReader(messageTemplate, builder);
  139. reader->getBOOL(_PREHASH_Test0, _PREHASH_Test0, outValue);
  140. ensure_equals("Ensure BOOL", inValue, outValue);
  141. delete reader;
  142. }
  143. template<> template<>
  144. void LLTemplateMessageBuilderTestObject::test<3>()
  145.  // U8
  146. {
  147. LLMessageTemplate messageTemplate = defaultTemplate();
  148. messageTemplate.addBlock(defaultBlock(MVT_U8, 1));
  149. U8 outValue, inValue = 2;
  150. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  151. builder->addU8(_PREHASH_Test0, inValue);
  152. LLTemplateMessageReader* reader = setReader(messageTemplate, builder);
  153. reader->getU8(_PREHASH_Test0, _PREHASH_Test0, outValue);
  154. ensure_equals("Ensure U8", inValue, outValue);
  155. delete reader;
  156. }
  157. template<> template<>
  158. void LLTemplateMessageBuilderTestObject::test<4>()
  159.  // S16
  160. {
  161. LLMessageTemplate messageTemplate = defaultTemplate();
  162. messageTemplate.addBlock(defaultBlock(MVT_S16, 2));
  163. S16 outValue, inValue = 90;
  164. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  165. builder->addS16(_PREHASH_Test0, inValue);
  166. LLTemplateMessageReader* reader = setReader(messageTemplate, builder);
  167. reader->getS16(_PREHASH_Test0, _PREHASH_Test0, outValue);
  168. ensure_equals("Ensure S16", inValue, outValue);
  169. delete reader;
  170. }
  171. template<> template<>
  172. void LLTemplateMessageBuilderTestObject::test<5>()
  173.  // U16
  174. {
  175. LLMessageTemplate messageTemplate = defaultTemplate();
  176. messageTemplate.addBlock(defaultBlock(MVT_U16, 2));
  177. U16 outValue, inValue = 3;
  178. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  179. builder->addU16(_PREHASH_Test0, inValue);
  180. LLTemplateMessageReader* reader = setReader(messageTemplate, builder);
  181. reader->getU16(_PREHASH_Test0, _PREHASH_Test0, outValue);
  182. ensure_equals("Ensure U16", inValue, outValue);
  183. delete reader;
  184. }
  185. template<> template<>
  186. void LLTemplateMessageBuilderTestObject::test<6>()
  187.  // S32
  188. {
  189. LLMessageTemplate messageTemplate = defaultTemplate();
  190. messageTemplate.addBlock(defaultBlock(MVT_S32, 4));
  191. S32 outValue, inValue = 44;
  192. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  193. builder->addS32(_PREHASH_Test0, inValue);
  194. LLTemplateMessageReader* reader = setReader(messageTemplate, builder);
  195. reader->getS32(_PREHASH_Test0, _PREHASH_Test0, outValue);
  196. ensure_equals("Ensure S32", inValue, outValue);
  197. delete reader;
  198. }
  199. template<> template<>
  200. void LLTemplateMessageBuilderTestObject::test<7>()
  201.  // F32
  202. {
  203. LLMessageTemplate messageTemplate = defaultTemplate();
  204. messageTemplate.addBlock(defaultBlock(MVT_F32, 4));
  205. F32 outValue, inValue = 121.44f;
  206. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  207. builder->addF32(_PREHASH_Test0, inValue);
  208. LLTemplateMessageReader* reader = setReader(messageTemplate, builder);
  209. reader->getF32(_PREHASH_Test0, _PREHASH_Test0, outValue);
  210. ensure_equals("Ensure F32", inValue, outValue);
  211. delete reader;
  212. }
  213. template<> template<>
  214. void LLTemplateMessageBuilderTestObject::test<8>()
  215.  // U32
  216. {
  217. LLMessageTemplate messageTemplate = defaultTemplate();
  218. messageTemplate.addBlock(defaultBlock(MVT_U32, 4));
  219. U32 outValue, inValue = 88;
  220. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  221. builder->addU32(_PREHASH_Test0, inValue);
  222. LLTemplateMessageReader* reader = setReader(messageTemplate, builder);
  223. reader->getU32(_PREHASH_Test0, _PREHASH_Test0, outValue);
  224. ensure_equals("Ensure U32", inValue, outValue);
  225. delete reader;
  226. }
  227. template<> template<>
  228. void LLTemplateMessageBuilderTestObject::test<9>()
  229.  // U64
  230. {
  231. LLMessageTemplate messageTemplate = defaultTemplate();
  232. messageTemplate.addBlock(defaultBlock(MVT_U64, 8));
  233. U64 outValue, inValue = 121;
  234. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  235. builder->addU64(_PREHASH_Test0, inValue);
  236. LLTemplateMessageReader* reader = setReader(messageTemplate, builder);
  237. reader->getU64(_PREHASH_Test0, _PREHASH_Test0, outValue);
  238. ensure_equals("Ensure U64", inValue, outValue);
  239. delete reader;
  240. }
  241. template<> template<>
  242. void LLTemplateMessageBuilderTestObject::test<10>()
  243.  // F64
  244. {
  245. LLMessageTemplate messageTemplate = defaultTemplate();
  246. messageTemplate.addBlock(defaultBlock(MVT_F64, 8));
  247. F64 outValue, inValue = 3232143.33;
  248. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  249. builder->addF64(_PREHASH_Test0, inValue);
  250. LLTemplateMessageReader* reader = setReader(messageTemplate, builder);
  251. reader->getF64(_PREHASH_Test0, _PREHASH_Test0, outValue);
  252. ensure_equals("Ensure F64", inValue, outValue);
  253. delete reader;
  254. }
  255. template<> template<>
  256. void LLTemplateMessageBuilderTestObject::test<11>()
  257.  // Vector3
  258. {
  259. LLMessageTemplate messageTemplate = defaultTemplate();
  260. messageTemplate.addBlock(defaultBlock(MVT_LLVector3, 12));
  261. LLVector3 outValue, inValue = LLVector3(1,2,3);
  262. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  263. builder->addVector3(_PREHASH_Test0, inValue);
  264. LLTemplateMessageReader* reader = setReader(messageTemplate, builder);
  265. reader->getVector3(_PREHASH_Test0, _PREHASH_Test0, outValue);
  266. ensure_equals("Ensure LLVector3", inValue, outValue);
  267. delete reader;
  268. }
  269. template<> template<>
  270. void LLTemplateMessageBuilderTestObject::test<12>()
  271.  // Vector4
  272. {
  273. LLMessageTemplate messageTemplate = defaultTemplate();
  274. messageTemplate.addBlock(defaultBlock(MVT_LLVector4, 16));
  275. LLVector4 outValue, inValue = LLVector4(1,2,3,4);
  276. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  277. builder->addVector4(_PREHASH_Test0, inValue);
  278. LLTemplateMessageReader* reader = setReader(messageTemplate, builder);
  279. reader->getVector4(_PREHASH_Test0, _PREHASH_Test0, outValue);
  280. ensure_equals("Ensure LLVector4", inValue, outValue);
  281. delete reader;
  282. }
  283. template<> template<>
  284. void LLTemplateMessageBuilderTestObject::test<13>()
  285.  // Vector3d
  286. {
  287. LLMessageTemplate messageTemplate = defaultTemplate();
  288. messageTemplate.addBlock(defaultBlock(MVT_LLVector3d, 24));
  289. LLVector3d outValue, inValue = LLVector3d(1,2,3);
  290. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  291. builder->addVector3d(_PREHASH_Test0, inValue);
  292. LLTemplateMessageReader* reader = setReader(messageTemplate, builder);
  293. reader->getVector3d(_PREHASH_Test0, _PREHASH_Test0, outValue);
  294. ensure_equals("Ensure LLVector3d", inValue, outValue);
  295. delete reader;
  296. }
  297. template<> template<>
  298. void LLTemplateMessageBuilderTestObject::test<14>()
  299.  // Quaternion
  300. {
  301. LLMessageTemplate messageTemplate = defaultTemplate();
  302. messageTemplate.addBlock(defaultBlock(MVT_LLQuaternion, 12));
  303. LLQuaternion outValue, inValue = LLQuaternion(1,2,3,0);
  304. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  305. builder->addQuat(_PREHASH_Test0, inValue);
  306. LLTemplateMessageReader* reader = setReader(messageTemplate, builder);
  307. reader->getQuat(_PREHASH_Test0, _PREHASH_Test0, outValue);
  308. ensure_equals("Ensure LLQuaternion", inValue, outValue);
  309. delete reader;
  310. }
  311. template<> template<>
  312. void LLTemplateMessageBuilderTestObject::test<15>()
  313.  // UUID
  314. {
  315. LLMessageTemplate messageTemplate = defaultTemplate();
  316. messageTemplate.addBlock(defaultBlock(MVT_LLUUID, 16));
  317. LLUUID outValue, inValue;
  318. inValue.generate();
  319. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  320. builder->addUUID(_PREHASH_Test0, inValue);
  321. LLTemplateMessageReader* reader = setReader(messageTemplate, builder);
  322. reader->getUUID(_PREHASH_Test0, _PREHASH_Test0, outValue);
  323. ensure_equals("Ensure UUID", inValue, outValue);
  324. delete reader;
  325. }
  326. template<> template<>
  327. void LLTemplateMessageBuilderTestObject::test<16>()
  328.  // IPAddr
  329. {
  330. LLMessageTemplate messageTemplate = defaultTemplate();
  331. messageTemplate.addBlock(defaultBlock(MVT_IP_ADDR, 4));
  332. U32 outValue, inValue = 12344556;
  333. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  334. builder->addIPAddr(_PREHASH_Test0, inValue);
  335. LLTemplateMessageReader* reader = setReader(messageTemplate, builder);
  336. reader->getIPAddr(_PREHASH_Test0, _PREHASH_Test0, outValue);
  337. ensure_equals("Ensure IPAddr", inValue, outValue);
  338. delete reader;
  339. }
  340.  template<> template<>
  341. void LLTemplateMessageBuilderTestObject::test<17>()
  342.  // IPPort
  343. {
  344. LLMessageTemplate messageTemplate = defaultTemplate();
  345. messageTemplate.addBlock(defaultBlock(MVT_IP_PORT, 2));
  346. U16 outValue, inValue = 80;
  347. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  348. builder->addIPPort(_PREHASH_Test0, inValue);
  349. LLTemplateMessageReader* reader = setReader(messageTemplate, builder);
  350. reader->getIPPort(_PREHASH_Test0, _PREHASH_Test0, outValue);
  351. ensure_equals("Ensure IPPort", inValue, outValue);
  352. delete reader;
  353. }
  354. template<> template<>
  355. void LLTemplateMessageBuilderTestObject::test<18>()
  356. // String
  357. {
  358. LLMessageTemplate messageTemplate = defaultTemplate();
  359. messageTemplate.addBlock(defaultBlock(MVT_VARIABLE, 1));
  360. std::string outValue, inValue = "testing";
  361. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  362. builder->addString(_PREHASH_Test0, inValue.c_str());
  363. LLTemplateMessageReader* reader = setReader(messageTemplate, builder);
  364. char buffer[MAX_STRING];
  365. reader->getString(_PREHASH_Test0, _PREHASH_Test0, MAX_STRING, buffer);
  366. outValue = buffer;
  367. ensure_equals("Ensure String", inValue, outValue);
  368. delete reader;
  369. }
  370. template<> template<>
  371. void LLTemplateMessageBuilderTestObject::test<19>()
  372. // block name !-> binary order
  373. {
  374. U8 buffer1[MAX_BUFFER_SIZE];
  375. memset(buffer1, 0, MAX_BUFFER_SIZE);
  376. U8 buffer2[MAX_BUFFER_SIZE];
  377. memset(buffer2, 0, MAX_BUFFER_SIZE);
  378. U32 bufferSize1, bufferSize2;
  379. // build template: Test0 before Test1
  380. LLMessageTemplate messageTemplate = defaultTemplate();
  381. messageTemplate.addBlock(createBlock(_PREHASH_Test0, MVT_U32, 4, MBT_SINGLE));
  382. messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_U32, 4, MBT_SINGLE));
  383. // build message: 1st declared block var == 0xaaaa, 2nd declared block var == 0xbbbb
  384. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate, _PREHASH_Test0);
  385. builder->addU32(_PREHASH_Test0, 0xaaaa);
  386. builder->nextBlock(_PREHASH_Test1);
  387. builder->addU32(_PREHASH_Test0, 0xbbbb);
  388. bufferSize1 = builder->buildMessage(buffer1, MAX_BUFFER_SIZE, 0);
  389. delete builder;
  390. // build template: Test1 before Test0
  391. messageTemplate = defaultTemplate();
  392. messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_U32, 4, MBT_SINGLE));
  393. messageTemplate.addBlock(createBlock(_PREHASH_Test0, MVT_U32, 4, MBT_SINGLE));
  394. // build message: 1st declared block var == 0xaaaa, 2nd declared block var == 0xbbbb
  395. builder = defaultBuilder(messageTemplate, _PREHASH_Test1);
  396. builder->addU32(_PREHASH_Test0, 0xaaaa);
  397. builder->nextBlock(_PREHASH_Test0);
  398. builder->addU32(_PREHASH_Test0, 0xbbbb);
  399. bufferSize2 = builder->buildMessage(buffer2, MAX_BUFFER_SIZE, 0);
  400. delete builder;
  401. ensure_equals("Ensure Buffer Sizes Equal", bufferSize1, bufferSize2);
  402. ensure_equals("Ensure Buffer Contents Equal", memcmp(buffer1, buffer2, bufferSize1), 0);
  403. }
  404. template<> template<>
  405. void LLTemplateMessageBuilderTestObject::test<20>()
  406. // block build order !-> binary order
  407. {
  408. U8 buffer1[MAX_BUFFER_SIZE];
  409. memset(buffer1, 0, MAX_BUFFER_SIZE);
  410. U8 buffer2[MAX_BUFFER_SIZE];
  411. memset(buffer2, 0, MAX_BUFFER_SIZE);
  412. U32 bufferSize1, bufferSize2;
  413. // build template: Test0 before Test1
  414. LLMessageTemplate messageTemplate = defaultTemplate();
  415. messageTemplate.addBlock(createBlock(_PREHASH_Test0, MVT_U32, 4, MBT_SINGLE));
  416. messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_U32, 4, MBT_SINGLE));
  417. // build message: 1st declared block var == 0xaaaa, 2nd declared block var == 0xbbbb
  418. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate, _PREHASH_Test0);
  419. builder->addU32(_PREHASH_Test0, 0xaaaa);
  420. builder->nextBlock(_PREHASH_Test1);
  421. builder->addU32(_PREHASH_Test0, 0xbbbb);
  422. bufferSize1 = builder->buildMessage(buffer1, MAX_BUFFER_SIZE, 0);
  423. delete builder;
  424. // build message: 1st declared block var == 0xaaaa, 2nd declared block var == 0xbbbb
  425. builder = defaultBuilder(messageTemplate, _PREHASH_Test1);
  426. builder->addU32(_PREHASH_Test0, 0xbbbb);
  427. builder->nextBlock(_PREHASH_Test0);
  428. builder->addU32(_PREHASH_Test0, 0xaaaa);
  429. bufferSize2 = builder->buildMessage(buffer2, MAX_BUFFER_SIZE, 0);
  430. delete builder;
  431. ensure_equals("Ensure Buffer Sizes Equal", bufferSize1, bufferSize2);
  432. ensure_equals("Ensure Buffer Contents Equal", memcmp(buffer1, buffer2, bufferSize1), 0);
  433. }
  434. template<> template<>
  435. void LLTemplateMessageBuilderTestObject::test<21>()
  436. // block appended in declaration -> data appended in binary
  437. {
  438. U8 buffer1[MAX_BUFFER_SIZE];
  439. memset(buffer1, 0, MAX_BUFFER_SIZE);
  440. U8 buffer2[MAX_BUFFER_SIZE];
  441. memset(buffer2, 0, MAX_BUFFER_SIZE);
  442. U32 bufferSize1, bufferSize2;
  443. // Build template: Test0 only
  444. LLMessageTemplate messageTemplate = defaultTemplate();
  445. messageTemplate.addBlock(createBlock(_PREHASH_Test0, MVT_U32, 4, MBT_SINGLE));
  446. // Build message
  447. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate, _PREHASH_Test0);
  448. builder->addU32(_PREHASH_Test0, 0xaaaa);
  449. bufferSize1 = builder->buildMessage(buffer1, MAX_BUFFER_SIZE, 0);
  450. delete builder;
  451. // Build template: Test0 before Test1
  452. messageTemplate = defaultTemplate();
  453. messageTemplate.addBlock(createBlock(_PREHASH_Test0, MVT_U32, 4, MBT_SINGLE));
  454. messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_U32, 4, MBT_SINGLE));
  455. // Build message
  456. builder = defaultBuilder(messageTemplate, _PREHASH_Test0);
  457. builder->addU32(_PREHASH_Test0, 0xaaaa);
  458. builder->nextBlock(_PREHASH_Test1);
  459. builder->addU32(_PREHASH_Test0, 0xbbbb);
  460. bufferSize2 = builder->buildMessage(buffer2, MAX_BUFFER_SIZE, 0);
  461. delete builder;
  462. ensure_not_equals("Ensure Buffer Sizes Not Equal", bufferSize1, bufferSize2);
  463. ensure_equals("Ensure Buffer Prefix Equal", memcmp(buffer1, buffer2, bufferSize1), 0);
  464. ensure_not_equals("Ensure Buffer Contents Not Equal", memcmp(buffer1, buffer2, bufferSize2), 0);
  465. }
  466. template<> template<>
  467. void LLTemplateMessageBuilderTestObject::test<22>()
  468. // repeated penultimate block (crashes when data in LLDynamicArrayIndexed)
  469. {
  470. U32 inTest00 = 0, inTest01 = 1, inTest1 = 2;
  471. U32 outTest00, outTest01, outTest1;
  472. LLMessageTemplate messageTemplate = defaultTemplate();
  473. messageTemplate.addBlock(createBlock(_PREHASH_Test0, MVT_U32, 4));
  474. messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_U32, 4));
  475. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  476. builder->addU32(_PREHASH_Test0, inTest00);
  477. builder->nextBlock(_PREHASH_Test0);
  478. builder->addU32(_PREHASH_Test0, inTest01);
  479. builder->nextBlock(_PREHASH_Test1);
  480. builder->addU32(_PREHASH_Test0, inTest1);
  481. LLTemplateMessageReader* reader = setReader(messageTemplate, builder);
  482. reader->getU32(_PREHASH_Test0, _PREHASH_Test0, outTest00, 0);
  483. reader->getU32(_PREHASH_Test0, _PREHASH_Test0, outTest01, 1);
  484. reader->getU32(_PREHASH_Test1, _PREHASH_Test0, outTest1);
  485. ensure_equals("Ensure Test0[0]", inTest00, outTest00);
  486. ensure_equals("Ensure Test0[1]", inTest01, outTest01);
  487. ensure_equals("Ensure Test1", inTest1, outTest1);
  488. delete reader;
  489. }
  490. template<> template<>
  491. void LLTemplateMessageBuilderTestObject::test<23>()
  492. // variable repeated block name never accessed
  493. {
  494. U32 inTest = 1, outTest;
  495. LLMessageTemplate messageTemplate = defaultTemplate();
  496. messageTemplate.addBlock(
  497. createBlock(_PREHASH_Test0, MVT_U32, 4, MBT_SINGLE));
  498. messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_U32, 4));
  499. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  500. builder->addU32(_PREHASH_Test0, inTest);
  501. LLTemplateMessageReader* reader = setReader(messageTemplate, builder);
  502. reader->getU32(_PREHASH_Test0, _PREHASH_Test0, outTest);
  503. S32 blockCount = reader->getNumberOfBlocks(_PREHASH_Test1);
  504. ensure_equals("Ensure block count", blockCount, 0);
  505. ensure_equals("Ensure Test0", inTest, outTest);
  506. delete reader;
  507. }
  508. template<> template<>
  509. void LLTemplateMessageBuilderTestObject::test<24>()
  510. // forwarding message
  511. {
  512. // build template
  513. LLMessageTemplate messageTemplate = defaultTemplate();
  514. messageTemplate.addBlock(createBlock(_PREHASH_Test0, MVT_U32, 4));
  515. // build message
  516. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  517. builder->addU32(_PREHASH_Test0, 42);
  518. // read message
  519. LLTemplateMessageReader* reader = setReader(messageTemplate, builder);
  520. // forward message
  521. builder = defaultBuilder(messageTemplate);
  522. builder->newMessage(_PREHASH_TestMessage);
  523. reader->copyToBuilder(*builder);
  524. U8 buffer[MAX_BUFFER_SIZE];
  525. builder->buildMessage(buffer, MAX_BUFFER_SIZE, 0);
  526. delete builder;
  527. delete reader;
  528. }
  529. template<> template<>
  530. void LLTemplateMessageBuilderTestObject::test<25>()
  531. // non-zero offset with undefined
  532. {
  533. LLMessageTemplate messageTemplate = defaultTemplate();
  534. messageTemplate.addBlock(defaultBlock());
  535. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  536. LLTemplateMessageReader* reader = setReader(
  537. messageTemplate, builder, 10);
  538. delete reader;
  539. }
  540. template<> template<>
  541. void LLTemplateMessageBuilderTestObject::test<26>()
  542.  // non-zero offset with BOOL
  543. {
  544. LLMessageTemplate messageTemplate = defaultTemplate();
  545. messageTemplate.addBlock(defaultBlock(MVT_BOOL, 1));
  546. BOOL outValue, inValue = TRUE;
  547. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  548. builder->addBOOL(_PREHASH_Test0, inValue);
  549. LLTemplateMessageReader* reader = setReader(
  550. messageTemplate, builder, 1);
  551. reader->getBOOL(_PREHASH_Test0, _PREHASH_Test0, outValue);
  552. ensure_equals("Ensure BOOL", inValue, outValue);
  553. delete reader;
  554. }
  555. template<> template<>
  556. void LLTemplateMessageBuilderTestObject::test<27>()
  557.  // non-zero offset with U8
  558. {
  559. LLMessageTemplate messageTemplate = defaultTemplate();
  560. messageTemplate.addBlock(defaultBlock(MVT_U8, 1));
  561. U8 outValue, inValue = 2;
  562. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  563. builder->addU8(_PREHASH_Test0, inValue);
  564. LLTemplateMessageReader* reader = setReader(
  565. messageTemplate, builder, 255);
  566. reader->getU8(_PREHASH_Test0, _PREHASH_Test0, outValue);
  567. ensure_equals("Ensure U8", inValue, outValue);
  568. delete reader;
  569. }
  570. template<> template<>
  571. void LLTemplateMessageBuilderTestObject::test<28>()
  572.  // non-zero offset with S16
  573. {
  574. LLMessageTemplate messageTemplate = defaultTemplate();
  575. messageTemplate.addBlock(defaultBlock(MVT_S16, 2));
  576. S16 outValue, inValue = 90;
  577. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  578. builder->addS16(_PREHASH_Test0, inValue);
  579. LLTemplateMessageReader* reader = setReader(
  580. messageTemplate, builder, 2);
  581. reader->getS16(_PREHASH_Test0, _PREHASH_Test0, outValue);
  582. ensure_equals("Ensure S16", inValue, outValue);
  583. delete reader;
  584. }
  585. template<> template<>
  586. void LLTemplateMessageBuilderTestObject::test<29>()
  587.  // non-zero offset with U16
  588. {
  589. LLMessageTemplate messageTemplate = defaultTemplate();
  590. messageTemplate.addBlock(defaultBlock(MVT_U16, 2));
  591. U16 outValue, inValue = 3;
  592. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  593. builder->addU16(_PREHASH_Test0, inValue);
  594. LLTemplateMessageReader* reader = setReader(
  595. messageTemplate, builder, 4);
  596. reader->getU16(_PREHASH_Test0, _PREHASH_Test0, outValue);
  597. ensure_equals("Ensure U16", inValue, outValue);
  598. delete reader;
  599. }
  600. template<> template<>
  601. void LLTemplateMessageBuilderTestObject::test<30>()
  602.  // non-zero offset with S32
  603. {
  604. LLMessageTemplate messageTemplate = defaultTemplate();
  605. messageTemplate.addBlock(defaultBlock(MVT_S32, 4));
  606. S32 outValue, inValue = 44;
  607. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  608. builder->addS32(_PREHASH_Test0, inValue);
  609. LLTemplateMessageReader* reader = setReader(
  610. messageTemplate, builder, 4);
  611. reader->getS32(_PREHASH_Test0, _PREHASH_Test0, outValue);
  612. ensure_equals("Ensure S32", inValue, outValue);
  613. delete reader;
  614. }
  615. template<> template<>
  616. void LLTemplateMessageBuilderTestObject::test<31>()
  617.  // non-zero offset with F32
  618. {
  619. LLMessageTemplate messageTemplate = defaultTemplate();
  620. messageTemplate.addBlock(defaultBlock(MVT_F32, 4));
  621. F32 outValue, inValue = 121.44f;
  622. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  623. builder->addF32(_PREHASH_Test0, inValue);
  624. LLTemplateMessageReader* reader = setReader(
  625. messageTemplate, builder, 16);
  626. reader->getF32(_PREHASH_Test0, _PREHASH_Test0, outValue);
  627. ensure_equals("Ensure F32", inValue, outValue);
  628. delete reader;
  629. }
  630. template<> template<>
  631. void LLTemplateMessageBuilderTestObject::test<32>()
  632.  // non-zero offset with U32
  633. {
  634. LLMessageTemplate messageTemplate = defaultTemplate();
  635. messageTemplate.addBlock(defaultBlock(MVT_U32, 4));
  636. U32 outValue, inValue = 88;
  637. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  638. builder->addU32(_PREHASH_Test0, inValue);
  639. LLTemplateMessageReader* reader = setReader(
  640. messageTemplate, builder, 127);
  641. reader->getU32(_PREHASH_Test0, _PREHASH_Test0, outValue);
  642. ensure_equals("Ensure U32", inValue, outValue);
  643. delete reader;
  644. }
  645. template<> template<>
  646. void LLTemplateMessageBuilderTestObject::test<33>()
  647.  // non-zero offset with U64
  648. {
  649. LLMessageTemplate messageTemplate = defaultTemplate();
  650. messageTemplate.addBlock(defaultBlock(MVT_U64, 8));
  651. U64 outValue, inValue = 121;
  652. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  653. builder->addU64(_PREHASH_Test0, inValue);
  654. LLTemplateMessageReader* reader = setReader(
  655. messageTemplate, builder, 32);
  656. reader->getU64(_PREHASH_Test0, _PREHASH_Test0, outValue);
  657. ensure_equals("Ensure U64", inValue, outValue);
  658. delete reader;
  659. }
  660. template<> template<>
  661. void LLTemplateMessageBuilderTestObject::test<34>()
  662.  // non-zero offset with F64
  663. {
  664. LLMessageTemplate messageTemplate = defaultTemplate();
  665. messageTemplate.addBlock(defaultBlock(MVT_F64, 8));
  666. F64 outValue, inValue = 3232143.33;
  667. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  668. builder->addF64(_PREHASH_Test0, inValue);
  669. LLTemplateMessageReader* reader = setReader(
  670. messageTemplate, builder, 128);
  671. reader->getF64(_PREHASH_Test0, _PREHASH_Test0, outValue);
  672. ensure_equals("Ensure F64", inValue, outValue);
  673. delete reader;
  674. }
  675. template<> template<>
  676. void LLTemplateMessageBuilderTestObject::test<35>()
  677.  // non-zero offset with Vector3
  678. {
  679. LLMessageTemplate messageTemplate = defaultTemplate();
  680. messageTemplate.addBlock(defaultBlock(MVT_LLVector3, 12));
  681. LLVector3 outValue, inValue = LLVector3(1,2,3);
  682. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  683. builder->addVector3(_PREHASH_Test0, inValue);
  684. LLTemplateMessageReader* reader = setReader(
  685. messageTemplate, builder, 63);
  686. reader->getVector3(_PREHASH_Test0, _PREHASH_Test0, outValue);
  687. ensure_equals("Ensure LLVector3", inValue, outValue);
  688. delete reader;
  689. }
  690. template<> template<>
  691. void LLTemplateMessageBuilderTestObject::test<36>()
  692.  // non-zero offset with Vector4
  693. {
  694. LLMessageTemplate messageTemplate = defaultTemplate();
  695. messageTemplate.addBlock(defaultBlock(MVT_LLVector4, 16));
  696. LLVector4 outValue, inValue = LLVector4(1,2,3,4);
  697. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  698. builder->addVector4(_PREHASH_Test0, inValue);
  699. LLTemplateMessageReader* reader = setReader(
  700. messageTemplate, builder, 64);
  701. reader->getVector4(_PREHASH_Test0, _PREHASH_Test0, outValue);
  702. ensure_equals("Ensure LLVector4", inValue, outValue);
  703. delete reader;
  704. }
  705. template<> template<>
  706. void LLTemplateMessageBuilderTestObject::test<37>()
  707.  // non-zero offset with Vector3d
  708. {
  709. LLMessageTemplate messageTemplate = defaultTemplate();
  710. messageTemplate.addBlock(defaultBlock(MVT_LLVector3d, 24));
  711. LLVector3d outValue, inValue = LLVector3d(1,2,3);
  712. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  713. builder->addVector3d(_PREHASH_Test0, inValue);
  714. LLTemplateMessageReader* reader = setReader(
  715. messageTemplate, builder, 64);
  716. reader->getVector3d(_PREHASH_Test0, _PREHASH_Test0, outValue);
  717. ensure_equals("Ensure LLVector3d", inValue, outValue);
  718. delete reader;
  719. }
  720. template<> template<>
  721. void LLTemplateMessageBuilderTestObject::test<38>()
  722.  // non-zero offset with Quaternion
  723. {
  724. LLMessageTemplate messageTemplate = defaultTemplate();
  725. messageTemplate.addBlock(defaultBlock(MVT_LLQuaternion, 12));
  726. LLQuaternion outValue, inValue = LLQuaternion(1,2,3,0);
  727. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  728. builder->addQuat(_PREHASH_Test0, inValue);
  729. LLTemplateMessageReader* reader = setReader(
  730. messageTemplate, builder, 12);
  731. reader->getQuat(_PREHASH_Test0, _PREHASH_Test0, outValue);
  732. ensure_equals("Ensure LLQuaternion", inValue, outValue);
  733. delete reader;
  734. }
  735. template<> template<>
  736. void LLTemplateMessageBuilderTestObject::test<39>()
  737.  // non-zero offset with UUID
  738. {
  739. LLMessageTemplate messageTemplate = defaultTemplate();
  740. messageTemplate.addBlock(defaultBlock(MVT_LLUUID, 16));
  741. LLUUID outValue, inValue;
  742. inValue.generate();
  743. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  744. builder->addUUID(_PREHASH_Test0, inValue);
  745. LLTemplateMessageReader* reader = setReader(
  746. messageTemplate, builder, 31);
  747. reader->getUUID(_PREHASH_Test0, _PREHASH_Test0, outValue);
  748. ensure_equals("Ensure UUID", inValue, outValue);
  749. delete reader;
  750. }
  751. template<> template<>
  752. void LLTemplateMessageBuilderTestObject::test<40>()
  753.  // non-zero offset with IPAddr
  754. {
  755. LLMessageTemplate messageTemplate = defaultTemplate();
  756. messageTemplate.addBlock(defaultBlock(MVT_IP_ADDR, 4));
  757. U32 outValue, inValue = 12344556;
  758. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  759. builder->addIPAddr(_PREHASH_Test0, inValue);
  760. LLTemplateMessageReader* reader = setReader(
  761. messageTemplate, builder, 32);
  762. reader->getIPAddr(_PREHASH_Test0, _PREHASH_Test0, outValue);
  763. ensure_equals("Ensure IPAddr", inValue, outValue);
  764. delete reader;
  765. }
  766.  template<> template<>
  767. void LLTemplateMessageBuilderTestObject::test<41>()
  768.  // non-zero offset with IPPort
  769. {
  770. LLMessageTemplate messageTemplate = defaultTemplate();
  771. messageTemplate.addBlock(defaultBlock(MVT_IP_PORT, 2));
  772. U16 outValue, inValue = 80;
  773. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  774. builder->addIPPort(_PREHASH_Test0, inValue);
  775. LLTemplateMessageReader* reader = setReader(
  776. messageTemplate, builder, 6);
  777. reader->getIPPort(_PREHASH_Test0, _PREHASH_Test0, outValue);
  778. ensure_equals("Ensure IPPort", inValue, outValue);
  779. delete reader;
  780. }
  781. template<> template<>
  782. void LLTemplateMessageBuilderTestObject::test<42>()
  783. // non-zero offset with String
  784. {
  785. LLMessageTemplate messageTemplate = defaultTemplate();
  786. messageTemplate.addBlock(defaultBlock(MVT_VARIABLE, 1));
  787. std::string outValue, inValue = "testing";
  788. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  789. builder->addString(_PREHASH_Test0, inValue.c_str());
  790. LLTemplateMessageReader* reader = setReader(
  791. messageTemplate, builder, 255);
  792. char buffer[MAX_STRING];
  793. reader->getString(_PREHASH_Test0, _PREHASH_Test0, MAX_STRING, buffer);
  794. outValue = buffer;
  795. ensure_equals("Ensure String", inValue, outValue);
  796. delete reader;
  797. }
  798. template<> template<>
  799. void LLTemplateMessageBuilderTestObject::test<43>()
  800. // read past end of message -> default values (forward compatibility)
  801. {
  802. // build message with single block
  803. LLMessageTemplate messageTemplate = defaultTemplate();
  804. messageTemplate.addBlock(defaultBlock(MVT_U32, 4, MBT_SINGLE));
  805. U32 outValue, outValue2, inValue = 0xbbbbbbbb;
  806. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  807. builder->addU32(_PREHASH_Test0, inValue);
  808. const U32 bufferSize = 1024;
  809. U8 buffer[bufferSize];
  810. memset(buffer, 0xaa, bufferSize);
  811. memset(buffer, 0, LL_PACKET_ID_SIZE);
  812. U32 builtSize = builder->buildMessage(buffer, bufferSize, 0);
  813. delete builder;
  814. // add block to reader template
  815. messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_U32, 4, MBT_SINGLE));
  816. // read message value and default value
  817. numberMap[1] = &messageTemplate;
  818. LLTemplateMessageReader* reader = 
  819. new LLTemplateMessageReader(numberMap);
  820. reader->validateMessage(buffer, builtSize, LLHost());
  821. reader->readMessage(buffer, LLHost());
  822. reader->getU32(_PREHASH_Test0, _PREHASH_Test0, outValue);
  823. reader->getU32(_PREHASH_Test1, _PREHASH_Test0, outValue2);
  824. ensure_equals("Ensure present value ", outValue, inValue);
  825. ensure_equals("Ensure default value ", outValue2, 0);
  826. delete reader;
  827. }
  828. template<> template<>
  829. void LLTemplateMessageBuilderTestObject::test<44>()
  830. // read variable block past end of message -> 0 repeats
  831. {
  832. // build message with single block
  833. LLMessageTemplate messageTemplate = defaultTemplate();
  834. messageTemplate.addBlock(defaultBlock(MVT_U32, 4, MBT_SINGLE));
  835. U32 outValue, outValue2, inValue = 0xbbbbbbbb;
  836. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  837. builder->addU32(_PREHASH_Test0, inValue);
  838. const U32 bufferSize = 1024;
  839. U8 buffer[bufferSize];
  840. memset(buffer, 0xaa, bufferSize);
  841. memset(buffer, 0, LL_PACKET_ID_SIZE);
  842. U32 builtSize = builder->buildMessage(buffer, bufferSize, 0);
  843. delete builder;
  844. // add variable block to reader template
  845. messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_U32, 4));
  846. // read message value and check block repeat count
  847. numberMap[1] = &messageTemplate;
  848. LLTemplateMessageReader* reader = 
  849. new LLTemplateMessageReader(numberMap);
  850. reader->validateMessage(buffer, builtSize, LLHost());
  851. reader->readMessage(buffer, LLHost());
  852. reader->getU32(_PREHASH_Test0, _PREHASH_Test0, outValue);
  853. outValue2 = reader->getNumberOfBlocks(_PREHASH_Test1);
  854. ensure_equals("Ensure present value ", outValue, inValue);
  855. ensure_equals("Ensure 0 repeats ", outValue2, 0);
  856. delete reader;
  857. }
  858. template<> template<>
  859. void LLTemplateMessageBuilderTestObject::test<45>()
  860. // read variable length data past end of message -> 0 length
  861. {
  862. // build message with single block
  863. LLMessageTemplate messageTemplate = defaultTemplate();
  864. messageTemplate.addBlock(defaultBlock(MVT_U32, 4, MBT_SINGLE));
  865. U32 outValue, outValue2, inValue = 0xbbbbbbbb;
  866. LLTemplateMessageBuilder* builder = defaultBuilder(messageTemplate);
  867. builder->addU32(_PREHASH_Test0, inValue);
  868. const U32 bufferSize = 1024;
  869. U8 buffer[bufferSize];
  870. memset(buffer, 0xaa, bufferSize);
  871. memset(buffer, 0, LL_PACKET_ID_SIZE);
  872. U32 builtSize = builder->buildMessage(buffer, bufferSize, 0);
  873. delete builder;
  874. // add variable block to reader template
  875. messageTemplate.addBlock(createBlock(_PREHASH_Test1, MVT_VARIABLE, 4, 
  876.  MBT_SINGLE));
  877. // read message value and default string
  878. numberMap[1] = &messageTemplate;
  879. LLTemplateMessageReader* reader = 
  880. new LLTemplateMessageReader(numberMap);
  881. reader->validateMessage(buffer, builtSize, LLHost());
  882. reader->readMessage(buffer, LLHost());
  883. reader->getU32(_PREHASH_Test0, _PREHASH_Test0, outValue);
  884. char outBuffer[bufferSize];
  885. memset(buffer, 0xcc, bufferSize);
  886. reader->getString(_PREHASH_Test1, _PREHASH_Test0, bufferSize, 
  887.   outBuffer);
  888. outValue2 = reader->getNumberOfBlocks(_PREHASH_Test1);
  889. ensure_equals("Ensure present value ", outValue, inValue);
  890. ensure_equals("Ensure unchanged buffer ", strlen(outBuffer), 0);
  891. delete reader;
  892. }
  893. }