1 // project created on 09/05/2003 at 18:07
\r
3 using System.Collections;
\r
4 using System.Reflection;
\r
5 using System.Threading;
\r
6 using System.Globalization;
\r
7 using System.Runtime.Remoting;
\r
8 using System.Runtime.Remoting.Messaging;
\r
9 using System.Runtime.Serialization;
\r
10 using System.Runtime.Serialization.Formatters;
\r
11 using System.Runtime.Serialization.Formatters.Soap;
\r
12 using System.Runtime.Remoting.Metadata.W3cXsd2001;
\r
14 using NUnit.Framework;
\r
16 namespace MonoTests.System.Runtime.Serialization.Formatters.Soap {
\r
18 internal class NonSerializableObject {
\r
22 public delegate void TrucDlg(string s);
\r
25 public class MoreComplexObject {
\r
26 public event TrucDlg TrucEvent;
\r
27 private string _string;
\r
28 private string[] _strings = new string[]{};
\r
29 private Queue _queue = new Queue();
\r
30 public Hashtable _table = new Hashtable();
\r
32 public string ObjString {
\r
33 get { return _string; }
\r
36 public MoreComplexObject() {
\r
37 TrucEvent += new TrucDlg(WriteString);
\r
39 _queue.Enqueue(null);
\r
40 _queue.Enqueue("foo");
\r
41 _table["foo"]="barr";
\r
43 _table['c'] = "barr";
\r
44 _table["barr"] = 1234567890;
\r
47 public void OnTrucEvent(string s) {
\r
51 public void WriteString(string s) {
\r
55 public override bool Equals(object obj) {
\r
56 MoreComplexObject objReturn = obj as MoreComplexObject;
\r
57 if(objReturn == null) return false;
\r
58 if(objReturn._string != this._string) return false;
\r
59 IEnumerator myEnum = this._table.GetEnumerator();
\r
60 foreach(DictionaryEntry e in objReturn._table) {
\r
62 DictionaryEntry s = (DictionaryEntry) myEnum.Current;
\r
63 Assertion.AssertEquals("#_table", s.Key, e.Key);
\r
64 Assertion.AssertEquals("#_table", s.Value, e.Value);
\r
65 if(s.Key.ToString() != e.Key.ToString() || s.Value.ToString() != e.Value.ToString()) return false;
\r
67 // Assertion.Assert("#_table is null", objReturn._table != null);
\r
68 // Console.WriteLine("_table[foo]: {0}", objReturn._table["foo"]);
\r
69 // Assertion.AssertEquals("#_table[\"foo\"]", "barr", objReturn._table["foo"]);
\r
70 // Console.WriteLine("_table[1]: {0}", objReturn._table[1]);
\r
71 // Assertion.AssertEquals("#_table[1]", "foo", objReturn._table[1]);
\r
72 // Console.WriteLine("_table['c']: {0}", objReturn._table['c']);
\r
73 // Assertion.AssertEquals("#_table['c']", "barr", objReturn._table['c']);
\r
74 // Console.WriteLine("_table[barr]: {0}", objReturn._table["barr"]);
\r
75 // Assertion.AssertEquals("#_table[\"barr\"]", 1234567890, objReturn._table["barr"]);
\r
76 return SoapFormatterTest.CheckArray(this._queue.ToArray(), objReturn._queue.ToArray());
\r
83 internal class MarshalObject: MarshalByRefObject {
\r
84 private string _name;
\r
87 public MarshalObject() {
\r
91 public MarshalObject(string name, long id) {
\r
98 internal class SimpleObject {
\r
99 private string _name;
\r
102 public SimpleObject(string name, int id) {
\r
107 public override bool Equals(object obj) {
\r
108 SimpleObject objCmp = obj as SimpleObject;
\r
109 if(objCmp == null) return false;
\r
110 if(objCmp._name != this._name) return false;
\r
111 if(objCmp._id != this._id) return false;
\r
117 internal class Version1 {
\r
120 public Version1(int value) {
\r
126 internal class Version2: ISerializable {
\r
128 public string _foo;
\r
130 public Version2(int value, string foo) {
\r
135 public void GetObjectData(SerializationInfo info, StreamingContext context) {
\r
136 info.AddValue("_value", _value);
\r
137 info.AddValue("_foo", _foo);
\r
140 private Version2(SerializationInfo info, StreamingContext context) {
\r
141 _value = info.GetInt32("_value");
\r
143 _foo = info.GetString("_foo");
\r
145 catch(SerializationException) {
\r
146 _foo = "Default value";
\r
151 public class Version1ToVersion2Binder: SerializationBinder {
\r
152 public override Type BindToType (string assemblyName, string typeName) {
\r
153 Type returnType = null;
\r
154 string typeVersion1 = "MonoTests.System.Runtime.Serialization.Formatters.Soap.Version1";
\r
155 string assemName = Assembly.GetExecutingAssembly().FullName;
\r
157 if(typeName == typeVersion1) {
\r
158 typeName = "MonoTests.System.Runtime.Serialization.Formatters.Soap.Version2";
\r
161 string typeFormat = String.Format("{0}, {1}", typeName, assemName);
\r
162 returnType = Type.GetType( typeFormat);
\r
169 public class SoapFormatterTest
\r
171 private SoapFormatter _soapFormatter;
\r
172 private SoapFormatter _soapFormatterDeserializer;
\r
173 private RemotingSurrogateSelector _surrogate;
\r
176 private void Out(MemoryStream stream, object objGraph) {
\r
177 Console.WriteLine("\n---------------------\n{0}\n", objGraph.ToString());
\r
178 stream.Position = 0;
\r
179 StreamReader r = new StreamReader(stream);
\r
180 Console.WriteLine(r.ReadToEnd());
\r
184 private object Serialize(object objGraph) {
\r
185 MemoryStream stream = new MemoryStream();
\r
186 Assertion.Assert(objGraph != null);
\r
187 Assertion.Assert(stream != null);
\r
188 _soapFormatter.SurrogateSelector = _surrogate;
\r
189 _soapFormatter.Serialize(stream, objGraph);
\r
192 Out(stream, objGraph);
\r
194 stream.Position = 0;
\r
196 object objReturn = _soapFormatterDeserializer.Deserialize(stream);
\r
197 Assertion.Assert(objReturn != null);
\r
198 Assertion.AssertEquals("#Tests "+objGraph.GetType(), objGraph.GetType(), objReturn.GetType());
\r
199 stream = new MemoryStream();
\r
200 _soapFormatter.Serialize(stream, objReturn);
\r
201 stream.Position = 0;
\r
207 public void GetReady() {
\r
208 StreamingContext context = new StreamingContext(StreamingContextStates.All);
\r
209 _surrogate = new RemotingSurrogateSelector();
\r
210 _soapFormatter = new SoapFormatter(_surrogate, context);
\r
211 _soapFormatterDeserializer = new SoapFormatter(null, context);
\r
215 public void Clean() {
\r
221 public void TestValueTypes() {
\r
223 objReturn = Serialize((short)1);
\r
224 Assertion.AssertEquals("#int16", objReturn, 1);
\r
225 objReturn = Serialize(1);
\r
226 Assertion.AssertEquals("#int32", objReturn, 1);
\r
227 objReturn = Serialize((Single)0.1234);
\r
228 Assertion.AssertEquals("#Single", objReturn, 0.123400003f);
\r
229 objReturn = Serialize((Double)1234567890.0987654321);
\r
230 Assertion.AssertEquals("#iDouble", objReturn, 1234567890.0987654321);
\r
231 objReturn = Serialize(true);
\r
232 Assertion.AssertEquals("#Bool", objReturn, true);
\r
233 objReturn = Serialize((Int64) 1234567890);
\r
234 Assertion.AssertEquals("#Int64", objReturn, 1234567890);
\r
235 objReturn = Serialize('c');
\r
236 Assertion.AssertEquals("#Char", objReturn, 'c');
\r
240 public void TestObjects() {
\r
242 objReturn = Serialize("");
\r
243 objReturn = Serialize("hello world!");
\r
244 Assertion.AssertEquals("#string", "hello world!", objReturn);
\r
245 SoapMessage soapMsg = new SoapMessage();
\r
246 soapMsg.Headers = new Header[0];
\r
247 soapMsg.MethodName = "Equals";
\r
248 soapMsg.ParamNames = new String[0];
\r
249 soapMsg.ParamTypes = new Type[0];
\r
250 soapMsg.ParamValues = new object[0];
\r
251 soapMsg.XmlNameSpace = SoapServices.CodeXmlNamespaceForClrTypeNamespace("String", "System");
\r
252 _soapFormatterDeserializer.TopObject = new SoapMessage();
\r
253 objReturn = Serialize(soapMsg);
\r
254 _soapFormatterDeserializer.TopObject = null;
\r
255 SimpleObject obj = new SimpleObject("simple object", 1);
\r
256 objReturn = Serialize(obj);
\r
257 Assertion.AssertEquals("#SimpleObject", obj, objReturn);
\r
258 objReturn = Serialize(typeof(SimpleObject));
\r
259 Assertion.AssertEquals("#Type", typeof(SimpleObject), (Type)objReturn);
\r
260 objReturn = Serialize(obj.GetType().Assembly);
\r
261 Assertion.AssertEquals("#Assembly", obj.GetType().Assembly, objReturn);
\r
264 public static bool CheckArray(object objTest, object objReturn) {
\r
265 Array objTestAsArray = objTest as Array;
\r
266 Array objReturnAsArray = objReturn as Array;
\r
268 Assertion.Assert("#Not an Array "+objTest, objReturnAsArray != null);
\r
269 Assertion.AssertEquals("#Different lengths "+objTest, objTestAsArray.Length, objReturnAsArray.Length);
\r
271 IEnumerator iEnum = objReturnAsArray.GetEnumerator();
\r
274 foreach(object obj1 in objTestAsArray) {
\r
276 obj2 = iEnum.Current;
\r
277 Assertion.AssertEquals("#The content of the 2 arrays is different", obj1, obj2);
\r
284 public void TestArray() {
\r
287 objReturn = Serialize(new int[]{});
\r
288 objTest = new int[]{1, 2, 3, 4};
\r
289 objReturn = Serialize(objTest);
\r
290 CheckArray(objTest, objReturn);
\r
291 objReturn = Serialize(new long[]{1, 2, 3, 4});
\r
292 objTest = new object[]{1, null, ":-)", 1234567890};
\r
293 objReturn = Serialize(objTest);
\r
294 objTest = new int[,]{{0, 1}, {2, 3}, {123, 4}};
\r
295 objReturn = Serialize(objTest);
\r
296 CheckArray(objTest, objReturn);
\r
297 objTest = new string[]{};
\r
298 objReturn = Serialize(objTest);
\r
299 CheckArray(objTest, objReturn);
\r
300 object[,,] objArray = new object[3,2,1];
\r
301 objArray[0,0,0] = 1;
\r
302 objArray[2,1,0] = "end";
\r
303 objReturn = Serialize(objArray);
\r
304 CheckArray(objArray, objReturn);
\r
308 public void TestMarshalByRefObject() {
\r
309 Serialize(new MarshalObject("thing", 1234567890));
\r
313 [ExpectedException(typeof(ArgumentNullException))]
\r
314 public void TestNullObject() {
\r
315 MemoryStream stream = new MemoryStream();
\r
316 _soapFormatter.Serialize(stream, null);
\r
320 [ExpectedException(typeof(SerializationException))]
\r
321 public void TestNonSerialisable() {
\r
322 Serialize(new NonSerializableObject());
\r
326 public void TestMoreComplexObject() {
\r
327 MoreComplexObject objReturn;
\r
328 MoreComplexObject objTest = new MoreComplexObject();
\r
329 objReturn = (MoreComplexObject) Serialize(objTest);
\r
330 Assertion.AssertEquals("#Equals", objTest, objReturn);
\r
331 objReturn.OnTrucEvent("bidule");
\r
332 Assertion.AssertEquals("#dlg", "bidule", objReturn.ObjString);
\r
336 public void TestSerializationbinder() {
\r
338 MemoryStream stream = new MemoryStream();
\r
339 Version1 objVer1 = new Version1(123);
\r
341 _soapFormatter.SurrogateSelector = _surrogate;
\r
342 _soapFormatter.Serialize(stream, objVer1);
\r
344 stream.Position = 0;
\r
345 _soapFormatterDeserializer.Binder = new Version1ToVersion2Binder();
\r
346 objReturn = _soapFormatterDeserializer.Deserialize(stream);
\r
348 Assertion.AssertEquals("#Version1 Version2", "Version2", objReturn.GetType().Name);
\r
349 Assertion.AssertEquals("#_value", 123, ((Version2) objReturn)._value);
\r
350 Assertion.AssertEquals("#_foo", "Default value", ((Version2) objReturn)._foo);
\r
354 public void TestMethodSignatureSerialization ()
\r
356 Header h = new Header ("__MethodSignature", new Type [] { typeof(string),typeof(SignatureTest[]) }, false, "http://schemas.microsoft.com/clr/soap/messageProperties");
\r
358 SoapMessage msg = new SoapMessage ();
\r
359 msg.MethodName = "Run";
\r
360 msg.ParamNames = new string [] { "nom" };
\r
361 msg.ParamTypes = new Type [] { typeof(SignatureTest) };
\r
362 msg.ParamValues = new object[] { new SignatureTest () };
\r
363 msg.Headers = new Header[] { h};
\r
365 MemoryStream ms = new MemoryStream ();
\r
366 SoapFormatter sf = new SoapFormatter ();
\r
367 sf.Serialize (ms, msg);
\r
371 SoapMessage t = new SoapMessage ();
\r
373 t = (SoapMessage) sf.Deserialize (ms);
\r
375 Assertion.AssertNotNull ("#1", t.Headers[0].Value);
\r
376 Assertion.AssertEquals ("#2", t.Headers[0].Value.GetType (), typeof(Type[]));
\r
378 Type[] ts = (Type[]) t.Headers[0].Value;
\r
380 Assertion.AssertEquals ("#3", 2, ts.Length);
\r
381 Assertion.AssertNotNull ("#4", ts[0]);
\r
382 Assertion.AssertNotNull ("#5", ts[1]);
\r
383 Console.WriteLine ("PPP:" + ts[0].GetType());
\r
384 Assertion.AssertEquals ("#6", typeof(string), ts[0]);
\r
385 Assertion.AssertEquals ("#7", typeof(SignatureTest[]), ts[1]);
\r
389 public void TestCulture ()
\r
391 var currentCulture = Thread.CurrentThread.CurrentCulture;
\r
393 Thread.CurrentThread.CurrentCulture = new CultureInfo ("de-DE");
\r
395 var ms = new MemoryStream ();
\r
396 var test = new CultureTest ();
\r
398 _soapFormatter.Serialize(ms, test);
\r
400 _soapFormatter.Deserialize(ms);
\r
402 Thread.CurrentThread.CurrentCulture = currentCulture;
\r
407 public class CultureTest
\r
410 public void OnDeserialization (StreamingContext context)
\r
412 var ci = Thread.CurrentThread.CurrentCulture;
\r
413 Assertion.AssertEquals("#1", "German (Germany)", ci.EnglishName);
\r
417 public void OnSerialized (StreamingContext context)
\r
419 var ci = Thread.CurrentThread.CurrentCulture;
\r
420 Assertion.AssertEquals("#2", "German (Germany)", ci.EnglishName);
\r
426 public class SignatureTest
\r
428 public SoapQName qn = new SoapQName ("e", "name", "espai");
\r