2 // CodeAccessPermissionCas.cs -
3 // CAS unit tests for System.Security.CodeAccessPermission
6 // Sebastien Pouliot <sebastien@ximian.com>
8 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 using NUnit.Framework;
33 using System.Collections;
34 using System.Reflection;
35 using System.Security;
36 using System.Security.Permissions;
38 namespace MonoCasTests.System.Security {
42 public class CodeAccessPermissionCas {
44 private const SecurityPermissionFlag Both = SecurityPermissionFlag.RemotingConfiguration | SecurityPermissionFlag.UnmanagedCode;
51 if (!SecurityManager.SecurityEnabled)
52 Assert.Ignore ("SecurityManager.SecurityEnabled is OFF");
56 [SecurityPermission (SecurityAction.Demand, Assertion = true)]
57 private void DemandAssertion ()
63 [SecurityPermission (SecurityAction.Deny, Assertion = true)]
64 [ExpectedException (typeof (SecurityException))]
65 public void Declarative_DenyAssertion_Assert ()
70 [SecurityPermission (SecurityAction.Demand, UnmanagedCode = true)]
71 private void DemandUnmanagedCode ()
76 [SecurityPermission (SecurityAction.Demand, RemotingConfiguration = true)]
77 private void DemandRemotingConfiguration ()
82 [SecurityPermission (SecurityAction.Demand, UnmanagedCode = true, RemotingConfiguration = true)]
83 private void DemandBoth ()
88 private void AssertSecurity (SecurityPermissionFlag flag)
90 bool unmanaged = ((flag & SecurityPermissionFlag.UnmanagedCode) != 0);
91 bool remoting = ((flag & SecurityPermissionFlag.RemotingConfiguration) != 0);
93 if (unmanaged && remoting)
96 DemandUnmanagedCode ();
98 DemandRemotingConfiguration ();
100 Assert.Fail ("Invalid demand");
103 [SecurityPermission (SecurityAction.Assert, UnmanagedCode = true)]
104 private void AssertUnmanagedCode (SecurityPermissionFlag flag)
106 AssertSecurity (flag);
109 [SecurityPermission (SecurityAction.Assert, RemotingConfiguration = true)]
110 private void AssertRemotingConfiguration (SecurityPermissionFlag flag)
112 AssertSecurity (flag);
115 [SecurityPermission (SecurityAction.Assert, UnmanagedCode = true, RemotingConfiguration = true)]
116 private void AssertBoth (SecurityPermissionFlag flag)
118 AssertSecurity (flag);
121 [SecurityPermission (SecurityAction.Assert, Unrestricted = true)]
122 private void AssertUnrestricted (SecurityPermissionFlag flag)
124 AssertSecurity (flag);
128 [SecurityPermission (SecurityAction.Deny, Unrestricted = true)]
129 public void Declarative_DenyUnrestricted_AssertUnmanaged_DemandUnmanaged ()
131 AssertUnmanagedCode (SecurityPermissionFlag.UnmanagedCode);
132 Assert.IsTrue (result);
136 [SecurityPermission (SecurityAction.Deny, Unrestricted = true)]
137 [ExpectedException (typeof (SecurityException))]
138 public void Declarative_DenyUnrestricted_AssertUnmanaged_DemandRemoting ()
140 AssertUnmanagedCode (SecurityPermissionFlag.RemotingConfiguration);
144 [SecurityPermission (SecurityAction.Deny, Unrestricted = true)]
145 [ExpectedException (typeof (SecurityException))]
146 public void Declarative_DenyUnrestricted_AssertUnmanaged_DemandBoth ()
148 AssertUnmanagedCode (Both);
152 [SecurityPermission (SecurityAction.Deny, Unrestricted = true)]
153 [ExpectedException (typeof (SecurityException))]
154 public void Declarative_DenyUnrestricted_AssertRemoting_DemandUnmanaged ()
156 AssertRemotingConfiguration (SecurityPermissionFlag.UnmanagedCode);
160 [SecurityPermission (SecurityAction.Deny, Unrestricted = true)]
161 public void Declarative_DenyUnrestricted_AssertRemoting_DemandRemoting ()
163 AssertRemotingConfiguration (SecurityPermissionFlag.RemotingConfiguration);
164 Assert.IsTrue (result);
168 [SecurityPermission (SecurityAction.Deny, Unrestricted = true)]
169 [ExpectedException (typeof (SecurityException))]
170 public void Declarative_DenyUnrestricted_AssertRemoting_DemandBoth ()
172 AssertRemotingConfiguration (Both);
176 [SecurityPermission (SecurityAction.Deny, Unrestricted = true)]
177 public void Declarative_DenyUnrestricted_AssertBoth_DemandUnmanaged ()
179 AssertBoth (SecurityPermissionFlag.UnmanagedCode);
180 Assert.IsTrue (result);
184 [SecurityPermission (SecurityAction.Deny, Unrestricted = true)]
185 public void Declarative_DenyUnrestricted_AssertBoth_DemandRemoting ()
187 AssertBoth (SecurityPermissionFlag.RemotingConfiguration);
188 Assert.IsTrue (result);
192 [SecurityPermission (SecurityAction.Deny, Unrestricted = true)]
193 public void Declarative_DenyUnrestricted_AssertBoth_DemandBoth ()
196 Assert.IsTrue (result);
200 [SecurityPermission (SecurityAction.Assert, UnmanagedCode = true)]
201 private void Assert_UnmanagedCode_RemotingConfiguration (SecurityPermissionFlag flag)
203 AssertRemotingConfiguration (flag);
206 [SecurityPermission (SecurityAction.Assert, RemotingConfiguration = true)]
207 private void Assert_RemotingConfiguration_UnmanagedCode (SecurityPermissionFlag flag)
209 AssertUnmanagedCode (flag);
213 [SecurityPermission (SecurityAction.Deny, Unrestricted = true)]
214 [ExpectedException (typeof (SecurityException))]
215 public void Declarative_DenyUnrestricted_AssertUnmanagedRemoting_DemandBoth ()
217 // no single stack frame can assert the whole SecurityPermission
218 // which is different from a PermissionSet
219 Assert_UnmanagedCode_RemotingConfiguration (Both);
223 [SecurityPermission (SecurityAction.Deny, Unrestricted = true)]
224 public void Declarative_DenyUnrestricted_AssertUnmanagedRemoting_DemandUnmanaged ()
226 Assert_UnmanagedCode_RemotingConfiguration (SecurityPermissionFlag.UnmanagedCode);
227 Assert.IsTrue (result);
231 [SecurityPermission (SecurityAction.Deny, Unrestricted = true)]
232 public void Declarative_DenyUnrestricted_AssertUnmanagedRemoting_DemandRemoting ()
234 Assert_UnmanagedCode_RemotingConfiguration (SecurityPermissionFlag.RemotingConfiguration);
235 Assert.IsTrue (result);
239 [SecurityPermission (SecurityAction.Deny, Unrestricted = true)]
240 [ExpectedException (typeof (SecurityException))]
241 public void Declarative_DenyUnrestricted_AssertRemotingUnmanaged_DemandBoth ()
243 // no single stack frame can assert the whole SecurityPermission
244 // which is different from a PermissionSet
245 Assert_RemotingConfiguration_UnmanagedCode (Both);
249 [SecurityPermission (SecurityAction.Deny, Unrestricted = true)]
250 public void Declarative_DenyUnrestricted_AssertRemotingUnmanaged_DemandUnmanaged ()
252 Assert_RemotingConfiguration_UnmanagedCode (SecurityPermissionFlag.UnmanagedCode);
253 Assert.IsTrue (result);
257 [SecurityPermission (SecurityAction.Deny, Unrestricted = true)]
258 public void Declarative_DenyUnrestricted_AssertRemotingUnmanaged_DemandRemoting ()
260 Assert_RemotingConfiguration_UnmanagedCode (SecurityPermissionFlag.RemotingConfiguration);
261 Assert.IsTrue (result);
265 [SecurityPermission (SecurityAction.Demand, UnmanagedCode = true)]
266 [ReflectionPermission (SecurityAction.Demand, ReflectionEmit = true)]
267 private void Demand_Reflection_Unmanaged ()
272 [SecurityPermission (SecurityAction.Assert, UnmanagedCode = true)]
273 private void Assert_Unmanaged (bool call)
276 Demand_Reflection_Unmanaged ();
278 Assert_Reflection (true);
281 [ReflectionPermission (SecurityAction.Assert, ReflectionEmit = true)]
282 private void Assert_Reflection (bool call)
285 Demand_Reflection_Unmanaged ();
287 Assert_Unmanaged (true);
291 [SecurityPermission (SecurityAction.Deny, Unrestricted = true)]
292 [ReflectionPermission (SecurityAction.Deny, Unrestricted = true)]
293 public void Declarative_DenyUnrestricted_AssertReflectionUnmanaged_DemandUnmanagedReflection ()
295 Assert_Reflection (false);
296 Assert.IsTrue (result);
300 [SecurityPermission (SecurityAction.Deny, Unrestricted = true)]
301 [ReflectionPermission (SecurityAction.Deny, Unrestricted = true)]
302 [ExpectedException (typeof (SecurityException))]
303 public void Declarative_DenyUnrestricted_AssertReflection_DemandUnmanagedReflection ()
305 Assert_Reflection (true);
309 [SecurityPermission (SecurityAction.Deny, Unrestricted = true)]
310 [ReflectionPermission (SecurityAction.Deny, Unrestricted = true)]
311 public void Declarative_DenyUnrestricted_AssertUnmanagedReflection_DemandUnmanagedReflection ()
313 Assert_Unmanaged (false);
314 Assert.IsTrue (result);
318 [SecurityPermission (SecurityAction.Deny, Unrestricted = true)]
319 [ReflectionPermission (SecurityAction.Deny, Unrestricted = true)]
320 [ExpectedException (typeof (SecurityException))]
321 public void Declarative_DenyUnrestricted_AssertUnmanaged_DemandUnmanagedReflection ()
323 Assert_Unmanaged (true);
327 [PermissionSet (SecurityAction.PermitOnly, Unrestricted = true)]
328 public void Declarative_PermitOnly_Unrestricted ()
330 // permitonly unrestricted is (technically) a no-op
332 Assert.IsTrue (result);