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
,
45 SecurityPermissionFlag
.BindingRedirects
,
46 SecurityPermissionFlag
.ControlAppDomain
,
47 SecurityPermissionFlag
.ControlDomainPolicy
,
48 SecurityPermissionFlag
.ControlEvidence
,
49 SecurityPermissionFlag
.ControlPolicy
,
50 SecurityPermissionFlag
.ControlPrincipal
,
51 SecurityPermissionFlag
.ControlThread
,
52 SecurityPermissionFlag
.Execution
,
53 SecurityPermissionFlag
.Infrastructure
,
54 SecurityPermissionFlag
.NoFlags
,
55 SecurityPermissionFlag
.RemotingConfiguration
,
56 SecurityPermissionFlag
.SerializationFormatter
,
57 SecurityPermissionFlag
.SkipVerification
,
58 SecurityPermissionFlag
.UnmanagedCode
};
60 static SecurityPermissionFlag
[] AllFlagsExceptNoFlags
= {
61 SecurityPermissionFlag
.AllFlags
,
62 SecurityPermissionFlag
.Assertion
,
63 SecurityPermissionFlag
.BindingRedirects
,
64 SecurityPermissionFlag
.ControlAppDomain
,
65 SecurityPermissionFlag
.ControlDomainPolicy
,
66 SecurityPermissionFlag
.ControlEvidence
,
67 SecurityPermissionFlag
.ControlPolicy
,
68 SecurityPermissionFlag
.ControlPrincipal
,
69 SecurityPermissionFlag
.ControlThread
,
70 SecurityPermissionFlag
.Execution
,
71 SecurityPermissionFlag
.Infrastructure
,
72 SecurityPermissionFlag
.RemotingConfiguration
,
73 SecurityPermissionFlag
.SerializationFormatter
,
74 SecurityPermissionFlag
.SkipVerification
,
75 SecurityPermissionFlag
.UnmanagedCode
};
77 static SecurityPermissionFlag
[] AllFlagsExceptAllFlags
= {
78 SecurityPermissionFlag
.Assertion
,
79 SecurityPermissionFlag
.BindingRedirects
,
80 SecurityPermissionFlag
.ControlAppDomain
,
81 SecurityPermissionFlag
.ControlDomainPolicy
,
82 SecurityPermissionFlag
.ControlEvidence
,
83 SecurityPermissionFlag
.ControlPolicy
,
84 SecurityPermissionFlag
.ControlPrincipal
,
85 SecurityPermissionFlag
.ControlThread
,
86 SecurityPermissionFlag
.Execution
,
87 SecurityPermissionFlag
.Infrastructure
,
88 SecurityPermissionFlag
.NoFlags
,
89 SecurityPermissionFlag
.RemotingConfiguration
,
90 SecurityPermissionFlag
.SerializationFormatter
,
91 SecurityPermissionFlag
.SkipVerification
,
92 SecurityPermissionFlag
.UnmanagedCode
};
95 public void PermissionState_None ()
97 PermissionState ps
= PermissionState
.None
;
98 SecurityPermission sp
= new SecurityPermission (ps
);
99 Assert
.AreEqual (SecurityPermissionFlag
.NoFlags
, sp
.Flags
, "Flags");
100 Assert
.IsFalse (sp
.IsUnrestricted (), "IsUnrestricted");
102 SecurityElement se
= sp
.ToXml ();
103 // only class and version are present
104 Assert
.AreEqual ("NoFlags", se
.Attribute ("Flags"), "Xml-Flags");
105 Assert
.IsNull (se
.Children
, "Xml-Children");
107 SecurityPermission copy
= (SecurityPermission
)sp
.Copy ();
108 Assert
.IsFalse (Object
.ReferenceEquals (sp
, copy
), "ReferenceEquals");
109 Assert
.AreEqual (sp
.Flags
, copy
.Flags
, "Flags");
110 Assert
.AreEqual (sp
.IsUnrestricted (), copy
.IsUnrestricted (), "IsUnrestricted ()");
114 public void PermissionState_Unrestricted ()
116 PermissionState ps
= PermissionState
.Unrestricted
;
117 SecurityPermission sp
= new SecurityPermission (ps
);
118 Assert
.AreEqual (SecurityPermissionFlag
.AllFlags
, sp
.Flags
, "Flags");
119 Assert
.IsTrue (sp
.IsUnrestricted (), "IsUnrestricted");
121 SecurityElement se
= sp
.ToXml ();
122 // only class and version are present
123 Assert
.AreEqual ("true", se
.Attribute ("Unrestricted"), "Xml-Unrestricted");
124 Assert
.IsNull (se
.Children
, "Xml-Children");
126 SecurityPermission copy
= (SecurityPermission
)sp
.Copy ();
127 Assert
.IsFalse (Object
.ReferenceEquals (sp
, copy
), "ReferenceEquals");
128 Assert
.AreEqual (sp
.Flags
, copy
.Flags
, "Flags");
129 Assert
.AreEqual (sp
.IsUnrestricted (), copy
.IsUnrestricted (), "IsUnrestricted ()");
133 [ExpectedException (typeof (ArgumentException
))]
134 public void PermissionState_Bad ()
136 PermissionState ps
= (PermissionState
)77;
137 SecurityPermission sp
= new SecurityPermission (ps
);
141 [ExpectedException (typeof (ArgumentException
))]
142 public void SecurityPermissionFlags_Bad ()
144 SecurityPermissionFlag spf
= (SecurityPermissionFlag
)(SecurityPermissionFlag
.AllFlags
+ 1);
145 SecurityPermission sp
= new SecurityPermission (spf
);
149 [ExpectedException (typeof (ArgumentException
))]
150 public void Flags_SecurityPermissionFlags_Bad ()
152 SecurityPermissionFlag spf
= (SecurityPermissionFlag
)(SecurityPermissionFlag
.AllFlags
+ 1);
153 SecurityPermission sp
= new SecurityPermission (PermissionState
.None
);
160 SecurityPermission sp
= new SecurityPermission (PermissionState
.None
);
161 foreach (SecurityPermissionFlag spf
in AllFlags
) {
163 SecurityPermission copy
= (SecurityPermission
) sp
.Copy ();
164 Assert
.AreEqual (spf
, copy
.Flags
, spf
.ToString ());
169 public void Intersect_Null ()
171 SecurityPermission sp
= new SecurityPermission (PermissionState
.None
);
172 // No intersection with null
173 foreach (SecurityPermissionFlag spf
in AllFlags
) {
175 Assert
.IsNull (sp
.Intersect (null), spf
.ToString ());
180 public void Intersect_None ()
182 SecurityPermission sp1
= new SecurityPermission (PermissionState
.None
);
183 SecurityPermission sp2
= new SecurityPermission (PermissionState
.None
);
184 foreach (SecurityPermissionFlag spf
in AllFlagsExceptNoFlags
) {
186 // 1. Intersect None with spf
187 SecurityPermission result
= (SecurityPermission
)sp1
.Intersect (sp2
);
188 Assert
.IsNull (result
, "None N " + spf
.ToString ());
189 // 2. Intersect spf with None
190 result
= (SecurityPermission
)sp2
.Intersect (sp1
);
191 Assert
.IsNull (result
, "None N " + spf
.ToString ());
196 public void Intersect_Self ()
198 SecurityPermission sp
= new SecurityPermission (PermissionState
.None
);
199 foreach (SecurityPermissionFlag spf
in AllFlagsExceptNoFlags
) {
201 SecurityPermission result
= (SecurityPermission
)sp
.Intersect (sp
);
202 Assert
.AreEqual (spf
, result
.Flags
, spf
.ToString ());
207 public void Intersect_Unrestricted ()
209 // Intersection with unrestricted == Copy
210 // a. source (this) is unrestricted
211 SecurityPermission sp1
= new SecurityPermission (PermissionState
.Unrestricted
);
212 SecurityPermission sp2
= new SecurityPermission (PermissionState
.None
);
213 foreach (SecurityPermissionFlag spf
in AllFlagsExceptNoFlags
) {
215 SecurityPermission result
= (SecurityPermission
) sp1
.Intersect (sp2
);
216 Assert
.AreEqual (sp2
.Flags
, result
.Flags
, "target " + spf
.ToString ());
218 // b. destination (target) is unrestricted
219 foreach (SecurityPermissionFlag spf
in AllFlagsExceptNoFlags
) {
221 SecurityPermission result
= (SecurityPermission
)sp2
.Intersect (sp1
);
222 Assert
.AreEqual (sp2
.Flags
, result
.Flags
, "source " + spf
.ToString ());
224 // exceptions for NoFlags
225 sp2
.Flags
= SecurityPermissionFlag
.NoFlags
;
226 Assert
.IsNull (sp1
.Intersect (sp2
), "target NoFlags");
227 Assert
.IsNull (sp2
.Intersect (sp1
), "source NoFlags");
231 public void IsSubset_Null ()
233 SecurityPermission sp
= new SecurityPermission (PermissionState
.None
);
234 Assert
.IsTrue (sp
.IsSubsetOf (null), "NoFlags");
235 foreach (SecurityPermissionFlag spf
in AllFlagsExceptNoFlags
) {
237 Assert
.IsFalse (sp
.IsSubsetOf (null), spf
.ToString ());
242 public void IsSubset_None ()
244 // IsSubset with none
245 // a. source (this) is none -> target is never a subset
246 SecurityPermission sp1
= new SecurityPermission (PermissionState
.None
);
247 SecurityPermission sp2
= new SecurityPermission (PermissionState
.None
);
248 foreach (SecurityPermissionFlag spf
in AllFlags
) {
250 Assert
.IsTrue (sp1
.IsSubsetOf (sp2
), "target " + spf
.ToString ());
252 // b. destination (target) is none -> target is always a subset
253 foreach (SecurityPermissionFlag spf
in AllFlagsExceptNoFlags
) {
255 Assert
.IsFalse (sp2
.IsSubsetOf (sp1
), "source " + spf
.ToString ());
257 // exception of NoFlags
258 sp2
.Flags
= SecurityPermissionFlag
.NoFlags
;
259 Assert
.IsTrue (sp2
.IsSubsetOf (sp1
), "source NoFlags");
263 public void IsSubset_Self ()
265 SecurityPermission sp
= new SecurityPermission (PermissionState
.None
);
266 foreach (SecurityPermissionFlag spf
in AllFlags
) {
268 SecurityPermission result
= (SecurityPermission
)sp
.Intersect (sp
);
269 Assert
.IsTrue (sp
.IsSubsetOf (sp
), spf
.ToString ());
274 public void IsSubset_Unrestricted ()
276 // IsSubset with unrestricted
277 // a. source (this) is unrestricted -> target is never a subset
278 SecurityPermission sp1
= new SecurityPermission (PermissionState
.Unrestricted
);
279 SecurityPermission sp2
= new SecurityPermission (PermissionState
.None
);
280 foreach (SecurityPermissionFlag spf
in AllFlagsExceptAllFlags
) {
282 Assert
.IsFalse (sp1
.IsSubsetOf (sp2
), "target " + spf
.ToString ());
284 // exception of AllFlags
285 sp2
.Flags
= SecurityPermissionFlag
.AllFlags
;
286 Assert
.IsTrue (sp1
.IsSubsetOf (sp2
), "target AllFlags");
287 // b. destination (target) is unrestricted -> target is always a subset
288 foreach (SecurityPermissionFlag spf
in AllFlags
) {
290 Assert
.IsTrue (sp2
.IsSubsetOf (sp1
), "source " + spf
.ToString ());
295 public void Union_Null ()
297 SecurityPermission sp
= new SecurityPermission (PermissionState
.None
);
298 // Union with null is a simple copy
299 foreach (SecurityPermissionFlag spf
in AllFlags
) {
301 SecurityPermission union
= (SecurityPermission
) sp
.Union (null);
302 Assert
.AreEqual (spf
, union
.Flags
, spf
.ToString ());
307 public void Union_None ()
309 // Union with none is same
310 SecurityPermission sp1
= new SecurityPermission (PermissionState
.None
);
311 SecurityPermission sp2
= new SecurityPermission (PermissionState
.None
);
312 // a. source (this) is none
313 foreach (SecurityPermissionFlag spf
in AllFlagsExceptAllFlags
) {
315 SecurityPermission union
= (SecurityPermission
)sp1
.Union (sp2
);
316 Assert
.IsFalse (union
.IsUnrestricted (), "target " + spf
.ToString ());
318 // b. destination (target) is none
319 foreach (SecurityPermissionFlag spf
in AllFlagsExceptAllFlags
) {
321 SecurityPermission union
= (SecurityPermission
)sp2
.Union (sp1
);
322 Assert
.IsFalse (union
.IsUnrestricted (), "source " + spf
.ToString ());
327 public void Union_Self ()
329 SecurityPermission sp
= new SecurityPermission (PermissionState
.None
);
330 foreach (SecurityPermissionFlag spf
in AllFlags
) {
332 SecurityPermission result
= (SecurityPermission
)sp
.Union (sp
);
333 Assert
.AreEqual (spf
, result
.Flags
, spf
.ToString ());
338 public void Union_Unrestricted ()
340 // Union with unrestricted is unrestricted
341 SecurityPermission sp1
= new SecurityPermission (PermissionState
.Unrestricted
);
342 SecurityPermission sp2
= new SecurityPermission (PermissionState
.None
);
343 // a. source (this) is unrestricted
344 foreach (SecurityPermissionFlag spf
in AllFlags
) {
346 SecurityPermission union
= (SecurityPermission
)sp1
.Union (sp2
);
347 Assert
.IsTrue (union
.IsUnrestricted (), "target " + spf
.ToString ());
349 // b. destination (target) is unrestricted
350 foreach (SecurityPermissionFlag spf
in AllFlags
) {
352 SecurityPermission union
= (SecurityPermission
)sp2
.Union (sp1
);
353 Assert
.IsTrue (union
.IsUnrestricted (), "source " + spf
.ToString ());
358 [ExpectedException (typeof (ArgumentNullException
))]
359 public void FromXml_Null ()
361 SecurityPermission sp
= new SecurityPermission (PermissionState
.None
);
366 [ExpectedException (typeof (ArgumentException
))]
367 public void FromXml_WrongTag ()
369 SecurityPermission sp
= new SecurityPermission (PermissionState
.None
);
370 SecurityElement se
= sp
.ToXml ();
376 [ExpectedException (typeof (ArgumentException
))]
377 public void FromXml_WrongTagCase ()
379 SecurityPermission sp
= new SecurityPermission (PermissionState
.None
);
380 SecurityElement se
= sp
.ToXml ();
381 se
.Tag
= "IPERMISSION"; // instead of IPermission
386 public void FromXml_WrongClass ()
388 SecurityPermission sp
= new SecurityPermission (PermissionState
.None
);
389 SecurityElement se
= sp
.ToXml ();
391 SecurityElement w
= new SecurityElement (se
.Tag
);
392 w
.AddAttribute ("class", "Wrong" + se
.Attribute ("class"));
393 w
.AddAttribute ("version", se
.Attribute ("version"));
395 // doesn't care of the class name at that stage
396 // anyway the class has already be created so...
400 public void FromXml_NoClass ()
402 SecurityPermission sp
= new SecurityPermission (PermissionState
.None
);
403 SecurityElement se
= sp
.ToXml ();
405 SecurityElement w
= new SecurityElement (se
.Tag
);
406 w
.AddAttribute ("version", se
.Attribute ("version"));
408 // doesn't even care of the class attribute presence
412 [ExpectedException (typeof (ArgumentException
))]
413 public void FromXml_WrongVersion ()
415 SecurityPermission sp
= new SecurityPermission (PermissionState
.None
);
416 SecurityElement se
= sp
.ToXml ();
417 se
.Attributes
.Remove ("version");
418 se
.Attributes
.Add ("version", "2");
423 public void FromXml_NoVersion ()
425 SecurityPermission sp
= new SecurityPermission (PermissionState
.None
);
426 SecurityElement se
= sp
.ToXml ();
428 SecurityElement w
= new SecurityElement (se
.Tag
);
429 w
.AddAttribute ("class", se
.Attribute ("class"));