In corlib/System.Runtime.Remoting.Proxies:
[mono.git] / mcs / class / System.Runtime.Remoting / Test / BaseCalls.cs
1 //\r
2 // MonoTests.Remoting.BaseCalls.cs\r
3 //\r
4 // Author: Lluis Sanchez Gual (lluis@ximian.com)\r
5 //\r
6 // 2003 (C) Copyright, Ximian, Inc.\r
7 //\r
8 \r
9 using System;\r
10 using System.IO;\r
11 using System.Net;\r
12 using System.Text;\r
13 using System.Threading;\r
14 using System.Collections;\r
15 using System.Globalization;\r
16 using System.Runtime.Remoting;\r
17 using System.Runtime.Remoting.Channels;\r
18 using System.Runtime.Remoting.Messaging;\r
19 using System.Runtime.Remoting.Lifetime;\r
20 using System.Runtime.Remoting.Channels.Tcp;\r
21 using System.Runtime.Remoting.Activation;\r
22 using System.Runtime.Remoting.Contexts;\r
23 using System.Runtime.InteropServices;\r
24 using NUnit.Framework;\r
25 \r
26 namespace MonoTests.Remoting\r
27 {\r
28         public abstract class BaseCallTest\r
29         {\r
30                 IChannelSender chs;\r
31                 string[] remoteUris;\r
32                 CallsDomainServer server;\r
33                 int remoteDomId;\r
34 \r
35                 [TestFixtureSetUp]\r
36                 public void Run()\r
37                 {\r
38                         remoteDomId = CreateServer ();\r
39                 }\r
40 \r
41                 [TestFixtureTearDown]\r
42                 public void End ()\r
43                 {\r
44                         ShutdownServer ();\r
45                 }\r
46 \r
47                 public static AppDomain CreateDomain (string friendlyName)\r
48                 {\r
49                         // return AppDomain.CreateDomain (friendlyName);\r
50                         return AppDomain.CreateDomain (friendlyName, null, Directory.GetCurrentDirectory (), ".", false);\r
51                 }\r
52 \r
53                 protected virtual int CreateServer ()\r
54                 {\r
55                         ChannelManager cm = CreateChannelManager ();\r
56                         chs = cm.CreateClientChannel ();\r
57                         ChannelServices.RegisterChannel (chs);\r
58 \r
59                         AppDomain domain = BaseCallTest.CreateDomain ("testdomain");\r
60                         server = (CallsDomainServer) domain.CreateInstanceAndUnwrap(GetType().Assembly.FullName,"MonoTests.Remoting.CallsDomainServer");\r
61                         remoteUris = server.Start (cm);\r
62                         return server.GetDomId ();\r
63                 }\r
64                 \r
65                 protected virtual void ShutdownServer ()\r
66                 {\r
67                         if (server != null) {\r
68                                 server.Stop ();\r
69                                 if (chs != null)\r
70                                         ChannelServices.UnregisterChannel (chs);\r
71                         }\r
72                 }\r
73 \r
74                 protected virtual RemoteObject CreateRemoteInstance ()\r
75                 {\r
76                         return (RemoteObject) Activator.GetObject (typeof(RemoteObject), remoteUris[0]);\r
77                 }\r
78 \r
79                 protected virtual AbstractRemoteObject CreateRemoteAbstract ()\r
80                 {\r
81                         return (AbstractRemoteObject) Activator.GetObject (typeof(AbstractRemoteObject), remoteUris[1]);\r
82                 }\r
83 \r
84                 protected virtual IRemoteObject CreateRemoteInterface ()\r
85                 {\r
86                         return (IRemoteObject) Activator.GetObject (typeof(IRemoteObject), remoteUris[2]);\r
87                 }\r
88 \r
89                 public InstanceSurrogate InternalGetInstanceSurrogate ()\r
90                 {\r
91                         InstanceSurrogate s = GetInstanceSurrogate ();\r
92                         s.RemoteObject = CreateRemoteInstance ();\r
93                         return s;\r
94                 }\r
95                 \r
96                 public AbstractSurrogate InternalGetAbstractSurrogate ()\r
97                 {\r
98                         AbstractSurrogate s = GetAbstractSurrogate ();\r
99                         s.RemoteObject = CreateRemoteAbstract ();\r
100                         return s;\r
101                 }\r
102                 \r
103                 public InterfaceSurrogate InternalGetInterfaceSurrogate ()\r
104                 {\r
105                         InterfaceSurrogate s = GetInterfaceSurrogate ();\r
106                         s.RemoteObject = CreateRemoteInterface ();\r
107                         return s;\r
108                 }\r
109 \r
110                 public abstract InstanceSurrogate GetInstanceSurrogate ();\r
111                 public abstract AbstractSurrogate GetAbstractSurrogate ();\r
112                 public abstract InterfaceSurrogate GetInterfaceSurrogate ();\r
113                 \r
114                 public virtual ChannelManager CreateChannelManager ()\r
115                 {\r
116                         return null;\r
117                 }\r
118 \r
119                 //\r
120                 // The tests\r
121                 //\r
122 \r
123                 [Test]\r
124                 public void TestInstanceSimple ()\r
125                 {\r
126                         RunTestSimple (InternalGetInstanceSurrogate());\r
127                 }\r
128 \r
129                 [Test]\r
130                 public void TestAbstractSimple ()\r
131                 {\r
132                         RunTestSimple (InternalGetAbstractSurrogate());\r
133                 }\r
134 \r
135                 [Test]\r
136                 public void TestInterfaceSimple ()\r
137                 {\r
138                         RunTestSimple (InternalGetInterfaceSurrogate());\r
139                 }\r
140 \r
141                 [Test]\r
142                 public void TestInstancePrimitiveParams ()\r
143                 {\r
144                         RunTestPrimitiveParams (InternalGetInstanceSurrogate());\r
145                 }\r
146 \r
147                 [Test]\r
148                 public void TestAbstractPrimitiveParams ()\r
149                 {\r
150                         RunTestPrimitiveParams (InternalGetAbstractSurrogate());\r
151                 }\r
152 \r
153                 [Test]\r
154                 public void TestInterfacePrimitiveParams ()\r
155                 {\r
156                         RunTestPrimitiveParams (InternalGetInterfaceSurrogate());\r
157                 }\r
158 \r
159                 [Test]\r
160                 public void TestInstancePrimitiveParamsInOut ()\r
161                 {\r
162                         RunTestPrimitiveParamsInOut (InternalGetInstanceSurrogate());\r
163                 }\r
164 \r
165                 [Test]\r
166                 public void TestAbstractPrimitiveParamsInOut ()\r
167                 {\r
168                         RunTestPrimitiveParamsInOut (InternalGetAbstractSurrogate());\r
169                 }\r
170 \r
171                 [Test]\r
172                 public void TestInterfacePrimitiveParamsInOut ()\r
173                 {\r
174                         RunTestPrimitiveParamsInOut (InternalGetInterfaceSurrogate());\r
175                 }\r
176 \r
177                 [Test]\r
178                 public void TestInstanceComplexParams ()\r
179                 {\r
180                         RunTestComplexParams (InternalGetInstanceSurrogate());\r
181                 }\r
182 \r
183                 [Test]\r
184                 public void TestAbstractComplexParams ()\r
185                 {\r
186                         RunTestComplexParams (InternalGetAbstractSurrogate());\r
187                 }\r
188 \r
189                 [Test]\r
190                 public void TestInterfaceComplexParams ()\r
191                 {\r
192                         RunTestComplexParams (InternalGetInterfaceSurrogate());\r
193                 }\r
194 \r
195                 [Test]\r
196                 [Category ("NotDotNet")]\r
197                 public void TestInstanceComplexParamsInOut ()\r
198                 {\r
199                         RunTestComplexParamsInOut (InternalGetInstanceSurrogate());\r
200                 }\r
201 \r
202                 [Test]\r
203                 [Category ("NotDotNet")]\r
204                 public void TestAbstractComplexParamsInOut ()\r
205                 {\r
206                         RunTestComplexParamsInOut (InternalGetAbstractSurrogate());\r
207                 }\r
208 \r
209                 [Test]\r
210                 [Category ("NotDotNet")]\r
211                 public void TestInterfaceComplexParamsInOut ()\r
212                 {\r
213                         RunTestComplexParamsInOut (InternalGetInterfaceSurrogate());\r
214                 }\r
215 \r
216                 [Test]\r
217                 public void TestInstanceProcessContextData ()\r
218                 {\r
219                         RunTestProcessContextData (InternalGetInstanceSurrogate());\r
220                 }\r
221 \r
222                 [Test]\r
223                 public void TestAbstractProcessContextData ()\r
224                 {\r
225                         RunTestProcessContextData (InternalGetAbstractSurrogate());\r
226                 }\r
227 \r
228                 [Test]\r
229                 public void TestInterfaceProcessContextData ()\r
230                 {\r
231                         RunTestProcessContextData (InternalGetInterfaceSurrogate());\r
232                 }\r
233 \r
234                 //\r
235                 // The tests runners\r
236                 //\r
237 \r
238                 public void RunTestSimple (IRemoteObject testerSurrogate)\r
239                 {\r
240                         Assert.AreEqual (130772 + remoteDomId, testerSurrogate.Simple (), "ReturnValue");\r
241                 }\r
242 \r
243                 public void RunTestPrimitiveParams (IRemoteObject testerSurrogate)\r
244                 {\r
245                         Assert.AreEqual ("11-22-L-SG@"+remoteDomId, testerSurrogate.PrimitiveParams (11, 22, 'L', "SG"), "ReturnValue");\r
246                 }\r
247 \r
248                 public void RunTestPrimitiveParamsInOut (IRemoteObject testerSurrogate)\r
249                 {\r
250                         int a2, a1 = 9876543;\r
251                         float b2, b1 = 82437.83f;\r
252                         char c2, c1 = 's';\r
253                         string d2, d1 = "asdASDzxcZXC";\r
254 \r
255                         string res = testerSurrogate.PrimitiveParamsInOut (ref a1, out a2, ref b1, out b2, 9821, ref c1, out c2, ref d1, out d2);\r
256 \r
257                         Assert.AreEqual ("9876543-82437.83-s-asdASDzxcZXC@" + remoteDomId, res, "ReturnValue");\r
258 \r
259                         Assert.AreEqual (12345678, a2, "a2");\r
260                         Assert.AreEqual (53455.345f, b2, "b2");\r
261                         Assert.AreEqual ('g', c2, "c2");\r
262                         Assert.AreEqual ("sfARREG$5345DGDfgY7656gDFG>><<dasdasd", d2, "d2");\r
263 \r
264                         Assert.AreEqual (65748392, a1, "a1");\r
265                         Assert.AreEqual (98395.654f, b1, "b1");\r
266                         Assert.AreEqual ('l', c1, "c1");\r
267                         Assert.AreEqual ("aasbasbdyhasbduybo234243", d1, "d1");\r
268                 }\r
269 \r
270                 public void RunTestComplexParams (IRemoteObject testerSurrogate)\r
271                 {\r
272                         ArrayList list = new ArrayList ();\r
273                         list.Add (new Complex (11,"first"));\r
274                         Complex c = new Complex (22,"second");\r
275 \r
276                         Complex r = testerSurrogate.ComplexParams (list, c, "third");\r
277 \r
278                         Assert.IsNotNull (r, "ReturnValue is null");\r
279                         Assert.IsNotNull (r.Child, "ReturnValue.Child is null");\r
280                         Assert.IsNotNull (r.Child.Child, "ReturnValue.Child.Child is null");\r
281                         \r
282                         Assert.AreEqual (33, r.Id, "ReturnValue.Id");\r
283                         Assert.AreEqual ("third@"+remoteDomId, r.Name, "ReturnValue.Name");\r
284                         Assert.AreEqual (22, r.Child.Id, "ReturnValue.Child.Id");\r
285                         Assert.AreEqual ("second", r.Child.Name, "ReturnValue.Child.Name");\r
286                         Assert.AreEqual (11, r.Child.Child.Id, "ReturnValue.Child.Child.Id");\r
287                         Assert.AreEqual ("first", r.Child.Child.Name, "ReturnValue.Child.Child.Name");\r
288                 }\r
289 \r
290                 public void RunTestComplexParamsInOut (IRemoteObject testerSurrogate)\r
291                 {\r
292                         ArrayList list = new ArrayList ();\r
293                         list.Add (new Complex (11,"first"));\r
294                         list.Add (new Complex (22,"second"));\r
295                         \r
296                         byte[] bytes = new byte [100];\r
297                         for (byte n=0; n<100; n++) bytes[n] = n;\r
298                         StringBuilder sb = new StringBuilder ("hello from client");\r
299 \r
300                         Complex c;\r
301                         Complex r = testerSurrogate.ComplexParamsInOut (ref list, out c, bytes, sb, "third");\r
302 \r
303                         Assert.IsNotNull (r, "ReturnValue is null");\r
304                         Assert.IsNotNull (c, "c is null");\r
305                         Assert.IsNotNull (list, "list is null");\r
306                         Assert.IsTrue (list.Count == 3, "Invalid list count");\r
307                         Assert.IsNotNull (list[0], "list[0] is null");\r
308                         Assert.IsNotNull (list[1], "list[1] is null");\r
309                         Assert.IsNotNull (list[2], "list[2] is null");\r
310                         Assert.IsNotNull (bytes, "bytes is null");\r
311                         Assert.IsNotNull (sb, "sb is null");\r
312                         \r
313                         Assert.AreEqual (33, r.Id, "ReturnValue.Id");\r
314                         Assert.AreEqual ("third@"+remoteDomId, r.Name, "ReturnValue.Name");\r
315                         Assert.AreEqual (33, c.Id, "c.Id");\r
316                         Assert.AreEqual ("third@"+remoteDomId, c.Name, "c.Name");\r
317 \r
318                         Assert.AreEqual (33, ((Complex)list[2]).Id, "list[2].Id");\r
319                         Assert.AreEqual ("third@"+remoteDomId, ((Complex)list[2]).Name, "list[2].Name");\r
320                         Assert.AreEqual (22, ((Complex)list[1]).Id, "list[1].Id");\r
321                         Assert.AreEqual ("second", ((Complex)list[1]).Name, "list[1].Name");\r
322                         Assert.AreEqual (11, ((Complex)list[0]).Id, "list[0].Id");\r
323                         Assert.AreEqual ("first", ((Complex)list[0]).Name, "list[0].Name");\r
324                         \r
325                         Assert.AreEqual ("hello from client", sb.ToString (), "sb");\r
326                         for (int n=0; n<100; n++) \r
327                                 Assert.AreEqual (n+1, bytes[n], "bytes["+n+"]");\r
328                 }\r
329                 \r
330                 public void RunTestProcessContextData (IRemoteObject testerSurrogate)\r
331                 {\r
332                         CallContext.FreeNamedDataSlot ("clientData");\r
333                         CallContext.FreeNamedDataSlot ("serverData");\r
334                         CallContext.FreeNamedDataSlot ("mustNotPass");\r
335                         \r
336                         // First step\r
337 \r
338                         ContextData cdata = new ContextData ();\r
339                         cdata.data = "hi from client";\r
340                         cdata.id = 1123;\r
341                         cdata.testStep = 1;\r
342                         CallContext.SetData ("clientData", cdata);\r
343                         CallContext.SetData ("mustNotPass", "more data");\r
344                         \r
345                         testerSurrogate.ProcessContextData ();\r
346                         \r
347                         cdata = CallContext.GetData ("clientData") as ContextData;\r
348                         Assert.IsNotNull (cdata, "clientData is null");\r
349                         Assert.AreEqual ("hi from client", cdata.data, "clientData.data");\r
350                         Assert.AreEqual (1123, cdata.id, "clientData.id");\r
351                         \r
352                         cdata = CallContext.GetData ("serverData") as ContextData;\r
353                         Assert.IsNotNull (cdata, "serverData is null");\r
354                         Assert.AreEqual ("hi from server", cdata.data, "serverData.data");\r
355                         Assert.AreEqual (3211, cdata.id, "serverData.id");\r
356                         \r
357                         string mdata = CallContext.GetData ("mustNotPass") as string;\r
358                         Assert.IsNotNull (mdata, "mustNotPass is null");\r
359                         Assert.AreEqual ("more data", mdata, "mustNotPass");\r
360                         \r
361                         // Second step. Test that exceptions return the call context.\r
362                         \r
363                         CallContext.FreeNamedDataSlot ("clientData");\r
364                         CallContext.FreeNamedDataSlot ("serverData");\r
365                         \r
366                         cdata = new ContextData ();\r
367                         cdata.data = "hi from client";\r
368                         cdata.id = 1123;\r
369                         cdata.testStep = 2;\r
370                         CallContext.SetData ("clientData", cdata);\r
371                         \r
372                         try {\r
373                                 testerSurrogate.ProcessContextData ();\r
374                                 Assert.IsTrue (false, "Exception not thrown");\r
375                         } catch (Exception ex) {\r
376                                 if (ex.InnerException != null)\r
377                                         ex = ex.InnerException;\r
378                                 if (ex.Message != "exception from server")\r
379                                         throw;\r
380                         }\r
381                         \r
382                         cdata = CallContext.GetData ("clientData") as ContextData;\r
383                         Assert.IsNotNull (cdata, "clientData is null (2)");\r
384                         Assert.AreEqual ("hi from client", cdata.data, "clientData.data (2)");\r
385                         Assert.AreEqual (1123, cdata.id, "clientData.id (2)");\r
386                         \r
387                         mdata = CallContext.GetData ("mustNotPass") as string;\r
388                         Assert.IsNotNull (mdata, "mustNotPass is null");\r
389                         Assert.AreEqual ("more data", mdata, "mustNotPass");\r
390                 }\r
391         }\r
392 \r
393         //\r
394         // The server running in the remote domain\r
395         //\r
396 \r
397         class CallsDomainServer: MarshalByRefObject\r
398         {\r
399                 IChannelReceiver ch;\r
400 \r
401                 public string[] Start(ChannelManager cm)\r
402                 {\r
403                         try\r
404                         {\r
405                                 ch = cm.CreateServerChannel ();\r
406                                 ChannelServices.RegisterChannel ((IChannel)ch);\r
407                                 RemotingConfiguration.RegisterWellKnownServiceType (typeof (RemoteObject), "test1", WellKnownObjectMode.SingleCall);\r
408                                 RemotingConfiguration.RegisterWellKnownServiceType (typeof (RemoteObject), "test2", WellKnownObjectMode.SingleCall);\r
409                                 RemotingConfiguration.RegisterWellKnownServiceType (typeof (RemoteObject), "test3", WellKnownObjectMode.SingleCall);\r
410                                 string[] uris = new string[3];\r
411                                 uris[0] = ch.GetUrlsForUri ("test1")[0];\r
412                                 uris[1] = ch.GetUrlsForUri ("test2")[0];\r
413                                 uris[2] = ch.GetUrlsForUri ("test3")[0];\r
414                                 return uris;\r
415                         }\r
416                         catch (Exception ex)\r
417                         {\r
418                                 Console.WriteLine (ex.ToString());\r
419                                 throw;\r
420                         }\r
421                 }\r
422 \r
423                 public void Stop ()\r
424                 {\r
425                         if (ch != null)\r
426                                 ChannelServices.UnregisterChannel (ch);\r
427                 }\r
428 \r
429                 public int GetDomId ()\r
430                 {\r
431                         return Thread.GetDomainID();\r
432                 }\r
433         }\r
434         \r
435         [Serializable]\r
436         public class ContextData : ILogicalThreadAffinative\r
437         {\r
438                 public string data;\r
439                 public int id;\r
440                 public int testStep;\r
441         }\r
442 \r
443         [Serializable]\r
444         public abstract class ChannelManager\r
445         {\r
446                 public abstract IChannelSender CreateClientChannel ();\r
447                 public abstract IChannelReceiver CreateServerChannel ();\r
448         }\r
449 \r
450 \r
451         //\r
452         // Test interface\r
453         //\r
454         public interface IRemoteObject\r
455         {\r
456                 int Simple ();\r
457                 string PrimitiveParams (int a, uint b, char c, string d);\r
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);\r
459                 Complex ComplexParams (ArrayList a, Complex b, string c);\r
460                 Complex ComplexParamsInOut (ref ArrayList a, out Complex b, [In,Out] byte[] bytes, [In,Out] StringBuilder sb, string c);\r
461                 void ProcessContextData ();\r
462         }\r
463 \r
464         // Base classes for tester surrogates\r
465         \r
466         public abstract class InstanceSurrogate : IRemoteObject\r
467         {\r
468                 public RemoteObject RemoteObject;\r
469                 public abstract int Simple ();\r
470                 public abstract string PrimitiveParams (int a, uint b, char c, string d);\r
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);\r
472                 public abstract Complex ComplexParams (ArrayList a, Complex b, string c);\r
473                 public abstract Complex ComplexParamsInOut (ref ArrayList a, out Complex b, [In,Out] byte[] bytes, [In,Out] StringBuilder sb, string c);\r
474                 public abstract void ProcessContextData ();\r
475         }\r
476         \r
477         public abstract class AbstractSurrogate : IRemoteObject\r
478         {\r
479                 public AbstractRemoteObject RemoteObject;\r
480                 public abstract int Simple ();\r
481                 public abstract string PrimitiveParams (int a, uint b, char c, string d);\r
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);\r
483                 public abstract Complex ComplexParams (ArrayList a, Complex b, string c);\r
484                 public abstract Complex ComplexParamsInOut (ref ArrayList a, out Complex b, [In,Out] byte[] bytes, [In,Out] StringBuilder sb, string c);\r
485                 public abstract void ProcessContextData ();\r
486         }\r
487 \r
488         public abstract class InterfaceSurrogate : IRemoteObject\r
489         {\r
490                 public IRemoteObject RemoteObject;\r
491                 public abstract int Simple ();\r
492                 public abstract string PrimitiveParams (int a, uint b, char c, string d);\r
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);\r
494                 public abstract Complex ComplexParams (ArrayList a, Complex b, string c);\r
495                 public abstract Complex ComplexParamsInOut (ref ArrayList a, out Complex b, [In,Out] byte[] bytes, [In,Out] StringBuilder sb, string c);\r
496                 public abstract void ProcessContextData ();\r
497         }\r
498 \r
499         \r
500         //\r
501         // Test abstract base class\r
502         //\r
503 \r
504         public abstract class AbstractRemoteObject : MarshalByRefObject\r
505         {\r
506                 public abstract int Simple ();\r
507                 public abstract string PrimitiveParams (int a, uint b, char c, string d);\r
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);\r
509                 public abstract Complex ComplexParams (ArrayList a, Complex b, string c);\r
510                 public abstract Complex ComplexParamsInOut (ref ArrayList a, out Complex b, [In,Out] byte[] bytes, [In,Out] StringBuilder sb, string c);\r
511                 public abstract void ProcessContextData ();\r
512         }\r
513 \r
514         //\r
515         // Test class\r
516         //\r
517         \r
518         public class RemoteObject : AbstractRemoteObject, IRemoteObject\r
519         {\r
520                 int inc = 0;\r
521                 \r
522                 public override int Simple ()\r
523                 {\r
524                         return 130772 + Thread.GetDomainID();\r
525                 }\r
526                 \r
527                 public int ReturnOne ()\r
528                 {\r
529                         return 1;\r
530                 }\r
531                 \r
532                 public int Increment ()\r
533                 {\r
534                         return inc++;\r
535                 }\r
536                 \r
537                 public override string PrimitiveParams (int a, uint b, char c, string d)\r
538                 {\r
539                         return "" + a + "-" + b + "-" + c + "-" + d + "@" + Thread.GetDomainID();\r
540                 }\r
541 \r
542                 // declare an overload for bug #77191\r
543                 public void PrimitiveParams ()\r
544                 {\r
545                 }\r
546 \r
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)\r
548                 {\r
549                         string res = "" + a1 + "-" + b1.ToString(CultureInfo.InvariantCulture) + "-" + c1 + "-" + d1 + "@" + Thread.GetDomainID();\r
550                         a2 = 12345678;\r
551                         b2 = 53455.345f;\r
552                         c2 = 'g';\r
553                         d2 = "sfARREG$5345DGDfgY7656gDFG>><<dasdasd";\r
554                         a1 = 65748392;\r
555                         b1 = 98395.654f;\r
556                         c1 = 'l';\r
557                         d1 = "aasbasbdyhasbduybo234243";\r
558                         return res;\r
559                 }\r
560 \r
561                 public override Complex ComplexParams (ArrayList a, Complex b, string c)\r
562                 {\r
563                         Complex cp = new Complex (33,c+ "@" + Thread.GetDomainID());\r
564                         cp.Child = b;\r
565                         cp.Child.Child = (Complex)a[0];\r
566                         return cp;\r
567                 }\r
568 \r
569                 public override Complex ComplexParamsInOut (ref ArrayList a, out Complex b, [In,Out] byte[] bytes, [In,Out] StringBuilder sb, string c)\r
570                 {\r
571                         b = new Complex (33,c+ "@" + Thread.GetDomainID());\r
572                         a.Add (b);\r
573                         for (byte n=0; n<100; n++) bytes[n] = (byte)(bytes[n] + 1);\r
574                         sb.Append (" and from server");\r
575                         return b;\r
576                 }\r
577 \r
578                 public override void ProcessContextData ()\r
579                 {\r
580                         string mdata = CallContext.GetData ("mustNotPass") as string;\r
581                         if (mdata != null)\r
582                                 throw new Exception ("mustNotPass is not null");\r
583                         \r
584                         ContextData cdata = CallContext.GetData ("clientData") as ContextData;\r
585                         if (cdata == null) \r
586                                 throw new Exception ("server: clientData is null");\r
587                         if (cdata.data != "hi from client" || cdata.id != 1123)\r
588                                 throw new Exception ("server: clientData is not valid");\r
589                         \r
590                         if (cdata.testStep == 2)\r
591                                 throw new Exception ("exception from server");\r
592 \r
593                         if (cdata.testStep != 1)\r
594                                 throw new Exception ("invalid test step");\r
595                                 \r
596                         cdata = new ContextData ();\r
597                         cdata.data = "hi from server";\r
598                         cdata.id = 3211;\r
599                         CallContext.SetData ("serverData", cdata);\r
600                 }\r
601         }\r
602 \r
603         [Serializable]\r
604         public class Complex\r
605         {\r
606                 public Complex (int id, string name)\r
607                 {\r
608                         Id = id;\r
609                         Name = name;\r
610                 }\r
611 \r
612                 public string Name;\r
613                 public int Id;\r
614                 public Complex Child;\r
615         }\r
616 }\r