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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llmime_test.cpp
  3.  * @author Phoenix
  4.  * @date 2006-12-24
  5.  * @brief BRIEF_DESC of llmime_test.cpp
  6.  *
  7.  * $LicenseInfo:firstyear=2006&license=viewergpl$
  8.  * 
  9.  * Copyright (c) 2006-2010, Linden Research, Inc.
  10.  * 
  11.  * Second Life Viewer Source Code
  12.  * The source code in this file ("Source Code") is provided by Linden Lab
  13.  * to you under the terms of the GNU General Public License, version 2.0
  14.  * ("GPL"), unless you have obtained a separate licensing agreement
  15.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  16.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  17.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  18.  * 
  19.  * There are special exceptions to the terms and conditions of the GPL as
  20.  * it is applied to this Source Code. View the full text of the exception
  21.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  22.  * online at
  23.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  24.  * 
  25.  * By copying, modifying or distributing this software, you acknowledge
  26.  * that you have read and understood your obligations described above,
  27.  * and agree to abide by those obligations.
  28.  * 
  29.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  30.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  31.  * COMPLETENESS OR PERFORMANCE.
  32.  * $/LicenseInfo$
  33.  */
  34. #include "linden_common.h"
  35. #include "llsdserialize.h"
  36. #include "../llmime.h"
  37. #include "../test/lltut.h"
  38. namespace tut
  39. {
  40. struct mime_index
  41. {
  42. };
  43. typedef test_group<mime_index> mime_index_t;
  44. typedef mime_index_t::object mime_index_object_t;
  45. tut::mime_index_t tut_mime_index("mime_index");
  46. template<> template<>
  47. void mime_index_object_t::test<1>()
  48. {
  49. LLMimeIndex mime;
  50. ensure("no headers", mime.headers().isUndefined());
  51. ensure_equals("invalid offset", mime.offset(), -1);
  52. ensure_equals("invalid content length", mime.contentLength(), -1);
  53. ensure("no content type", mime.contentType().empty());
  54. ensure("not multipart", !mime.isMultipart());
  55. ensure_equals("no attachments", mime.subPartCount(), 0);
  56. }
  57. template<> template<>
  58. void mime_index_object_t::test<2>()
  59. {
  60. const S32 CONTENT_LENGTH = 6000;
  61. const S32 CONTENT_OFFSET = 100;
  62. const std::string CONTENT_TYPE = std::string("image/j2c");
  63. LLSD headers;
  64. headers["Content-Length"] = CONTENT_LENGTH;
  65. headers["Content-Type"] = CONTENT_TYPE;
  66. LLMimeIndex mime(headers, CONTENT_OFFSET);
  67. ensure("headers are map", mime.headers().isMap());
  68. ensure_equals("offset", mime.offset(), CONTENT_OFFSET);
  69. ensure_equals("content length", mime.contentLength(), CONTENT_LENGTH);
  70. ensure_equals("type is image/j2c", mime.contentType(), CONTENT_TYPE);
  71. ensure("not multipart", !mime.isMultipart());
  72. ensure_equals("no attachments", mime.subPartCount(), 0);
  73. }
  74. template<> template<>
  75. void mime_index_object_t::test<3>()
  76. {
  77. const S32 MULTI_CONTENT_LENGTH = 8000;
  78. const S32 MULTI_CONTENT_OFFSET = 100;
  79. const std::string MULTI_CONTENT_TYPE = std::string("multipart/mixed");
  80. LLSD headers;
  81. headers["Content-Length"] = MULTI_CONTENT_LENGTH;
  82. headers["Content-Type"] = MULTI_CONTENT_TYPE;
  83. LLMimeIndex mime(headers, MULTI_CONTENT_OFFSET);
  84. llinfos << "headers: " << LLSDOStreamer<LLSDNotationFormatter>(headers)
  85. << llendl;
  86. const S32 META_CONTENT_LENGTH = 700;
  87. const S32 META_CONTENT_OFFSET = 69;
  88. const std::string META_CONTENT_TYPE = std::string(
  89. "text/llsd+xml");
  90. headers = LLSD::emptyMap();
  91. headers["Content-Length"] = META_CONTENT_LENGTH;
  92. headers["Content-Type"] = META_CONTENT_TYPE;
  93. LLMimeIndex meta(headers, META_CONTENT_OFFSET);
  94. mime.attachSubPart(meta);
  95. const S32 IMAGE_CONTENT_LENGTH = 6000;
  96. const S32 IMAGE_CONTENT_OFFSET = 200;
  97. const std::string IMAGE_CONTENT_TYPE = std::string("image/j2c");
  98. headers = LLSD::emptyMap();
  99. headers["Content-Length"] = IMAGE_CONTENT_LENGTH;
  100. headers["Content-Type"] = IMAGE_CONTENT_TYPE;
  101. LLMimeIndex image(headers, IMAGE_CONTENT_OFFSET);
  102. mime.attachSubPart(image);
  103. // make sure we have a valid multi-part
  104. ensure("is multipart", mime.isMultipart());
  105. ensure_equals("multi offset", mime.offset(), MULTI_CONTENT_OFFSET);
  106. ensure_equals(
  107. "multi content length",
  108. mime.contentLength(),
  109. MULTI_CONTENT_LENGTH);
  110. ensure_equals("two attachments", mime.subPartCount(), 2);
  111. // make sure ranged gets do the right thing with out of bounds
  112. // sub-parts.
  113. LLMimeIndex invalid_child(mime.subPart(-1));
  114. ensure("no headers", invalid_child.headers().isUndefined());
  115. ensure_equals("invalid offset", invalid_child.offset(), -1);
  116. ensure_equals(
  117. "invalid content length", invalid_child.contentLength(), -1);
  118. ensure("no content type", invalid_child.contentType().empty());
  119. ensure("not multipart", !invalid_child.isMultipart());
  120. ensure_equals("no attachments", invalid_child.subPartCount(), 0);
  121. invalid_child = mime.subPart(2);
  122. ensure("no headers", invalid_child.headers().isUndefined());
  123. ensure_equals("invalid offset", invalid_child.offset(), -1);
  124. ensure_equals(
  125. "invalid content length", invalid_child.contentLength(), -1);
  126. ensure("no content type", invalid_child.contentType().empty());
  127. ensure("not multipart", !invalid_child.isMultipart());
  128. ensure_equals("no attachments", invalid_child.subPartCount(), 0);
  129. }
  130. template<> template<>
  131. void mime_index_object_t::test<4>()
  132. {
  133. const S32 MULTI_CONTENT_LENGTH = 8000;
  134. const S32 MULTI_CONTENT_OFFSET = 100;
  135. const std::string MULTI_CONTENT_TYPE = std::string("multipart/mixed");
  136. LLSD headers;
  137. headers["Content-Length"] = MULTI_CONTENT_LENGTH;
  138. headers["Content-Type"] = MULTI_CONTENT_TYPE;
  139. LLMimeIndex mime(headers, MULTI_CONTENT_OFFSET);
  140. const S32 META_CONTENT_LENGTH = 700;
  141. const S32 META_CONTENT_OFFSET = 69;
  142. const std::string META_CONTENT_TYPE = std::string(
  143. "application/llsd+xml");
  144. headers = LLSD::emptyMap();
  145. headers["Content-Length"] = META_CONTENT_LENGTH;
  146. headers["Content-Type"] = META_CONTENT_TYPE;
  147. LLMimeIndex meta(headers, META_CONTENT_OFFSET);
  148. mime.attachSubPart(meta);
  149. const S32 IMAGE_CONTENT_LENGTH = 6000;
  150. const S32 IMAGE_CONTENT_OFFSET = 200;
  151. const std::string IMAGE_CONTENT_TYPE = std::string("image/j2c");
  152. headers = LLSD::emptyMap();
  153. headers["Content-Length"] = IMAGE_CONTENT_LENGTH;
  154. headers["Content-Type"] = IMAGE_CONTENT_TYPE;
  155. LLMimeIndex image(headers, IMAGE_CONTENT_OFFSET);
  156. mime.attachSubPart(image);
  157. // check what we have
  158. ensure("is multipart", mime.isMultipart());
  159. ensure_equals("multi offset", mime.offset(), MULTI_CONTENT_OFFSET);
  160. ensure_equals(
  161. "multi content length",
  162. mime.contentLength(),
  163. MULTI_CONTENT_LENGTH);
  164. ensure_equals("two attachments", mime.subPartCount(), 2);
  165. LLMimeIndex actual_meta = mime.subPart(0);
  166. ensure_equals(
  167. "meta type", actual_meta.contentType(), META_CONTENT_TYPE);
  168. ensure_equals(
  169. "meta offset", actual_meta.offset(), META_CONTENT_OFFSET);
  170. ensure_equals(
  171. "meta content length",
  172. actual_meta.contentLength(),
  173. META_CONTENT_LENGTH);
  174. LLMimeIndex actual_image = mime.subPart(1);
  175. ensure_equals(
  176. "image type", actual_image.contentType(), IMAGE_CONTENT_TYPE);
  177. ensure_equals(
  178. "image offset", actual_image.offset(), IMAGE_CONTENT_OFFSET);
  179. ensure_equals(
  180. "image content length",
  181. actual_image.contentLength(),
  182. IMAGE_CONTENT_LENGTH);
  183. }
  184. /*
  185. template<> template<>
  186. void mime_index_object_t::test<5>()
  187. {
  188. }
  189. template<> template<>
  190. void mime_index_object_t::test<6>()
  191. {
  192. }
  193. template<> template<>
  194. void mime_index_object_t::test<7>()
  195. {
  196. }
  197. template<> template<>
  198. void mime_index_object_t::test<8>()
  199. {
  200. }
  201. template<> template<>
  202. void mime_index_object_t::test<>()
  203. {
  204. }
  205. */
  206. }
  207. namespace tut
  208. {
  209. struct mime_parse
  210. {
  211. };
  212. typedef test_group<mime_parse> mime_parse_t;
  213. typedef mime_parse_t::object mime_parse_object_t;
  214. tut::mime_parse_t tut_mime_parse("mime_parse");
  215. template<> template<>
  216. void mime_parse_object_t::test<1>()
  217. {
  218. // parse one mime object
  219. const std::string SERIALIZED_MIME("Content-Length: 200rnContent-Type: text/plainrnrnaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccrn");
  220. std::stringstream istr;
  221. istr.str(SERIALIZED_MIME);
  222. LLMimeIndex mime;
  223. LLMimeParser parser;
  224. bool ok = parser.parseIndex(istr, mime);
  225. ensure("Parse successful.", ok);
  226. ensure_equals("content type", mime.contentType(), "text/plain");
  227. ensure_equals("content length", mime.contentLength(), 200);
  228. ensure_equals("offset", mime.offset(), 49);
  229.   }
  230. template<> template<>
  231. void mime_parse_object_t::test<2>()
  232. {
  233. // make sure we only parse one.
  234. const std::string SERIALIZED_MIME("Content-Length: 200rnContent-Type: text/plainrnrnaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccrnrnContent-Length: 200rnContent-Type: text/plainrnrnaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccrnrn");
  235. std::stringstream istr;
  236. istr.str(SERIALIZED_MIME);
  237. LLMimeIndex mime;
  238. LLMimeParser parser;
  239. bool ok = parser.parseIndex(istr, mime);
  240. ensure("Parse successful.", ok);
  241. ensure("not multipart.", !mime.isMultipart());
  242. ensure_equals("content type", mime.contentType(), "text/plain");
  243. ensure_equals("content length", mime.contentLength(), 200);
  244. ensure_equals("offset", mime.offset(), 49);
  245. }
  246. template<> template<>
  247. void mime_parse_object_t::test<3>()
  248. {
  249. // test multi-part and lack of content length for some of it.
  250. /*
  251. Content-Type: multipart/mixed; boundary="segment"rnContent-Length: 148rnrn--segmentrnContent-Type: text/plainrnrnsome datarnrn--segmentrnContent-Type: text/xml; charset=UTF-8rnContent-Length: 22rnrn<llsd><undef /></llsd>rnrn
  252.  */
  253. const std::string SERIALIZED_MIME("Content-Type: multipart/mixed; boundary="segment"rnContent-Length: 150rnrn--segmentrnContent-Type: text/plainrnrnsome datarnrn--segmentrnContent-Type: text/xml; charset=UTF-8rnContent-Length: 22rnrn<llsd><undef /></llsd>rnrn");
  254. std::stringstream istr;
  255. istr.str(SERIALIZED_MIME);
  256. LLMimeIndex mime;
  257. LLMimeParser parser;
  258. bool ok = parser.parseIndex(istr, mime);
  259. ensure("Parse successful.", ok);
  260. ensure("is multipart.", mime.isMultipart());
  261. ensure_equals("sub-part count", mime.subPartCount(), 2);
  262. ensure_equals("content length", mime.contentLength(), 150);
  263. ensure_equals("data offset for multipart", mime.offset(), 74);
  264. LLMimeIndex mime_plain(mime.subPart(0));
  265. ensure_equals(
  266. "first part type",
  267. mime_plain.contentType(),
  268. "text/plain");
  269. ensure_equals(
  270. "first part content length not known.",
  271. mime_plain.contentLength(),
  272. -1);
  273. ensure_equals("first part offset", mime_plain.offset(), 113);
  274. LLMimeIndex mime_xml(mime.subPart(1));
  275. ensure_equals(
  276. "second part type",
  277. mime_xml.contentType(),
  278. "text/xml; charset=UTF-8");
  279. ensure_equals(
  280. "second part content length",
  281. mime_xml.contentLength(),
  282. 22);
  283. ensure_equals("second part offset", mime_xml.offset(), 198);
  284. }
  285. template<> template<>
  286. void mime_parse_object_t::test<4>()
  287. {
  288. // test multi-part, unquoted separator, and premature eof conditions
  289. /*
  290. Content-Type: multipart/mixed; boundary=segmentrnContent-Length: 220rnrn--segmentrnContent-Type: text/plainrnContent-Length: 55rnrnhow are you today?rnI do not know. I guess I am:n'fine'rnrn--segmentrnContent-Type: text/xml; charset=UTF-8rnContent-Length: 22rnrn<llsd><undef /></llsd>rnrn  */
  291. const std::string SERIALIZED_MIME("Content-Type: multipart/mixed; boundary=segmentrnContent-Length: 220rnrn--segmentrnContent-Type: text/plainrnContent-Length: 55rnrnhow are you today?rnI do not know. I guess I am:n'fine'rnrn--segmentrnContent-Type: text/xml; charset=UTF-8rnContent-Length: 22rnrn<llsd><undef /></llsd>rnrn");
  292. std::stringstream istr;
  293. istr.str(SERIALIZED_MIME);
  294. LLMimeIndex mime;
  295. LLMimeParser parser;
  296. bool ok = parser.parseIndex(istr, mime);
  297. ensure("Parse successful.", ok);
  298. ensure("is multipart.", mime.isMultipart());
  299. ensure_equals("sub-part count", mime.subPartCount(), 2);
  300. ensure_equals("content length", mime.contentLength(), 220);
  301. ensure_equals("data offset for multipart", mime.offset(), 72);
  302. LLMimeIndex mime_plain(mime.subPart(0));
  303. ensure_equals(
  304. "first part type",
  305. mime_plain.contentType(),
  306. "text/plain");
  307. ensure_equals(
  308. "first part content length",
  309. mime_plain.contentLength(),
  310. 55);
  311. ensure_equals("first part offset", mime_plain.offset(), 131);
  312. LLMimeIndex mime_xml(mime.subPart(1));
  313. ensure_equals(
  314. "second part type",
  315. mime_xml.contentType(),
  316. "text/xml; charset=UTF-8");
  317. ensure_equals(
  318. "second part content length",
  319. mime_xml.contentLength(),
  320. 22);
  321. ensure_equals("second part offset", mime_xml.offset(), 262);
  322. }
  323. template<> template<>
  324. void mime_parse_object_t::test<5>()
  325. {
  326. // test multi-part with multiple params
  327. const std::string SERIALIZED_MIME("Content-Type: multipart/mixed; boundary=segment; comment="testing multiple params."rnContent-Length: 220rnrn--segmentrnContent-Type: text/plainrnContent-Length: 55rnrnhow are you today?rnI do not know. I guess I am:n'fine'rnrn--segmentrnContent-Type: text/xml; charset=UTF-8rnContent-Length: 22rnrn<llsd><undef /></llsd>rnrn");
  328. std::stringstream istr;
  329. istr.str(SERIALIZED_MIME);
  330. LLMimeIndex mime;
  331. LLMimeParser parser;
  332. bool ok = parser.parseIndex(istr, mime);
  333. ensure("Parse successful.", ok);
  334. ensure("is multipart.", mime.isMultipart());
  335. ensure_equals("sub-part count", mime.subPartCount(), 2);
  336. ensure_equals("content length", mime.contentLength(), 220);
  337. LLMimeIndex mime_plain(mime.subPart(0));
  338. ensure_equals(
  339. "first part type",
  340. mime_plain.contentType(),
  341. "text/plain");
  342. ensure_equals(
  343. "first part content length",
  344. mime_plain.contentLength(),
  345. 55);
  346. LLMimeIndex mime_xml(mime.subPart(1));
  347. ensure_equals(
  348. "second part type",
  349. mime_xml.contentType(),
  350. "text/xml; charset=UTF-8");
  351. ensure_equals(
  352. "second part content length",
  353. mime_xml.contentLength(),
  354. 22);
  355. }
  356. template<> template<>
  357. void mime_parse_object_t::test<6>()
  358. {
  359. // test multi-part with no specified boundary and eof
  360. /*
  361. Content-Type: multipart/relatedrnContent-Length: 220rnrn--rnContent-Type: text/plainrnContent-Length: 55rnrnhow are you today?rnI do not know. I guess I am:n'fine'rnrn--rnContent-Type: text/xml; charset=UTF-8rnContent-Length: 22rnrn<llsd><undef /></llsd>rnrn
  362. */
  363. const std::string SERIALIZED_MIME("Content-Type: multipart/relatedrnContent-Length: 500rnrn--rnContent-Type: text/plainrnContent-Length: 55rnrnhow are you today?rnI do not know. I guess I am:n'fine'rnrn--rnContent-Type: text/xml; charset=UTF-8rnContent-Length: 22rnrn<llsd><undef /></llsd>rnrn");
  364. std::stringstream istr;
  365. istr.str(SERIALIZED_MIME);
  366. LLMimeIndex mime;
  367. LLMimeParser parser;
  368. bool ok = parser.parseIndex(istr, mime);
  369. ensure("Parse successful.", ok);
  370. ensure("is multipart.", mime.isMultipart());
  371. ensure_equals("sub-part count", mime.subPartCount(), 2);
  372. ensure_equals("content length", mime.contentLength(), 500);
  373. ensure_equals("data offset for multipart", mime.offset(), 56);
  374. LLMimeIndex mime_plain(mime.subPart(0));
  375. ensure_equals(
  376. "first part type",
  377. mime_plain.contentType(),
  378. "text/plain");
  379. ensure_equals(
  380. "first part content length",
  381. mime_plain.contentLength(),
  382. 55);
  383. ensure_equals("first part offset", mime_plain.offset(), 108);
  384. LLMimeIndex mime_xml(mime.subPart(1));
  385. ensure_equals(
  386. "second part type",
  387. mime_xml.contentType(),
  388. "text/xml; charset=UTF-8");
  389. ensure_equals(
  390. "second part content length",
  391. mime_xml.contentLength(),
  392. 22);
  393. ensure_equals("second part offset", mime_xml.offset(), 232);
  394. }
  395. /*
  396. template<> template<>
  397. void mime_parse_object_t::test<>()
  398. {
  399. }
  400. template<> template<>
  401. void mime_parse_object_t::test<>()
  402. {
  403. }
  404. template<> template<>
  405. void mime_parse_object_t::test<>()
  406. {
  407. }
  408. template<> template<>
  409. void mime_parse_object_t::test<>()
  410. {
  411. }
  412. */
  413. }