Merge branch 'master' of git://github.com/mono/mono
[mono.git] / mcs / class / System.Runtime.Remoting / Test / CallSeq.cs
1 //\r
2 // MonoTests.Remoting.CallSeq.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.Threading;\r
11 using System.Collections;\r
12 using NUnit.Framework;\r
13 \r
14 namespace MonoTests.Remoting\r
15 {\r
16         public class CallSeq\r
17         {\r
18                 static ArrayList calls = new ArrayList();\r
19                 static int checkPos = 0;\r
20                 static int writePos = 0;\r
21                 static string name = "";\r
22                 static ArrayList contexts = new ArrayList ();\r
23                 static int domId = 1;\r
24 \r
25                 public static void Add (string msg)\r
26                 {\r
27                         writePos++;\r
28 \r
29                         msg = writePos.ToString ("000") + " (d" + CommonDomainId + ",c" + CommonContextId + ") " + msg;\r
30                         calls.Add (msg);\r
31                 }\r
32 \r
33                 public static int CommonContextId\r
34                 {\r
35                         get\r
36                         {\r
37                                 int id = Thread.CurrentContext.ContextID;\r
38                                 int idc = contexts.IndexOf (id);\r
39                                 if (idc == -1)\r
40                                 {\r
41                                         idc = contexts.Count;\r
42                                         contexts.Add (id);\r
43                                 }\r
44                                 return idc;\r
45                         }\r
46                 }\r
47 \r
48                 public static int CommonDomainId\r
49                 {\r
50                         get { return domId; }\r
51                         set { domId = value; }\r
52                 }\r
53 \r
54                 public static void Init (string str)\r
55                 {\r
56                         calls = new ArrayList();\r
57                         contexts = new ArrayList ();\r
58                         name = str;\r
59                         checkPos = 0;\r
60                         writePos = 0;\r
61                 }\r
62 \r
63                 public static void Check (string msg, int domain)\r
64                 {\r
65                         bool optional = false;\r
66                         if (msg.StartsWith ("#"))\r
67                         {\r
68                                 optional = true;\r
69                                 msg = msg.Substring (1);\r
70                         }\r
71 \r
72                         if (msg[6].ToString() != domain.ToString()) return;\r
73 \r
74                         if (checkPos >= calls.Count)\r
75                         {\r
76                                 if (!optional) Assert.Fail ("[" + name + "] Call check failed. Expected call not made: \"" + msg + "\"");\r
77                                 else return;\r
78                         }\r
79 \r
80                         string call = (string) calls[checkPos++];\r
81 \r
82                         if (msg.Substring (3) != call.Substring (3))\r
83                         {\r
84                                 if (optional) checkPos--;\r
85                                 else Assert.Fail ("[" + name + "] Call check failed in step " + (checkPos+1) + ". Expected \"" + msg + "\" found \"" + call + "\"");\r
86                         }\r
87                 }\r
88 \r
89                 public static void Check (string[] msgs, int domain)\r
90                 {\r
91                         foreach (string msg in msgs)\r
92                                 Check (msg, domain);\r
93                 }\r
94 \r
95                 public static ArrayList Seq\r
96                 {\r
97                         get { return calls; }\r
98                         set { calls = value; }\r
99                 }\r
100         }\r
101 }\r