Halve the stack depth for both the new single step tests
[mono.git] / mcs / class / corlib / Test / System.Threading / ExecutionContextCas.cs
1 //
2 // ExecutionContextCas.cs - CAS Unit Tests for ExecutionContext
3 //
4 // Author:
5 //      Sebastien Pouliot (sebastien@ximian.com)
6 //
7 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
16 // 
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 // 
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 //
28
29
30 using System;
31 using System.Security;
32 using System.Security.Permissions;
33 using System.Threading;
34
35 using NUnit.Framework;
36
37 namespace MonoCasTests.System.Threading {
38
39         [TestFixture]
40         [Category ("CAS")]
41         public class ExecutionContextCas {
42
43                 static bool success;
44
45                 static void Callback (object o)
46                 {
47                         new SecurityPermission (SecurityPermissionFlag.UnmanagedCode).Demand ();
48                         success = (bool)o;
49                 }
50
51                 [SetUp]
52                 public void SetUp ()
53                 {
54                         if (!SecurityManager.SecurityEnabled)
55                                 Assert.Ignore ("SecurityManager isn't enabled");
56
57                         success = false;
58                 }
59
60                 [TearDown]
61                 public void TearDown ()
62                 {
63                         if (ExecutionContext.IsFlowSuppressed ())
64                                 ExecutionContext.RestoreFlow ();
65                 }
66
67                 private void Thread_Run_Empty ()
68                 {
69                         Assert.IsFalse (success, "pre-check");
70                         ExecutionContext.Run (ExecutionContext.Capture (), new ContextCallback (Callback), true);
71                         Assert.IsTrue (success, "post-check");
72                 }
73
74                 [Test]
75                 public void Run_Empty ()
76                 {
77                         Thread t = new Thread (new ThreadStart (Thread_Run_Empty));
78                         t.Start ();
79                         t.Join ();
80                 }
81
82                 [SecurityPermission (SecurityAction.Deny, UnmanagedCode = true)]
83                 private ExecutionContext GetExecutionContextUnmanaged ()
84                 {
85                         return ExecutionContext.Capture ();
86                         // the Deny disappears with this stack frame but we got a capture of it
87                 }
88
89                 private void Thread_Run_UnmanagedCode ()
90                 {
91                         bool result = false;
92                         Assert.IsFalse (success, "pre-check");
93                         try {
94                                 ExecutionContext ec = GetExecutionContextUnmanaged ();
95                                 // run with the captured security stack (i.e. deny unmanaged)
96                                 ExecutionContext.Run (ec, new ContextCallback (Callback), true);
97                         }
98                         catch (SecurityException) {
99                                 result = true;
100                         }
101                         finally {
102                                 Assert.IsFalse (success, "post-check");
103                                 Assert.IsTrue (result, "Result");
104                         }
105                 }
106
107                 [Test]
108                 public void Run_UnmanagedCode ()
109                 {
110                         Thread t = new Thread (new ThreadStart (Thread_Run_UnmanagedCode));
111                         t.Start ();
112                         t.Join ();
113                 }
114
115                 private void Thread_Run_UnmanagedCode_SuppressFlow_BeforeCapture ()
116                 {
117                         bool result = false;
118                         Assert.IsFalse (success, "pre-check");
119                         AsyncFlowControl afc = ExecutionContext.SuppressFlow ();
120                         try {
121                                 ExecutionContext ec = GetExecutionContextUnmanaged ();
122                                 ExecutionContext.Run (ec, new ContextCallback (Callback), true);
123                         }
124                         catch (InvalidOperationException) {
125                                 result = true;
126                         }
127                         finally {
128                                 Assert.IsFalse (success, "post-check");
129                                 afc.Undo ();
130                                 Assert.IsTrue (result, "Result");
131                         }
132                 }
133
134                 [Test]
135                 public void Run_UnmanagedCode_SuppressFlow_BeforeCapture ()
136                 {
137                         Thread t = new Thread (new ThreadStart (Thread_Run_UnmanagedCode_SuppressFlow_BeforeCapture));
138                         t.Start ();
139                         t.Join ();
140                 }
141
142                 private void Thread_Run_UnmanagedCode_SuppressFlow_AfterCapture ()
143                 {
144                         bool result = false;
145                         Assert.IsFalse (success, "pre-check");
146                         ExecutionContext ec = GetExecutionContextUnmanaged ();
147                         AsyncFlowControl afc = ExecutionContext.SuppressFlow ();
148                         try {
149                                 ExecutionContext.Run (ec, new ContextCallback (Callback), true);
150                         }
151                         catch (SecurityException) {
152                                 result = true;
153                         }
154                         finally {
155                                 Assert.IsFalse (success, "post-check");
156                                 afc.Undo ();
157                                 Assert.IsTrue (result, "Result");
158                         }
159                 }
160
161                 [Test]
162                 public void Run_UnmanagedCode_SuppressFlow_AfterCapture ()
163                 {
164                         Thread t = new Thread (new ThreadStart (Thread_Run_UnmanagedCode_SuppressFlow_AfterCapture));
165                         t.Start ();
166                         t.Join ();
167                 }
168         }
169 }
170