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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llmessagetemplateparser_tut.cpp
  3.  * @date April 2007
  4.  * @brief LLMessageTemplateParser 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. #include "linden_common.h"
  34. #include "llmessagetemplateparser.h"
  35. #include "lltut.h"
  36. namespace tut
  37. {
  38. struct LLMessageTemplateParserTestData {
  39. LLMessageTemplateParserTestData() : mMessage("unset message")
  40. {
  41. }
  42. ~LLMessageTemplateParserTestData()
  43. {
  44. }
  45. void ensure_next(LLTemplateTokenizer & tokens,
  46.  std::string value,
  47.  U32 line)
  48. {
  49. std::string next = tokens.next();
  50. ensure_equals(mMessage + " token matches", next, value);
  51. ensure_equals(mMessage + " line matches", tokens.line(), line);
  52. }
  53. char * prehash(const char * name)
  54. {
  55. return LLMessageStringTable::getInstance()->getString(name);
  56. }
  57. void ensure_block_attributes(std::string identifier,
  58.  const LLMessageTemplate * message,
  59.  const char * name,
  60.  EMsgBlockType type,
  61.  S32 number,
  62.  S32 total_size)
  63. {
  64. const LLMessageBlock * block = message->getBlock(prehash(name));
  65. identifier = identifier + ":" + message->mName + ":" + name + " block";
  66. ensure(identifier + " exists", block != NULL);
  67. ensure_equals(identifier + " name", block->mName, prehash(name));
  68. ensure_equals(identifier + " type", block->mType, type);
  69. ensure_equals(identifier + " number", block->mNumber, number);
  70. ensure_equals(identifier + " total size", block->mTotalSize, total_size);
  71. }
  72. void ensure_variable_attributes(std::string identifier,
  73. const LLMessageBlock * block,
  74. const char * name,
  75. EMsgVariableType type,
  76. S32 size)
  77. {
  78. const LLMessageVariable * var = block->getVariable(prehash(name));
  79. identifier = identifier + ":" + block->mName + ":" + name + " variable";
  80. ensure(identifier + " exists", var != NULL);
  81. ensure_equals(
  82. identifier + " name", var->getName(), prehash(name));
  83. ensure_equals(
  84. identifier + " type", var->getType(), type);
  85. ensure_equals(identifier + " size", var->getSize(), size);
  86. }
  87. std::string mMessage;
  88. };
  89. typedef test_group<LLMessageTemplateParserTestData> LLMessageTemplateParserTestGroup;
  90. typedef LLMessageTemplateParserTestGroup::object LLMessageTemplateParserTestObject;
  91. LLMessageTemplateParserTestGroup llMessageTemplateParserTestGroup("LLMessageTemplateParser");
  92. template<> template<>
  93. void LLMessageTemplateParserTestObject::test<1>()
  94. // tests tokenizer constructor and next methods
  95. {
  96. mMessage = "test method 1 walkthrough";
  97. LLTemplateTokenizer tokens("first linennextt linennfourth");
  98. ensure_next(tokens, "first", 1);
  99. ensure_next(tokens, "line", 1);
  100. ensure_next(tokens, "next", 2);
  101. ensure_next(tokens, "line", 2);
  102. ensure_next(tokens, "fourth", 4);
  103. tokens = LLTemplateTokenizer("nt{ t   Test1 Fixed n 523 }nn");
  104. ensure(tokens.want("{"));
  105. ensure_next(tokens, "Test1", 2);
  106. ensure_next(tokens, "Fixed", 2);
  107. ensure_next(tokens, "523", 3);
  108. ensure(tokens.want("}"));
  109. tokens = LLTemplateTokenizer("first linennextt linennfourth");
  110. ensure(tokens.want("first"));
  111. ensure_next(tokens, "line", 1);
  112. ensure_next(tokens, "next", 2);
  113. ensure_next(tokens, "line", 2);
  114. ensure(tokens.want("fourth"));
  115. }
  116. template<> template<>
  117. void LLMessageTemplateParserTestObject::test<2>()
  118. // tests tokenizer want method
  119. {
  120. // *NOTE: order matters
  121. LLTemplateTokenizer tokens("first linennextt linennfourth");
  122. ensure_equals("wants first token", tokens.want("first"), true);
  123. ensure_equals("doesn't want blar token", tokens.want("blar"), false);
  124. ensure_equals("wants line token", tokens.want("line"), true);
  125. }
  126. template<> template<>
  127. void LLMessageTemplateParserTestObject::test<3>()
  128. // tests tokenizer eof methods
  129. {
  130. LLTemplateTokenizer tokens("singlenn");
  131. ensure_equals("is not at eof at beginning", tokens.atEOF(), false);
  132. ensure_equals("doesn't want eof", tokens.wantEOF(), false);
  133. ensure_equals("wants the first token just to consume it",
  134.   tokens.want("single"), true);
  135. ensure_equals("is not at eof in middle", tokens.atEOF(), false);
  136. ensure_equals("wants eof", tokens.wantEOF(), true);
  137. ensure_equals("is at eof at end", tokens.atEOF(), true);
  138. }
  139. template<> template<>
  140. void LLMessageTemplateParserTestObject::test<4>()
  141. // tests variable parsing method
  142. {
  143. LLTemplateTokenizer tokens(std::string("{    Test0  ntn   U32 nn }"));
  144. LLMessageVariable * var = LLTemplateParser::parseVariable(tokens);
  145. ensure("test0 var parsed", var != 0);
  146. ensure_equals("name of variable", std::string(var->getName()), std::string("Test0"));
  147. ensure_equals("type of variable is U32", var->getType(), MVT_U32);
  148. ensure_equals("size of variable", var->getSize(), 4);
  149. delete var;
  150. std::string message_string("nt{ t   Test1 Fixed n 523 }nn");
  151. tokens = LLTemplateTokenizer(message_string);
  152. var = LLTemplateParser::parseVariable(tokens);
  153. ensure("test1 var parsed", var != 0);
  154. ensure_equals("name of variable", std::string(var->getName()), std::string("Test1"));
  155. ensure_equals("type of variable is Fixed", var->getType(), MVT_FIXED);
  156. ensure_equals("size of variable", var->getSize(), 523);
  157. delete var;
  158. // *NOTE: the parsers call llerrs on invalid input, so we can't really
  159. // test that  :-(
  160. }
  161. template<> template<>
  162. void LLMessageTemplateParserTestObject::test<5>()
  163. // tests block parsing method
  164. {
  165. LLTemplateTokenizer tokens("{ BlockA Single { VarX F32 } }");
  166. LLMessageBlock * block = LLTemplateParser::parseBlock(tokens);
  167. ensure("blockA block parsed", block != 0);
  168. ensure_equals("name of block", std::string(block->mName), std::string("BlockA"));
  169. ensure_equals("type of block is Single", block->mType, MBT_SINGLE);
  170. ensure_equals("total size of block", block->mTotalSize, 4);
  171. ensure_equals("number of block defaults to 1", block->mNumber, 1);
  172. ensure_equals("variable type of VarX is F32",
  173.   block->getVariableType(prehash("VarX")), MVT_F32);
  174. ensure_equals("variable size of VarX",
  175.   block->getVariableSize(prehash("VarX")), 4);
  176. delete block;
  177. tokens = LLTemplateTokenizer("{ Stuff Variable { Id LLUUID } }");
  178. block = LLTemplateParser::parseBlock(tokens);
  179. ensure("stuff block parsed", block != 0);
  180. ensure_equals("name of block", std::string(block->mName), std::string("Stuff"));
  181. ensure_equals("type of block is Multiple", block->mType, MBT_VARIABLE);
  182. ensure_equals("total size of block", block->mTotalSize, 16);
  183. ensure_equals("number of block defaults to 1", block->mNumber, 1);
  184. ensure_equals("variable type of Id is LLUUID",
  185.   block->getVariableType(prehash("Id")), MVT_LLUUID);
  186. ensure_equals("variable size of Id",
  187.   block->getVariableSize(prehash("Id")), 16);
  188. delete block;
  189. tokens = LLTemplateTokenizer("{ Stuff2 Multiple 45 { Shid LLVector3d } }");
  190. block = LLTemplateParser::parseBlock(tokens);
  191. ensure("stuff2 block parsed", block != 0);
  192. ensure_equals("name of block", std::string(block->mName), std::string("Stuff2"));
  193. ensure_equals("type of block is Multiple", block->mType, MBT_MULTIPLE);
  194. ensure_equals("total size of block", block->mTotalSize, 24);
  195. ensure_equals("number of blocks", block->mNumber, 45);
  196. ensure_equals("variable type of Shid is Vector3d",
  197.   block->getVariableType(prehash("Shid")), MVT_LLVector3d);
  198. ensure_equals("variable size of Shid",
  199.   block->getVariableSize(prehash("Shid")), 24);
  200. delete block;
  201. }
  202. template<> template<>
  203. void LLMessageTemplateParserTestObject::test<6>()
  204. // tests message parsing method on a simple message
  205. {
  206. std::string message_skel(
  207. "{n"
  208. "TestMessage Low 1 NotTrusted Zerocodedn"
  209. "// comment n"
  210. "  {n"
  211. "TestBlock1      Singlen"
  212. "      {   Test1       U32 }n"
  213. "  }n"
  214. "  {n"
  215. "      NeighborBlock       Multiple        4n"
  216. "      {   Test0       U32 }n"
  217. "      {   Test1       U32 }n"
  218. "      {   Test2       U32 }n"
  219. "  }n"
  220. "}");
  221. LLTemplateTokenizer tokens(message_skel);
  222. LLMessageTemplate * message = LLTemplateParser::parseMessage(tokens);
  223. ensure("simple message parsed", message != 0);
  224. ensure_equals("name of message", std::string(message->mName), std::string("TestMessage"));
  225. ensure_equals("frequency is Low", message->mFrequency, MFT_LOW);
  226. ensure_equals("trust is untrusted", message->mTrust, MT_NOTRUST);
  227. ensure_equals("message number", message->mMessageNumber, (U32)((255 << 24) | (255 << 16) | 1));
  228. ensure_equals("message encoding is zerocoded", message->mEncoding, ME_ZEROCODED);
  229. ensure_equals("message deprecation is notdeprecated", message->mDeprecation, MD_NOTDEPRECATED);
  230. LLMessageBlock * block = message->getBlock(prehash("NonexistantBlock"));
  231. ensure("Nonexistant block does not exist", block == 0);
  232. delete message;
  233. }
  234. template<> template<>
  235. void LLMessageTemplateParserTestObject::test<7>()
  236. // tests message parsing method on a deprecated message
  237. {
  238. std::string message_skel(
  239. "{n"
  240. "TestMessageDeprecated High 34 Trusted Unencoded Deprecatedn"
  241. "  {n"
  242. "TestBlock2      Singlen"
  243. "      {   Test2       S32 }n"
  244. "  }n"
  245. "}");
  246. LLTemplateTokenizer tokens(message_skel);
  247. LLMessageTemplate * message = LLTemplateParser::parseMessage(tokens);
  248. ensure("deprecated message parsed", message != 0);
  249. ensure_equals("name of message", std::string(message->mName), std::string("TestMessageDeprecated"));
  250. ensure_equals("frequency is High", message->mFrequency, MFT_HIGH);
  251. ensure_equals("trust is trusted", message->mTrust, MT_TRUST);
  252. ensure_equals("message number", message->mMessageNumber, (U32)34);
  253. ensure_equals("message encoding is unencoded", message->mEncoding, ME_UNENCODED);
  254. ensure_equals("message deprecation is deprecated", message->mDeprecation, MD_DEPRECATED);
  255. delete message;
  256. }
  257. template<> template<> void LLMessageTemplateParserTestObject::test<8>()
  258. // tests message parsing on RezMultipleAttachmentsFromInv, a possibly-faulty message
  259. {
  260. std::string message_skel(
  261. "{n
  262. RezMultipleAttachmentsFromInv Low 452 NotTrusted Zerocodedn
  263. {n
  264. AgentData Singlen
  265. { AgentID LLUUID }n
  266. { SessionID LLUUID }n
  267. } n
  268. {n
  269. HeaderData Singlen
  270. { CompoundMsgID LLUUID  } // All messages a single "compound msg" must have the same idn
  271. { TotalObjects U8 }n
  272. { FirstDetachAll BOOL }n
  273. }n
  274. {n
  275. ObjectData Variable // 1 to 4 of these per packetn
  276. { ItemID LLUUID }n
  277. { OwnerID LLUUID }n
  278. { AttachmentPt U8 } // 0 for defaultn
  279. { ItemFlags U32 }n
  280. { GroupMask U32 }n
  281. { EveryoneMask U32 }n
  282. { NextOwnerMask U32 }n
  283. { Name Variable 1 }n
  284. { Description Variable 1 }n
  285. }n
  286. }n
  287. ");
  288. LLTemplateTokenizer tokens(message_skel);
  289. LLMessageTemplate * message = LLTemplateParser::parseMessage(tokens);
  290. ensure("RezMultipleAttachmentsFromInv message parsed", message != 0);
  291. ensure_equals("name of message", message->mName, prehash("RezMultipleAttachmentsFromInv"));
  292. ensure_equals("frequency is low", message->mFrequency, MFT_LOW);
  293. ensure_equals("trust is not trusted", message->mTrust, MT_NOTRUST);
  294. ensure_equals("message number", message->mMessageNumber, (U32)((255 << 24) | (255 << 16) | 452));
  295. ensure_equals("message encoding is zerocoded", message->mEncoding, ME_ZEROCODED);
  296. ensure_block_attributes(
  297. "RMAFI", message, "AgentData", MBT_SINGLE, 1, 16+16);
  298. LLMessageBlock * block = message->getBlock(prehash("AgentData"));
  299. ensure_variable_attributes("RMAFI",
  300.    block, "AgentID", MVT_LLUUID, 16);
  301. ensure_variable_attributes("RMAFI",
  302.    block, "SessionID", MVT_LLUUID, 16);
  303. ensure_block_attributes(
  304. "RMAFI", message, "HeaderData", MBT_SINGLE, 1, 16+1+1);
  305. block = message->getBlock(prehash("HeaderData"));
  306. ensure_variable_attributes(
  307. "RMAFI", block, "CompoundMsgID", MVT_LLUUID, 16);
  308. ensure_variable_attributes(
  309. "RMAFI", block, "TotalObjects", MVT_U8, 1);
  310. ensure_variable_attributes(
  311. "RMAFI", block, "FirstDetachAll", MVT_BOOL, 1);
  312. ensure_block_attributes(
  313. "RMAFI", message, "ObjectData", MBT_VARIABLE, 1, -1);
  314. block = message->getBlock(prehash("ObjectData"));
  315. ensure_variable_attributes("RMAFI", block, "ItemID", MVT_LLUUID, 16);
  316. ensure_variable_attributes("RMAFI", block, "OwnerID", MVT_LLUUID, 16);
  317. ensure_variable_attributes("RMAFI", block, "AttachmentPt", MVT_U8, 1);
  318. ensure_variable_attributes("RMAFI", block, "ItemFlags", MVT_U32, 4);
  319. ensure_variable_attributes("RMAFI", block, "GroupMask", MVT_U32, 4);
  320. ensure_variable_attributes("RMAFI", block, "EveryoneMask", MVT_U32, 4);
  321. ensure_variable_attributes("RMAFI", block, "NextOwnerMask", MVT_U32, 4);
  322. ensure_variable_attributes("RMAFI", block, "Name", MVT_VARIABLE, 1);
  323. ensure_variable_attributes("RMAFI", block, "Description", MVT_VARIABLE, 1);
  324. delete message;
  325. }
  326. }