[bcl] Remove more NET_2_0 checks from class libs
[mono.git] / mcs / class / System.DirectoryServices / Test / System.DirectoryServices / DirectoryServicesPermissionTest.cs
1 //\r
2 // DirectoryServicesPermissionTest.cs -\r
3 //      NUnit Test Cases for DirectoryServicesPermission\r
4 //\r
5 // Author:\r
6 //      Sebastien Pouliot  <sebastien@ximian.com>\r
7 //\r
8 // Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)\r
9 //\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
17 // \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
20 // \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
28 //\r
29 \r
30 using NUnit.Framework;\r
31 using System;\r
32 using System.DirectoryServices;\r
33 using System.Security;\r
34 using System.Security.Permissions;\r
35 \r
36 using System.Diagnostics;\r
37 \r
38 namespace MonoTests.System.DirectoryServices {\r
39 \r
40         [TestFixture]\r
41         public class DirectoryServicesPermissionTest {\r
42 \r
43                 static DirectoryServicesPermissionAccess[] AllAccess = {\r
44                         DirectoryServicesPermissionAccess.None,\r
45                         DirectoryServicesPermissionAccess.Browse,\r
46                         DirectoryServicesPermissionAccess.Write,\r
47                         DirectoryServicesPermissionAccess.Browse | DirectoryServicesPermissionAccess.Write,\r
48                 };\r
49 \r
50                 [Test]\r
51                 public void PermissionState_None ()\r
52                 {\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
57 \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
62 \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
67                 }\r
68 \r
69                 [Test]\r
70                 public void PermissionState_Unrestricted ()\r
71                 {\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
76 \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
81 \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
86                 }\r
87 \r
88                 [Test]\r
89                 [ExpectedException (typeof (ArgumentException))]\r
90                 public void PermissionState_Bad ()\r
91                 {\r
92                         PermissionState ps = (PermissionState)77;\r
93                         DirectoryServicesPermission dsp = new DirectoryServicesPermission (ps);\r
94                         Assert.IsFalse (dsp.IsUnrestricted (), "IsUnrestricted");\r
95                 }\r
96 \r
97                 [Test]\r
98                 public void DirectoryServicesPermissionAccesss_Bad ()\r
99                 {\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
105                 }\r
106 \r
107                 [Test]\r
108                 public void PermissionEntries () \r
109                 {\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
114 \r
115                         DirectoryServicesPermissionEntry dspe = new DirectoryServicesPermissionEntry (DirectoryServicesPermissionAccess.Browse, "*");\r
116                         dsp.PermissionEntries.Add (dspe);\r
117                         Assert.AreEqual (2, dspec.Count, "Count==2");\r
118 \r
119                         // remove (same instance)\r
120                         dsp.PermissionEntries.Remove (dspe);\r
121                         Assert.AreEqual (1, dspec.Count, "Count==1 (b)");\r
122 \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
126                 }\r
127 \r
128                 [Test]\r
129                 public void Copy ()\r
130                 {\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
139                         }\r
140                 }\r
141 \r
142                 [Test]\r
143                 public void Intersect_Null ()\r
144                 {\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
148                 }\r
149 \r
150                 [Test]\r
151                 public void Intersect_None ()\r
152                 {\r
153                         DirectoryServicesPermission dsp1 = new DirectoryServicesPermission (PermissionState.None);\r
154                         DirectoryServicesPermission dsp2 = new DirectoryServicesPermission (PermissionState.None);\r
155                         // 1. None N None\r
156                         DirectoryServicesPermission result = (DirectoryServicesPermission) dsp1.Intersect (dsp2);\r
157                         Assert.IsNull (result, "Empty N Empty");\r
158                         // 2. None N Entry\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
162                         // 3. Entry N None\r
163                         result = (DirectoryServicesPermission) dsp2.Intersect (dsp1);\r
164                         Assert.IsNull (result, "Entry N Empty");\r
165                 }\r
166 \r
167                 [Test]\r
168                 public void Intersect_Unrestricted ()\r
169                 {\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
174 \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
179 \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
184 \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
189 \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
195 \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
200 \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
206                 }\r
207 \r
208                 [Test]\r
209                 public void IsSubset_Null ()\r
210                 {\r
211                         DirectoryServicesPermission dsp = new DirectoryServicesPermission (PermissionState.None);\r
212                         Assert.IsTrue (dsp.IsSubsetOf (null), "null");\r
213                 }\r
214 \r
215                 [Test]\r
216                 public void IsSubset_None ()\r
217                 {\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
227                         }\r
228                 }\r
229 \r
230                 [Test]\r
231                 public void IsSubset_Self ()\r
232                 {\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
237                         }\r
238                 }\r
239 \r
240                 [Test]\r
241                 public void IsSubset_Unrestricted ()\r
242                 {\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
252                         }\r
253                         Assert.IsTrue (dsp1.IsSubsetOf (dsp1), "Unrestricted.IsSubsetOf(Unrestricted)");\r
254                 }\r
255 \r
256                 [Test]\r
257                 public void Union_Null ()\r
258                 {\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
264                 }\r
265 \r
266                 [Test]\r
267                 public void Union_None ()\r
268                 {\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
276 \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
280                         }\r
281                 }\r
282 \r
283                 [Test]\r
284                 public void Union_Self ()\r
285                 {\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
292                         }\r
293                 }\r
294 \r
295                 [Test]\r
296                 public void Union_Unrestricted ()\r
297                 {\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
306 \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
310                         }\r
311                 }\r
312 \r
313                 [Test]\r
314                 [ExpectedException (typeof (ArgumentNullException))]\r
315                 public void FromXml_Null ()\r
316                 {\r
317                         DirectoryServicesPermission dsp = new DirectoryServicesPermission (PermissionState.None);\r
318                         dsp.FromXml (null);\r
319                 }\r
320 \r
321                 [Test]\r
322                 [ExpectedException (typeof (ArgumentException))]\r
323                 public void FromXml_WrongTag ()\r
324                 {\r
325                         DirectoryServicesPermission dsp = new DirectoryServicesPermission (PermissionState.None);\r
326                         SecurityElement se = dsp.ToXml ();\r
327                         se.Tag = "IMono";\r
328                         dsp.FromXml (se);\r
329                         // note: normally IPermission classes (in corlib) DO care about the\r
330                         // IPermission tag\r
331                 }\r
332 \r
333                 [Test]\r
334                 [ExpectedException (typeof (ArgumentException))]\r
335                 public void FromXml_WrongTagCase ()\r
336                 {\r
337                         DirectoryServicesPermission dsp = new DirectoryServicesPermission (PermissionState.None);\r
338                         SecurityElement se = dsp.ToXml ();\r
339                         se.Tag = "IPERMISSION"; // instead of IPermission\r
340                         dsp.FromXml (se);\r
341                         // note: normally IPermission classes (in corlib) DO care about the\r
342                         // IPermission tag\r
343                 }\r
344 \r
345                 [Test]\r
346                 public void FromXml_WrongClass ()\r
347                 {\r
348                         DirectoryServicesPermission dsp = new DirectoryServicesPermission (PermissionState.None);\r
349                         SecurityElement se = dsp.ToXml ();\r
350 \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
354                         dsp.FromXml (w);\r
355                         // doesn't care of the class name at that stage\r
356                         // anyway the class has already be created so...\r
357                 }\r
358 \r
359                 [Test]\r
360                 public void FromXml_NoClass ()\r
361                 {\r
362                         DirectoryServicesPermission dsp = new DirectoryServicesPermission (PermissionState.None);\r
363                         SecurityElement se = dsp.ToXml ();\r
364 \r
365                         SecurityElement w = new SecurityElement (se.Tag);\r
366                         w.AddAttribute ("version", se.Attribute ("version"));\r
367                         dsp.FromXml (w);\r
368                         // doesn't even care of the class attribute presence\r
369                 }\r
370 \r
371                 [Test]\r
372                 [ExpectedException (typeof (ArgumentException))]\r
373                 public void FromXml_WrongVersion ()\r
374                 {\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
379                         dsp.FromXml (se);\r
380                 }\r
381 \r
382                 [Test]\r
383                 public void FromXml_NoVersion ()\r
384                 {\r
385                         DirectoryServicesPermission dsp = new DirectoryServicesPermission (PermissionState.None);\r
386                         SecurityElement se = dsp.ToXml ();\r
387 \r
388                         SecurityElement w = new SecurityElement (se.Tag);\r
389                         w.AddAttribute ("class", se.Attribute ("class"));\r
390                         dsp.FromXml (w);\r
391                 }\r
392         }\r
393 }\r