New tests.
[mono.git] / mcs / class / System.ServiceModel / Test / System.ServiceModel.Channels / MessageHeaderTest.cs
1 using System;
2 using System.Collections.Generic;
3 using System.IO;
4 using System.Runtime.Serialization;
5 using System.ServiceModel;
6 using System.ServiceModel.Channels;
7 using System.Text;
8 using System.Xml;
9 using NUnit.Framework;
10
11 namespace MonoTests.System.ServiceModel.Channels
12 {
13         [TestFixture]
14         public class MessageHeaderTest
15         {
16                 [Test]
17                 public void TestDefaultValues ()
18                 {
19                         MessageHeader h = MessageHeader.CreateHeader ("foo", "bar", 1);
20                         Assert.AreEqual (String.Empty, h.Actor);
21                         Assert.IsFalse (h.MustUnderstand);
22                         Assert.IsFalse (h.Relay);
23                 }
24
25                 [Test]
26                 public void TestIsMessageVersionSupported ()
27                 {
28                         MessageHeader h;
29
30                         // by default, both versions are supported.
31                         h = MessageHeader.CreateHeader ("foo", "bar", 1);
32                         Assert.IsTrue (h.IsMessageVersionSupported (MessageVersion.Soap11WSAddressing10), "#1");
33                         Assert.IsTrue (h.IsMessageVersionSupported (MessageVersion.Soap12WSAddressing10), "#2");
34
35                         // SOAP 1.1 is not supported if Actor == Soap12.NextDestinationActorValue
36                         h = MessageHeader.CreateHeader ("foo", "bar", 1, false, MessageVersion.Soap12WSAddressing10.Envelope.NextDestinationActorValue);
37                         Assert.IsFalse (h.IsMessageVersionSupported (MessageVersion.Soap11WSAddressing10), "#3");
38                         Assert.IsTrue (h.IsMessageVersionSupported (MessageVersion.Soap12WSAddressing10), "#4");
39
40                         // SOAP 1.1 is not supported if Actor == Soap12's UltimateDestinationActor
41                         h = MessageHeader.CreateHeader ("foo", "bar", 1, false, MessageVersion.Soap12WSAddressing10.Envelope.GetUltimateDestinationActorValues () [1]);
42                         Assert.IsFalse (h.IsMessageVersionSupported (MessageVersion.Soap11WSAddressing10), "#5");
43                         Assert.IsTrue (h.IsMessageVersionSupported (MessageVersion.Soap12WSAddressing10), "#6");
44
45                         // SOAP 1.2 is not supported if Actor == Soap11.NextDestinationActorValue
46                         h = MessageHeader.CreateHeader ("foo", "bar", 1, false, MessageVersion.Soap11WSAddressing10.Envelope.NextDestinationActorValue);
47                         Assert.IsTrue (h.IsMessageVersionSupported (MessageVersion.Soap11WSAddressing10), "#7");
48                         Assert.IsFalse (h.IsMessageVersionSupported (MessageVersion.Soap12WSAddressing10), "#8");
49                 }
50
51                 [Test]
52                 public void TestToString ()
53                 {
54                         MessageHeader h = MessageHeader.CreateHeader ("foo", "bar", 1);
55                         StringBuilder sb = new StringBuilder ();
56                         XmlWriterSettings settings = new XmlWriterSettings ();
57                         settings.OmitXmlDeclaration = true;
58                         settings.Indent = true;
59
60                         XmlWriter w = XmlWriter.Create (sb, settings);
61
62                         h.WriteHeader (w, MessageVersion.Soap12WSAddressing10);
63                         w.Close ();
64                         
65                         // ToString is the same as WriteHeader (minus the XML declaration)
66                         Assert.AreEqual (sb.ToString (), h.ToString ());
67                 }
68
69                 [Test]
70                 public void TestWriteStartHeader ()
71                 {
72                         int value = 1;
73
74                         MessageHeader h = MessageHeader.CreateHeader ("foo", "bar", value);                        
75
76                         StringBuilder sb = new StringBuilder ();                                            
77                         XmlDictionaryWriter w = XmlDictionaryWriter.CreateDictionaryWriter (
78                                 XmlWriter.Create (sb));                     
79                         h.WriteStartHeader (w, MessageVersion.Soap12WSAddressing10);
80                         w.Close ();
81                         string actual = sb.ToString ();
82                         
83                         sb = new StringBuilder ();
84                         XmlWriter w2 = XmlWriter.Create (sb);
85                         w2.WriteStartElement (h.Name, h.Namespace);
86                         w2.Close ();
87                         string expected = sb.ToString ();
88
89                         // WriteStartHeader == WriteStartElement (msg.Name, msg.Namespace)
90                         Assert.AreEqual (expected, actual);
91                 }
92
93                 [Test]
94                 public void TestWriteHeaderContent ()
95                 {
96                         TestWriteHeaderContent (1, "<dummy-root>1</dummy-root>");
97                 }
98
99                 [Test]
100                 [Category ("NotWorking")] // too cosmetic, it just does not output xmlns:i. (insignificant)
101                 public void TestWriteHeaderContent2 ()
102                 {
103                         TestWriteHeaderContent (new UniqueId (new byte [] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5}), "<dummy-root xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" />");
104                 }
105
106                 void TestWriteHeaderContent (object value, string expected)
107                 {
108                         MessageHeader h = MessageHeader.CreateHeader ("foo", "bar", value);
109                         XmlObjectSerializer f = new DataContractSerializer (value.GetType ());
110
111                         StringBuilder sb = new StringBuilder ();
112                         XmlWriterSettings settings = new XmlWriterSettings ();
113                         settings.ConformanceLevel = ConformanceLevel.Auto;                        
114                         XmlDictionaryWriter w = XmlDictionaryWriter.CreateDictionaryWriter (
115                                 XmlWriter.Create (sb, settings));
116
117                         w.WriteStartElement ("dummy-root");
118                         h.WriteHeaderContents (w, MessageVersion.Soap12WSAddressing10);
119                         w.WriteEndElement ();
120                         w.Flush ();
121                         string actual2 = sb.ToString ();
122
123                         sb.Length = 0;
124                         w.WriteStartElement ("dummy-root");
125                         f.WriteObjectContent (w, value);
126                         w.WriteEndElement ();
127                         w.Flush ();
128                         string actual1 = sb.ToString ();
129
130                         // the output of WriteHeaderContent is the same as XmlSerializer.Serialize
131                         Assert.AreEqual (expected, actual1, "#1");
132                         Assert.AreEqual (expected, actual2, "#2");
133                 }
134
135                 [Test]
136                 public void TestWriteHeaderAttributes ()
137                 {
138                         MessageHeader h = MessageHeader.CreateHeader ("foo", "bar", 1, 
139                                 true, "some actor", true);
140                         StringBuilder sb = new StringBuilder ();                
141                         XmlDictionaryWriter w = XmlDictionaryWriter.CreateDictionaryWriter (XmlWriter.Create (sb));
142                        
143                         h.WriteStartHeader (w, MessageVersion.Soap12WSAddressing10);
144                         w.WriteEndElement ();
145                         w.Close ();
146                 }
147
148                 [Test]
149                 public void TestGenericConstructor ()
150                 {
151                         MessageHeader<int> h = new MessageHeader<int> ();
152
153                         Assert.AreEqual (null, h.Actor);
154                         Assert.AreEqual (default (int), h.Content);
155                         Assert.IsFalse (h.MustUnderstand);
156                         Assert.IsFalse (h.Relay);
157                 }
158
159                 [Test]
160                 public void CreateEndpointAddressTypeHeader ()
161                 {
162                         MessageHeader.CreateHeader (
163                                 "ReplyTo",
164                                 "http://www.w3.org/2005/08/addressing",
165                                 new EndpointAddress ("http://localhost:8080"));
166                         MessageHeader.CreateHeader (
167                                 "ReplyTo",
168                                 "http://www.w3.org/2005/08/addressing",
169                                 new EndpointAddress ("http://localhost:8080"),
170                                 new DataContractSerializer (typeof (EndpointAddress)));
171                 }
172         }
173 }