MessageBufferTest.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. using System;
  2. using System.IO;
  3. using System.ServiceModel;
  4. using System.ServiceModel.Channels;
  5. using System.ServiceModel.Dispatcher;
  6. using System.Text;
  7. using System.Xml;
  8. using System.Xml.XPath;
  9. using NUnit.Framework;
  10. namespace MonoTests.System.ServiceModel.Channels
  11. {
  12. [TestFixture]
  13. public class MessageBufferTest
  14. {
  15. [Test]
  16. public void TestCreateNavigator ()
  17. {
  18. Message m = Message.CreateMessage (MessageVersion.Default, "http://tempuri.org/");
  19. MessageBuffer mb = m.CreateBufferedCopy (1024);
  20. XPathNavigator nav = mb.CreateNavigator ();
  21. Assert.IsTrue (nav is SeekableXPathNavigator);
  22. }
  23. [Test]
  24. [ExpectedException (typeof (InvalidOperationException))]
  25. public void TestCreateBufferedCopyTwice ()
  26. {
  27. Message m = Message.CreateMessage (MessageVersion.Default, "action", 1);
  28. m.CreateBufferedCopy (64);
  29. m.CreateBufferedCopy (64);
  30. }
  31. [Test]
  32. public void TestCreateMessage ()
  33. {
  34. Message m = Message.CreateMessage (MessageVersion.Default, "action", 1);
  35. Message m2 = Message.CreateMessage (MessageVersion.Default, "action", 1);
  36. MessageBuffer mb = m.CreateBufferedCopy (64);
  37. Message n = mb.CreateMessage ();
  38. Assert.AreEqual (m2.ToString (), n.ToString (), "#2");
  39. }
  40. [Test, ExpectedException (typeof (ArgumentNullException))]
  41. public void TestWriteMessageNull ()
  42. {
  43. Message m = Message.CreateMessage (MessageVersion.Default, "action", 1);
  44. MessageBuffer mb = m.CreateBufferedCopy (64);
  45. mb.WriteMessage (null);
  46. }
  47. [Test]
  48. public void WriteMessageWithDictionaryWriter ()
  49. {
  50. Message m = Message.CreateMessage (MessageVersion.Default, "action", 1);
  51. StringBuilder sb = new StringBuilder ();
  52. XmlWriter w = XmlWriter.Create (sb);
  53. XmlDictionaryWriter dw = XmlDictionaryWriter.CreateDictionaryWriter (w);
  54. m.WriteMessage (dw);
  55. dw.Close ();
  56. }
  57. [Test]
  58. [Category ("NotWorking")]
  59. public void TestWriteMessage ()
  60. {
  61. Message m = Message.CreateMessage (MessageVersion.Default, "action", 1);
  62. Message n = Message.CreateMessage (MessageVersion.Default, "action", 1);
  63. Assert.AreEqual (m.ToString (), n.ToString ());
  64. // Write out a message using a Binary XmlDictionaryWriter
  65. MemoryStream ms = new MemoryStream ();
  66. XmlDictionaryWriter w = XmlDictionaryWriter.CreateBinaryWriter (ms);
  67. m.WriteMessage (w);
  68. w.Close ();
  69. ms.Close ();
  70. byte [] expected = ms.GetBuffer ();
  71. StringBuilder sb = new StringBuilder ();
  72. sb.AppendLine ("expected: " + expected.Length);
  73. for (int i = 0; i < 24; i++) {
  74. byte b = expected [i];
  75. sb.Append (String.Format ("{0:X02} ", b));
  76. }
  77. string exp = sb.ToString ();
  78. // Write out an equivalent MessageBuffer
  79. MessageBuffer mb = n.CreateBufferedCopy (1024);
  80. sb = new StringBuilder ();
  81. ms = new MemoryStream ();
  82. mb.WriteMessage (ms);
  83. ms.Close ();
  84. byte [] actual = ms.GetBuffer ();
  85. sb.AppendLine ("actual: " + actual.Length);
  86. for (int i = 0; i < 24; i++) {
  87. byte b = actual [i];
  88. sb.Append (String.Format ("{0:X02} ", b));
  89. }
  90. string act = sb.ToString ();
  91. // Console.WriteLine (exp + "\n" + act);
  92. // So the lengths of the buffer are the same....
  93. Assert.AreEqual (expected.Length, actual.Length);
  94. // TODO:
  95. // There are three possible XmlDictionaryWriters:
  96. // Binary, Dictionary, Mtom
  97. //
  98. // It doesn't have a MIME type header, so it's definitely not Mtom.
  99. // Dictionary outputs text, so it's not that either.
  100. // It's got to be the Binary one.
  101. //
  102. // But the content differs, why?
  103. // FIXME: we don't have AreNotEqual
  104. // Assert.AreNotEqual (expected, actual);
  105. }
  106. [Test]
  107. public void TestEmptyMessageBuffer ()
  108. {
  109. Message m = Message.CreateMessage (MessageVersion.Default, String.Empty);
  110. MessageBuffer b = m.CreateBufferedCopy (0);
  111. Assert.IsTrue (m.IsEmpty, "#1");
  112. Assert.AreEqual (0, b.BufferSize, "#2");
  113. Assert.AreEqual ("application/soap+msbin1", b.MessageContentType, "#3");
  114. }
  115. [Test]
  116. public void TestSimpleMessageBuffer ()
  117. {
  118. Message m = Message.CreateMessage (MessageVersion.Default,
  119. String.Empty,
  120. new MyBodyWriter ());
  121. MessageBuffer b = m.CreateBufferedCopy (Int32.MaxValue);
  122. Assert.IsFalse (m.IsEmpty, "#1");
  123. Assert.AreEqual (0, b.BufferSize, "#2");
  124. Assert.AreEqual ("application/soap+msbin1", b.MessageContentType, "#3");
  125. // BodyWriter must not be used twice.
  126. using (XmlWriter w = XmlWriter.Create (TextWriter.Null)) {
  127. b.CreateMessage ().WriteMessage (w);
  128. }
  129. using (XmlWriter w = XmlWriter.Create (TextWriter.Null)) {
  130. b.CreateMessage ().WriteMessage (w);
  131. }
  132. }
  133. [Test, ExpectedException (typeof (ObjectDisposedException))]
  134. public void TestCreateMessageFromClosedBuffer ()
  135. {
  136. Message m = Message.CreateMessage (MessageVersion.Default, String.Empty);
  137. MessageBuffer b = m.CreateBufferedCopy (0);
  138. b.Close ();
  139. b.CreateMessage ();
  140. }
  141. [Test, ExpectedException (typeof (InvalidOperationException))]
  142. public void CreateBufferedCopyConsumesMessage ()
  143. {
  144. Message msg = Message.CreateMessage (
  145. MessageVersion.Default, "foo", new MyBodyWriter ());
  146. MessageBuffer buf = msg.CreateBufferedCopy (1);
  147. // This WriteMessage() complains that the Message
  148. // is already consumed.
  149. using (XmlWriter w = XmlWriter.Create (TextWriter.Null)) {
  150. msg.WriteMessage (w);
  151. }
  152. }
  153. }
  154. internal class MyBodyWriter : BodyWriter
  155. {
  156. bool done;
  157. internal MyBodyWriter ()
  158. : base (false)
  159. {
  160. }
  161. protected override void OnWriteBodyContents (XmlDictionaryWriter writer)
  162. {
  163. if (done)
  164. Assert.Fail ("Allow two or more write.");
  165. done = true;
  166. }
  167. }
  168. }