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 [Category("NotDotNet")]
40 public class SecurityPermissionTest {
42 static SecurityPermissionFlag [] AllFlags = {
43 SecurityPermissionFlag.AllFlags,
44 SecurityPermissionFlag.Assertion,
46 SecurityPermissionFlag.BindingRedirects,
48 SecurityPermissionFlag.ControlAppDomain,
49 SecurityPermissionFlag.ControlDomainPolicy,
50 SecurityPermissionFlag.ControlEvidence,
51 SecurityPermissionFlag.ControlPolicy,
52 SecurityPermissionFlag.ControlPrincipal,
53 SecurityPermissionFlag.ControlThread,
54 SecurityPermissionFlag.Execution,
55 SecurityPermissionFlag.Infrastructure,
56 SecurityPermissionFlag.NoFlags,
57 SecurityPermissionFlag.RemotingConfiguration,
58 SecurityPermissionFlag.SerializationFormatter,
59 SecurityPermissionFlag.SkipVerification,
60 SecurityPermissionFlag.UnmanagedCode };
62 static SecurityPermissionFlag [] AllFlagsExceptNoFlags = {
63 SecurityPermissionFlag.AllFlags,
64 SecurityPermissionFlag.Assertion,
66 SecurityPermissionFlag.BindingRedirects,
68 SecurityPermissionFlag.ControlAppDomain,
69 SecurityPermissionFlag.ControlDomainPolicy,
70 SecurityPermissionFlag.ControlEvidence,
71 SecurityPermissionFlag.ControlPolicy,
72 SecurityPermissionFlag.ControlPrincipal,
73 SecurityPermissionFlag.ControlThread,
74 SecurityPermissionFlag.Execution,
75 SecurityPermissionFlag.Infrastructure,
76 SecurityPermissionFlag.RemotingConfiguration,
77 SecurityPermissionFlag.SerializationFormatter,
78 SecurityPermissionFlag.SkipVerification,
79 SecurityPermissionFlag.UnmanagedCode };
81 static SecurityPermissionFlag [] AllFlagsExceptAllFlags = {
82 SecurityPermissionFlag.Assertion,
84 SecurityPermissionFlag.BindingRedirects,
86 SecurityPermissionFlag.ControlAppDomain,
87 SecurityPermissionFlag.ControlDomainPolicy,
88 SecurityPermissionFlag.ControlEvidence,
89 SecurityPermissionFlag.ControlPolicy,
90 SecurityPermissionFlag.ControlPrincipal,
91 SecurityPermissionFlag.ControlThread,
92 SecurityPermissionFlag.Execution,
93 SecurityPermissionFlag.Infrastructure,
94 SecurityPermissionFlag.NoFlags,
95 SecurityPermissionFlag.RemotingConfiguration,
96 SecurityPermissionFlag.SerializationFormatter,
97 SecurityPermissionFlag.SkipVerification,
98 SecurityPermissionFlag.UnmanagedCode };
101 public void PermissionState_None ()
103 PermissionState ps = PermissionState.None;
104 SecurityPermission sp = new SecurityPermission (ps);
105 Assert.AreEqual (SecurityPermissionFlag.NoFlags, sp.Flags, "Flags");
106 Assert.IsFalse (sp.IsUnrestricted (), "IsUnrestricted");
108 SecurityElement se = sp.ToXml ();
109 // only class and version are present
110 Assert.AreEqual ("NoFlags", se.Attribute ("Flags"), "Xml-Flags");
111 Assert.IsNull (se.Children, "Xml-Children");
113 SecurityPermission copy = (SecurityPermission)sp.Copy ();
114 Assert.IsFalse (Object.ReferenceEquals (sp, copy), "ReferenceEquals");
115 Assert.AreEqual (sp.Flags, copy.Flags, "Flags");
116 Assert.AreEqual (sp.IsUnrestricted (), copy.IsUnrestricted (), "IsUnrestricted ()");
120 public void PermissionState_Unrestricted ()
122 PermissionState ps = PermissionState.Unrestricted;
123 SecurityPermission sp = new SecurityPermission (ps);
124 Assert.AreEqual (SecurityPermissionFlag.AllFlags, sp.Flags, "Flags");
125 Assert.IsTrue (sp.IsUnrestricted (), "IsUnrestricted");
127 SecurityElement se = sp.ToXml ();
128 // only class and version are present
129 Assert.AreEqual ("true", se.Attribute ("Unrestricted"), "Xml-Unrestricted");
130 Assert.IsNull (se.Children, "Xml-Children");
132 SecurityPermission copy = (SecurityPermission)sp.Copy ();
133 Assert.IsFalse (Object.ReferenceEquals (sp, copy), "ReferenceEquals");
134 Assert.AreEqual (sp.Flags, copy.Flags, "Flags");
135 Assert.AreEqual (sp.IsUnrestricted (), copy.IsUnrestricted (), "IsUnrestricted ()");
139 [ExpectedException (typeof (ArgumentException))]
140 public void PermissionState_Bad ()
142 PermissionState ps = (PermissionState)77;
143 SecurityPermission sp = new SecurityPermission (ps);
147 [ExpectedException (typeof (ArgumentException))]
148 public void SecurityPermissionFlags_Bad ()
150 SecurityPermissionFlag spf = (SecurityPermissionFlag)(SecurityPermissionFlag.AllFlags + 1);
151 SecurityPermission sp = new SecurityPermission (spf);
155 [ExpectedException (typeof (ArgumentException))]
156 public void Flags_SecurityPermissionFlags_Bad ()
158 SecurityPermissionFlag spf = (SecurityPermissionFlag)(SecurityPermissionFlag.AllFlags + 1);
159 SecurityPermission sp = new SecurityPermission (PermissionState.None);
166 SecurityPermission sp = new SecurityPermission (PermissionState.None);
167 foreach (SecurityPermissionFlag spf in AllFlags) {
169 SecurityPermission copy = (SecurityPermission) sp.Copy ();
170 Assert.AreEqual (spf, copy.Flags, spf.ToString ());
175 public void Intersect_Null ()
177 SecurityPermission sp = new SecurityPermission (PermissionState.None);
178 // No intersection with null
179 foreach (SecurityPermissionFlag spf in AllFlags) {
181 Assert.IsNull (sp.Intersect (null), spf.ToString ());
186 public void Intersect_None ()
188 SecurityPermission sp1 = new SecurityPermission (PermissionState.None);
189 SecurityPermission sp2 = new SecurityPermission (PermissionState.None);
190 foreach (SecurityPermissionFlag spf in AllFlagsExceptNoFlags) {
192 // 1. Intersect None with spf
193 SecurityPermission result = (SecurityPermission)sp1.Intersect (sp2);
194 Assert.IsNull (result, "None N " + spf.ToString ());
195 // 2. Intersect spf with None
196 result = (SecurityPermission)sp2.Intersect (sp1);
197 Assert.IsNull (result, "None N " + spf.ToString ());
202 public void Intersect_Self ()
204 SecurityPermission sp = new SecurityPermission (PermissionState.None);
205 foreach (SecurityPermissionFlag spf in AllFlagsExceptNoFlags) {
207 SecurityPermission result = (SecurityPermission)sp.Intersect (sp);
208 Assert.AreEqual (spf, result.Flags, spf.ToString ());
213 public void Intersect_Unrestricted ()
215 // Intersection with unrestricted == Copy
216 // a. source (this) is unrestricted
217 SecurityPermission sp1 = new SecurityPermission (PermissionState.Unrestricted);
218 SecurityPermission sp2 = new SecurityPermission (PermissionState.None);
219 foreach (SecurityPermissionFlag spf in AllFlagsExceptNoFlags) {
221 SecurityPermission result = (SecurityPermission) sp1.Intersect (sp2);
222 Assert.AreEqual (sp2.Flags, result.Flags, "target " + spf.ToString ());
224 // b. destination (target) is unrestricted
225 foreach (SecurityPermissionFlag spf in AllFlagsExceptNoFlags) {
227 SecurityPermission result = (SecurityPermission)sp2.Intersect (sp1);
228 Assert.AreEqual (sp2.Flags, result.Flags, "source " + spf.ToString ());
230 // exceptions for NoFlags
231 sp2.Flags = SecurityPermissionFlag.NoFlags;
232 Assert.IsNull (sp1.Intersect (sp2), "target NoFlags");
233 Assert.IsNull (sp2.Intersect (sp1), "source NoFlags");
237 public void IsSubset_Null ()
239 SecurityPermission sp = new SecurityPermission (PermissionState.None);
240 Assert.IsTrue (sp.IsSubsetOf (null), "NoFlags");
241 foreach (SecurityPermissionFlag spf in AllFlagsExceptNoFlags) {
243 Assert.IsFalse (sp.IsSubsetOf (null), spf.ToString ());
248 public void IsSubset_None ()
250 // IsSubset with none
251 // a. source (this) is none -> target is never a subset
252 SecurityPermission sp1 = new SecurityPermission (PermissionState.None);
253 SecurityPermission sp2 = new SecurityPermission (PermissionState.None);
254 foreach (SecurityPermissionFlag spf in AllFlags) {
256 Assert.IsTrue (sp1.IsSubsetOf (sp2), "target " + spf.ToString ());
258 // b. destination (target) is none -> target is always a subset
259 foreach (SecurityPermissionFlag spf in AllFlagsExceptNoFlags) {
261 Assert.IsFalse (sp2.IsSubsetOf (sp1), "source " + spf.ToString ());
263 // exception of NoFlags
264 sp2.Flags = SecurityPermissionFlag.NoFlags;
265 Assert.IsTrue (sp2.IsSubsetOf (sp1), "source NoFlags");
269 public void IsSubset_Self ()
271 SecurityPermission sp = new SecurityPermission (PermissionState.None);
272 foreach (SecurityPermissionFlag spf in AllFlags) {
274 SecurityPermission result = (SecurityPermission)sp.Intersect (sp);
275 Assert.IsTrue (sp.IsSubsetOf (sp), spf.ToString ());
280 public void IsSubset_Unrestricted ()
282 // IsSubset with unrestricted
283 // a. source (this) is unrestricted -> target is never a subset
284 SecurityPermission sp1 = new SecurityPermission (PermissionState.Unrestricted);
285 SecurityPermission sp2 = new SecurityPermission (PermissionState.None);
286 foreach (SecurityPermissionFlag spf in AllFlagsExceptAllFlags) {
288 Assert.IsFalse (sp1.IsSubsetOf (sp2), "target " + spf.ToString ());
290 // exception of AllFlags
291 sp2.Flags = SecurityPermissionFlag.AllFlags;
292 Assert.IsTrue (sp1.IsSubsetOf (sp2), "target AllFlags");
293 // b. destination (target) is unrestricted -> target is always a subset
294 foreach (SecurityPermissionFlag spf in AllFlags) {
296 Assert.IsTrue (sp2.IsSubsetOf (sp1), "source " + spf.ToString ());
301 public void Union_Null ()
303 SecurityPermission sp = new SecurityPermission (PermissionState.None);
304 // Union with null is a simple copy
305 foreach (SecurityPermissionFlag spf in AllFlags) {
307 SecurityPermission union = (SecurityPermission) sp.Union (null);
308 Assert.AreEqual (spf, union.Flags, spf.ToString ());
313 public void Union_None ()
315 // Union with none is same
316 SecurityPermission sp1 = new SecurityPermission (PermissionState.None);
317 SecurityPermission sp2 = new SecurityPermission (PermissionState.None);
318 // a. source (this) is none
319 foreach (SecurityPermissionFlag spf in AllFlagsExceptAllFlags) {
321 SecurityPermission union = (SecurityPermission)sp1.Union (sp2);
322 Assert.IsFalse (union.IsUnrestricted (), "target " + spf.ToString ());
324 // b. destination (target) is none
325 foreach (SecurityPermissionFlag spf in AllFlagsExceptAllFlags) {
327 SecurityPermission union = (SecurityPermission)sp2.Union (sp1);
328 Assert.IsFalse (union.IsUnrestricted (), "source " + spf.ToString ());
333 public void Union_Self ()
335 SecurityPermission sp = new SecurityPermission (PermissionState.None);
336 foreach (SecurityPermissionFlag spf in AllFlags) {
338 SecurityPermission result = (SecurityPermission)sp.Union (sp);
339 Assert.AreEqual (spf, result.Flags, spf.ToString ());
344 public void Union_Unrestricted ()
346 // Union with unrestricted is unrestricted
347 SecurityPermission sp1 = new SecurityPermission (PermissionState.Unrestricted);
348 SecurityPermission sp2 = new SecurityPermission (PermissionState.None);
349 // a. source (this) is unrestricted
350 foreach (SecurityPermissionFlag spf in AllFlags) {
352 SecurityPermission union = (SecurityPermission)sp1.Union (sp2);
353 Assert.IsTrue (union.IsUnrestricted (), "target " + spf.ToString ());
355 // b. destination (target) is unrestricted
356 foreach (SecurityPermissionFlag spf in AllFlags) {
358 SecurityPermission union = (SecurityPermission)sp2.Union (sp1);
359 Assert.IsTrue (union.IsUnrestricted (), "source " + spf.ToString ());
364 [ExpectedException (typeof (ArgumentNullException))]
365 public void FromXml_Null ()
367 SecurityPermission sp = new SecurityPermission (PermissionState.None);
372 [ExpectedException (typeof (ArgumentException))]
373 public void FromXml_WrongTag ()
375 SecurityPermission sp = new SecurityPermission (PermissionState.None);
376 SecurityElement se = sp.ToXml ();
382 [ExpectedException (typeof (ArgumentException))]
383 public void FromXml_WrongTagCase ()
385 SecurityPermission sp = new SecurityPermission (PermissionState.None);
386 SecurityElement se = sp.ToXml ();
387 se.Tag = "IPERMISSION"; // instead of IPermission
392 public void FromXml_WrongClass ()
394 SecurityPermission sp = new SecurityPermission (PermissionState.None);
395 SecurityElement se = sp.ToXml ();
397 SecurityElement w = new SecurityElement (se.Tag);
398 w.AddAttribute ("class", "Wrong" + se.Attribute ("class"));
399 w.AddAttribute ("version", se.Attribute ("version"));
401 // doesn't care of the class name at that stage
402 // anyway the class has already be created so...
406 public void FromXml_NoClass ()
408 SecurityPermission sp = new SecurityPermission (PermissionState.None);
409 SecurityElement se = sp.ToXml ();
411 SecurityElement w = new SecurityElement (se.Tag);
412 w.AddAttribute ("version", se.Attribute ("version"));
414 // doesn't even care of the class attribute presence
418 [ExpectedException (typeof (ArgumentException))]
419 public void FromXml_WrongVersion ()
421 SecurityPermission sp = new SecurityPermission (PermissionState.None);
422 SecurityElement se = sp.ToXml ();
423 se.Attributes.Remove ("version");
424 se.Attributes.Add ("version", "2");
429 public void FromXml_NoVersion ()
431 SecurityPermission sp = new SecurityPermission (PermissionState.None);
432 SecurityElement se = sp.ToXml ();
434 SecurityElement w = new SecurityElement (se.Tag);
435 w.AddAttribute ("class", se.Attribute ("class"));