2 // DirectoryServicesPermissionTest.cs -
\r
3 // NUnit Test Cases for DirectoryServicesPermission
\r
6 // Sebastien Pouliot <sebastien@ximian.com>
\r
8 // Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)
\r
10 // Permission is hereby granted, free of charge, to any person obtaining
\r
11 // a copy of this software and associated documentation files (the
\r
12 // "Software"), to deal in the Software without restriction, including
\r
13 // without limitation the rights to use, copy, modify, merge, publish,
\r
14 // distribute, sublicense, and/or sell copies of the Software, and to
\r
15 // permit persons to whom the Software is furnished to do so, subject to
\r
16 // the following conditions:
\r
18 // The above copyright notice and this permission notice shall be
\r
19 // included in all copies or substantial portions of the Software.
\r
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
\r
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
\r
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
\r
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
\r
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
\r
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
\r
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\r
30 using NUnit.Framework;
\r
32 using System.DirectoryServices;
\r
33 using System.Security;
\r
34 using System.Security.Permissions;
\r
36 using System.Diagnostics;
\r
38 namespace MonoTests.System.DirectoryServices {
\r
41 public class DirectoryServicesPermissionTest {
\r
43 static DirectoryServicesPermissionAccess[] AllAccess = {
\r
44 DirectoryServicesPermissionAccess.None,
\r
45 DirectoryServicesPermissionAccess.Browse,
\r
46 DirectoryServicesPermissionAccess.Write,
\r
47 DirectoryServicesPermissionAccess.Browse | DirectoryServicesPermissionAccess.Write,
\r
51 public void PermissionState_None ()
\r
53 PermissionState ps = PermissionState.None;
\r
54 DirectoryServicesPermission dsp = new DirectoryServicesPermission (ps);
\r
55 Assert.AreEqual (0, dsp.PermissionEntries.Count, "PermissionEntries");
\r
56 Assert.IsFalse (dsp.IsUnrestricted (), "IsUnrestricted");
\r
58 SecurityElement se = dsp.ToXml ();
\r
59 // only class and version are present
\r
60 Assert.AreEqual (2, se.Attributes.Count, "Xml-Attributes");
\r
61 Assert.IsNull (se.Children, "Xml-Children");
\r
63 DirectoryServicesPermission copy = (DirectoryServicesPermission)dsp.Copy ();
\r
64 Assert.IsFalse (Object.ReferenceEquals (dsp, copy), "ReferenceEquals");
\r
65 Assert.AreEqual (dsp.PermissionEntries.Count, copy.PermissionEntries.Count, "copy-PermissionEntries");
\r
66 Assert.AreEqual (dsp.IsUnrestricted (), copy.IsUnrestricted (), "IsUnrestricted ()");
\r
70 public void PermissionState_Unrestricted ()
\r
72 PermissionState ps = PermissionState.Unrestricted;
\r
73 DirectoryServicesPermission dsp = new DirectoryServicesPermission (ps);
\r
74 Assert.AreEqual (0, dsp.PermissionEntries.Count, "PermissionEntries");
\r
75 Assert.IsTrue (dsp.IsUnrestricted (), "IsUnrestricted");
\r
77 SecurityElement se = dsp.ToXml ();
\r
78 // only class and version are present
\r
79 Assert.AreEqual ("true", se.Attribute ("Unrestricted"), "Xml-Unrestricted");
\r
80 Assert.IsNull (se.Children, "Xml-Children");
\r
82 DirectoryServicesPermission copy = (DirectoryServicesPermission)dsp.Copy ();
\r
83 Assert.IsFalse (Object.ReferenceEquals (dsp, copy), "ReferenceEquals");
\r
84 Assert.AreEqual (dsp.PermissionEntries.Count, copy.PermissionEntries.Count, "copy-PermissionEntries");
\r
85 Assert.AreEqual (dsp.IsUnrestricted (), copy.IsUnrestricted (), "copy-IsUnrestricted ()");
\r
89 [ExpectedException (typeof (ArgumentException))]
\r
90 public void PermissionState_Bad ()
\r
92 PermissionState ps = (PermissionState)77;
\r
93 DirectoryServicesPermission dsp = new DirectoryServicesPermission (ps);
\r
94 Assert.IsFalse (dsp.IsUnrestricted (), "IsUnrestricted");
\r
98 public void DirectoryServicesPermissionAccesss_Bad ()
\r
100 DirectoryServicesPermissionAccess dspa = (DirectoryServicesPermissionAccess) Int32.MinValue;
\r
101 DirectoryServicesPermission dsp = new DirectoryServicesPermission (dspa, String.Empty);
\r
102 Assert.AreEqual (1, dsp.PermissionEntries.Count, "Count");
\r
103 Assert.AreEqual ((DirectoryServicesPermissionAccess)Int32.MinValue, dsp.PermissionEntries [0].PermissionAccess, "PermissionAccess");
\r
104 Assert.AreEqual (String.Empty, dsp.PermissionEntries [0].Path, "Path");
\r
108 public void PermissionEntries ()
\r
110 DirectoryServicesPermissionAccess dspa = DirectoryServicesPermissionAccess.None;
\r
111 DirectoryServicesPermission dsp = new DirectoryServicesPermission (dspa, String.Empty);
\r
112 DirectoryServicesPermissionEntryCollection dspec = dsp.PermissionEntries;
\r
113 Assert.AreEqual (1, dspec.Count, "Count==1");
\r
115 DirectoryServicesPermissionEntry dspe = new DirectoryServicesPermissionEntry (DirectoryServicesPermissionAccess.Browse, "*");
\r
116 dsp.PermissionEntries.Add (dspe);
\r
117 Assert.AreEqual (2, dspec.Count, "Count==2");
\r
119 // remove (same instance)
\r
120 dsp.PermissionEntries.Remove (dspe);
\r
121 Assert.AreEqual (1, dspec.Count, "Count==1 (b)");
\r
123 // remove different instance (doesn't work)
\r
124 dspe = new DirectoryServicesPermissionEntry (DirectoryServicesPermissionAccess.None, String.Empty);
\r
125 Assert.AreEqual (1, dspec.Count, "Count==1");
\r
129 public void Copy ()
\r
131 foreach (DirectoryServicesPermissionAccess ppl in AllAccess) {
\r
132 DirectoryServicesPermission dsp = new DirectoryServicesPermission (PermissionState.None);
\r
133 DirectoryServicesPermissionEntry dspe = new DirectoryServicesPermissionEntry (ppl, ppl.ToString ());
\r
134 dsp.PermissionEntries.Add (dspe);
\r
135 DirectoryServicesPermission copy = (DirectoryServicesPermission)dsp.Copy ();
\r
136 Assert.AreEqual (1, copy.PermissionEntries.Count, "Count==1");
\r
137 Assert.AreEqual (ppl, dsp.PermissionEntries [0].PermissionAccess, ppl.ToString ());
\r
138 Assert.AreEqual (ppl.ToString (), dsp.PermissionEntries [0].Path, ppl.ToString () + "-Path");
\r
143 public void Intersect_Null ()
\r
145 DirectoryServicesPermission dsp = new DirectoryServicesPermission (PermissionState.None);
\r
146 // No intersection with null
\r
147 Assert.IsNull (dsp.Intersect (null), "None N null");
\r
151 public void Intersect_None ()
\r
153 DirectoryServicesPermission dsp1 = new DirectoryServicesPermission (PermissionState.None);
\r
154 DirectoryServicesPermission dsp2 = new DirectoryServicesPermission (PermissionState.None);
\r
156 DirectoryServicesPermission result = (DirectoryServicesPermission) dsp1.Intersect (dsp2);
\r
157 Assert.IsNull (result, "Empty N Empty");
\r
159 dsp2.PermissionEntries.Add (new DirectoryServicesPermissionEntry (DirectoryServicesPermissionAccess.None, String.Empty));
\r
160 result = (DirectoryServicesPermission) dsp1.Intersect (dsp2);
\r
161 Assert.IsNull (result, "Empty N Entry");
\r
163 result = (DirectoryServicesPermission) dsp2.Intersect (dsp1);
\r
164 Assert.IsNull (result, "Entry N Empty");
\r
168 public void Intersect_Unrestricted ()
\r
170 // Intersection with unrestricted == Copy
\r
171 // a. source (this) is unrestricted
\r
172 DirectoryServicesPermission dsp1 = new DirectoryServicesPermission (PermissionState.Unrestricted);
\r
173 DirectoryServicesPermission dsp2 = new DirectoryServicesPermission (PermissionState.None);
\r
175 // 1. Unrestricted N None
\r
176 DirectoryServicesPermission result = (DirectoryServicesPermission) dsp1.Intersect (dsp2);
\r
177 Assert.IsFalse (result.IsUnrestricted (), "(Unrestricted N None).IsUnrestricted");
\r
178 Assert.AreEqual (0, result.PermissionEntries.Count, "(Unrestricted N None).Count");
\r
180 // 2. None N Unrestricted
\r
181 result = (DirectoryServicesPermission) dsp2.Intersect (dsp1);
\r
182 Assert.IsFalse (result.IsUnrestricted (), "(None N Unrestricted).IsUnrestricted");
\r
183 Assert.AreEqual (0, result.PermissionEntries.Count, "(None N Unrestricted).Count");
\r
185 // 3. Unrestricted N Unrestricted
\r
186 result = (DirectoryServicesPermission) dsp1.Intersect (dsp1);
\r
187 Assert.IsTrue (result.IsUnrestricted (), "(Unrestricted N Unrestricted).IsUnrestricted");
\r
188 Assert.AreEqual (0, result.PermissionEntries.Count, "(Unrestricted N Unrestricted).Count");
\r
190 // 4. Unrestricted N Entry
\r
191 dsp2.PermissionEntries.Add (new DirectoryServicesPermissionEntry (DirectoryServicesPermissionAccess.None, String.Empty));
\r
192 result = (DirectoryServicesPermission)dsp1.Intersect (dsp2);
\r
193 Assert.IsFalse (result.IsUnrestricted (), "(Unrestricted N Entry).IsUnrestricted");
\r
194 Assert.AreEqual (1, result.PermissionEntries.Count, "(Unrestricted N Entry).Count");
\r
196 // 5. Entry N Unrestricted
\r
197 result = (DirectoryServicesPermission)dsp2.Intersect (dsp1);
\r
198 Assert.IsFalse (result.IsUnrestricted (), "(Entry N Unrestricted).IsUnrestricted");
\r
199 Assert.AreEqual (1, result.PermissionEntries.Count, "(Entry N Unrestricted).Count");
\r
201 // 6. Unrestricted N Unrestricted
\r
202 dsp1.PermissionEntries.Add (new DirectoryServicesPermissionEntry (DirectoryServicesPermissionAccess.None, String.Empty));
\r
203 result = (DirectoryServicesPermission)dsp1.Intersect (dsp1);
\r
204 Assert.IsTrue (result.IsUnrestricted (), "(Unrestricted N Unrestricted).IsUnrestricted");
\r
205 Assert.AreEqual (1, result.PermissionEntries.Count, "(Unrestricted N Unrestricted).Count");
\r
209 public void IsSubset_Null ()
\r
211 DirectoryServicesPermission dsp = new DirectoryServicesPermission (PermissionState.None);
\r
212 Assert.IsTrue (dsp.IsSubsetOf (null), "null");
\r
216 public void IsSubset_None ()
\r
218 // IsSubset with none
\r
219 // a. source (this) is none -> target is never a subset
\r
220 // b. destination (target) is none -> target is always a subset
\r
221 DirectoryServicesPermission dsp1 = new DirectoryServicesPermission (PermissionState.None);
\r
222 foreach (DirectoryServicesPermissionAccess ppl in AllAccess) {
\r
223 DirectoryServicesPermission dsp2 = new DirectoryServicesPermission (PermissionState.None);
\r
224 dsp2.PermissionEntries.Add (new DirectoryServicesPermissionEntry (ppl, ppl.ToString ()));
\r
225 Assert.IsTrue (dsp1.IsSubsetOf (dsp2), "target " + ppl.ToString ());
\r
226 Assert.IsFalse (dsp2.IsSubsetOf (dsp1), "source " + ppl.ToString ());
\r
231 public void IsSubset_Self ()
\r
233 foreach (DirectoryServicesPermissionAccess ppl in AllAccess) {
\r
234 DirectoryServicesPermission dsp = new DirectoryServicesPermission (PermissionState.None);
\r
235 dsp.PermissionEntries.Add (new DirectoryServicesPermissionEntry (ppl, ppl.ToString ()));
\r
236 Assert.IsTrue (dsp.IsSubsetOf (dsp), ppl.ToString ());
\r
241 public void IsSubset_Unrestricted ()
\r
243 // IsSubset with unrestricted
\r
244 // a. source (this) is unrestricted -> target is never a subset
\r
245 // b. destination (target) is unrestricted -> source is always a subset
\r
246 DirectoryServicesPermission dsp1 = new DirectoryServicesPermission (PermissionState.Unrestricted);
\r
247 foreach (DirectoryServicesPermissionAccess ppl in AllAccess) {
\r
248 DirectoryServicesPermission dsp2 = new DirectoryServicesPermission (PermissionState.None);
\r
249 dsp2.PermissionEntries.Add (new DirectoryServicesPermissionEntry (ppl, ppl.ToString ()));
\r
250 Assert.IsFalse (dsp1.IsSubsetOf (dsp2), "target " + ppl.ToString ());
\r
251 Assert.IsTrue (dsp2.IsSubsetOf (dsp1), "source " + ppl.ToString ());
\r
253 Assert.IsTrue (dsp1.IsSubsetOf (dsp1), "Unrestricted.IsSubsetOf(Unrestricted)");
\r
257 public void Union_Null ()
\r
259 DirectoryServicesPermission dsp = new DirectoryServicesPermission (PermissionState.None);
\r
260 dsp.PermissionEntries.Add (new DirectoryServicesPermissionEntry (DirectoryServicesPermissionAccess.None, String.Empty));
\r
261 // Union with null is a simple copy
\r
262 DirectoryServicesPermission union = (DirectoryServicesPermission)dsp.Union (null);
\r
263 Assert.IsNotNull (dsp.PermissionEntries.Count, "Count");
\r
267 public void Union_None ()
\r
269 DirectoryServicesPermission dsp1 = new DirectoryServicesPermission (PermissionState.None);
\r
270 foreach (DirectoryServicesPermissionAccess ppl in AllAccess) {
\r
271 DirectoryServicesPermission dsp2 = new DirectoryServicesPermission (PermissionState.None);
\r
272 dsp2.PermissionEntries.Add (new DirectoryServicesPermissionEntry (ppl, ppl.ToString ()));
\r
273 DirectoryServicesPermission union = (DirectoryServicesPermission) dsp1.Union (dsp2);
\r
274 Assert.IsFalse (union.IsUnrestricted (), "target.IsUnrestricted " + ppl.ToString ());
\r
275 Assert.AreEqual (1, union.PermissionEntries.Count, "target.Count " + ppl.ToString ());
\r
277 union = (DirectoryServicesPermission) dsp2.Union (dsp1);
\r
278 Assert.IsFalse (union.IsUnrestricted (), "source.IsUnrestricted " + ppl.ToString ());
\r
279 Assert.AreEqual (1, union.PermissionEntries.Count, "source.Count " + ppl.ToString ());
\r
284 public void Union_Self ()
\r
286 foreach (DirectoryServicesPermissionAccess ppl in AllAccess) {
\r
287 DirectoryServicesPermission dsp = new DirectoryServicesPermission (PermissionState.None);
\r
288 dsp.PermissionEntries.Add (new DirectoryServicesPermissionEntry (ppl, ppl.ToString ()));
\r
289 DirectoryServicesPermission union = (DirectoryServicesPermission)dsp.Union (dsp);
\r
290 Assert.IsFalse (union.IsUnrestricted (), "IsUnrestricted " + ppl.ToString ());
\r
291 Assert.AreEqual (1, union.PermissionEntries.Count, "Count " + ppl.ToString ());
\r
296 public void Union_Unrestricted ()
\r
298 // Union with unrestricted is unrestricted
\r
299 DirectoryServicesPermission dsp1 = new DirectoryServicesPermission (PermissionState.Unrestricted);
\r
300 foreach (DirectoryServicesPermissionAccess ppl in AllAccess) {
\r
301 DirectoryServicesPermission dsp2 = new DirectoryServicesPermission (PermissionState.None);
\r
302 dsp2.PermissionEntries.Add (new DirectoryServicesPermissionEntry (ppl, ppl.ToString ()));
\r
303 DirectoryServicesPermission union = (DirectoryServicesPermission)dsp1.Union (dsp2);
\r
304 Assert.IsTrue (union.IsUnrestricted (), "target.IsUnrestricted " + ppl.ToString ());
\r
305 Assert.AreEqual (0, union.PermissionEntries.Count, "target.Count " + ppl.ToString ());
\r
307 union = (DirectoryServicesPermission)dsp2.Union (dsp1);
\r
308 Assert.IsTrue (union.IsUnrestricted (), "source.IsUnrestricted " + ppl.ToString ());
\r
309 Assert.AreEqual (0, union.PermissionEntries.Count, "source.Count " + ppl.ToString ());
\r
314 [ExpectedException (typeof (ArgumentNullException))]
\r
315 public void FromXml_Null ()
\r
317 DirectoryServicesPermission dsp = new DirectoryServicesPermission (PermissionState.None);
\r
318 dsp.FromXml (null);
\r
322 [ExpectedException (typeof (ArgumentException))]
\r
323 public void FromXml_WrongTag ()
\r
325 DirectoryServicesPermission dsp = new DirectoryServicesPermission (PermissionState.None);
\r
326 SecurityElement se = dsp.ToXml ();
\r
329 // note: normally IPermission classes (in corlib) DO care about the
\r
334 [ExpectedException (typeof (ArgumentException))]
\r
335 public void FromXml_WrongTagCase ()
\r
337 DirectoryServicesPermission dsp = new DirectoryServicesPermission (PermissionState.None);
\r
338 SecurityElement se = dsp.ToXml ();
\r
339 se.Tag = "IPERMISSION"; // instead of IPermission
\r
341 // note: normally IPermission classes (in corlib) DO care about the
\r
346 public void FromXml_WrongClass ()
\r
348 DirectoryServicesPermission dsp = new DirectoryServicesPermission (PermissionState.None);
\r
349 SecurityElement se = dsp.ToXml ();
\r
351 SecurityElement w = new SecurityElement (se.Tag);
\r
352 w.AddAttribute ("class", "Wrong" + se.Attribute ("class"));
\r
353 w.AddAttribute ("version", se.Attribute ("version"));
\r
355 // doesn't care of the class name at that stage
\r
356 // anyway the class has already be created so...
\r
360 public void FromXml_NoClass ()
\r
362 DirectoryServicesPermission dsp = new DirectoryServicesPermission (PermissionState.None);
\r
363 SecurityElement se = dsp.ToXml ();
\r
365 SecurityElement w = new SecurityElement (se.Tag);
\r
366 w.AddAttribute ("version", se.Attribute ("version"));
\r
368 // doesn't even care of the class attribute presence
\r
372 [ExpectedException (typeof (ArgumentException))]
\r
373 public void FromXml_WrongVersion ()
\r
375 DirectoryServicesPermission dsp = new DirectoryServicesPermission (PermissionState.None);
\r
376 SecurityElement se = dsp.ToXml ();
\r
377 se.Attributes.Remove ("version");
\r
378 se.Attributes.Add ("version", "2");
\r
383 public void FromXml_NoVersion ()
\r
385 DirectoryServicesPermission dsp = new DirectoryServicesPermission (PermissionState.None);
\r
386 SecurityElement se = dsp.ToXml ();
\r
388 SecurityElement w = new SecurityElement (se.Tag);
\r
389 w.AddAttribute ("class", se.Attribute ("class"));
\r