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