PageRenderTime 40ms CodeModel.GetById 11ms RepoModel.GetById 0ms app.codeStats 0ms

/test/System.Net.Http.Formatting.Test.Unit/Formatting/Parsers/InternetMessageFormatHeaderParserTests.cs

https://bitbucket.org/mdavid/aspnetwebstack
C# | 663 lines | 580 code | 82 blank | 1 comment | 14 complexity | fb31fa99bde4567b184aca42222fe3cb MD5 | raw file
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Net.Http.Headers;
  4. using System.Text;
  5. using Microsoft.TestCommon;
  6. using Xunit;
  7. using Assert = Microsoft.TestCommon.AssertEx;
  8. namespace System.Net.Http.Formatting.Parsers
  9. {
  10. public class InternetMessageFormatHeaderParserTests
  11. {
  12. [Fact]
  13. [Trait("Description", "HeaderParser is internal class")]
  14. public void TypeIsCorrect()
  15. {
  16. Assert.Type.HasProperties<InternetMessageFormatHeaderParser>(TypeAssert.TypeProperties.IsClass);
  17. }
  18. private static IEnumerable<HttpHeaders> CreateHttpHeaders()
  19. {
  20. return new HttpHeaders[]
  21. {
  22. new HttpRequestMessage().Headers,
  23. new HttpResponseMessage().Headers,
  24. new StringContent(String.Empty).Headers,
  25. };
  26. }
  27. private static InternetMessageFormatHeaderParser CreateHeaderParser(int maximumHeaderLength, out HttpHeaders headers)
  28. {
  29. headers = new HttpRequestMessage().Headers;
  30. return new InternetMessageFormatHeaderParser(headers, maximumHeaderLength);
  31. }
  32. internal static byte[] CreateBuffer(params string[] headers)
  33. {
  34. const string CRLF = "\r\n";
  35. StringBuilder header = new StringBuilder();
  36. foreach (var h in headers)
  37. {
  38. header.Append(h + CRLF);
  39. }
  40. header.Append(CRLF);
  41. return Encoding.UTF8.GetBytes(header.ToString());
  42. }
  43. private static void RunRfc5322SampleTest(string[] testHeaders, Action<HttpHeaders> validation)
  44. {
  45. byte[] data = InternetMessageFormatHeaderParserTests.CreateBuffer(testHeaders);
  46. for (var cnt = 1; cnt <= data.Length; cnt++)
  47. {
  48. HttpHeaders headers;
  49. InternetMessageFormatHeaderParser parser = InternetMessageFormatHeaderParserTests.CreateHeaderParser(data.Length, out headers);
  50. Assert.NotNull(parser);
  51. int totalBytesConsumed = 0;
  52. ParserState state = InternetMessageFormatHeaderParserTests.ParseBufferInSteps(parser, data, cnt, out totalBytesConsumed);
  53. Assert.Equal(ParserState.Done, state);
  54. Assert.Equal(data.Length, totalBytesConsumed);
  55. validation(headers);
  56. }
  57. }
  58. private static ParserState ParseBufferInSteps(InternetMessageFormatHeaderParser parser, byte[] buffer, int readsize, out int totalBytesConsumed)
  59. {
  60. ParserState state = ParserState.Invalid;
  61. totalBytesConsumed = 0;
  62. while (totalBytesConsumed <= buffer.Length)
  63. {
  64. int size = Math.Min(buffer.Length - totalBytesConsumed, readsize);
  65. byte[] parseBuffer = new byte[size];
  66. Buffer.BlockCopy(buffer, totalBytesConsumed, parseBuffer, 0, size);
  67. int bytesConsumed = 0;
  68. state = parser.ParseBuffer(parseBuffer, parseBuffer.Length, ref bytesConsumed);
  69. totalBytesConsumed += bytesConsumed;
  70. if (state != ParserState.NeedMoreData)
  71. {
  72. return state;
  73. }
  74. }
  75. return state;
  76. }
  77. [Fact]
  78. [Trait("Description", "HeaderParser constructor throws on invalid arguments")]
  79. public void HeaderParserConstructorTest()
  80. {
  81. IEnumerable<HttpHeaders> headers = InternetMessageFormatHeaderParserTests.CreateHttpHeaders();
  82. foreach (var header in headers)
  83. {
  84. InternetMessageFormatHeaderParser parser = new InternetMessageFormatHeaderParser(header, ParserData.MinHeaderSize);
  85. Assert.NotNull(parser);
  86. }
  87. Assert.ThrowsArgumentGreaterThanOrEqualTo(() => new InternetMessageFormatHeaderParser(headers.ElementAt(0), ParserData.MinHeaderSize - 1),
  88. "maxHeaderSize", ParserData.MinHeaderSize.ToString(), ParserData.MinHeaderSize - 1);
  89. Assert.ThrowsArgumentNull(() => { new InternetMessageFormatHeaderParser(null, ParserData.MinHeaderSize); }, "headers");
  90. }
  91. [Fact]
  92. [Trait("Description", "HeaderParser.ParseBuffer throws on null buffer.")]
  93. public void HeaderParserNullBuffer()
  94. {
  95. HttpHeaders headers;
  96. InternetMessageFormatHeaderParser parser = InternetMessageFormatHeaderParserTests.CreateHeaderParser(128, out headers);
  97. Assert.NotNull(parser);
  98. int bytesConsumed = 0;
  99. Assert.ThrowsArgumentNull(() => { parser.ParseBuffer(null, 0, ref bytesConsumed); }, "buffer");
  100. }
  101. [Fact]
  102. [Trait("Description", "HeaderParser.ParseBuffer parses empty header.")]
  103. public void HeaderParserEmptyBuffer()
  104. {
  105. byte[] data = InternetMessageFormatHeaderParserTests.CreateBuffer();
  106. HttpHeaders headers;
  107. InternetMessageFormatHeaderParser parser = InternetMessageFormatHeaderParserTests.CreateHeaderParser(data.Length, out headers);
  108. Assert.NotNull(parser);
  109. int bytesConsumed = 0;
  110. ParserState state = parser.ParseBuffer(data, data.Length, ref bytesConsumed);
  111. Assert.Equal(ParserState.Done, state);
  112. Assert.Equal(data.Length, bytesConsumed);
  113. Assert.Equal(0, headers.Count());
  114. }
  115. [Fact]
  116. [Trait("Description", "HeaderParser.ParseBuffer parses single header field.")]
  117. public void HeaderParserSingleNameValueHeader()
  118. {
  119. byte[] data = InternetMessageFormatHeaderParserTests.CreateBuffer("N:V");
  120. for (var cnt = 1; cnt <= data.Length; cnt++)
  121. {
  122. HttpHeaders headers;
  123. InternetMessageFormatHeaderParser parser = InternetMessageFormatHeaderParserTests.CreateHeaderParser(data.Length, out headers);
  124. Assert.NotNull(parser);
  125. int totalBytesConsumed;
  126. ParserState state = InternetMessageFormatHeaderParserTests.ParseBufferInSteps(parser, data, cnt, out totalBytesConsumed);
  127. Assert.Equal(ParserState.Done, state);
  128. Assert.Equal(data.Length, totalBytesConsumed);
  129. Assert.Equal(1, headers.Count());
  130. IEnumerable<string> parsedValues = headers.GetValues("N");
  131. Assert.Equal(1, parsedValues.Count());
  132. Assert.Equal(parsedValues.ElementAt(0), "V");
  133. }
  134. }
  135. [Fact]
  136. [Trait("Description", "HeaderParser.ParseBuffer parses single header field with name only.")]
  137. public void HeaderParserSingleNameHeader()
  138. {
  139. byte[] data = InternetMessageFormatHeaderParserTests.CreateBuffer("N:");
  140. for (var cnt = 1; cnt <= data.Length; cnt++)
  141. {
  142. HttpHeaders headers;
  143. InternetMessageFormatHeaderParser parser = InternetMessageFormatHeaderParserTests.CreateHeaderParser(data.Length, out headers);
  144. Assert.NotNull(parser);
  145. int totalBytesConsumed;
  146. ParserState state = InternetMessageFormatHeaderParserTests.ParseBufferInSteps(parser, data, cnt, out totalBytesConsumed);
  147. Assert.Equal(ParserState.Done, state);
  148. Assert.Equal(data.Length, totalBytesConsumed);
  149. Assert.Equal(1, headers.Count());
  150. IEnumerable<string> parsedValues = headers.GetValues("N");
  151. Assert.Equal(1, parsedValues.Count());
  152. Assert.Equal("", parsedValues.ElementAt(0));
  153. }
  154. }
  155. [Fact]
  156. [Trait("Description", "HeaderParser.ParseBuffer parses multiple header fields.")]
  157. public void HeaderParserMultipleNameHeader()
  158. {
  159. byte[] data = InternetMessageFormatHeaderParserTests.CreateBuffer("N:V1", "N:V2");
  160. for (var cnt = 1; cnt <= data.Length; cnt++)
  161. {
  162. HttpHeaders headers;
  163. InternetMessageFormatHeaderParser parser = InternetMessageFormatHeaderParserTests.CreateHeaderParser(data.Length, out headers);
  164. Assert.NotNull(parser);
  165. int totalBytesConsumed;
  166. ParserState state = InternetMessageFormatHeaderParserTests.ParseBufferInSteps(parser, data, cnt, out totalBytesConsumed);
  167. Assert.Equal(ParserState.Done, state);
  168. Assert.Equal(data.Length, totalBytesConsumed);
  169. Assert.Equal(1, headers.Count());
  170. IEnumerable<string> parsedValues = headers.GetValues("N");
  171. Assert.Equal(2, parsedValues.Count());
  172. Assert.Equal("V1", parsedValues.ElementAt(0));
  173. Assert.Equal("V2", parsedValues.ElementAt(1));
  174. }
  175. }
  176. [Fact]
  177. [Trait("Description", "HeaderParser.ParseBuffer parses multiple header fields with linear white space.")]
  178. public void HeaderParserLwsHeader()
  179. {
  180. byte[] data = InternetMessageFormatHeaderParserTests.CreateBuffer("N1:V1", "N2: V2", "N3:\tV3");
  181. for (var cnt = 1; cnt <= data.Length; cnt++)
  182. {
  183. HttpHeaders headers;
  184. InternetMessageFormatHeaderParser parser = InternetMessageFormatHeaderParserTests.CreateHeaderParser(data.Length, out headers);
  185. Assert.NotNull(parser);
  186. int totalBytesConsumed = 0;
  187. ParserState state = InternetMessageFormatHeaderParserTests.ParseBufferInSteps(parser, data, cnt, out totalBytesConsumed);
  188. Assert.Equal(ParserState.Done, state);
  189. Assert.Equal(data.Length, totalBytesConsumed);
  190. Assert.Equal(3, headers.Count());
  191. IEnumerable<string> parsedValues = headers.GetValues("N1");
  192. Assert.Equal(1, parsedValues.Count());
  193. Assert.Equal("V1", parsedValues.ElementAt(0));
  194. parsedValues = headers.GetValues("N2");
  195. Assert.Equal(1, parsedValues.Count());
  196. Assert.Equal("V2", parsedValues.ElementAt(0));
  197. parsedValues = headers.GetValues("N3");
  198. Assert.Equal(1, parsedValues.Count());
  199. Assert.Equal("V3", parsedValues.ElementAt(0));
  200. }
  201. }
  202. [Fact]
  203. [Trait("Description", "HeaderParser.ParseBuffer parses invalid header field.")]
  204. public void HeaderParserInvalidHeader()
  205. {
  206. byte[] data = InternetMessageFormatHeaderParserTests.CreateBuffer("N1 :V1");
  207. for (var cnt = 1; cnt <= data.Length; cnt++)
  208. {
  209. HttpHeaders headers;
  210. InternetMessageFormatHeaderParser parser = InternetMessageFormatHeaderParserTests.CreateHeaderParser(data.Length, out headers);
  211. Assert.NotNull(parser);
  212. int totalBytesConsumed = 0;
  213. ParserState state = InternetMessageFormatHeaderParserTests.ParseBufferInSteps(parser, data, cnt, out totalBytesConsumed);
  214. Assert.Equal(ParserState.Invalid, state);
  215. Assert.Equal(data.Length - 2, totalBytesConsumed);
  216. }
  217. }
  218. [Fact]
  219. [Trait("Description", "HeaderParser.ParseBuffer parses various specialized header fields including JSON, P3P, etc.")]
  220. public void HeaderParserSpecializedHeaders()
  221. {
  222. Dictionary<string, string> headerData = new Dictionary<string, string>
  223. {
  224. { @"JsonProperties0", @"{ ""SessionId"": ""{27729E1-B37B-4D29-AA0A-E367906C206E}"", ""MessageId"": ""{701332E1-B37B-4D29-AA0A-E367906C206E}"", ""TimeToLive"" : 90, ""CorrelationId"": ""{701332F3-B37B-4D29-AA0A-E367906C206E}"", ""SequenceNumber"" : 12345, ""DeliveryCount"" : 2, ""To"" : ""http://contoso.com/path1"", ""ReplyTo"" : ""http://fabrikam.com/path1"", ""SentTimeUtc"" : ""Sun, 06 Nov 1994 08:49:37 GMT"", ""ScheduledEnqueueTimeUtc"" : ""Sun, 06 Nov 1994 08:49:37 GMT""}" },
  225. { @"JsonProperties1", @"{ ""SessionId"": ""{2813D4D2-46A9-4F4D-8904-E9BDE3712B70}"", ""MessageId"": ""{24AE31D6-63B8-46F3-9975-A3DAF1B6D3F4}"", ""TimeToLive"" : 80, ""CorrelationId"": ""{896DD5BD-1645-44D7-9E7C-D7F70958ECD6}"", ""SequenceNumber"" : 54321, ""DeliveryCount"" : 4, ""To"" : ""http://contoso.com/path2"", ""ReplyTo"" : ""http://fabrikam.com/path2"", ""SentTimeUtc"" : ""Sun, 06 Nov 1994 10:49:37 GMT"", ""ScheduledEnqueueTimeUtc"" : ""Sun, 06 Nov 1994 10:49:37 GMT""}" },
  226. { @"P3P", @"CP=""ALL IND DSP COR ADM CONo CUR CUSo IVAo IVDo PSA PSD TAI TELo OUR SAMo CNT COM INT NAV ONL PHY PRE PUR UNI""" },
  227. { @"Cookie", @"omniID=1297715979621_9f45_1519_3f8a_f22f85346ac6; WT_FPC=id=65.55.227.138-2323234032.30136233:lv=1309374389020:ss=1309374389020; A=I&I=AxUFAAAAAACNCAAADYEZ7CFPss7Swnujy4PXZA!!&M=1&CS=126mAa0002ZB51a02gZB51a; MC1=GUID=568428660ad44d4ab8f46133f4b03738&HASH=6628&LV=20113&V=3; WT_NVR_RU=0=msdn:1=:2=; MUID=A44DE185EA1B4E8088CCF7B348C5D65F; MSID=Microsoft.CreationDate=03/04/2011 23:38:15&Microsoft.LastVisitDate=06/20/2011 04:15:08&Microsoft.VisitStartDate=06/20/2011 04:15:08&Microsoft.CookieId=f658f3f2-e6d6-42ab-b86b-96791b942b6f&Microsoft.TokenId=ffffffff-ffff-ffff-ffff-ffffffffffff&Microsoft.NumberOfVisits=106&Microsoft.CookieFirstVisit=1&Microsoft.IdentityToken=AA==&Microsoft.MicrosoftId=0441-6141-1523-9969; msresearch=%7B%22version%22%3A%224.6%22%2C%22state%22%3A%7B%22name%22%3A%22IDLE%22%2C%22url%22%3Aundefined%2C%22timestamp%22%3A1299281911415%7D%2C%22lastinvited%22%3A1299281911415%2C%22userid%22%3A%2212992819114151265672533023080%22%2C%22vendorid%22%3A1%2C%22surveys%22%3A%5Bundefined%5D%7D; CodeSnippetContainerLang=C#; msdn=L=1033; ADS=SN=175A21EF; s_cc=true; s_sq=%5B%5BB%5D%5D; TocHashCookie=ms310241(n)/aa187916(n)/aa187917(n)/dd273952(n)/dd295083(n)/ff472634(n)/ee667046(n)/ee667070(n)/gg259047(n)/gg618436(n)/; WT_NVR=0=/:1=query|library|en-us:2=en-us/vcsharp|en-us/library" },
  228. { @"Set-Cookie", @"A=I&I=AxUFAAAAAADsBgAA1sWZz4FGun/kOeyV4LGZVg!!&M=1; domain=.microsoft.com; expires=Sun, 30-Jun-2041 00:14:40 GMT; path=/" },
  229. };
  230. byte[] data = InternetMessageFormatHeaderParserTests.CreateBuffer(headerData.Select((kv) => { return String.Format("{0}: {1}", kv.Key, kv.Value); }).ToArray());
  231. for (var cnt = 1; cnt <= data.Length; cnt++)
  232. {
  233. HttpHeaders headers;
  234. InternetMessageFormatHeaderParser parser = InternetMessageFormatHeaderParserTests.CreateHeaderParser(data.Length, out headers);
  235. Assert.NotNull(parser);
  236. int totalBytesConsumed = 0;
  237. ParserState state = InternetMessageFormatHeaderParserTests.ParseBufferInSteps(parser, data, cnt, out totalBytesConsumed);
  238. Assert.Equal(ParserState.Done, state);
  239. Assert.Equal(data.Length, totalBytesConsumed);
  240. Assert.Equal(headerData.Count, headers.Count());
  241. for (int hCnt = 0; hCnt < headerData.Count; hCnt++)
  242. {
  243. Assert.Equal(headerData.Keys.ElementAt(hCnt), headers.ElementAt(hCnt).Key);
  244. Assert.Equal(headerData.Values.ElementAt(hCnt), headers.ElementAt(hCnt).Value.ElementAt(0));
  245. }
  246. }
  247. }
  248. [Fact]
  249. [Trait("Description", "HeaderParser.ParseBuffer parses multi-line header field.")]
  250. public void HeaderParserSplitHeader()
  251. {
  252. byte[] data = InternetMessageFormatHeaderParserTests.CreateBuffer("N:V1,", " V2,", "\tV3,", " V4,", " \tV5");
  253. for (var cnt = 1; cnt <= data.Length; cnt++)
  254. {
  255. HttpHeaders headers;
  256. InternetMessageFormatHeaderParser parser = InternetMessageFormatHeaderParserTests.CreateHeaderParser(data.Length, out headers);
  257. Assert.NotNull(parser);
  258. int totalBytesConsumed = 0;
  259. ParserState state = InternetMessageFormatHeaderParserTests.ParseBufferInSteps(parser, data, cnt, out totalBytesConsumed);
  260. Assert.Equal(ParserState.Done, state);
  261. Assert.Equal(data.Length, totalBytesConsumed);
  262. Assert.Equal(1, headers.Count());
  263. IEnumerable<string> parsedValues = headers.GetValues("N");
  264. Assert.Equal(1, parsedValues.Count());
  265. Assert.Equal("V1, V2, V3, V4, \tV5", parsedValues.ElementAt(0));
  266. }
  267. }
  268. [Fact]
  269. [Trait("Description", "HeaderParser.ParseBuffer parses too big header with single header field.")]
  270. public void HeaderParserDataTooBigSingle()
  271. {
  272. byte[] data = InternetMessageFormatHeaderParserTests.CreateBuffer("N:V");
  273. for (var cnt = 1; cnt <= data.Length; cnt++)
  274. {
  275. HttpHeaders headers;
  276. InternetMessageFormatHeaderParser parser = InternetMessageFormatHeaderParserTests.CreateHeaderParser(ParserData.MinHeaderSize, out headers);
  277. Assert.NotNull(parser);
  278. int totalBytesConsumed = 0;
  279. ParserState state = InternetMessageFormatHeaderParserTests.ParseBufferInSteps(parser, data, cnt, out totalBytesConsumed);
  280. Assert.Equal(ParserState.DataTooBig, state);
  281. Assert.Equal(ParserData.MinHeaderSize, totalBytesConsumed);
  282. }
  283. }
  284. [Fact]
  285. [Trait("Description", "HeaderParser.ParseBuffer parses too big header with multiple header field.")]
  286. public void HeaderParserTestDataTooBigMulti()
  287. {
  288. byte[] data = InternetMessageFormatHeaderParserTests.CreateBuffer("N1:V1", "N2:V2", "N3:V3");
  289. for (var cnt = 1; cnt <= data.Length; cnt++)
  290. {
  291. HttpHeaders headers;
  292. InternetMessageFormatHeaderParser parser = InternetMessageFormatHeaderParserTests.CreateHeaderParser(10, out headers);
  293. Assert.NotNull(parser);
  294. int totalBytesConsumed = 0;
  295. ParserState state = InternetMessageFormatHeaderParserTests.ParseBufferInSteps(parser, data, cnt, out totalBytesConsumed);
  296. Assert.Equal(ParserState.DataTooBig, state);
  297. Assert.Equal(10, totalBytesConsumed);
  298. }
  299. }
  300. // Set of samples from RFC 5322 with times adjusted to GMT following HTTP style for date time format.
  301. static readonly string[] Rfc5322Sample1 = new string[] {
  302. @"From: John Doe <jdoe@machine.example>",
  303. @"To: Mary Smith <mary@example.net>",
  304. @"Subject: Saying Hello",
  305. @"Date: Fri, 21 Nov 1997 09:55:06 GMT",
  306. @"Message-ID: <1234@local.machine.example>",
  307. };
  308. static readonly string[] Rfc5322Sample2 = new string[] {
  309. @"From: John Doe <jdoe@machine.example>",
  310. @"Sender: Michael Jones <mjones@machine.example>",
  311. @"To: Mary Smith <mary@example.net>",
  312. @"Subject: Saying Hello",
  313. @"Date: Fri, 21 Nov 1997 09:55:06 GMT",
  314. @"Message-ID: <1234@local.machine.example>",
  315. };
  316. static readonly string[] Rfc5322Sample3 = new string[] {
  317. @"From: ""Joe Q. Public"" <john.q.public@example.com>",
  318. @"To: Mary Smith <mary@x.test>, jdoe@example.org, Who? <one@y.test>",
  319. @"Cc: <boss@nil.test>, ""Giant; \""Big\"" Box"" <sysservices@example.net>",
  320. @"Date: Tue, 01 Jul 2003 10:52:37 GMT",
  321. @"Message-ID: <5678.21-Nov-1997@example.com>",
  322. };
  323. static readonly string[] Rfc5322Sample4 = new string[] {
  324. @"From: Pete <pete@silly.example>",
  325. @"To: A Group:Ed Jones <c@a.test>,joe@where.test,John <jdoe@one.test>;",
  326. @"Cc: Undisclosed recipients:;",
  327. @"Date: Thu, 13 Feb 1969 23:32:54 GMT",
  328. @"Message-ID: <testabcd.1234@silly.example>",
  329. };
  330. static readonly string[] Rfc5322Sample5 = new string[] {
  331. @"From: John Doe <jdoe@machine.example>",
  332. @"To: Mary Smith <mary@example.net>",
  333. @"Subject: Saying Hello",
  334. @"Date: Fri, 21 Nov 1997 09:55:06 GMT",
  335. @"Message-ID: <1234@local.machine.example>",
  336. };
  337. static readonly string[] Rfc5322Sample6 = new string[] {
  338. @"From: Mary Smith <mary@example.net>",
  339. @"To: John Doe <jdoe@machine.example>",
  340. @"Reply-To: ""Mary Smith: Personal Account"" <smith@home.example>",
  341. @"Subject: Re: Saying Hello",
  342. @"Date: Fri, 21 Nov 1997 10:01:10 GMT",
  343. @"Message-ID: <3456@example.net>",
  344. @"In-Reply-To: <1234@local.machine.example>",
  345. @"References: <1234@local.machine.example>",
  346. };
  347. static readonly string[] Rfc5322Sample7 = new string[] {
  348. @"To: ""Mary Smith: Personal Account"" <smith@home.example>",
  349. @"From: John Doe <jdoe@machine.example>",
  350. @"Subject: Re: Saying Hello",
  351. @"Date: Fri, 21 Nov 1997 11:00:00 GMT",
  352. @"Message-ID: <abcd.1234@local.machine.test>",
  353. @"In-Reply-To: <3456@example.net>",
  354. @"References: <1234@local.machine.example> <3456@example.net>",
  355. };
  356. static readonly string[] Rfc5322Sample8 = new string[] {
  357. @"From: John Doe <jdoe@machine.example>",
  358. @"To: Mary Smith <mary@example.net>",
  359. @"Subject: Saying Hello",
  360. @"Date: Fri, 21 Nov 1997 09:55:06 GMT",
  361. @"Message-ID: <1234@local.machine.example>",
  362. };
  363. static readonly string[] Rfc5322Sample9 = new string[] {
  364. @"Resent-From: Mary Smith <mary@example.net>",
  365. @"Resent-To: Jane Brown <j-brown@other.example>",
  366. @"Resent-Date: Mon, 24 Nov 1997 14:22:01 GMT",
  367. @"Resent-Message-ID: <78910@example.net>",
  368. @"From: John Doe <jdoe@machine.example>",
  369. @"To: Mary Smith <mary@example.net>",
  370. @"Subject: Saying Hello",
  371. @"Date: Fri, 21 Nov 1997 09:55:06 GMT",
  372. @"Message-ID: <1234@local.machine.example>",
  373. };
  374. static readonly string[] Rfc5322Sample10 = new string[] {
  375. @"Received: from x.y.test",
  376. @" by example.net",
  377. @" via TCP",
  378. @" with ESMTP",
  379. @" id ABC12345",
  380. @" for <mary@example.net>; 21 Nov 1997 10:05:43 GMT",
  381. @"Received: from node.example by x.y.test; 21 Nov 1997 10:01:22 GMT",
  382. @"From: John Doe <jdoe@node.example>",
  383. @"To: Mary Smith <mary@example.net>",
  384. @"Subject: Saying Hello",
  385. @"Date: Fri, 21 Nov 1997 09:55:06 GMT",
  386. @"Message-ID: <1234@local.node.example>",
  387. };
  388. static readonly string[] Rfc5322Sample11 = new string[] {
  389. @"From: Pete(A nice \) chap) <pete(his account)@silly.test(his host)>",
  390. @"To:A Group(Some people)",
  391. @" :Chris Jones <c@(Chris's host.)public.example>,",
  392. @" joe@example.org,",
  393. @" John <jdoe@one.test> (my dear friend); (the end of the group)",
  394. @"Cc:(Empty list)(start)Hidden recipients :(nobody(that I know)) ;",
  395. @"Date: Thu,",
  396. @" 13",
  397. @" Feb",
  398. @" 1969",
  399. @" 23:32:00",
  400. @" GMT",
  401. @"Message-ID: <testabcd.1234@silly.test>",
  402. };
  403. [Fact]
  404. [Trait("Description", "HeaderParser.ParseBuffer Rfc5322Sample1 header.")]
  405. public void Rfc5322Sample1Test()
  406. {
  407. RunRfc5322SampleTest(Rfc5322Sample1,
  408. (headers) =>
  409. {
  410. Assert.NotNull(headers);
  411. Assert.True(headers.Contains("from"));
  412. Assert.True(headers.Contains("to"));
  413. Assert.True(headers.Contains("subject"));
  414. Assert.True(headers.Contains("date"));
  415. Assert.True(headers.Contains("message-id"));
  416. });
  417. }
  418. [Fact]
  419. [Trait("Description", "HeaderParser.ParseBuffer Rfc5322Sample2 header.")]
  420. public void Rfc5322Sample2Test()
  421. {
  422. RunRfc5322SampleTest(Rfc5322Sample2,
  423. (headers) =>
  424. {
  425. Assert.NotNull(headers);
  426. Assert.True(headers.Contains("from"));
  427. Assert.True(headers.Contains("sender"));
  428. Assert.True(headers.Contains("to"));
  429. Assert.True(headers.Contains("subject"));
  430. Assert.True(headers.Contains("date"));
  431. Assert.True(headers.Contains("message-id"));
  432. });
  433. }
  434. [Fact]
  435. [Trait("Description", "HeaderParser.ParseBuffer Rfc5322Sample3 header.")]
  436. public void Rfc5322Sample3Test()
  437. {
  438. RunRfc5322SampleTest(Rfc5322Sample3,
  439. (headers) =>
  440. {
  441. Assert.NotNull(headers);
  442. Assert.True(headers.Contains("from"));
  443. Assert.True(headers.Contains("to"));
  444. Assert.True(headers.Contains("cc"));
  445. Assert.True(headers.Contains("date"));
  446. Assert.True(headers.Contains("message-id"));
  447. });
  448. }
  449. [Fact]
  450. [Trait("Description", "HeaderParser.ParseBuffer Rfc5322Sample4 header.")]
  451. public void Rfc5322Sample4Test()
  452. {
  453. RunRfc5322SampleTest(Rfc5322Sample4,
  454. (headers) =>
  455. {
  456. Assert.NotNull(headers);
  457. Assert.True(headers.Contains("from"));
  458. Assert.True(headers.Contains("to"));
  459. Assert.True(headers.Contains("cc"));
  460. Assert.True(headers.Contains("date"));
  461. Assert.True(headers.Contains("message-id"));
  462. });
  463. }
  464. [Fact]
  465. [Trait("Description", "HeaderParser.ParseBuffer Rfc5322Sample5 header.")]
  466. public void Rfc5322Sample5Test()
  467. {
  468. RunRfc5322SampleTest(Rfc5322Sample5,
  469. (headers) =>
  470. {
  471. Assert.NotNull(headers);
  472. Assert.True(headers.Contains("from"));
  473. Assert.True(headers.Contains("to"));
  474. Assert.True(headers.Contains("subject"));
  475. Assert.True(headers.Contains("date"));
  476. Assert.True(headers.Contains("message-id"));
  477. });
  478. }
  479. [Fact]
  480. [Trait("Description", "HeaderParser.ParseBuffer Rfc5322Sample6 header.")]
  481. public void Rfc5322Sample6Test()
  482. {
  483. RunRfc5322SampleTest(Rfc5322Sample6,
  484. (headers) =>
  485. {
  486. Assert.NotNull(headers);
  487. Assert.True(headers.Contains("from"));
  488. Assert.True(headers.Contains("to"));
  489. Assert.True(headers.Contains("reply-to"));
  490. Assert.True(headers.Contains("subject"));
  491. Assert.True(headers.Contains("date"));
  492. Assert.True(headers.Contains("message-id"));
  493. Assert.True(headers.Contains("in-reply-to"));
  494. Assert.True(headers.Contains("references"));
  495. });
  496. }
  497. [Fact]
  498. [Trait("Description", "HeaderParser.ParseBuffer Rfc5322Sample7 header.")]
  499. public void Rfc5322Sample7Test()
  500. {
  501. RunRfc5322SampleTest(Rfc5322Sample7,
  502. (headers) =>
  503. {
  504. Assert.NotNull(headers);
  505. Assert.True(headers.Contains("to"));
  506. Assert.True(headers.Contains("from"));
  507. Assert.True(headers.Contains("subject"));
  508. Assert.True(headers.Contains("date"));
  509. Assert.True(headers.Contains("message-id"));
  510. Assert.True(headers.Contains("in-reply-to"));
  511. Assert.True(headers.Contains("references"));
  512. });
  513. }
  514. [Fact]
  515. [Trait("Description", "HeaderParser.ParseBuffer Rfc5322Sample8 header.")]
  516. public void Rfc5322Sample8Test()
  517. {
  518. RunRfc5322SampleTest(Rfc5322Sample8,
  519. (headers) =>
  520. {
  521. Assert.NotNull(headers);
  522. Assert.True(headers.Contains("from"));
  523. Assert.True(headers.Contains("to"));
  524. Assert.True(headers.Contains("subject"));
  525. Assert.True(headers.Contains("date"));
  526. Assert.True(headers.Contains("message-id"));
  527. });
  528. }
  529. [Fact]
  530. [Trait("Description", "HeaderParser.ParseBuffer Rfc5322Sample9 header.")]
  531. public void Rfc5322Sample9Test()
  532. {
  533. RunRfc5322SampleTest(Rfc5322Sample9,
  534. (headers) =>
  535. {
  536. Assert.NotNull(headers);
  537. Assert.True(headers.Contains("resent-from"));
  538. Assert.True(headers.Contains("resent-to"));
  539. Assert.True(headers.Contains("resent-date"));
  540. Assert.True(headers.Contains("resent-message-id"));
  541. Assert.True(headers.Contains("from"));
  542. Assert.True(headers.Contains("to"));
  543. Assert.True(headers.Contains("subject"));
  544. Assert.True(headers.Contains("date"));
  545. Assert.True(headers.Contains("message-id"));
  546. });
  547. }
  548. [Fact]
  549. [Trait("Description", "HeaderParser.ParseBuffer Rfc5322Sample10 header.")]
  550. public void Rfc5322Sample10Test()
  551. {
  552. RunRfc5322SampleTest(Rfc5322Sample10,
  553. (headers) =>
  554. {
  555. Assert.NotNull(headers);
  556. Assert.True(headers.Contains("received"));
  557. Assert.Equal(2, headers.GetValues("received").Count());
  558. Assert.True(headers.Contains("from"));
  559. Assert.True(headers.Contains("to"));
  560. Assert.True(headers.Contains("subject"));
  561. Assert.True(headers.Contains("date"));
  562. Assert.True(headers.Contains("message-id"));
  563. });
  564. }
  565. [Fact]
  566. [Trait("Description", "HeaderParser.ParseBuffer Rfc5322Sample11 header.")]
  567. public void Rfc5322Sample11Test()
  568. {
  569. RunRfc5322SampleTest(Rfc5322Sample11,
  570. (headers) =>
  571. {
  572. Assert.NotNull(headers);
  573. Assert.True(headers.Contains("from"));
  574. Assert.True(headers.Contains("to"));
  575. Assert.True(headers.Contains("cc"));
  576. Assert.True(headers.Contains("date"));
  577. Assert.True(headers.Contains("message-id"));
  578. });
  579. }
  580. }
  581. }