2 // ResourcePermissionBaseTest.cs - NUnit Test Cases for ResourcePermissionBase
5 // Sebastien Pouliot <sebastien@ximian.com>
7 // Copyright (C) 2004-2005 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 namespace MonoTests.System.Security.Permissions {
36 // the publicizer of the protected ;-)
37 public class NonAbstractResourcePermissionBase : ResourcePermissionBase {
39 public NonAbstractResourcePermissionBase () : base ()
43 public NonAbstractResourcePermissionBase (PermissionState state)
48 public new Type PermissionAccessType {
49 get { return base.PermissionAccessType; }
50 set { base.PermissionAccessType = value; }
53 public new string [] TagNames {
54 get { return base.TagNames; }
55 set { base.TagNames = value; }
58 public new void AddPermissionAccess (ResourcePermissionBaseEntry entry)
60 base.AddPermissionAccess (entry);
63 public new void Clear ()
68 public new ResourcePermissionBaseEntry [] GetPermissionEntries ()
70 return base.GetPermissionEntries ();
73 public new void RemovePermissionAccess (ResourcePermissionBaseEntry entry)
75 base.RemovePermissionAccess (entry);
80 public class ResourcePermissionBaseTest {
83 public void Constants ()
85 Assert.AreEqual ("*", ResourcePermissionBase.Any, "Any");
86 Assert.AreEqual (".", ResourcePermissionBase.Local, "Local");
89 private void CheckDefaultValues (string msg, NonAbstractResourcePermissionBase rp, bool unrestricted)
91 Assert.IsNull (rp.PermissionAccessType, msg + "-PermissionAccessType");
92 Assert.IsNull (rp.TagNames, msg + "-TagNames");
93 Assert.AreEqual (unrestricted, rp.IsUnrestricted (), msg + "-IsUnrestricted");
94 ResourcePermissionBaseEntry[] entries = rp.GetPermissionEntries ();
95 Assert.AreEqual (0, entries.Length, msg + "Count");
99 public void Constructor_Empty ()
101 NonAbstractResourcePermissionBase rp = new NonAbstractResourcePermissionBase ();
102 CheckDefaultValues ("original", rp, false);
103 NonAbstractResourcePermissionBase copy = (NonAbstractResourcePermissionBase) rp.Copy ();
104 CheckDefaultValues ("copy", rp, false);
108 public void Constructor_None ()
110 NonAbstractResourcePermissionBase rp = new NonAbstractResourcePermissionBase (PermissionState.None);
111 CheckDefaultValues ("original", rp, false);
112 NonAbstractResourcePermissionBase copy = (NonAbstractResourcePermissionBase)rp.Copy ();
113 CheckDefaultValues ("copy", rp, false);
117 public void Constructor_Unrestricted ()
119 NonAbstractResourcePermissionBase rp = new NonAbstractResourcePermissionBase (PermissionState.Unrestricted);
120 CheckDefaultValues ("original", rp, true);
121 NonAbstractResourcePermissionBase copy = (NonAbstractResourcePermissionBase)rp.Copy ();
122 CheckDefaultValues ("copy", rp, true);
127 [ExpectedException (typeof (ArgumentException))]
129 public void Constructor_Invalid ()
131 NonAbstractResourcePermissionBase rp = new NonAbstractResourcePermissionBase ((PermissionState)Int32.MaxValue);
132 CheckDefaultValues ("original", rp, false);
133 NonAbstractResourcePermissionBase copy = (NonAbstractResourcePermissionBase)rp.Copy ();
134 CheckDefaultValues ("copy", rp, false);
138 [ExpectedException (typeof (ArgumentNullException))]
139 public void PermissionAccessType_Null ()
141 NonAbstractResourcePermissionBase rp = new NonAbstractResourcePermissionBase ();
142 rp.PermissionAccessType = null;
146 [ExpectedException (typeof (ArgumentException))]
147 public void PermissionAccessType_NonEnum ()
149 NonAbstractResourcePermissionBase rp = new NonAbstractResourcePermissionBase ();
150 rp.PermissionAccessType = typeof (NonAbstractResourcePermissionBase);
154 public void PermissionAccessType ()
156 NonAbstractResourcePermissionBase rp = new NonAbstractResourcePermissionBase ();
157 rp.PermissionAccessType = typeof (PermissionState);
158 Assert.AreEqual (typeof (PermissionState), rp.PermissionAccessType, "PermissionAccessType");
162 [ExpectedException (typeof (ArgumentNullException))]
163 public void TagNames_Null ()
165 NonAbstractResourcePermissionBase rp = new NonAbstractResourcePermissionBase ();
170 [ExpectedException (typeof (ArgumentException))]
171 public void TagNames_Length ()
173 NonAbstractResourcePermissionBase rp = new NonAbstractResourcePermissionBase ();
174 rp.TagNames = new string [0];
178 public void TagNames ()
180 NonAbstractResourcePermissionBase rp = new NonAbstractResourcePermissionBase ();
181 rp.TagNames = new string [2] { "Mono", "Novell" };
182 Assert.AreEqual (2, rp.TagNames.Length, "TagNames");
183 Assert.AreEqual ("Mono", rp.TagNames [0], "TagNames-1");
184 Assert.AreEqual ("Novell", rp.TagNames [1], "TagNames-2");
188 [ExpectedException (typeof (ArgumentNullException))]
189 public void AddPermissionAccess_Null ()
191 NonAbstractResourcePermissionBase rp = new NonAbstractResourcePermissionBase ();
192 rp.AddPermissionAccess (null);
196 [ExpectedException (typeof (InvalidOperationException))]
197 public void AddPermissionAccess_MismatchTag ()
199 NonAbstractResourcePermissionBase rp = new NonAbstractResourcePermissionBase ();
200 rp.TagNames = new string [1] { "Monkeys" };
201 rp.AddPermissionAccess (new ResourcePermissionBaseEntry ());
205 public void AddPermissionAccess ()
207 NonAbstractResourcePermissionBase rp = new NonAbstractResourcePermissionBase ();
208 rp.TagNames = new string [1] { "Monkeys" };
209 ResourcePermissionBaseEntry entry = new ResourcePermissionBaseEntry (0, new string [1] { "Singes" });
210 rp.AddPermissionAccess (entry);
212 ResourcePermissionBaseEntry[] entries = rp.GetPermissionEntries ();
213 Assert.AreEqual (1, entries.Length, "Count");
217 [ExpectedException (typeof (InvalidOperationException))]
218 public void AddPermissionAccess_Duplicates_SameInstance ()
220 NonAbstractResourcePermissionBase rp = new NonAbstractResourcePermissionBase ();
221 rp.TagNames = new string [1] { "Monkeys" };
222 ResourcePermissionBaseEntry entry = new ResourcePermissionBaseEntry (0, new string [1] { "Singes" });
223 rp.AddPermissionAccess (entry);
224 rp.AddPermissionAccess (entry);
228 [ExpectedException (typeof (InvalidOperationException))]
229 public void AddPermissionAccess_Duplicates_DifferentInstances ()
231 NonAbstractResourcePermissionBase rp = new NonAbstractResourcePermissionBase ();
232 rp.TagNames = new string [1] { "Monkeys" };
233 ResourcePermissionBaseEntry entry1 = new ResourcePermissionBaseEntry (0, new string [1] { "Singes" });
234 rp.AddPermissionAccess (entry1);
235 ResourcePermissionBaseEntry entry2 = new ResourcePermissionBaseEntry (0, new string [1] { "Singes" });
236 rp.AddPermissionAccess (entry2);
240 public void AddPermissionAccess_SemiDuplicates ()
242 NonAbstractResourcePermissionBase rp = new NonAbstractResourcePermissionBase ();
243 rp.TagNames = new string [2] { "Monkeys", "Singes" };
244 ResourcePermissionBaseEntry entry1 = new ResourcePermissionBaseEntry (0, new string [2] { "1", "2" });
245 rp.AddPermissionAccess (entry1);
246 ResourcePermissionBaseEntry entry2 = new ResourcePermissionBaseEntry (0, new string [2] { "2", "1" });
247 rp.AddPermissionAccess (entry2);
253 NonAbstractResourcePermissionBase rp = new NonAbstractResourcePermissionBase ();
254 rp.TagNames = new string [1] { "Monkeys" };
256 ResourcePermissionBaseEntry entry = new ResourcePermissionBaseEntry (0, new string [1] { "Singes" });
257 rp.AddPermissionAccess (entry);
258 ResourcePermissionBaseEntry [] entries = rp.GetPermissionEntries ();
259 Assert.AreEqual (1, entries.Length, "Count");
262 entries = rp.GetPermissionEntries ();
263 Assert.AreEqual (0, entries.Length, "Count");
269 NonAbstractResourcePermissionBase rp = new NonAbstractResourcePermissionBase ();
270 rp.PermissionAccessType = typeof (PermissionState);
271 rp.TagNames = new string [1] { "Monkeys" };
273 ResourcePermissionBaseEntry entry = new ResourcePermissionBaseEntry (0, new string [1] { "Singes" });
274 rp.AddPermissionAccess (entry);
276 NonAbstractResourcePermissionBase copy = (NonAbstractResourcePermissionBase) rp.Copy ();
277 Assert.AreEqual (typeof (PermissionState), copy.PermissionAccessType, "PermissionAccessType");
278 Assert.AreEqual ("Monkeys", copy.TagNames [0], "TagNames");
280 ResourcePermissionBaseEntry [] entries = copy.GetPermissionEntries ();
281 Assert.AreEqual (1, entries.Length, "Count");
286 [ExpectedException (typeof (ArgumentNullException))]
288 [ExpectedException (typeof (NullReferenceException))]
290 public void FromXml_Null ()
292 NonAbstractResourcePermissionBase rp = new NonAbstractResourcePermissionBase ();
298 [ExpectedException (typeof (ArgumentException))]
300 public void FromXml_WrongTag ()
302 NonAbstractResourcePermissionBase rp = new NonAbstractResourcePermissionBase ();
303 SecurityElement se = rp.ToXml ();
304 se.Tag = "IMono"; // instead of IPermission
310 [ExpectedException (typeof (ArgumentException))]
312 public void FromXml_WrongTagCase ()
314 NonAbstractResourcePermissionBase rp = new NonAbstractResourcePermissionBase ();
315 SecurityElement se = rp.ToXml ();
316 se.Tag = "IPERMISSION"; // instead of IPermission
321 public void FromXml_WrongClass ()
323 NonAbstractResourcePermissionBase rp = new NonAbstractResourcePermissionBase ();
324 SecurityElement se = rp.ToXml ();
326 SecurityElement w = new SecurityElement (se.Tag);
327 w.AddAttribute ("class", "Wrong" + se.Attribute ("class"));
328 w.AddAttribute ("version", se.Attribute ("version"));
330 // doesn't care of the class name at that stage
331 // anyway the class has already be created so...
335 public void FromXml_NoClass ()
337 NonAbstractResourcePermissionBase rp = new NonAbstractResourcePermissionBase ();
338 SecurityElement se = rp.ToXml ();
340 SecurityElement w = new SecurityElement (se.Tag);
341 w.AddAttribute ("version", se.Attribute ("version"));
343 // doesn't even care of the class attribute presence
348 [ExpectedException (typeof (ArgumentException))]
350 public void FromXml_WrongVersion ()
352 NonAbstractResourcePermissionBase rp = new NonAbstractResourcePermissionBase ();
353 SecurityElement se = rp.ToXml ();
355 SecurityElement w = new SecurityElement (se.Tag);
356 w.AddAttribute ("class", se.Attribute ("class"));
357 w.AddAttribute ("version", "2");
362 public void FromXml_NoVersion ()
364 NonAbstractResourcePermissionBase rp = new NonAbstractResourcePermissionBase ();
365 SecurityElement se = rp.ToXml ();
367 SecurityElement w = new SecurityElement (se.Tag);
368 w.AddAttribute ("class", se.Attribute ("class"));
373 public void GetPermissionEntries ()
375 NonAbstractResourcePermissionBase rp = new NonAbstractResourcePermissionBase ();
376 ResourcePermissionBaseEntry[] entries = rp.GetPermissionEntries ();
377 Assert.AreEqual (0, entries.Length, "Empty");
379 rp.PermissionAccessType = typeof (PermissionState);
380 rp.TagNames = new string [1] { "Monkeys" };
381 ResourcePermissionBaseEntry entry = new ResourcePermissionBaseEntry (0, new string [1] { "Singes" });
382 rp.AddPermissionAccess (entry);
384 entries = rp.GetPermissionEntries ();
385 Assert.AreEqual (1, entries.Length, "Count==1");
388 entries = rp.GetPermissionEntries ();
389 Assert.AreEqual (0, entries.Length, "Count==0");
393 [ExpectedException (typeof (ArgumentException))]
394 public void Intersect_DifferentPermissions ()
396 NonAbstractResourcePermissionBase rp = new NonAbstractResourcePermissionBase ();
397 SecurityPermission b = new SecurityPermission (PermissionState.None);
402 public void IsSubsetOf_DifferentPermissions ()
404 NonAbstractResourcePermissionBase rp = new NonAbstractResourcePermissionBase ();
405 SecurityPermission b = new SecurityPermission (PermissionState.None);
406 // normally (other permissions) this would throw an ArgumentException
407 Assert.IsFalse (rp.IsSubsetOf (b));
411 [ExpectedException (typeof (ArgumentNullException))]
412 public void RemovePermissionAccess_Null ()
414 NonAbstractResourcePermissionBase rp = new NonAbstractResourcePermissionBase ();
415 rp.RemovePermissionAccess (null);
419 [ExpectedException (typeof (InvalidOperationException))]
420 public void RemovePermissionAccess_MismatchTag ()
422 NonAbstractResourcePermissionBase rp = new NonAbstractResourcePermissionBase ();
423 rp.TagNames = new string [1] { "Monkeys" };
424 rp.RemovePermissionAccess (new ResourcePermissionBaseEntry ());
428 public void RemovePermissionAccess ()
430 NonAbstractResourcePermissionBase rp = new NonAbstractResourcePermissionBase ();
431 rp.TagNames = new string [1] { "Monkeys" };
433 ResourcePermissionBaseEntry entry = new ResourcePermissionBaseEntry (0, new string [1] { "Singes" });
434 rp.AddPermissionAccess (entry);
436 ResourcePermissionBaseEntry[] entries = rp.GetPermissionEntries ();
437 Assert.AreEqual (1, entries.Length, "Count==1");
439 rp.RemovePermissionAccess (entry);
440 entries = rp.GetPermissionEntries ();
441 Assert.AreEqual (0, entries.Length, "Count==0");
445 [ExpectedException (typeof (InvalidOperationException))]
446 public void RemovePermissionAccess_Unexisting ()
448 NonAbstractResourcePermissionBase rp = new NonAbstractResourcePermissionBase ();
449 rp.TagNames = new string [1] { "Monkeys" };
451 ResourcePermissionBaseEntry entry = new ResourcePermissionBaseEntry (0, new string [1] { "Singes" });
452 rp.RemovePermissionAccess (entry);
455 private void CheckCommonXml (string msg, SecurityElement se)
457 Assert.AreEqual ("IPermission", se.Tag, msg + "Tag");
458 Assert.IsTrue (se.Attribute ("class").StartsWith ("MonoTests.System.Security.Permissions.NonAbstractResourcePermissionBase, "), msg + "class");
459 Assert.AreEqual ("1", se.Attribute ("version"), msg + "version");
465 NonAbstractResourcePermissionBase rp = new NonAbstractResourcePermissionBase ();
466 rp.TagNames = new string [1] { "Monkeys" };
467 SecurityElement se = rp.ToXml ();
468 CheckCommonXml ("empty", se);
469 Assert.AreEqual (2, se.Attributes.Count, "#attributes");
470 Assert.IsNull (se.Children, "Children");
472 ResourcePermissionBaseEntry entry = new ResourcePermissionBaseEntry (0, new string [1] { "Singes" });
473 rp.AddPermissionAccess (entry);
475 CheckCommonXml ("one", se);
476 Assert.AreEqual (2, se.Attributes.Count, "#attributes");
477 Assert.AreEqual (1, se.Children.Count, "1-Children");
478 SecurityElement child = (SecurityElement) se.Children [0];
479 Assert.AreEqual ("Monkeys", child.Tag, "Monkeys");
480 Assert.AreEqual ("Singes", child.Attribute ("name"), "Singes");
484 public void ToXml_Unrestricted ()
486 NonAbstractResourcePermissionBase rp = new NonAbstractResourcePermissionBase (PermissionState.Unrestricted);
487 rp.TagNames = new string [1] { "Monkeys" };
488 SecurityElement se = rp.ToXml ();
489 CheckCommonXml ("empty", se);
490 Assert.AreEqual (3, se.Attributes.Count, "#attributes");
491 Assert.AreEqual ("true", se.Attribute ("Unrestricted"), "Unrestricted");
492 Assert.IsNull (se.Children, "Children");
494 ResourcePermissionBaseEntry entry = new ResourcePermissionBaseEntry (0, new string [1] { "Singes" });
495 rp.AddPermissionAccess (entry);
497 CheckCommonXml ("one", se);
498 Assert.AreEqual (3, se.Attributes.Count, "#attributes");
499 // not XML output of childrens for unrestricted
500 Assert.IsNull (se.Children, "Children");
506 NonAbstractResourcePermissionBase a = new NonAbstractResourcePermissionBase ();
507 NonAbstractResourcePermissionBase z = (NonAbstractResourcePermissionBase) a.Union (null);
508 CheckDefaultValues ("Empty U null", z, false);
509 Assert.IsFalse (Object.ReferenceEquals (a, z), "!ReferenceEquals1");
511 NonAbstractResourcePermissionBase b = new NonAbstractResourcePermissionBase (PermissionState.None);
512 z = (NonAbstractResourcePermissionBase) a.Union (b);
513 Assert.IsNull (z, "Empty U Empty");
515 NonAbstractResourcePermissionBase u = new NonAbstractResourcePermissionBase (PermissionState.Unrestricted);
516 z = (NonAbstractResourcePermissionBase) u.Union (b);
517 CheckDefaultValues ("Unrestricted U Empty", z, true);
518 Assert.IsFalse (Object.ReferenceEquals (u, z), "!ReferenceEquals2");
519 Assert.IsFalse (Object.ReferenceEquals (b, z), "!ReferenceEquals3");
521 z = (NonAbstractResourcePermissionBase)b.Union (u);
522 CheckDefaultValues ("Empty U Unrestricted", z, true);
523 Assert.IsFalse (Object.ReferenceEquals (u, z), "!ReferenceEquals4");
524 Assert.IsFalse (Object.ReferenceEquals (b, z), "!ReferenceEquals5");
528 [ExpectedException (typeof (ArgumentException))]
529 public void Union_DifferentPermissions ()
531 NonAbstractResourcePermissionBase rp = new NonAbstractResourcePermissionBase ();
532 SecurityPermission b = new SecurityPermission (PermissionState.None);
537 public void Unrestricted_AddRemove ()
539 NonAbstractResourcePermissionBase rp = new NonAbstractResourcePermissionBase (PermissionState.Unrestricted);
540 rp.TagNames = new string [1] { "Monkeys" };
542 ResourcePermissionBaseEntry entry = new ResourcePermissionBaseEntry (0, new string [1] { "Singes" });
543 rp.AddPermissionAccess (entry);
545 ResourcePermissionBaseEntry [] entries = rp.GetPermissionEntries ();
546 Assert.AreEqual (1, entries.Length, "Count==1");
548 rp.RemovePermissionAccess (entry);
549 entries = rp.GetPermissionEntries ();
550 Assert.AreEqual (0, entries.Length, "Count==0");