3 using System.ServiceModel;
4 using System.ServiceModel.Channels;
5 using System.ServiceModel.Dispatcher;
8 using System.Xml.XPath;
11 namespace MonoTests.System.ServiceModel.Channels
14 public class MessageBufferTest
17 public void TestCreateNavigator ()
19 Message m = Message.CreateMessage (MessageVersion.Default, "http://tempuri.org/");
20 MessageBuffer mb = m.CreateBufferedCopy (1024);
22 XPathNavigator nav = mb.CreateNavigator ();
24 Assert.IsTrue (nav is SeekableXPathNavigator);
28 [ExpectedException (typeof (InvalidOperationException))]
29 public void TestCreateBufferedCopyTwice ()
31 Message m = Message.CreateMessage (MessageVersion.Default, "action", 1);
32 m.CreateBufferedCopy (64);
33 m.CreateBufferedCopy (64);
37 public void TestCreateMessage ()
39 Message m = Message.CreateMessage (MessageVersion.Default, "action", 1);
40 Message m2 = Message.CreateMessage (MessageVersion.Default, "action", 1);
41 MessageBuffer mb = m.CreateBufferedCopy (64);
43 Message n = mb.CreateMessage ();
44 Assert.AreEqual (m2.ToString (), n.ToString (), "#2");
47 [Test, ExpectedException (typeof (ArgumentNullException))]
48 public void TestWriteMessageNull ()
50 Message m = Message.CreateMessage (MessageVersion.Default, "action", 1);
51 MessageBuffer mb = m.CreateBufferedCopy (64);
53 mb.WriteMessage (null);
57 public void WriteMessageWithDictionaryWriter ()
59 Message m = Message.CreateMessage (MessageVersion.Default, "action", 1);
61 StringBuilder sb = new StringBuilder ();
62 XmlWriter w = XmlWriter.Create (sb);
63 XmlDictionaryWriter dw = XmlDictionaryWriter.CreateDictionaryWriter (w);
69 public void TestWriteMessage ()
71 Message m = Message.CreateMessage (MessageVersion.Default, "action", 1);
72 Message n = Message.CreateMessage (MessageVersion.Default, "action", 1);
73 Assert.AreEqual (m.ToString (), n.ToString ());
75 // Write out a message using a Binary XmlDictionaryWriter
76 MemoryStream ms = new MemoryStream ();
77 XmlDictionaryWriter w = XmlDictionaryWriter.CreateBinaryWriter (ms);
81 byte [] expected = ms.GetBuffer ();
82 StringBuilder sb = new StringBuilder ();
83 sb.AppendLine ("expected: " + expected.Length);
85 for (int i = 0; i < 24; i++) {
86 byte b = expected [i];
87 sb.Append (String.Format ("{0:X02} ", b));
89 string exp = sb.ToString ();
91 // Write out an equivalent MessageBuffer
92 MessageBuffer mb = n.CreateBufferedCopy (1024);
93 sb = new StringBuilder ();
94 ms = new MemoryStream ();
97 byte [] actual = ms.GetBuffer ();
98 sb.AppendLine ("actual: " + actual.Length);
99 for (int i = 0; i < 24; i++) {
101 sb.Append (String.Format ("{0:X02} ", b));
103 string act = sb.ToString ();
105 // Console.WriteLine (exp + "\n" + act);
107 // So the lengths of the buffer are the same....
108 Assert.AreEqual (expected.Length, actual.Length);
111 // There are three possible XmlDictionaryWriters:
112 // Binary, Dictionary, Mtom
114 // It doesn't have a MIME type header, so it's definitely not Mtom.
115 // Dictionary outputs text, so it's not that either.
116 // It's got to be the Binary one.
118 // But the content differs, why?
120 // FIXME: we don't have AreNotEqual
121 // Assert.AreNotEqual (expected, actual);
125 public void TestEmptyMessageBuffer ()
127 Message m = Message.CreateMessage (MessageVersion.Default, String.Empty);
128 MessageBuffer b = m.CreateBufferedCopy (0);
130 Assert.IsTrue (m.IsEmpty, "#1");
131 Assert.AreEqual (0, b.BufferSize, "#2");
132 Assert.AreEqual ("application/soap+msbin1", b.MessageContentType, "#3");
136 public void TestSimpleMessageBuffer ()
138 Message m = Message.CreateMessage (MessageVersion.Default,
140 new MyBodyWriter ());
141 MessageBuffer b = m.CreateBufferedCopy (Int32.MaxValue);
143 Assert.IsFalse (m.IsEmpty, "#1");
144 Assert.AreEqual (0, b.BufferSize, "#2");
145 Assert.AreEqual ("application/soap+msbin1", b.MessageContentType, "#3");
146 // BodyWriter must not be used twice.
147 using (XmlWriter w = XmlWriter.Create (TextWriter.Null)) {
148 b.CreateMessage ().WriteMessage (w);
150 using (XmlWriter w = XmlWriter.Create (TextWriter.Null)) {
151 b.CreateMessage ().WriteMessage (w);
155 [Test, ExpectedException (typeof (ObjectDisposedException))]
156 public void TestCreateMessageFromClosedBuffer ()
158 Message m = Message.CreateMessage (MessageVersion.Default, String.Empty);
159 MessageBuffer b = m.CreateBufferedCopy (0);
165 [Test, ExpectedException (typeof (InvalidOperationException))]
166 public void CreateBufferedCopyConsumesMessage ()
168 Message msg = Message.CreateMessage (
169 MessageVersion.Default, "foo", new MyBodyWriter ());
170 MessageBuffer buf = msg.CreateBufferedCopy (1);
171 // This WriteMessage() complains that the Message
172 // is already consumed.
173 using (XmlWriter w = XmlWriter.Create (TextWriter.Null)) {
174 msg.WriteMessage (w);
179 public void IsFaultCopied ()
181 var ret = Message.CreateMessage (MessageVersion.Soap12,
182 MessageFault.CreateFault (new FaultCode ("mycode"), "private affair"),
183 "http://tempuri.org/IFoo/Test");
184 Assert.IsTrue (ret.IsFault, "#1");
185 var mb = ret.CreateBufferedCopy (0x1000);
186 ret = mb.CreateMessage ();
187 Assert.IsTrue (ret.IsFault, "#2");
191 internal class MyBodyWriter : BodyWriter
195 internal MyBodyWriter ()
200 protected override void OnWriteBodyContents (XmlDictionaryWriter writer)
203 Assert.Fail ("Allow two or more write.");