2 // SecurityPermissionTest.cs - NUnit Test Cases for SecurityPermission
5 // Sebastien Pouliot <sebastien@ximian.com>
7 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
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:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
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.
29 using NUnit.Framework;
31 using System.Security;
32 using System.Security.Permissions;
34 using System.Diagnostics;
36 namespace MonoTests.System.Security.Permissions {
39 public class SecurityPermissionTest {
41 static SecurityPermissionFlag [] AllFlags = {
42 SecurityPermissionFlag.AllFlags,
43 SecurityPermissionFlag.Assertion,
45 SecurityPermissionFlag.BindingRedirects,
47 SecurityPermissionFlag.ControlAppDomain,
48 SecurityPermissionFlag.ControlDomainPolicy,
49 SecurityPermissionFlag.ControlEvidence,
50 SecurityPermissionFlag.ControlPolicy,
51 SecurityPermissionFlag.ControlPrincipal,
52 SecurityPermissionFlag.ControlThread,
53 SecurityPermissionFlag.Execution,
54 SecurityPermissionFlag.Infrastructure,
55 SecurityPermissionFlag.NoFlags,
56 SecurityPermissionFlag.RemotingConfiguration,
57 SecurityPermissionFlag.SerializationFormatter,
58 SecurityPermissionFlag.SkipVerification,
59 SecurityPermissionFlag.UnmanagedCode };
61 static SecurityPermissionFlag [] AllFlagsExceptNoFlags = {
62 SecurityPermissionFlag.AllFlags,
63 SecurityPermissionFlag.Assertion,
65 SecurityPermissionFlag.BindingRedirects,
67 SecurityPermissionFlag.ControlAppDomain,
68 SecurityPermissionFlag.ControlDomainPolicy,
69 SecurityPermissionFlag.ControlEvidence,
70 SecurityPermissionFlag.ControlPolicy,
71 SecurityPermissionFlag.ControlPrincipal,
72 SecurityPermissionFlag.ControlThread,
73 SecurityPermissionFlag.Execution,
74 SecurityPermissionFlag.Infrastructure,
75 SecurityPermissionFlag.RemotingConfiguration,
76 SecurityPermissionFlag.SerializationFormatter,
77 SecurityPermissionFlag.SkipVerification,
78 SecurityPermissionFlag.UnmanagedCode };
80 static SecurityPermissionFlag [] AllFlagsExceptAllFlags = {
81 SecurityPermissionFlag.Assertion,
83 SecurityPermissionFlag.BindingRedirects,
85 SecurityPermissionFlag.ControlAppDomain,
86 SecurityPermissionFlag.ControlDomainPolicy,
87 SecurityPermissionFlag.ControlEvidence,
88 SecurityPermissionFlag.ControlPolicy,
89 SecurityPermissionFlag.ControlPrincipal,
90 SecurityPermissionFlag.ControlThread,
91 SecurityPermissionFlag.Execution,
92 SecurityPermissionFlag.Infrastructure,
93 SecurityPermissionFlag.NoFlags,
94 SecurityPermissionFlag.RemotingConfiguration,
95 SecurityPermissionFlag.SerializationFormatter,
96 SecurityPermissionFlag.SkipVerification,
97 SecurityPermissionFlag.UnmanagedCode };
100 public void PermissionState_None ()
102 PermissionState ps = PermissionState.None;
103 SecurityPermission sp = new SecurityPermission (ps);
104 Assert.AreEqual (SecurityPermissionFlag.NoFlags, sp.Flags, "Flags");
105 Assert.IsFalse (sp.IsUnrestricted (), "IsUnrestricted");
107 SecurityElement se = sp.ToXml ();
108 // only class and version are present
109 Assert.AreEqual ("NoFlags", se.Attribute ("Flags"), "Xml-Flags");
110 Assert.IsNull (se.Children, "Xml-Children");
112 SecurityPermission copy = (SecurityPermission)sp.Copy ();
113 Assert.IsFalse (Object.ReferenceEquals (sp, copy), "ReferenceEquals");
114 Assert.AreEqual (sp.Flags, copy.Flags, "Flags");
115 Assert.AreEqual (sp.IsUnrestricted (), copy.IsUnrestricted (), "IsUnrestricted ()");
119 public void PermissionState_Unrestricted ()
121 PermissionState ps = PermissionState.Unrestricted;
122 SecurityPermission sp = new SecurityPermission (ps);
123 Assert.AreEqual (SecurityPermissionFlag.AllFlags, sp.Flags, "Flags");
124 Assert.IsTrue (sp.IsUnrestricted (), "IsUnrestricted");
126 SecurityElement se = sp.ToXml ();
127 // only class and version are present
128 Assert.AreEqual ("true", se.Attribute ("Unrestricted"), "Xml-Unrestricted");
129 Assert.IsNull (se.Children, "Xml-Children");
131 SecurityPermission copy = (SecurityPermission)sp.Copy ();
132 Assert.IsFalse (Object.ReferenceEquals (sp, copy), "ReferenceEquals");
133 Assert.AreEqual (sp.Flags, copy.Flags, "Flags");
134 Assert.AreEqual (sp.IsUnrestricted (), copy.IsUnrestricted (), "IsUnrestricted ()");
138 [ExpectedException (typeof (ArgumentException))]
139 public void PermissionState_Bad ()
141 PermissionState ps = (PermissionState)77;
142 SecurityPermission sp = new SecurityPermission (ps);
146 [ExpectedException (typeof (ArgumentException))]
147 public void SecurityPermissionFlags_Bad ()
149 SecurityPermissionFlag spf = (SecurityPermissionFlag)(SecurityPermissionFlag.AllFlags + 1);
150 SecurityPermission sp = new SecurityPermission (spf);
154 [ExpectedException (typeof (ArgumentException))]
155 public void Flags_SecurityPermissionFlags_Bad ()
157 SecurityPermissionFlag spf = (SecurityPermissionFlag)(SecurityPermissionFlag.AllFlags + 1);
158 SecurityPermission sp = new SecurityPermission (PermissionState.None);
165 SecurityPermission sp = new SecurityPermission (PermissionState.None);
166 foreach (SecurityPermissionFlag spf in AllFlags) {
168 SecurityPermission copy = (SecurityPermission) sp.Copy ();
169 Assert.AreEqual (spf, copy.Flags, spf.ToString ());
174 public void Intersect_Null ()
176 SecurityPermission sp = new SecurityPermission (PermissionState.None);
177 // No intersection with null
178 foreach (SecurityPermissionFlag spf in AllFlags) {
180 Assert.IsNull (sp.Intersect (null), spf.ToString ());
185 public void Intersect_None ()
187 SecurityPermission sp1 = new SecurityPermission (PermissionState.None);
188 SecurityPermission sp2 = new SecurityPermission (PermissionState.None);
189 foreach (SecurityPermissionFlag spf in AllFlagsExceptNoFlags) {
191 // 1. Intersect None with spf
192 SecurityPermission result = (SecurityPermission)sp1.Intersect (sp2);
193 Assert.IsNull (result, "None N " + spf.ToString ());
194 // 2. Intersect spf with None
195 result = (SecurityPermission)sp2.Intersect (sp1);
196 Assert.IsNull (result, "None N " + spf.ToString ());
201 public void Intersect_Self ()
203 SecurityPermission sp = new SecurityPermission (PermissionState.None);
204 foreach (SecurityPermissionFlag spf in AllFlagsExceptNoFlags) {
206 SecurityPermission result = (SecurityPermission)sp.Intersect (sp);
207 Assert.AreEqual (spf, result.Flags, spf.ToString ());
212 public void Intersect_Unrestricted ()
214 // Intersection with unrestricted == Copy
215 // a. source (this) is unrestricted
216 SecurityPermission sp1 = new SecurityPermission (PermissionState.Unrestricted);
217 SecurityPermission sp2 = new SecurityPermission (PermissionState.None);
218 foreach (SecurityPermissionFlag spf in AllFlagsExceptNoFlags) {
220 SecurityPermission result = (SecurityPermission) sp1.Intersect (sp2);
221 Assert.AreEqual (sp2.Flags, result.Flags, "target " + spf.ToString ());
223 // b. destination (target) is unrestricted
224 foreach (SecurityPermissionFlag spf in AllFlagsExceptNoFlags) {
226 SecurityPermission result = (SecurityPermission)sp2.Intersect (sp1);
227 Assert.AreEqual (sp2.Flags, result.Flags, "source " + spf.ToString ());
229 // exceptions for NoFlags
230 sp2.Flags = SecurityPermissionFlag.NoFlags;
231 Assert.IsNull (sp1.Intersect (sp2), "target NoFlags");
232 Assert.IsNull (sp2.Intersect (sp1), "source NoFlags");
236 public void IsSubset_Null ()
238 SecurityPermission sp = new SecurityPermission (PermissionState.None);
239 Assert.IsTrue (sp.IsSubsetOf (null), "NoFlags");
240 foreach (SecurityPermissionFlag spf in AllFlagsExceptNoFlags) {
242 Assert.IsFalse (sp.IsSubsetOf (null), spf.ToString ());
247 public void IsSubset_None ()
249 // IsSubset with none
250 // a. source (this) is none -> target is never a subset
251 SecurityPermission sp1 = new SecurityPermission (PermissionState.None);
252 SecurityPermission sp2 = new SecurityPermission (PermissionState.None);
253 foreach (SecurityPermissionFlag spf in AllFlags) {
255 Assert.IsTrue (sp1.IsSubsetOf (sp2), "target " + spf.ToString ());
257 // b. destination (target) is none -> target is always a subset
258 foreach (SecurityPermissionFlag spf in AllFlagsExceptNoFlags) {
260 Assert.IsFalse (sp2.IsSubsetOf (sp1), "source " + spf.ToString ());
262 // exception of NoFlags
263 sp2.Flags = SecurityPermissionFlag.NoFlags;
264 Assert.IsTrue (sp2.IsSubsetOf (sp1), "source NoFlags");
268 public void IsSubset_Self ()
270 SecurityPermission sp = new SecurityPermission (PermissionState.None);
271 foreach (SecurityPermissionFlag spf in AllFlags) {
273 SecurityPermission result = (SecurityPermission)sp.Intersect (sp);
274 Assert.IsTrue (sp.IsSubsetOf (sp), spf.ToString ());
279 public void IsSubset_Unrestricted ()
281 // IsSubset with unrestricted
282 // a. source (this) is unrestricted -> target is never a subset
283 SecurityPermission sp1 = new SecurityPermission (PermissionState.Unrestricted);
284 SecurityPermission sp2 = new SecurityPermission (PermissionState.None);
285 foreach (SecurityPermissionFlag spf in AllFlagsExceptAllFlags) {
287 Assert.IsFalse (sp1.IsSubsetOf (sp2), "target " + spf.ToString ());
289 // exception of AllFlags
290 sp2.Flags = SecurityPermissionFlag.AllFlags;
291 Assert.IsTrue (sp1.IsSubsetOf (sp2), "target AllFlags");
292 // b. destination (target) is unrestricted -> target is always a subset
293 foreach (SecurityPermissionFlag spf in AllFlags) {
295 Assert.IsTrue (sp2.IsSubsetOf (sp1), "source " + spf.ToString ());
300 public void Union_Null ()
302 SecurityPermission sp = new SecurityPermission (PermissionState.None);
303 // Union with null is a simple copy
304 foreach (SecurityPermissionFlag spf in AllFlags) {
306 SecurityPermission union = (SecurityPermission) sp.Union (null);
307 Assert.AreEqual (spf, union.Flags, spf.ToString ());
312 public void Union_None ()
314 // Union with none is same
315 SecurityPermission sp1 = new SecurityPermission (PermissionState.None);
316 SecurityPermission sp2 = new SecurityPermission (PermissionState.None);
317 // a. source (this) is none
318 foreach (SecurityPermissionFlag spf in AllFlagsExceptAllFlags) {
320 SecurityPermission union = (SecurityPermission)sp1.Union (sp2);
321 Assert.IsFalse (union.IsUnrestricted (), "target " + spf.ToString ());
323 // b. destination (target) is none
324 foreach (SecurityPermissionFlag spf in AllFlagsExceptAllFlags) {
326 SecurityPermission union = (SecurityPermission)sp2.Union (sp1);
327 Assert.IsFalse (union.IsUnrestricted (), "source " + spf.ToString ());
332 public void Union_Self ()
334 SecurityPermission sp = new SecurityPermission (PermissionState.None);
335 foreach (SecurityPermissionFlag spf in AllFlags) {
337 SecurityPermission result = (SecurityPermission)sp.Union (sp);
338 Assert.AreEqual (spf, result.Flags, spf.ToString ());
343 public void Union_Unrestricted ()
345 // Union with unrestricted is unrestricted
346 SecurityPermission sp1 = new SecurityPermission (PermissionState.Unrestricted);
347 SecurityPermission sp2 = new SecurityPermission (PermissionState.None);
348 // a. source (this) is unrestricted
349 foreach (SecurityPermissionFlag spf in AllFlags) {
351 SecurityPermission union = (SecurityPermission)sp1.Union (sp2);
352 Assert.IsTrue (union.IsUnrestricted (), "target " + spf.ToString ());
354 // b. destination (target) is unrestricted
355 foreach (SecurityPermissionFlag spf in AllFlags) {
357 SecurityPermission union = (SecurityPermission)sp2.Union (sp1);
358 Assert.IsTrue (union.IsUnrestricted (), "source " + spf.ToString ());
363 [ExpectedException (typeof (ArgumentNullException))]
364 public void FromXml_Null ()
366 SecurityPermission sp = new SecurityPermission (PermissionState.None);
371 [ExpectedException (typeof (ArgumentException))]
372 public void FromXml_WrongTag ()
374 SecurityPermission sp = new SecurityPermission (PermissionState.None);
375 SecurityElement se = sp.ToXml ();
381 [ExpectedException (typeof (ArgumentException))]
382 public void FromXml_WrongTagCase ()
384 SecurityPermission sp = new SecurityPermission (PermissionState.None);
385 SecurityElement se = sp.ToXml ();
386 se.Tag = "IPERMISSION"; // instead of IPermission
391 public void FromXml_WrongClass ()
393 SecurityPermission sp = new SecurityPermission (PermissionState.None);
394 SecurityElement se = sp.ToXml ();
396 SecurityElement w = new SecurityElement (se.Tag);
397 w.AddAttribute ("class", "Wrong" + se.Attribute ("class"));
398 w.AddAttribute ("version", se.Attribute ("version"));
400 // doesn't care of the class name at that stage
401 // anyway the class has already be created so...
405 public void FromXml_NoClass ()
407 SecurityPermission sp = new SecurityPermission (PermissionState.None);
408 SecurityElement se = sp.ToXml ();
410 SecurityElement w = new SecurityElement (se.Tag);
411 w.AddAttribute ("version", se.Attribute ("version"));
413 // doesn't even care of the class attribute presence
417 [ExpectedException (typeof (ArgumentException))]
418 public void FromXml_WrongVersion ()
420 SecurityPermission sp = new SecurityPermission (PermissionState.None);
421 SecurityElement se = sp.ToXml ();
422 se.Attributes.Remove ("version");
423 se.Attributes.Add ("version", "2");
428 public void FromXml_NoVersion ()
430 SecurityPermission sp = new SecurityPermission (PermissionState.None);
431 SecurityElement se = sp.ToXml ();
433 SecurityElement w = new SecurityElement (se.Tag);
434 w.AddAttribute ("class", se.Attribute ("class"));