MessageHeadersTest.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393
  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",
  52. "http://www.w3.org/2005/08/addressing"), "#1");
  53. // The return value of FindHeader maps to its places in the headers
  54. Assert.AreEqual (1, headers.FindHeader ("MyHeader", "bar"), "#2");
  55. // If a header has actor (role) specified, then it must be provided
  56. Assert.AreEqual (-1, headers.FindHeader ("MyHeader", "baz"), "#3");
  57. Assert.AreEqual (2, headers.FindHeader ("MyHeader", "baz", "john"), "#4");
  58. }
  59. [Test]
  60. public void TestFindHeaderWithMultipleIdenticalHeaders ()
  61. {
  62. Message m = Message.CreateMessage (MessageVersion.Default, "test", 1);
  63. m.Headers.Add (MessageHeader.CreateHeader (
  64. "Action", "http://schemas.xmlsoap.org/ws/2004/08/addressing", 1));
  65. MessageHeaders headers = m.Headers;
  66. headers.FindHeader ("Action", "http://schemas.xmlsoap.org/ws/2004/08/addressing");
  67. }
  68. [Test]
  69. public void TestGetHeader ()
  70. {
  71. Message m = Message.CreateMessage (MessageVersion.Default, "test", 1);
  72. MessageHeaders headers = m.Headers;
  73. Assert.AreEqual ("test", headers.GetHeader<string> (0));
  74. }
  75. [Test, ExpectedException (typeof (ArgumentOutOfRangeException))]
  76. public void TestGetHeaderOutOfRange ()
  77. {
  78. Message m = Message.CreateMessage (MessageVersion.Default, "test", 1);
  79. MessageHeaders headers = m.Headers;
  80. Assert.AreEqual ("test", headers.GetHeader<int> (1));
  81. }
  82. [Test]
  83. [ExpectedException (typeof (ArgumentNullException))]
  84. public void GetHeaderNullSerializer ()
  85. {
  86. MessageHeaders headers = new MessageHeaders (MessageVersion.Default);
  87. string ns = "http://schemas.xmlsoap.org/ws/2004/08/addressing";
  88. headers.Add (MessageHeader.CreateHeader ("Action", ns, "urn:foo"));
  89. headers.GetHeader<string> (0, null);
  90. }
  91. [Test]
  92. [ExpectedException (typeof (ArgumentNullException))]
  93. public void GetHeaderNullSerializer2 ()
  94. {
  95. MessageHeaders headers = new MessageHeaders (MessageVersion.Default);
  96. string ns = "http://schemas.xmlsoap.org/ws/2004/08/addressing";
  97. headers.Add (MessageHeader.CreateHeader ("Action", ns, "urn:foo"));
  98. headers.GetHeader<string> ("Action", ns, (XmlObjectSerializer) null);
  99. }
  100. [Test, ExpectedException (typeof (MessageHeaderException))]
  101. public void TestGetHeaderNonexistent ()
  102. {
  103. Message m = Message.CreateMessage (MessageVersion.Default, "test", 1);
  104. MessageHeaders headers = m.Headers;
  105. headers.GetHeader<string>("name", "namespace");
  106. }
  107. [Test]
  108. public void TestInsert ()
  109. {
  110. Message m = Message.CreateMessage (MessageVersion.Default, "test", 1);
  111. m.Headers.Add (MessageHeader.CreateHeader ("FirstHeader", "ns", "first"));
  112. Assert.AreEqual (1, m.Headers.FindHeader ("FirstHeader", "ns"));
  113. m.Headers.Insert (1, MessageHeader.CreateHeader ("InsertedHeader", "ns", "insert"));
  114. Assert.AreEqual (1, m.Headers.FindHeader ("InsertedHeader", "ns"));
  115. Assert.AreEqual (2, m.Headers.FindHeader ("FirstHeader", "ns"));
  116. }
  117. [Test]
  118. public void TestWriteStartHeaderSimple ()
  119. {
  120. Message m = Message.CreateMessage (MessageVersion.Default, "test", 1);
  121. MessageHeader h = MessageHeader.CreateHeader ("FirstHeader", "ns", "first");
  122. m.Headers.Add (h);
  123. StringBuilder sb = new StringBuilder ();
  124. XmlWriterSettings s = new XmlWriterSettings ();
  125. s.ConformanceLevel = ConformanceLevel.Fragment;
  126. XmlWriter w = XmlWriter.Create (sb, s);
  127. XmlDictionaryWriter dw = XmlDictionaryWriter.CreateDictionaryWriter (w);
  128. m.Headers.WriteStartHeader (1, dw);
  129. dw.Close ();
  130. w.Close ();
  131. string actual = sb.ToString ();
  132. sb = new StringBuilder ();
  133. w = XmlWriter.Create (sb, s);
  134. dw = XmlDictionaryWriter.CreateDictionaryWriter (w);
  135. h.WriteStartHeader (dw, MessageVersion.Soap12WSAddressing10);
  136. dw.Close ();
  137. w.Close ();
  138. string expected = sb.ToString ();
  139. Assert.AreEqual (expected, actual);
  140. }
  141. [Test]
  142. public void TestWriteStartHeaderWithActor ()
  143. {
  144. Message m = Message.CreateMessage (MessageVersion.Default, "test", 1);
  145. MessageHeader h = MessageHeader.CreateHeader ("FirstHeader", "ns", "first", true, "actor");
  146. m.Headers.Add (h);
  147. StringBuilder sb = new StringBuilder ();
  148. XmlWriterSettings s = new XmlWriterSettings ();
  149. s.ConformanceLevel = ConformanceLevel.Fragment;
  150. XmlWriter w = XmlWriter.Create (sb, s);
  151. XmlDictionaryWriter dw = XmlDictionaryWriter.CreateDictionaryWriter (w);
  152. m.Headers.WriteStartHeader (1, dw);
  153. dw.Close ();
  154. w.Close ();
  155. string actual = sb.ToString ();
  156. sb = new StringBuilder ();
  157. w = XmlWriter.Create (sb, s);
  158. dw = XmlDictionaryWriter.CreateDictionaryWriter (w);
  159. h.WriteStartHeader (dw, MessageVersion.Soap12WSAddressing10);
  160. dw.Close ();
  161. w.Close ();
  162. string expected = sb.ToString ();
  163. Assert.AreEqual (expected, actual);
  164. }
  165. [Test]
  166. public void TestWriteHeaderContents ()
  167. {
  168. Message m = Message.CreateMessage (MessageVersion.Default, "test", 1);
  169. m.Headers.Add (MessageHeader.CreateHeader ("FirstHeader", "ns", "first"));
  170. Assert.AreEqual (1, m.Headers.FindHeader ("FirstHeader", "ns"));
  171. m.Headers.Add (MessageHeader.CreateHeader ("SecondHeader", "ns", 2));
  172. StringBuilder sb = new StringBuilder ();
  173. // Even if XmlWriter is allowed to write fragment,
  174. // DataContractSerializer never allows it to write
  175. // content in contentOnly mode.
  176. XmlWriterSettings settings = new XmlWriterSettings ();
  177. settings.OmitXmlDeclaration = true;
  178. //settings.ConformanceLevel = ConformanceLevel.Fragment;
  179. XmlWriter w = XmlWriter.Create (sb, settings);
  180. w.WriteStartElement ("root");
  181. w.WriteStartElement ("HEADER1");
  182. m.Headers.WriteHeaderContents (1, w);
  183. w.WriteEndElement ();
  184. w.WriteStartElement ("HEADER2");
  185. m.Headers.WriteHeaderContents (2, w);
  186. w.WriteEndElement ();
  187. w.WriteEndElement ();
  188. w.Close ();
  189. Assert.AreEqual ("<root><HEADER1>first</HEADER1><HEADER2>2</HEADER2></root>", sb.ToString ());
  190. }
  191. [Test]
  192. [Ignore ("I believe that with AddressingVersion.None it should not output any mustUnderstand addressing headers.")]
  193. public void WriteHeaderContentsAddressingNone ()
  194. {
  195. // This Action header is IMO extraneous.
  196. 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/08/addressing/none\">Echo</Action></s:Header><s:Body xmlns=\"http://tempuri.org/\"><Echo xmlns=\"http://tempuri.org/\" /></s:Body></s:Envelope>";
  197. Message m = Message.CreateMessage (MessageVersion.Soap12, "Echo", (object) null);
  198. StringWriter sw = new StringWriter ();
  199. using (XmlWriter w = XmlWriter.Create (sw)) {
  200. m.WriteMessage (w);
  201. }
  202. Assert.AreEqual (xml, sw.ToString ());
  203. }
  204. [Test]
  205. public void TestAction ()
  206. {
  207. Message m = Message.CreateMessage (MessageVersion.Default, "test", 1);
  208. m.Headers.Add (MessageHeader.CreateHeader ("FirstHeader", "ns", "first"));
  209. Assert.AreEqual ("test", m.Headers.Action, "#1");
  210. MessageHeaders headers = new MessageHeaders (MessageVersion.Default, 1);
  211. Assert.AreEqual (null, headers.Action, "#2");
  212. headers.Add (MessageHeader.CreateHeader ("Action", "http://www.w3.org/2005/08/addressing", "test"));
  213. MessageHeaderInfo info = headers [0];
  214. Assert.AreEqual ("Action", info.Name, "#2-1");
  215. Assert.AreEqual ("http://www.w3.org/2005/08/addressing", info.Namespace, "#2-2");
  216. Assert.AreEqual (false, info.MustUnderstand, "#2-3");
  217. Assert.AreEqual (String.Empty, info.Actor, "#2-4");
  218. Assert.AreEqual ("test", headers.Action, "#3");
  219. headers.Clear ();
  220. Assert.AreEqual (null, headers.Action, "#4");
  221. }
  222. [Test]
  223. public void MessageCreateAddsAction ()
  224. {
  225. Message m = Message.CreateMessage (MessageVersion.Default, "test", 1);
  226. MessageHeaderInfo info = m.Headers [0];
  227. Assert.AreEqual ("Action", info.Name, "#1");
  228. Assert.AreEqual ("http://www.w3.org/2005/08/addressing", info.Namespace, "#2");
  229. Assert.AreEqual (true, info.MustUnderstand, "#3");
  230. Assert.AreEqual (String.Empty, info.Actor, "#4");
  231. }
  232. [Test]
  233. public void GetReaderAtHeader ()
  234. {
  235. Message m = Message.CreateMessage (MessageVersion.Default, "test", 1);
  236. XmlDictionaryReader r = m.Headers.GetReaderAtHeader (0);
  237. XmlDictionaryReader r2 = m.Headers.GetReaderAtHeader (0);
  238. using (XmlWriter x = XmlWriter.Create (TextWriter.Null)) {
  239. r2.MoveToContent ();
  240. while (!r2.EOF)
  241. x.WriteNode (r2, false);
  242. }
  243. /*
  244. // Seems like there is some attribute order differences
  245. // in XmlDictionaryReader or XmlWriter, so don't compare
  246. // XML in raw strings.
  247. StringWriter sw = new StringWriter ();
  248. XmlWriterSettings settings = new XmlWriterSettings ();
  249. settings.OmitXmlDeclaration = true;
  250. settings.ConformanceLevel = ConformanceLevel.Fragment;
  251. XmlWriter w = XmlWriter.Create (sw, settings);
  252. Assert.AreEqual (ReadState.Interactive, r.ReadState, "#1-1");
  253. Assert.AreEqual (XmlNodeType.Element, r.NodeType, "#1-2");
  254. while (!r.EOF)
  255. w.WriteNode (r, false);
  256. w.Flush ();
  257. 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");
  258. */
  259. Assert.AreEqual (ReadState.Interactive, r.ReadState, "#1-1");
  260. Assert.AreEqual (XmlNodeType.Element, r.NodeType, "#1-2");
  261. Assert.AreEqual ("Action", r.LocalName, "#1-3");
  262. Assert.AreEqual ("http://www.w3.org/2005/08/addressing", r.NamespaceURI, "#1-4");
  263. Assert.AreEqual ("1", r.GetAttribute ("mustUnderstand", "http://www.w3.org/2003/05/soap-envelope"), "#1-5");
  264. Assert.AreEqual ("test", r.ReadElementContentAsString (), "#1-6");
  265. }
  266. [Test]
  267. [ExpectedException (typeof (ArgumentOutOfRangeException))]
  268. public void GetReaderAtHeaderOutOfRange ()
  269. {
  270. MessageHeaders h = new MessageHeaders (MessageVersion.Default, 1);
  271. h.GetReaderAtHeader (0);
  272. }
  273. // I doubt things wrt this work fine on WinFX; sometimes it
  274. // does *not* raise an error, while sometimes it does. And it
  275. // is basically consistent on every run against the same
  276. // *_test.dll binary. Huh.
  277. [Test]
  278. [ExpectedException (typeof (MessageHeaderException))] // multiple headers: "Action"
  279. [Category ("NotWorking")]
  280. public void CopyHeadersFrom ()
  281. {
  282. Message msg = Message.CreateMessage (MessageVersion.Default, "urn:myaction");
  283. Message msg2 = Message.CreateMessage (MessageVersion.Default, "urn:myaction2");
  284. msg2.Headers.CopyHeadersFrom (msg);
  285. Assert.AreEqual ("urn:myaction2", msg2.Headers.Action);
  286. }
  287. [Test]
  288. public void AddressingNoneAndAction ()
  289. {
  290. MessageHeaders h = new MessageHeaders (MessageVersion.Soap12);
  291. h.Action = "urn:foo";
  292. }
  293. [Test]
  294. [ExpectedException (typeof (InvalidOperationException))]
  295. public void AddressingNoneAndFrom ()
  296. {
  297. MessageHeaders h = new MessageHeaders (MessageVersion.Soap12);
  298. h.From = new EndpointAddress ("http://localhost:8080");
  299. }
  300. [Test]
  301. [ExpectedException (typeof (InvalidOperationException))]
  302. public void AddressingNoneAndFaultTo ()
  303. {
  304. MessageHeaders h = new MessageHeaders (MessageVersion.Soap12);
  305. h.FaultTo = new EndpointAddress ("http://localhost:8080");
  306. }
  307. [Test]
  308. [ExpectedException (typeof (InvalidOperationException))]
  309. public void AddressingNoneAndMessageId ()
  310. {
  311. MessageHeaders h = new MessageHeaders (MessageVersion.Soap12);
  312. h.MessageId = new UniqueId (Guid.NewGuid ());
  313. }
  314. [Test]
  315. [ExpectedException (typeof (InvalidOperationException))]
  316. public void AddressingNoneAndRelatesTo ()
  317. {
  318. MessageHeaders h = new MessageHeaders (MessageVersion.Soap12);
  319. h.RelatesTo = new UniqueId (Guid.NewGuid ());
  320. }
  321. [Test]
  322. [ExpectedException (typeof (InvalidOperationException))]
  323. public void AddressingNoneAndReplyTo ()
  324. {
  325. MessageHeaders h = new MessageHeaders (MessageVersion.Soap12);
  326. h.ReplyTo = new EndpointAddress ("http://localhost:8080");
  327. }
  328. [Test]
  329. public void AddressingNoneAndTo ()
  330. {
  331. MessageHeaders h = new MessageHeaders (MessageVersion.Soap12);
  332. h.To = new Uri ("http://localhost:8080");
  333. }
  334. }
  335. }