2 // MonoTests.Remoting.BaseCalls.cs
4 // Author: Lluis Sanchez Gual (lluis@ximian.com)
6 // 2003 (C) Copyright, Ximian, Inc.
13 using System
.Threading
;
14 using System
.Collections
;
15 using System
.Globalization
;
16 using System
.Runtime
.Remoting
;
17 using System
.Runtime
.Remoting
.Channels
;
18 using System
.Runtime
.Remoting
.Messaging
;
19 using System
.Runtime
.Remoting
.Lifetime
;
20 using System
.Runtime
.Remoting
.Channels
.Tcp
;
21 using System
.Runtime
.Remoting
.Activation
;
22 using System
.Runtime
.Remoting
.Contexts
;
23 using System
.Runtime
.InteropServices
;
24 using NUnit
.Framework
;
26 namespace MonoTests
.Remoting
28 public abstract class BaseCallTest
32 CallsDomainServer server
;
38 remoteDomId
= CreateServer ();
47 public static AppDomain
CreateDomain (string friendlyName
)
49 // return AppDomain.CreateDomain (friendlyName);
50 return AppDomain
.CreateDomain (friendlyName
, null, Directory
.GetCurrentDirectory (), ".", false);
53 protected virtual int CreateServer ()
55 ChannelManager cm
= CreateChannelManager ();
56 chs
= cm
.CreateClientChannel ();
57 ChannelServices
.RegisterChannel (chs
);
59 AppDomain domain
= BaseCallTest
.CreateDomain ("testdomain");
60 server
= (CallsDomainServer
) domain
.CreateInstanceAndUnwrap(GetType().Assembly
.FullName
,"MonoTests.Remoting.CallsDomainServer");
61 remoteUris
= server
.Start (cm
);
62 return server
.GetDomId ();
65 protected virtual void ShutdownServer ()
70 ChannelServices
.UnregisterChannel (chs
);
74 protected virtual RemoteObject
CreateRemoteInstance ()
76 return (RemoteObject
) Activator
.GetObject (typeof(RemoteObject
), remoteUris
[0]);
79 protected virtual AbstractRemoteObject
CreateRemoteAbstract ()
81 return (AbstractRemoteObject
) Activator
.GetObject (typeof(AbstractRemoteObject
), remoteUris
[1]);
84 protected virtual IRemoteObject
CreateRemoteInterface ()
86 return (IRemoteObject
) Activator
.GetObject (typeof(IRemoteObject
), remoteUris
[2]);
89 public InstanceSurrogate
InternalGetInstanceSurrogate ()
91 InstanceSurrogate s
= GetInstanceSurrogate ();
92 s
.RemoteObject
= CreateRemoteInstance ();
96 public AbstractSurrogate
InternalGetAbstractSurrogate ()
98 AbstractSurrogate s
= GetAbstractSurrogate ();
99 s
.RemoteObject
= CreateRemoteAbstract ();
103 public InterfaceSurrogate
InternalGetInterfaceSurrogate ()
105 InterfaceSurrogate s
= GetInterfaceSurrogate ();
106 s
.RemoteObject
= CreateRemoteInterface ();
110 public abstract InstanceSurrogate
GetInstanceSurrogate ();
111 public abstract AbstractSurrogate
GetAbstractSurrogate ();
112 public abstract InterfaceSurrogate
GetInterfaceSurrogate ();
114 public virtual ChannelManager
CreateChannelManager ()
124 public void TestInstanceSimple ()
126 RunTestSimple (InternalGetInstanceSurrogate());
130 public void TestAbstractSimple ()
132 RunTestSimple (InternalGetAbstractSurrogate());
136 public void TestInterfaceSimple ()
138 RunTestSimple (InternalGetInterfaceSurrogate());
142 public void TestInstancePrimitiveParams ()
144 RunTestPrimitiveParams (InternalGetInstanceSurrogate());
148 public void TestAbstractPrimitiveParams ()
150 RunTestPrimitiveParams (InternalGetAbstractSurrogate());
154 public void TestInterfacePrimitiveParams ()
156 RunTestPrimitiveParams (InternalGetInterfaceSurrogate());
160 public void TestInstancePrimitiveParamsInOut ()
162 RunTestPrimitiveParamsInOut (InternalGetInstanceSurrogate());
166 public void TestAbstractPrimitiveParamsInOut ()
168 RunTestPrimitiveParamsInOut (InternalGetAbstractSurrogate());
172 public void TestInterfacePrimitiveParamsInOut ()
174 RunTestPrimitiveParamsInOut (InternalGetInterfaceSurrogate());
178 public void TestInstanceComplexParams ()
180 RunTestComplexParams (InternalGetInstanceSurrogate());
184 public void TestAbstractComplexParams ()
186 RunTestComplexParams (InternalGetAbstractSurrogate());
190 public void TestInterfaceComplexParams ()
192 RunTestComplexParams (InternalGetInterfaceSurrogate());
196 [Category ("NotDotNet")]
197 public void TestInstanceComplexParamsInOut ()
199 RunTestComplexParamsInOut (InternalGetInstanceSurrogate());
203 [Category ("NotDotNet")]
204 public void TestAbstractComplexParamsInOut ()
206 RunTestComplexParamsInOut (InternalGetAbstractSurrogate());
210 [Category ("NotDotNet")]
211 public void TestInterfaceComplexParamsInOut ()
213 RunTestComplexParamsInOut (InternalGetInterfaceSurrogate());
217 public void TestInstanceProcessContextData ()
219 RunTestProcessContextData (InternalGetInstanceSurrogate());
223 public void TestAbstractProcessContextData ()
225 RunTestProcessContextData (InternalGetAbstractSurrogate());
229 public void TestInterfaceProcessContextData ()
231 RunTestProcessContextData (InternalGetInterfaceSurrogate());
238 public void RunTestSimple (IRemoteObject testerSurrogate
)
240 Assert
.AreEqual (130772 + remoteDomId
, testerSurrogate
.Simple (), "ReturnValue");
243 public void RunTestPrimitiveParams (IRemoteObject testerSurrogate
)
245 Assert
.AreEqual ("11-22-L-SG@"+remoteDomId
, testerSurrogate
.PrimitiveParams (11, 22, 'L', "SG"), "ReturnValue");
248 public void RunTestPrimitiveParamsInOut (IRemoteObject testerSurrogate
)
250 int a2
, a1
= 9876543;
251 float b2
, b1
= 82437.83f
;
253 string d2
, d1
= "asdASDzxcZXC";
255 string res
= testerSurrogate
.PrimitiveParamsInOut (ref a1
, out a2
, ref b1
, out b2
, 9821, ref c1
, out c2
, ref d1
, out d2
);
257 Assert
.AreEqual ("9876543-82437.83-s-asdASDzxcZXC@" + remoteDomId
, res
, "ReturnValue");
259 Assert
.AreEqual (12345678, a2
, "a2");
260 Assert
.AreEqual (53455.345f
, b2
, "b2");
261 Assert
.AreEqual ('g', c2
, "c2");
262 Assert
.AreEqual ("sfARREG$5345DGDfgY7656gDFG>><<dasdasd", d2
, "d2");
264 Assert
.AreEqual (65748392, a1
, "a1");
265 Assert
.AreEqual (98395.654f
, b1
, "b1");
266 Assert
.AreEqual ('l', c1
, "c1");
267 Assert
.AreEqual ("aasbasbdyhasbduybo234243", d1
, "d1");
270 public void RunTestComplexParams (IRemoteObject testerSurrogate
)
272 ArrayList list
= new ArrayList ();
273 list
.Add (new Complex (11,"first"));
274 Complex c
= new Complex (22,"second");
276 Complex r
= testerSurrogate
.ComplexParams (list
, c
, "third");
278 Assert
.IsNotNull (r
, "ReturnValue is null");
279 Assert
.IsNotNull (r
.Child
, "ReturnValue.Child is null");
280 Assert
.IsNotNull (r
.Child
.Child
, "ReturnValue.Child.Child is null");
282 Assert
.AreEqual (33, r
.Id
, "ReturnValue.Id");
283 Assert
.AreEqual ("third@"+remoteDomId
, r
.Name
, "ReturnValue.Name");
284 Assert
.AreEqual (22, r
.Child
.Id
, "ReturnValue.Child.Id");
285 Assert
.AreEqual ("second", r
.Child
.Name
, "ReturnValue.Child.Name");
286 Assert
.AreEqual (11, r
.Child
.Child
.Id
, "ReturnValue.Child.Child.Id");
287 Assert
.AreEqual ("first", r
.Child
.Child
.Name
, "ReturnValue.Child.Child.Name");
290 public void RunTestComplexParamsInOut (IRemoteObject testerSurrogate
)
292 ArrayList list
= new ArrayList ();
293 list
.Add (new Complex (11,"first"));
294 list
.Add (new Complex (22,"second"));
296 byte[] bytes
= new byte [100];
297 for (byte n
=0; n
<100; n
++) bytes
[n
] = n
;
298 StringBuilder sb
= new StringBuilder ("hello from client");
301 Complex r
= testerSurrogate
.ComplexParamsInOut (ref list
, out c
, bytes
, sb
, "third");
303 Assert
.IsNotNull (r
, "ReturnValue is null");
304 Assert
.IsNotNull (c
, "c is null");
305 Assert
.IsNotNull (list
, "list is null");
306 Assert
.IsTrue (list
.Count
== 3, "Invalid list count");
307 Assert
.IsNotNull (list
[0], "list[0] is null");
308 Assert
.IsNotNull (list
[1], "list[1] is null");
309 Assert
.IsNotNull (list
[2], "list[2] is null");
310 Assert
.IsNotNull (bytes
, "bytes is null");
311 Assert
.IsNotNull (sb
, "sb is null");
313 Assert
.AreEqual (33, r
.Id
, "ReturnValue.Id");
314 Assert
.AreEqual ("third@"+remoteDomId
, r
.Name
, "ReturnValue.Name");
315 Assert
.AreEqual (33, c
.Id
, "c.Id");
316 Assert
.AreEqual ("third@"+remoteDomId
, c
.Name
, "c.Name");
318 Assert
.AreEqual (33, ((Complex
)list
[2]).Id
, "list[2].Id");
319 Assert
.AreEqual ("third@"+remoteDomId
, ((Complex
)list
[2]).Name
, "list[2].Name");
320 Assert
.AreEqual (22, ((Complex
)list
[1]).Id
, "list[1].Id");
321 Assert
.AreEqual ("second", ((Complex
)list
[1]).Name
, "list[1].Name");
322 Assert
.AreEqual (11, ((Complex
)list
[0]).Id
, "list[0].Id");
323 Assert
.AreEqual ("first", ((Complex
)list
[0]).Name
, "list[0].Name");
325 Assert
.AreEqual ("hello from client", sb
.ToString (), "sb");
326 for (int n
=0; n
<100; n
++)
327 Assert
.AreEqual (n
+1, bytes
[n
], "bytes["+n
+"]");
330 public void RunTestProcessContextData (IRemoteObject testerSurrogate
)
332 CallContext
.FreeNamedDataSlot ("clientData");
333 CallContext
.FreeNamedDataSlot ("serverData");
334 CallContext
.FreeNamedDataSlot ("mustNotPass");
338 ContextData cdata
= new ContextData ();
339 cdata
.data
= "hi from client";
342 CallContext
.SetData ("clientData", cdata
);
343 CallContext
.SetData ("mustNotPass", "more data");
345 testerSurrogate
.ProcessContextData ();
347 cdata
= CallContext
.GetData ("clientData") as ContextData
;
348 Assert
.IsNotNull (cdata
, "clientData is null");
349 Assert
.AreEqual ("hi from client", cdata
.data
, "clientData.data");
350 Assert
.AreEqual (1123, cdata
.id
, "clientData.id");
352 cdata
= CallContext
.GetData ("serverData") as ContextData
;
353 Assert
.IsNotNull (cdata
, "serverData is null");
354 Assert
.AreEqual ("hi from server", cdata
.data
, "serverData.data");
355 Assert
.AreEqual (3211, cdata
.id
, "serverData.id");
357 string mdata
= CallContext
.GetData ("mustNotPass") as string;
358 Assert
.IsNotNull (mdata
, "mustNotPass is null");
359 Assert
.AreEqual ("more data", mdata
, "mustNotPass");
361 // Second step. Test that exceptions return the call context.
363 CallContext
.FreeNamedDataSlot ("clientData");
364 CallContext
.FreeNamedDataSlot ("serverData");
366 cdata
= new ContextData ();
367 cdata
.data
= "hi from client";
370 CallContext
.SetData ("clientData", cdata
);
373 testerSurrogate
.ProcessContextData ();
374 Assert
.IsTrue (false, "Exception not thrown");
375 } catch (Exception ex
) {
376 if (ex
.InnerException
!= null)
377 ex
= ex
.InnerException
;
378 if (ex
.Message
!= "exception from server")
382 cdata
= CallContext
.GetData ("clientData") as ContextData
;
383 Assert
.IsNotNull (cdata
, "clientData is null (2)");
384 Assert
.AreEqual ("hi from client", cdata
.data
, "clientData.data (2)");
385 Assert
.AreEqual (1123, cdata
.id
, "clientData.id (2)");
387 mdata
= CallContext
.GetData ("mustNotPass") as string;
388 Assert
.IsNotNull (mdata
, "mustNotPass is null");
389 Assert
.AreEqual ("more data", mdata
, "mustNotPass");
394 // The server running in the remote domain
397 class CallsDomainServer
: MarshalByRefObject
401 public string[] Start(ChannelManager cm
)
405 ch
= cm
.CreateServerChannel ();
406 ChannelServices
.RegisterChannel ((IChannel
)ch
);
407 RemotingConfiguration
.RegisterWellKnownServiceType (typeof (RemoteObject
), "test1", WellKnownObjectMode
.SingleCall
);
408 RemotingConfiguration
.RegisterWellKnownServiceType (typeof (RemoteObject
), "test2", WellKnownObjectMode
.SingleCall
);
409 RemotingConfiguration
.RegisterWellKnownServiceType (typeof (RemoteObject
), "test3", WellKnownObjectMode
.SingleCall
);
410 string[] uris
= new string[3];
411 uris
[0] = ch
.GetUrlsForUri ("test1")[0];
412 uris
[1] = ch
.GetUrlsForUri ("test2")[0];
413 uris
[2] = ch
.GetUrlsForUri ("test3")[0];
418 Console
.WriteLine (ex
.ToString());
426 ChannelServices
.UnregisterChannel (ch
);
429 public int GetDomId ()
431 return Thread
.GetDomainID();
436 public class ContextData
: ILogicalThreadAffinative
444 public abstract class ChannelManager
446 public abstract IChannelSender
CreateClientChannel ();
447 public abstract IChannelReceiver
CreateServerChannel ();
454 public interface IRemoteObject
457 string PrimitiveParams (int a
, uint b
, char c
, string d
);
458 string PrimitiveParamsInOut (ref int a1
, out int a2
, ref float b1
, out float b2
, int filler
, ref char c1
, out char c2
, ref string d1
, out string d2
);
459 Complex
ComplexParams (ArrayList a
, Complex b
, string c
);
460 Complex
ComplexParamsInOut (ref ArrayList a
, out Complex b
, [In
,Out
] byte[] bytes
, [In
,Out
] StringBuilder sb
, string c
);
461 void ProcessContextData ();
464 // Base classes for tester surrogates
466 public abstract class InstanceSurrogate
: IRemoteObject
468 public RemoteObject RemoteObject
;
469 public abstract int Simple ();
470 public abstract string PrimitiveParams (int a
, uint b
, char c
, string d
);
471 public abstract string PrimitiveParamsInOut (ref int a1
, out int a2
, ref float b1
, out float b2
, int filler
, ref char c1
, out char c2
, ref string d1
, out string d2
);
472 public abstract Complex
ComplexParams (ArrayList a
, Complex b
, string c
);
473 public abstract Complex
ComplexParamsInOut (ref ArrayList a
, out Complex b
, [In
,Out
] byte[] bytes
, [In
,Out
] StringBuilder sb
, string c
);
474 public abstract void ProcessContextData ();
477 public abstract class AbstractSurrogate
: IRemoteObject
479 public AbstractRemoteObject RemoteObject
;
480 public abstract int Simple ();
481 public abstract string PrimitiveParams (int a
, uint b
, char c
, string d
);
482 public abstract string PrimitiveParamsInOut (ref int a1
, out int a2
, ref float b1
, out float b2
, int filler
, ref char c1
, out char c2
, ref string d1
, out string d2
);
483 public abstract Complex
ComplexParams (ArrayList a
, Complex b
, string c
);
484 public abstract Complex
ComplexParamsInOut (ref ArrayList a
, out Complex b
, [In
,Out
] byte[] bytes
, [In
,Out
] StringBuilder sb
, string c
);
485 public abstract void ProcessContextData ();
488 public abstract class InterfaceSurrogate
: IRemoteObject
490 public IRemoteObject RemoteObject
;
491 public abstract int Simple ();
492 public abstract string PrimitiveParams (int a
, uint b
, char c
, string d
);
493 public abstract string PrimitiveParamsInOut (ref int a1
, out int a2
, ref float b1
, out float b2
, int filler
, ref char c1
, out char c2
, ref string d1
, out string d2
);
494 public abstract Complex
ComplexParams (ArrayList a
, Complex b
, string c
);
495 public abstract Complex
ComplexParamsInOut (ref ArrayList a
, out Complex b
, [In
,Out
] byte[] bytes
, [In
,Out
] StringBuilder sb
, string c
);
496 public abstract void ProcessContextData ();
501 // Test abstract base class
504 public abstract class AbstractRemoteObject
: MarshalByRefObject
506 public abstract int Simple ();
507 public abstract string PrimitiveParams (int a
, uint b
, char c
, string d
);
508 public abstract string PrimitiveParamsInOut (ref int a1
, out int a2
, ref float b1
, out float b2
, int filler
, ref char c1
, out char c2
, ref string d1
, out string d2
);
509 public abstract Complex
ComplexParams (ArrayList a
, Complex b
, string c
);
510 public abstract Complex
ComplexParamsInOut (ref ArrayList a
, out Complex b
, [In
,Out
] byte[] bytes
, [In
,Out
] StringBuilder sb
, string c
);
511 public abstract void ProcessContextData ();
518 public class RemoteObject
: AbstractRemoteObject
, IRemoteObject
522 public override int Simple ()
524 return 130772 + Thread
.GetDomainID();
527 public int ReturnOne ()
532 public int Increment ()
537 public override string PrimitiveParams (int a
, uint b
, char c
, string d
)
539 return "" + a
+ "-" + b
+ "-" + c
+ "-" + d
+ "@" + Thread
.GetDomainID();
542 // declare an overload for bug #77191
543 public void PrimitiveParams ()
547 public override string PrimitiveParamsInOut (ref int a1
, out int a2
, ref float b1
, out float b2
, int filler
, ref char c1
, out char c2
, ref string d1
, out string d2
)
549 string res
= "" + a1
+ "-" + b1
.ToString(CultureInfo
.InvariantCulture
) + "-" + c1
+ "-" + d1
+ "@" + Thread
.GetDomainID();
553 d2
= "sfARREG$5345DGDfgY7656gDFG>><<dasdasd";
557 d1
= "aasbasbdyhasbduybo234243";
561 public override Complex
ComplexParams (ArrayList a
, Complex b
, string c
)
563 Complex cp
= new Complex (33,c
+ "@" + Thread
.GetDomainID());
565 cp
.Child
.Child
= (Complex
)a
[0];
569 public override Complex
ComplexParamsInOut (ref ArrayList a
, out Complex b
, [In
,Out
] byte[] bytes
, [In
,Out
] StringBuilder sb
, string c
)
571 b
= new Complex (33,c
+ "@" + Thread
.GetDomainID());
573 for (byte n
=0; n
<100; n
++) bytes
[n
] = (byte)(bytes
[n
] + 1);
574 sb
.Append (" and from server");
578 public override void ProcessContextData ()
580 string mdata
= CallContext
.GetData ("mustNotPass") as string;
582 throw new Exception ("mustNotPass is not null");
584 ContextData cdata
= CallContext
.GetData ("clientData") as ContextData
;
586 throw new Exception ("server: clientData is null");
587 if (cdata
.data
!= "hi from client" || cdata
.id
!= 1123)
588 throw new Exception ("server: clientData is not valid");
590 if (cdata
.testStep
== 2)
591 throw new Exception ("exception from server");
593 if (cdata
.testStep
!= 1)
594 throw new Exception ("invalid test step");
596 cdata
= new ContextData ();
597 cdata
.data
= "hi from server";
599 CallContext
.SetData ("serverData", cdata
);
606 public Complex (int id
, string name
)
614 public Complex Child
;