MessageHeadersTest.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Runtime.Serialization;
  6. using System.ServiceModel;
  7. using System.ServiceModel.Channels;
  8. using System.Text;
  9. using System.Xml;
  10. using NUnit.Framework;
  11. namespace MonoTests.System.ServiceModel.Channels
  12. {
  13. [TestFixture]
  14. public class MessageHeadersTest
  15. {
  16. string wsa1 = "http://www.w3.org/2005/08/addressing";
  17. [Test] // it is somehow allowed ...
  18. public void AddDuplicate ()
  19. {
  20. MessageHeaders headers = new MessageHeaders (MessageVersion.Default);
  21. headers.Add (MessageHeader.CreateHeader ("Action", wsa1, "urn:foo"));
  22. headers.Add (MessageHeader.CreateHeader ("Action", wsa1, "urn:bar"));
  23. }
  24. [Test]
  25. public void AddDuplicate2 ()
  26. {
  27. MessageHeaders headers = new MessageHeaders (MessageVersion.Default);
  28. headers.Add (MessageHeader.CreateHeader ("Action", wsa1, "urn:foo", true, "whoa"));
  29. headers.Add (MessageHeader.CreateHeader ("Action", wsa1, "urn:bar", true, "whee"));
  30. }
  31. [Test]
  32. public void TestConstructor ()
  33. {
  34. MessageHeaders headers = new MessageHeaders (MessageVersion.Soap12WSAddressing10);
  35. Assert.AreEqual (0, headers.Count);
  36. headers = new MessageHeaders (MessageVersion.Default);
  37. Assert.AreEqual (0, headers.Count);
  38. }
  39. [Test]
  40. public void TestFindHeader ()
  41. {
  42. // <a:Action mU="true">test</a:Action>
  43. Message m = Message.CreateMessage (MessageVersion.Default, "test", 1);
  44. Assert.AreEqual (1, m.Headers.Count, "#0");
  45. // <MyHeader xmlns="bar">1</MyHeader>
  46. m.Headers.Add (MessageHeader.CreateHeader ("MyHeader", "bar", 1));
  47. // <MyHeader xmlns="baz" role="john">1</MyHeader>
  48. m.Headers.Add (MessageHeader.CreateHeader ("MyHeader", "baz", 1, false, "john"));
  49. MessageHeaders headers = m.Headers;
  50. // The first header is at 0
  51. Assert.AreEqual (0, headers.FindHeader ("Action", wsa1), "#1");
  52. // The return value of FindHeader maps to its places in the headers
  53. Assert.AreEqual (1, headers.FindHeader ("MyHeader", "bar"), "#2");
  54. // If a header has actor (role) specified, then it must be provided
  55. Assert.AreEqual (-1, headers.FindHeader ("MyHeader", "baz"), "#3");
  56. Assert.AreEqual (2, headers.FindHeader ("MyHeader", "baz", "john"), "#4");
  57. }
  58. [Test]
  59. public void TestFindHeaderWithMultipleIdenticalHeaders ()
  60. {
  61. Message m = Message.CreateMessage (MessageVersion.Default, "test", 1);
  62. m.Headers.Add (MessageHeader.CreateHeader (
  63. "Action", "http://schemas.xmlsoap.org/ws/2004/08/addressing", 1));
  64. MessageHeaders headers = m.Headers;
  65. headers.FindHeader ("Action", "http://schemas.xmlsoap.org/ws/2004/08/addressing");
  66. }
  67. [Test]
  68. public void TestGetHeader ()
  69. {
  70. Message m = Message.CreateMessage (MessageVersion.Default, "test", 1);
  71. MessageHeaders headers = m.Headers;
  72. Assert.AreEqual ("test", headers.GetHeader<string> (0));
  73. }
  74. [Test, ExpectedException (typeof (ArgumentOutOfRangeException))]
  75. public void TestGetHeaderOutOfRange ()
  76. {
  77. Message m = Message.CreateMessage (MessageVersion.Default, "test", 1);
  78. MessageHeaders headers = m.Headers;
  79. Assert.AreEqual ("test", headers.GetHeader<int> (1));
  80. }
  81. [Test]
  82. [ExpectedException (typeof (ArgumentNullException))]
  83. public void GetHeaderNullSerializer ()
  84. {
  85. MessageHeaders headers = new MessageHeaders (MessageVersion.Default);
  86. string ns = "http://schemas.xmlsoap.org/ws/2004/08/addressing";
  87. headers.Add (MessageHeader.CreateHeader ("Action", ns, "urn:foo"));
  88. headers.GetHeader<string> (0, null);
  89. }
  90. [Test]
  91. [ExpectedException (typeof (ArgumentNullException))]
  92. public void GetHeaderNullSerializer2 ()
  93. {
  94. MessageHeaders headers = new MessageHeaders (MessageVersion.Default);
  95. string ns = "http://schemas.xmlsoap.org/ws/2004/08/addressing";
  96. headers.Add (MessageHeader.CreateHeader ("Action", ns, "urn:foo"));
  97. headers.GetHeader<string> ("Action", ns, (XmlObjectSerializer) null);
  98. }
  99. [Test, ExpectedException (typeof (MessageHeaderException))]
  100. public void TestGetHeaderNonexistent ()
  101. {
  102. Message m = Message.CreateMessage (MessageVersion.Default, "test", 1);
  103. MessageHeaders headers = m.Headers;
  104. headers.GetHeader<string>("name", "namespace");
  105. }
  106. [Test]
  107. public void SetWSAddressingHeadersNullToNonSoap ()
  108. {
  109. Message m = Message.CreateMessage (MessageVersion.None, "test", 1);
  110. m.Headers.From = null;
  111. m.Headers.MessageId = null;
  112. m.Headers.ReplyTo = null;
  113. m.Headers.FaultTo = null;
  114. m.Headers.RelatesTo = null;
  115. }
  116. [Test]
  117. public void TestInsert ()
  118. {
  119. Message m = Message.CreateMessage (MessageVersion.Default, "test", 1);
  120. m.Headers.Add (MessageHeader.CreateHeader ("FirstHeader", "ns", "first"));
  121. Assert.AreEqual (1, m.Headers.FindHeader ("FirstHeader", "ns"));
  122. m.Headers.Insert (1, MessageHeader.CreateHeader ("InsertedHeader", "ns", "insert"));
  123. Assert.AreEqual (1, m.Headers.FindHeader ("InsertedHeader", "ns"));
  124. Assert.AreEqual (2, m.Headers.FindHeader ("FirstHeader", "ns"));
  125. }
  126. [Test]
  127. public void TestWriteStartHeaderSimple ()
  128. {
  129. Message m = Message.CreateMessage (MessageVersion.Default, "test", 1);
  130. MessageHeader h = MessageHeader.CreateHeader ("FirstHeader", "ns", "first");
  131. m.Headers.Add (h);
  132. StringBuilder sb = new StringBuilder ();
  133. XmlWriterSettings s = new XmlWriterSettings ();
  134. s.ConformanceLevel = ConformanceLevel.Fragment;
  135. XmlWriter w = XmlWriter.Create (sb, s);
  136. XmlDictionaryWriter dw = XmlDictionaryWriter.CreateDictionaryWriter (w);
  137. m.Headers.WriteStartHeader (1, dw);
  138. dw.Close ();
  139. w.Close ();
  140. string actual = sb.ToString ();
  141. sb = new StringBuilder ();
  142. w = XmlWriter.Create (sb, s);
  143. dw = XmlDictionaryWriter.CreateDictionaryWriter (w);
  144. h.WriteStartHeader (dw, MessageVersion.Soap12WSAddressing10);
  145. dw.Close ();
  146. w.Close ();
  147. string expected = sb.ToString ();
  148. Assert.AreEqual (expected, actual);
  149. }
  150. [Test]
  151. public void TestWriteStartHeaderWithActor ()
  152. {
  153. Message m = Message.CreateMessage (MessageVersion.Default, "test", 1);
  154. MessageHeader h = MessageHeader.CreateHeader ("FirstHeader", "ns", "first", true, "actor");
  155. m.Headers.Add (h);
  156. StringBuilder sb = new StringBuilder ();
  157. XmlWriterSettings s = new XmlWriterSettings ();
  158. s.ConformanceLevel = ConformanceLevel.Fragment;
  159. XmlWriter w = XmlWriter.Create (sb, s);
  160. XmlDictionaryWriter dw = XmlDictionaryWriter.CreateDictionaryWriter (w);
  161. m.Headers.WriteStartHeader (1, dw);
  162. dw.Close ();
  163. w.Close ();
  164. string actual = sb.ToString ();
  165. sb = new StringBuilder ();
  166. w = XmlWriter.Create (sb, s);
  167. dw = XmlDictionaryWriter.CreateDictionaryWriter (w);
  168. h.WriteStartHeader (dw, MessageVersion.Soap12WSAddressing10);
  169. dw.Close ();
  170. w.Close ();
  171. string expected = sb.ToString ();
  172. Assert.AreEqual (expected, actual);
  173. }
  174. [Test]
  175. public void TestWriteHeaderContents ()
  176. {
  177. Message m = Message.CreateMessage (MessageVersion.Default, "test", 1);
  178. m.Headers.Add (MessageHeader.CreateHeader ("FirstHeader", "ns", "first"));
  179. Assert.AreEqual (1, m.Headers.FindHeader ("FirstHeader", "ns"));
  180. m.Headers.Add (MessageHeader.CreateHeader ("SecondHeader", "ns", 2));
  181. StringBuilder sb = new StringBuilder ();
  182. // Even if XmlWriter is allowed to write fragment,
  183. // DataContractSerializer never allows it to write
  184. // content in contentOnly mode.
  185. XmlWriterSettings settings = new XmlWriterSettings ();
  186. settings.OmitXmlDeclaration = true;
  187. //settings.ConformanceLevel = ConformanceLevel.Fragment;
  188. XmlWriter w = XmlWriter.Create (sb, settings);
  189. w.WriteStartElement ("root");
  190. w.WriteStartElement ("HEADER1");
  191. m.Headers.WriteHeaderContents (1, w);
  192. w.WriteEndElement ();
  193. w.WriteStartElement ("HEADER2");
  194. m.Headers.WriteHeaderContents (2, w);
  195. w.WriteEndElement ();
  196. w.WriteEndElement ();
  197. w.Close ();
  198. Assert.AreEqual ("<root><HEADER1>first</HEADER1><HEADER2>2</HEADER2></root>", sb.ToString ());
  199. }
  200. [Test]
  201. [Ignore ("I believe that with AddressingVersion.None it should not output any mustUnderstand addressing headers.")]
  202. public void WriteHeaderContentsAddressingNone ()
  203. {
  204. // This Action header is IMO extraneous.
  205. string xml = "<?xml version=\"1.0\" encoding=\"utf-16\"?><s:Envelope xmlns:s=\"http://www.w3.org/2003/05/soap-envelope\"><s:Header><Action s:mustUnderstand=\"1\" xmlns=\"http://schemas.microsoft.com/ws/2005/05/addressing/none\">Echo</Action></s:Header><s:Body><z:anyType i:nil=\"true\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:z=\"http://schemas.microsoft.com/2003/10/Serialization/\"/></s:Body></s:Envelope>";
  206. Message m = Message.CreateMessage (MessageVersion.Soap12, "Echo", (object) null);
  207. StringWriter sw = new StringWriter ();
  208. using (XmlWriter w = XmlWriter.Create (sw)) {
  209. m.WriteMessage (w);
  210. }
  211. Assert.AreEqual (xml, sw.ToString ());
  212. }
  213. [Test]
  214. public void TestAction ()
  215. {
  216. Message m = Message.CreateMessage (MessageVersion.Default, "test", 1);
  217. m.Headers.Add (MessageHeader.CreateHeader ("FirstHeader", "ns", "first"));
  218. Assert.AreEqual ("test", m.Headers.Action, "#1");
  219. MessageHeaders headers = new MessageHeaders (MessageVersion.Default, 1);
  220. Assert.AreEqual (null, headers.Action, "#2");
  221. headers.Add (MessageHeader.CreateHeader ("Action", "http://www.w3.org/2005/08/addressing", "test"));
  222. MessageHeaderInfo info = headers [0];
  223. Assert.AreEqual ("Action", info.Name, "#2-1");
  224. Assert.AreEqual ("http://www.w3.org/2005/08/addressing", info.Namespace, "#2-2");
  225. Assert.AreEqual (false, info.MustUnderstand, "#2-3");
  226. Assert.AreEqual (String.Empty, info.Actor, "#2-4");
  227. Assert.AreEqual ("test", headers.Action, "#3");
  228. headers.Clear ();
  229. Assert.AreEqual (null, headers.Action, "#4");
  230. }
  231. [Test]
  232. public void MessageCreateAddsAction ()
  233. {
  234. Message m = Message.CreateMessage (MessageVersion.Default, "test", 1);
  235. MessageHeaderInfo info = m.Headers [0];
  236. Assert.AreEqual ("Action", info.Name, "#1");
  237. Assert.AreEqual ("http://www.w3.org/2005/08/addressing", info.Namespace, "#2");
  238. Assert.AreEqual (true, info.MustUnderstand, "#3");
  239. Assert.AreEqual (String.Empty, info.Actor, "#4");
  240. }
  241. [Test]
  242. public void GetReaderAtHeader ()
  243. {
  244. Message m = Message.CreateMessage (MessageVersion.Default, "test", 1);
  245. XmlDictionaryReader r = m.Headers.GetReaderAtHeader (0);
  246. XmlDictionaryReader r2 = m.Headers.GetReaderAtHeader (0);
  247. using (XmlWriter x = XmlWriter.Create (TextWriter.Null)) {
  248. r2.MoveToContent ();
  249. while (!r2.EOF)
  250. x.WriteNode (r2, false);
  251. }
  252. /*
  253. // Seems like there is some attribute order differences
  254. // in XmlDictionaryReader or XmlWriter, so don't compare
  255. // XML in raw strings.
  256. StringWriter sw = new StringWriter ();
  257. XmlWriterSettings settings = new XmlWriterSettings ();
  258. settings.OmitXmlDeclaration = true;
  259. settings.ConformanceLevel = ConformanceLevel.Fragment;
  260. XmlWriter w = XmlWriter.Create (sw, settings);
  261. Assert.AreEqual (ReadState.Interactive, r.ReadState, "#1-1");
  262. Assert.AreEqual (XmlNodeType.Element, r.NodeType, "#1-2");
  263. while (!r.EOF)
  264. w.WriteNode (r, false);
  265. w.Flush ();
  266. Assert.AreEqual ("<Action a:mustUnderstand=\"1\" xmlns=\"http://www.w3.org/2005/08/addressing\" xmlns:a=\"http://www.w3.org/2003/05/soap-envelope\">test</Action>", sw.ToString (), "#2");
  267. */
  268. Assert.AreEqual (ReadState.Interactive, r.ReadState, "#1-1");
  269. Assert.AreEqual (XmlNodeType.Element, r.NodeType, "#1-2");
  270. Assert.AreEqual ("Action", r.LocalName, "#1-3");
  271. Assert.AreEqual ("http://www.w3.org/2005/08/addressing", r.NamespaceURI, "#1-4");
  272. Assert.AreEqual ("1", r.GetAttribute ("mustUnderstand", "http://www.w3.org/2003/05/soap-envelope"), "#1-5");
  273. Assert.AreEqual ("test", r.ReadElementContentAsString (), "#1-6");
  274. }
  275. [Test]
  276. [ExpectedException (typeof (ArgumentOutOfRangeException))]
  277. public void GetReaderAtHeaderOutOfRange ()
  278. {
  279. MessageHeaders h = new MessageHeaders (MessageVersion.Default, 1);
  280. h.GetReaderAtHeader (0);
  281. }
  282. [Test]
  283. [ExpectedException (typeof (MessageHeaderException))] // multiple headers: "Action"
  284. public void CopyHeadersFrom ()
  285. {
  286. Message msg = Message.CreateMessage (MessageVersion.Default, "urn:myaction");
  287. Message msg2 = Message.CreateMessage (MessageVersion.Default, "urn:myaction2");
  288. msg2.Headers.CopyHeadersFrom (msg);
  289. Assert.AreEqual ("urn:myaction2", msg2.Headers.Action);
  290. }
  291. [Test]
  292. public void CopyHeadersFrom2 ()
  293. {
  294. Message msg = Message.CreateMessage (MessageVersion.Default, "urn:myaction");
  295. Message msg2 = Message.CreateMessage (MessageVersion.Default, "urn:myaction2");
  296. msg2.Headers.Action = null;
  297. msg2.Headers.CopyHeadersFrom (msg);
  298. Assert.AreEqual ("urn:myaction", msg2.Headers.Action);
  299. }
  300. [Test]
  301. public void AddressingNoneAndAction ()
  302. {
  303. MessageHeaders h = new MessageHeaders (MessageVersion.Soap12);
  304. h.Action = "urn:foo";
  305. }
  306. [Test]
  307. [ExpectedException (typeof (InvalidOperationException))]
  308. public void AddressingNoneAndFrom ()
  309. {
  310. MessageHeaders h = new MessageHeaders (MessageVersion.Soap12);
  311. h.From = new EndpointAddress ("http://localhost:8080");
  312. }
  313. [Test]
  314. [ExpectedException (typeof (InvalidOperationException))]
  315. public void AddressingNoneAndFaultTo ()
  316. {
  317. MessageHeaders h = new MessageHeaders (MessageVersion.Soap12);
  318. h.FaultTo = new EndpointAddress ("http://localhost:8080");
  319. }
  320. [Test]
  321. [ExpectedException (typeof (InvalidOperationException))]
  322. public void AddressingNoneAndMessageId ()
  323. {
  324. MessageHeaders h = new MessageHeaders (MessageVersion.Soap12);
  325. h.MessageId = new UniqueId (Guid.NewGuid ());
  326. }
  327. [Test]
  328. [ExpectedException (typeof (InvalidOperationException))]
  329. public void AddressingNoneAndRelatesTo ()
  330. {
  331. MessageHeaders h = new MessageHeaders (MessageVersion.Soap12);
  332. h.RelatesTo = new UniqueId (Guid.NewGuid ());
  333. }
  334. [Test]
  335. [ExpectedException (typeof (InvalidOperationException))]
  336. public void AddressingNoneAndReplyTo ()
  337. {
  338. MessageHeaders h = new MessageHeaders (MessageVersion.Soap12);
  339. h.ReplyTo = new EndpointAddress ("http://localhost:8080");
  340. }
  341. [Test]
  342. public void AddressingNoneAndTo ()
  343. {
  344. MessageHeaders h = new MessageHeaders (MessageVersion.Soap12);
  345. h.To = new Uri ("http://localhost:8080");
  346. }
  347. [Test]
  348. [ExpectedException (typeof (MessageHeaderException))]
  349. public void DuplicateActionFindError ()
  350. {
  351. MessageHeaders headers = new MessageHeaders (MessageVersion.Default);
  352. headers.Add (MessageHeader.CreateHeader ("Action", wsa1, "urn:foo"));
  353. headers.Add (MessageHeader.CreateHeader ("Action", wsa1, "urn:bar"));
  354. Assert.Fail (String.Format ("Action should not be caught", headers.Action)); // access to Action results in an error. If it does not, then simply assert fail.
  355. }
  356. [Test]
  357. [ExpectedException (typeof (MessageHeaderException))]
  358. public void CopyHeadersFrom_Merge ()
  359. {
  360. var h1 = new MessageHeaders (MessageVersion.Default);
  361. var h2 = new MessageHeaders (MessageVersion.Default);
  362. h1.Add (MessageHeader.CreateHeader ("Action", wsa1, "urn:foo"));
  363. h2.Add (MessageHeader.CreateHeader ("Action", wsa1, "urn:bar"));
  364. h1.CopyHeadersFrom (h2); // it somehow allow dups!
  365. Assert.Fail (String.Format ("Action should not be caught", h1.Action)); // access to Action results in an error. If it does not, then simply assert fail.
  366. }
  367. }
  368. }