2004-12-03 Lluis Sanchez Gual <lluis@novell.com>
[mono.git] / mcs / class / corlib / Test / System.Security.Permissions / SecurityPermissionTest.cs
1 //
2 // SecurityPermissionTest.cs - NUnit Test Cases for SecurityPermission
3 //
4 // Author:
5 //      Sebastien Pouliot  <sebastien@ximian.com>
6 //
7 // Copyright (C) 2004 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 using NUnit.Framework;
30 using System;
31 using System.Security;
32 using System.Security.Permissions;
33
34 using System.Diagnostics;
35
36 namespace MonoTests.System.Security.Permissions {
37
38         [TestFixture]
39         public class SecurityPermissionTest {
40
41                 static SecurityPermissionFlag [] AllFlags = {
42                         SecurityPermissionFlag.AllFlags,
43                         SecurityPermissionFlag.Assertion,
44 #if NET_1_1
45                         SecurityPermissionFlag.BindingRedirects,
46 #endif
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 };
60
61                 static SecurityPermissionFlag [] AllFlagsExceptNoFlags = {
62                         SecurityPermissionFlag.AllFlags,
63                         SecurityPermissionFlag.Assertion,
64 #if NET_1_1
65                         SecurityPermissionFlag.BindingRedirects,
66 #endif
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 };
79
80                 static SecurityPermissionFlag [] AllFlagsExceptAllFlags = {
81                         SecurityPermissionFlag.Assertion,
82 #if NET_1_1
83                         SecurityPermissionFlag.BindingRedirects,
84 #endif
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 };
98
99                 [Test]
100                 public void PermissionState_None ()
101                 {
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");
106
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");
111
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 ()");
116                 }
117
118                 [Test]
119                 public void PermissionState_Unrestricted ()
120                 {
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");
125
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");
130
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 ()");
135                 }
136
137                 [Test]
138                 [ExpectedException (typeof (ArgumentException))]
139                 public void PermissionState_Bad ()
140                 {
141                         PermissionState ps = (PermissionState)77;
142                         SecurityPermission sp = new SecurityPermission (ps);
143                 }
144
145                 [Test]
146                 [ExpectedException (typeof (ArgumentException))]
147                 public void SecurityPermissionFlags_Bad ()
148                 {
149                         SecurityPermissionFlag spf = (SecurityPermissionFlag)(SecurityPermissionFlag.AllFlags + 1);
150                         SecurityPermission sp = new SecurityPermission (spf);
151                 }
152
153                 [Test]
154                 [ExpectedException (typeof (ArgumentException))]
155                 public void Flags_SecurityPermissionFlags_Bad ()
156                 {
157                         SecurityPermissionFlag spf = (SecurityPermissionFlag)(SecurityPermissionFlag.AllFlags + 1);
158                         SecurityPermission sp = new SecurityPermission (PermissionState.None);
159                         sp.Flags = spf;
160                 }
161
162                 [Test]
163                 public void Copy ()
164                 {
165                         SecurityPermission sp = new SecurityPermission (PermissionState.None);
166                         foreach (SecurityPermissionFlag spf in AllFlags) {
167                                 sp.Flags = spf;
168                                 SecurityPermission copy = (SecurityPermission) sp.Copy ();
169                                 Assert.AreEqual (spf, copy.Flags, spf.ToString ());
170                         }
171                 }
172
173                 [Test]
174                 public void Intersect_Null ()
175                 {
176                         SecurityPermission sp = new SecurityPermission (PermissionState.None);
177                         // No intersection with null
178                         foreach (SecurityPermissionFlag spf in AllFlags) {
179                                 sp.Flags = spf;
180                                 Assert.IsNull (sp.Intersect (null), spf.ToString ());
181                         }
182                 }
183
184                 [Test]
185                 public void Intersect_None ()
186                 {
187                         SecurityPermission sp1 = new SecurityPermission (PermissionState.None);
188                         SecurityPermission sp2 = new SecurityPermission (PermissionState.None);
189                         foreach (SecurityPermissionFlag spf in AllFlagsExceptNoFlags) {
190                                 sp2.Flags = spf;
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 ());
197                         }
198                 }
199
200                 [Test]
201                 public void Intersect_Self ()
202                 {
203                         SecurityPermission sp = new SecurityPermission (PermissionState.None);
204                         foreach (SecurityPermissionFlag spf in AllFlagsExceptNoFlags) {
205                                 sp.Flags = spf;
206                                 SecurityPermission result = (SecurityPermission)sp.Intersect (sp);
207                                 Assert.AreEqual (spf, result.Flags, spf.ToString ());
208                         }
209                 }
210
211                 [Test]
212                 public void Intersect_Unrestricted ()
213                 {
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) {
219                                 sp2.Flags = spf;
220                                 SecurityPermission result = (SecurityPermission) sp1.Intersect (sp2);
221                                 Assert.AreEqual (sp2.Flags, result.Flags, "target " + spf.ToString ());
222                         }
223                         // b. destination (target) is unrestricted
224                         foreach (SecurityPermissionFlag spf in AllFlagsExceptNoFlags) {
225                                 sp2.Flags = spf;
226                                 SecurityPermission result = (SecurityPermission)sp2.Intersect (sp1);
227                                 Assert.AreEqual (sp2.Flags, result.Flags, "source " + spf.ToString ());
228                         }
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");
233                 }
234
235                 [Test]
236                 public void IsSubset_Null () 
237                 {
238                         SecurityPermission sp = new SecurityPermission (PermissionState.None);
239                         Assert.IsTrue (sp.IsSubsetOf (null), "NoFlags");
240                         foreach (SecurityPermissionFlag spf in AllFlagsExceptNoFlags) {
241                                 sp.Flags = spf;
242                                 Assert.IsFalse (sp.IsSubsetOf (null), spf.ToString ());
243                         }
244                 }
245
246                 [Test]
247                 public void IsSubset_None ()
248                 {
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) {
254                                 sp2.Flags = spf;
255                                 Assert.IsTrue (sp1.IsSubsetOf (sp2), "target " + spf.ToString ());
256                         }
257                         // b. destination (target) is none -> target is always a subset
258                         foreach (SecurityPermissionFlag spf in AllFlagsExceptNoFlags) {
259                                 sp2.Flags = spf;
260                                 Assert.IsFalse (sp2.IsSubsetOf (sp1), "source " + spf.ToString ());
261                         }
262                         // exception of NoFlags
263                         sp2.Flags = SecurityPermissionFlag.NoFlags;
264                         Assert.IsTrue (sp2.IsSubsetOf (sp1), "source NoFlags");
265                 }
266
267                 [Test]
268                 public void IsSubset_Self ()
269                 {
270                         SecurityPermission sp = new SecurityPermission (PermissionState.None);
271                         foreach (SecurityPermissionFlag spf in AllFlags) {
272                                 sp.Flags = spf;
273                                 SecurityPermission result = (SecurityPermission)sp.Intersect (sp);
274                                 Assert.IsTrue (sp.IsSubsetOf (sp), spf.ToString ());
275                         }
276                 }
277
278                 [Test]
279                 public void IsSubset_Unrestricted () 
280                 {
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) {
286                                 sp2.Flags = spf;
287                                 Assert.IsFalse (sp1.IsSubsetOf (sp2), "target " + spf.ToString ());
288                         }
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) {
294                                 sp2.Flags = spf;
295                                 Assert.IsTrue (sp2.IsSubsetOf (sp1), "source " + spf.ToString ());
296                         }
297                 }
298
299                 [Test]
300                 public void Union_Null ()
301                 {
302                         SecurityPermission sp = new SecurityPermission (PermissionState.None);
303                         // Union with null is a simple copy
304                         foreach (SecurityPermissionFlag spf in AllFlags) {
305                                 sp.Flags = spf;
306                                 SecurityPermission union = (SecurityPermission) sp.Union (null);
307                                 Assert.AreEqual (spf, union.Flags, spf.ToString ());
308                         }
309                 }
310
311                 [Test]
312                 public void Union_None ()
313                 {
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) {
319                                 sp2.Flags = spf;
320                                 SecurityPermission union = (SecurityPermission)sp1.Union (sp2);
321                                 Assert.IsFalse (union.IsUnrestricted (), "target " + spf.ToString ());
322                         }
323                         // b. destination (target) is none
324                         foreach (SecurityPermissionFlag spf in AllFlagsExceptAllFlags) {
325                                 sp2.Flags = spf;
326                                 SecurityPermission union = (SecurityPermission)sp2.Union (sp1);
327                                 Assert.IsFalse (union.IsUnrestricted (), "source " + spf.ToString ());
328                         }
329                 }
330
331                 [Test]
332                 public void Union_Self ()
333                 {
334                         SecurityPermission sp = new SecurityPermission (PermissionState.None);
335                         foreach (SecurityPermissionFlag spf in AllFlags) {
336                                 sp.Flags = spf;
337                                 SecurityPermission result = (SecurityPermission)sp.Union (sp);
338                                 Assert.AreEqual (spf, result.Flags, spf.ToString ());
339                         }
340                 }
341
342                 [Test]
343                 public void Union_Unrestricted ()
344                 {
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) {
350                                 sp2.Flags = spf;
351                                 SecurityPermission union = (SecurityPermission)sp1.Union (sp2);
352                                 Assert.IsTrue (union.IsUnrestricted (), "target " + spf.ToString ());
353                         }
354                         // b. destination (target) is unrestricted
355                         foreach (SecurityPermissionFlag spf in AllFlags) {
356                                 sp2.Flags = spf;
357                                 SecurityPermission union = (SecurityPermission)sp2.Union (sp1);
358                                 Assert.IsTrue (union.IsUnrestricted (), "source " + spf.ToString ());
359                         }
360                 }
361
362                 [Test]
363                 [ExpectedException (typeof (ArgumentNullException))]
364                 public void FromXml_Null ()
365                 {
366                         SecurityPermission sp = new SecurityPermission (PermissionState.None);
367                         sp.FromXml (null);
368                 }
369
370                 [Test]
371                 [ExpectedException (typeof (ArgumentException))]
372                 public void FromXml_WrongTag ()
373                 {
374                         SecurityPermission sp = new SecurityPermission (PermissionState.None);
375                         SecurityElement se = sp.ToXml ();
376                         se.Tag = "IMono";
377                         sp.FromXml (se);
378                 }
379
380                 [Test]
381                 [ExpectedException (typeof (ArgumentException))]
382                 public void FromXml_WrongTagCase ()
383                 {
384                         SecurityPermission sp = new SecurityPermission (PermissionState.None);
385                         SecurityElement se = sp.ToXml ();
386                         se.Tag = "IPERMISSION"; // instead of IPermission
387                         sp.FromXml (se);
388                 }
389
390                 [Test]
391                 public void FromXml_WrongClass ()
392                 {
393                         SecurityPermission sp = new SecurityPermission (PermissionState.None);
394                         SecurityElement se = sp.ToXml ();
395
396                         SecurityElement w = new SecurityElement (se.Tag);
397                         w.AddAttribute ("class", "Wrong" + se.Attribute ("class"));
398                         w.AddAttribute ("version", se.Attribute ("version"));
399                         sp.FromXml (w);
400                         // doesn't care of the class name at that stage
401                         // anyway the class has already be created so...
402                 }
403
404                 [Test]
405                 public void FromXml_NoClass ()
406                 {
407                         SecurityPermission sp = new SecurityPermission (PermissionState.None);
408                         SecurityElement se = sp.ToXml ();
409
410                         SecurityElement w = new SecurityElement (se.Tag);
411                         w.AddAttribute ("version", se.Attribute ("version"));
412                         sp.FromXml (w);
413                         // doesn't even care of the class attribute presence
414                 }
415
416                 [Test]
417                 [ExpectedException (typeof (ArgumentException))]
418                 public void FromXml_WrongVersion ()
419                 {
420                         SecurityPermission sp = new SecurityPermission (PermissionState.None);
421                         SecurityElement se = sp.ToXml ();
422                         se.Attributes.Remove ("version");
423                         se.Attributes.Add ("version", "2");
424                         sp.FromXml (se);
425                 }
426
427                 [Test]
428                 public void FromXml_NoVersion ()
429                 {
430                         SecurityPermission sp = new SecurityPermission (PermissionState.None);
431                         SecurityElement se = sp.ToXml ();
432
433                         SecurityElement w = new SecurityElement (se.Tag);
434                         w.AddAttribute ("class", se.Attribute ("class"));
435                         sp.FromXml (w);
436                 }
437         }
438 }