Xamarin Public Jenkins (auto-signing) 94b2861243 Imported Upstream version 4.8.0.309
Former-commit-id: 5f9c6ae75f295e057a7d2971f3a6df4656fa8850
2016-11-10 13:04:39 +00:00

419 lines
12 KiB
C#

// project created on 09/05/2003 at 18:07
using System;
using System.Collections;
using System.Reflection;
using System.Threading;
using System.Globalization;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters;
using System.Runtime.Serialization.Formatters.Soap;
using System.Runtime.Remoting.Metadata.W3cXsd2001;
using System.IO;
using NUnit.Framework;
using System.Collections.Generic;
namespace MonoTests.System.Runtime.Serialization.Formatters.Soap {
internal class NonSerializableObject {
}
public delegate void TrucDlg(string s);
[Serializable]
public class MoreComplexObject {
public event TrucDlg TrucEvent;
private string _string;
private string[] _strings = new string[]{};
private Queue _queue = new Queue();
public Dictionary<object, object> _table = new Dictionary<object, object> ();
public string ObjString {
get { return _string; }
}
public MoreComplexObject() {
TrucEvent += new TrucDlg(WriteString);
_queue.Enqueue(1);
_queue.Enqueue(null);
_queue.Enqueue("foo");
_table["foo"]="barr";
_table[1]="foo";
_table['c'] = "barr";
_table["barr"] = 1234567890;
}
public void OnTrucEvent(string s) {
TrucEvent(s);
}
public void WriteString(string s) {
_string = s;
}
public override bool Equals(object obj) {
MoreComplexObject objReturn = obj as MoreComplexObject;
if(objReturn == null) return false;
if(objReturn._string != this._string) return false;
Assert.AreEqual (_table.Count, objReturn._table.Count, "#1");
foreach(var e in objReturn._table) {
Assert.AreEqual (e.Value, _table[e.Key], e.Key.ToString ());
}
return SoapFormatterTest.CheckArray(this._queue.ToArray(), objReturn._queue.ToArray());
}
}
[Serializable]
internal class MarshalObject: MarshalByRefObject {
private string _name;
private long _id;
public MarshalObject() {
}
public MarshalObject(string name, long id) {
_name = name;
_id = id;
}
}
[Serializable]
internal class SimpleObject {
private string _name;
private int _id;
public SimpleObject(string name, int id) {
_name = name;
_id = id;
}
public override bool Equals(object obj) {
SimpleObject objCmp = obj as SimpleObject;
if(objCmp == null) return false;
if(objCmp._name != this._name) return false;
if(objCmp._id != this._id) return false;
return true;
}
}
[Serializable]
internal class Version1 {
public int _value;
public Version1(int value) {
_value = value;
}
}
[Serializable]
internal class Version2: ISerializable {
public int _value;
public string _foo;
public Version2(int value, string foo) {
_value = value;
_foo = foo;
}
public void GetObjectData(SerializationInfo info, StreamingContext context) {
info.AddValue("_value", _value);
info.AddValue("_foo", _foo);
}
private Version2(SerializationInfo info, StreamingContext context) {
_value = info.GetInt32("_value");
try{
_foo = info.GetString("_foo");
}
catch(SerializationException) {
_foo = "Default value";
}
}
}
public class Version1ToVersion2Binder: SerializationBinder {
public override Type BindToType (string assemblyName, string typeName) {
Type returnType = null;
string typeVersion1 = "MonoTests.System.Runtime.Serialization.Formatters.Soap.Version1";
string assemName = Assembly.GetExecutingAssembly().FullName;
if(typeName == typeVersion1) {
typeName = "MonoTests.System.Runtime.Serialization.Formatters.Soap.Version2";
}
string typeFormat = String.Format("{0}, {1}", typeName, assemName);
returnType = Type.GetType( typeFormat);
return returnType;
}
}
[TestFixture]
public class SoapFormatterTest
{
private SoapFormatter _soapFormatter;
private SoapFormatter _soapFormatterDeserializer;
private RemotingSurrogateSelector _surrogate;
#if DEBUG
private void Out(MemoryStream stream, object objGraph) {
Console.WriteLine("\n---------------------\n{0}\n", objGraph.ToString());
stream.Position = 0;
StreamReader r = new StreamReader(stream);
Console.WriteLine(r.ReadToEnd());
}
#endif
private object Serialize(object objGraph) {
MemoryStream stream = new MemoryStream();
Assert.IsTrue(objGraph != null);
Assert.IsTrue(stream != null);
_soapFormatter.SurrogateSelector = _surrogate;
_soapFormatter.Serialize(stream, objGraph);
#if DEBUG
Out(stream, objGraph);
#endif
stream.Position = 0;
object objReturn = _soapFormatterDeserializer.Deserialize(stream);
Assert.IsTrue(objReturn != null);
Assert.AreEqual(objGraph.GetType(), objReturn.GetType(), "#Tests "+objGraph.GetType());
stream = new MemoryStream();
_soapFormatter.Serialize(stream, objReturn);
stream.Position = 0;
return objReturn;
}
[SetUp]
public void GetReady() {
StreamingContext context = new StreamingContext(StreamingContextStates.All);
_surrogate = new RemotingSurrogateSelector();
_soapFormatter = new SoapFormatter(_surrogate, context);
_soapFormatterDeserializer = new SoapFormatter(null, context);
}
[TearDown]
public void Clean() {
}
[Test]
public void TestValueTypes() {
object objReturn;
objReturn = Serialize((short)1);
Assert.AreEqual(objReturn, 1, "#int16");
objReturn = Serialize(1);
Assert.AreEqual(objReturn, 1, "#int32");
objReturn = Serialize((Single)0.1234);
Assert.AreEqual(objReturn, 0.123400003f, "#Single");
objReturn = Serialize((Double)1234567890.0987654321);
Assert.AreEqual(objReturn, 1234567890.0987654321, "#iDouble");
objReturn = Serialize(true);
Assert.AreEqual(objReturn, true, "#Bool");
objReturn = Serialize((Int64) 1234567890);
Assert.AreEqual(objReturn, 1234567890, "#Int64");
objReturn = Serialize('c');
Assert.AreEqual(objReturn, 'c', "#Char");
}
[Test]
public void TestObjects() {
object objReturn;
objReturn = Serialize("");
objReturn = Serialize("hello world!");
Assert.AreEqual("hello world!", objReturn, "#string");
SoapMessage soapMsg = new SoapMessage();
soapMsg.Headers = new Header[0];
soapMsg.MethodName = "Equals";
soapMsg.ParamNames = new String[0];
soapMsg.ParamTypes = new Type[0];
soapMsg.ParamValues = new object[0];
soapMsg.XmlNameSpace = SoapServices.CodeXmlNamespaceForClrTypeNamespace("String", "System");
_soapFormatterDeserializer.TopObject = new SoapMessage();
objReturn = Serialize(soapMsg);
_soapFormatterDeserializer.TopObject = null;
SimpleObject obj = new SimpleObject("simple object", 1);
objReturn = Serialize(obj);
Assert.AreEqual(obj, objReturn, "#SimpleObject");
objReturn = Serialize(typeof(SimpleObject));
Assert.AreEqual(typeof(SimpleObject), (Type)objReturn, "#Type");
objReturn = Serialize(obj.GetType().Assembly);
Assert.AreEqual(obj.GetType().Assembly, objReturn, "#Assembly");
}
public static bool CheckArray(object objTest, object objReturn) {
Array objTestAsArray = objTest as Array;
Array objReturnAsArray = objReturn as Array;
Assert.IsTrue(objReturnAsArray != null, "#Not an Array "+objTest);
Assert.AreEqual(objTestAsArray.Length, objReturnAsArray.Length, "#Different lengths "+objTest);
IEnumerator iEnum = objReturnAsArray.GetEnumerator();
iEnum.Reset();
object obj2;
foreach(object obj1 in objTestAsArray) {
iEnum.MoveNext();
obj2 = iEnum.Current;
Assert.AreEqual(obj1, obj2, "#The content of the 2 arrays is different");
}
return true;
}
[Test]
public void TestArray() {
object objReturn;
object objTest;
objReturn = Serialize(new int[]{});
objTest = new int[]{1, 2, 3, 4};
objReturn = Serialize(objTest);
CheckArray(objTest, objReturn);
objReturn = Serialize(new long[]{1, 2, 3, 4});
objTest = new object[]{1, null, ":-)", 1234567890};
objReturn = Serialize(objTest);
objTest = new int[,]{{0, 1}, {2, 3}, {123, 4}};
objReturn = Serialize(objTest);
CheckArray(objTest, objReturn);
objTest = new string[]{};
objReturn = Serialize(objTest);
CheckArray(objTest, objReturn);
object[,,] objArray = new object[3,2,1];
objArray[0,0,0] = 1;
objArray[2,1,0] = "end";
objReturn = Serialize(objArray);
CheckArray(objArray, objReturn);
}
[Test]
public void TestMarshalByRefObject() {
Serialize(new MarshalObject("thing", 1234567890));
}
[Test]
[ExpectedException(typeof(ArgumentNullException))]
public void TestNullObject() {
MemoryStream stream = new MemoryStream();
_soapFormatter.Serialize(stream, null);
}
[Test]
[ExpectedException(typeof(SerializationException))]
public void TestNonSerialisable() {
Serialize(new NonSerializableObject());
}
[Test]
public void TestMoreComplexObject() {
MoreComplexObject objReturn;
MoreComplexObject objTest = new MoreComplexObject();
objReturn = (MoreComplexObject) Serialize(objTest);
Assert.AreEqual(objTest, objReturn, "#Equals");
objReturn.OnTrucEvent("bidule");
Assert.AreEqual("bidule", objReturn.ObjString, "#dlg");
}
[Test]
public void TestSerializationbinder() {
Object objReturn;
MemoryStream stream = new MemoryStream();
Version1 objVer1 = new Version1(123);
_soapFormatter.SurrogateSelector = _surrogate;
_soapFormatter.Serialize(stream, objVer1);
stream.Position = 0;
_soapFormatterDeserializer.Binder = new Version1ToVersion2Binder();
objReturn = _soapFormatterDeserializer.Deserialize(stream);
Assert.AreEqual("Version2", objReturn.GetType().Name, "#Version1 Version2");
Assert.AreEqual(123, ((Version2) objReturn)._value, "#_value");
Assert.AreEqual("Default value", ((Version2) objReturn)._foo, "#_foo");
}
[Test]
public void TestMethodSignatureSerialization ()
{
Header h = new Header ("__MethodSignature", new Type [] { typeof(string),typeof(SignatureTest[]) }, false, "http://schemas.microsoft.com/clr/soap/messageProperties");
SoapMessage msg = new SoapMessage ();
msg.MethodName = "Run";
msg.ParamNames = new string [] { "nom" };
msg.ParamTypes = new Type [] { typeof(SignatureTest) };
msg.ParamValues = new object[] { new SignatureTest () };
msg.Headers = new Header[] { h};
MemoryStream ms = new MemoryStream ();
SoapFormatter sf = new SoapFormatter ();
sf.Serialize (ms, msg);
ms.Position = 0;
SoapMessage t = new SoapMessage ();
sf.TopObject = t;
t = (SoapMessage) sf.Deserialize (ms);
Assert.IsNotNull (t.Headers[0].Value, "#1");
Assert.AreEqual (t.Headers[0].Value.GetType (), typeof(Type[]), "#2");
Type[] ts = (Type[]) t.Headers[0].Value;
Assert.AreEqual (2, ts.Length, "#3");
Assert.IsNotNull (ts[0], "#4");
Assert.IsNotNull (ts[1], "#5");
Console.WriteLine ("PPP:" + ts[0].GetType());
Assert.AreEqual (typeof(string), ts[0], "#6");
Assert.AreEqual (typeof(SignatureTest[]), ts[1], "#7");
}
[Test]
public void TestCulture ()
{
var currentCulture = Thread.CurrentThread.CurrentCulture;
try {
Thread.CurrentThread.CurrentCulture = new CultureInfo ("de-DE");
var ms = new MemoryStream ();
var test = new CultureTest ();
_soapFormatter.Serialize(ms, test);
ms.Position = 0;
_soapFormatter.Deserialize(ms);
} finally {
Thread.CurrentThread.CurrentCulture = currentCulture;
}
}
[Serializable]
public class CultureTest
{
[OnDeserialized]
public void OnDeserialization (StreamingContext context)
{
var ci = Thread.CurrentThread.CurrentCulture;
Assert.AreEqual("German (Germany)", ci.EnglishName, "#1");
}
[OnSerialized]
public void OnSerialized (StreamingContext context)
{
var ci = Thread.CurrentThread.CurrentCulture;
Assert.AreEqual("German (Germany)", ci.EnglishName, "#2");
}
}
}
[Serializable]
public class SignatureTest
{
public SoapQName qn = new SoapQName ("e", "name", "espai");
}
}