Merge pull request #1245 from StephenMcConnel/bug-22483
[mono.git] / mcs / class / System.ServiceModel / Test / System.ServiceModel.Channels / MessageBufferTest.cs
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
11 namespace MonoTests.System.ServiceModel.Channels
12 {
13         [TestFixture]
14         public class MessageBufferTest
15         {
16                 [Test]
17                 public void TestCreateNavigator ()
18                 {
19                         Message m = Message.CreateMessage (MessageVersion.Default, "http://tempuri.org/");
20                         MessageBuffer mb = m.CreateBufferedCopy (1024);
21
22                         XPathNavigator nav = mb.CreateNavigator ();
23
24                         Assert.IsTrue (nav is SeekableXPathNavigator);
25                 }
26
27                 [Test]
28                 [ExpectedException (typeof (InvalidOperationException))]
29                 public void TestCreateBufferedCopyTwice ()
30                 {
31                         Message m = Message.CreateMessage (MessageVersion.Default, "action", 1);
32                         m.CreateBufferedCopy (64);
33                         m.CreateBufferedCopy (64);
34                 }
35
36                 [Test]
37                 public void TestCreateMessage ()
38                 {
39                         Message m = Message.CreateMessage (MessageVersion.Default, "action", 1);
40                         Message m2 = Message.CreateMessage (MessageVersion.Default, "action", 1);
41                         MessageBuffer mb = m.CreateBufferedCopy (64);
42
43                         Message n = mb.CreateMessage ();
44                         Assert.AreEqual (m2.ToString (), n.ToString (), "#2");
45                 }
46
47                 [Test, ExpectedException (typeof (ArgumentNullException))]
48                 public void TestWriteMessageNull ()
49                 {
50                         Message m = Message.CreateMessage (MessageVersion.Default, "action", 1);
51                         MessageBuffer mb = m.CreateBufferedCopy (64);
52
53                         mb.WriteMessage (null);
54                 }
55                 
56                 [Test]
57                 public void WriteMessageWithDictionaryWriter ()
58                 {
59                         Message m = Message.CreateMessage (MessageVersion.Default, "action", 1);
60
61                         StringBuilder sb = new StringBuilder ();
62                         XmlWriter w = XmlWriter.Create (sb);
63                         XmlDictionaryWriter dw = XmlDictionaryWriter.CreateDictionaryWriter (w);                        
64                         m.WriteMessage (dw);
65                         dw.Close ();
66                 }
67
68                 [Test]
69                 public void TestWriteMessage ()
70                 {
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 ());
74
75                         // Write out a message using a Binary XmlDictionaryWriter
76                         MemoryStream ms = new MemoryStream ();
77                         XmlDictionaryWriter w = XmlDictionaryWriter.CreateBinaryWriter (ms);
78                         m.WriteMessage (w);
79                         w.Close ();
80                         ms.Close ();
81                         byte [] expected = ms.GetBuffer ();
82                         StringBuilder sb = new StringBuilder ();
83                         sb.AppendLine ("expected: " + expected.Length);
84
85                         for (int i = 0; i < 24; i++) {
86                                 byte b = expected [i];
87                                 sb.Append (String.Format ("{0:X02} ", b));
88                         }
89                         string exp = sb.ToString ();
90
91                         // Write out an equivalent MessageBuffer
92                         MessageBuffer mb = n.CreateBufferedCopy (1024);
93                         sb = new StringBuilder ();
94                         ms = new MemoryStream ();
95                         mb.WriteMessage (ms);
96                         ms.Close ();
97                         byte [] actual = ms.GetBuffer ();
98                         sb.AppendLine ("actual: " + actual.Length);
99                         for (int i = 0; i < 24; i++) {
100                                 byte b = actual [i];
101                                 sb.Append (String.Format ("{0:X02} ", b));
102                         }
103                         string act = sb.ToString ();
104
105 //                      Console.WriteLine (exp + "\n" + act);
106
107                         // So the lengths of the buffer are the same....
108                         Assert.AreEqual (expected.Length, actual.Length);
109
110                         // TODO: 
111                         // There are three possible XmlDictionaryWriters:
112                         // Binary, Dictionary, Mtom
113                         // 
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.
117                         //
118                         // But the content differs, why? 
119
120                         // FIXME: we don't have AreNotEqual
121                         // Assert.AreNotEqual (expected, actual);
122                 }
123                 
124                 [Test]
125                 public void TestEmptyMessageBuffer ()
126                 {
127                         Message m = Message.CreateMessage (MessageVersion.Default, String.Empty);
128                         MessageBuffer b = m.CreateBufferedCopy (0);
129
130                         Assert.IsTrue (m.IsEmpty, "#1");
131                         Assert.AreEqual (0, b.BufferSize, "#2");
132                         Assert.AreEqual ("application/soap+msbin1", b.MessageContentType, "#3");
133                 }
134
135                 [Test]
136                 public void TestSimpleMessageBuffer ()
137                 {
138                         Message m = Message.CreateMessage (MessageVersion.Default, 
139                                                            String.Empty,
140                                                            new MyBodyWriter ());
141                         MessageBuffer b = m.CreateBufferedCopy (Int32.MaxValue);
142
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);
149                         }
150                         using (XmlWriter w = XmlWriter.Create (TextWriter.Null)) {
151                                 b.CreateMessage ().WriteMessage (w);
152                         }
153                 }
154
155                 [Test, ExpectedException (typeof (ObjectDisposedException))]
156                 public void TestCreateMessageFromClosedBuffer ()
157                 {
158                         Message m = Message.CreateMessage (MessageVersion.Default, String.Empty);
159                         MessageBuffer b = m.CreateBufferedCopy (0);
160
161                         b.Close ();
162                         b.CreateMessage ();
163                 }
164
165                 [Test, ExpectedException (typeof (InvalidOperationException))]
166                 public void CreateBufferedCopyConsumesMessage ()
167                 {
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);
175                         }
176                 }
177
178                 [Test]
179                 public void IsFaultCopied ()
180                 {
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");
188                 }
189         }
190
191         internal class MyBodyWriter : BodyWriter
192         {
193                 bool done;
194
195                 internal MyBodyWriter ()
196                         : base (false)
197                 {
198                 }
199
200                 protected override void OnWriteBodyContents (XmlDictionaryWriter writer)
201                 {
202                         if (done)
203                                 Assert.Fail ("Allow two or more write.");
204                         done = true;
205                 }
206         }
207 }