2 // ServiceControllerPermissionTest.cs -
3 // NUnit Test Cases for ServiceControllerPermission
6 // Sebastien Pouliot <sebastien@ximian.com>
8 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 using NUnit
.Framework
;
32 using System
.Security
;
33 using System
.Security
.Permissions
;
34 using System
.ServiceProcess
;
36 namespace MonoTests
.System
.ServiceProcess
{
39 public class ServiceControllerPermissionTest
{
41 static ServiceControllerPermissionAccess
[] AllAccess
= {
42 ServiceControllerPermissionAccess
.None
,
43 ServiceControllerPermissionAccess
.Browse
,
44 ServiceControllerPermissionAccess
.Control
,
48 public void PermissionState_None ()
50 PermissionState ps
= PermissionState
.None
;
51 ServiceControllerPermission scp
= new ServiceControllerPermission (ps
);
52 Assert
.AreEqual (0, scp
.PermissionEntries
.Count
, "PermissionEntries");
53 Assert
.IsFalse (scp
.IsUnrestricted (), "IsUnrestricted");
55 SecurityElement se
= scp
.ToXml ();
56 // only class and version are present
57 Assert
.AreEqual (2, se
.Attributes
.Count
, "Xml-Attributes");
58 Assert
.IsNull (se
.Children
, "Xml-Children");
60 ServiceControllerPermission copy
= (ServiceControllerPermission
)scp
.Copy ();
61 Assert
.IsFalse (Object
.ReferenceEquals (scp
, copy
), "ReferenceEquals");
62 Assert
.AreEqual (scp
.PermissionEntries
.Count
, copy
.PermissionEntries
.Count
, "copy-PermissionEntries");
63 Assert
.AreEqual (scp
.IsUnrestricted (), copy
.IsUnrestricted (), "IsUnrestricted ()");
67 public void PermissionState_Unrestricted ()
69 PermissionState ps
= PermissionState
.Unrestricted
;
70 ServiceControllerPermission scp
= new ServiceControllerPermission (ps
);
71 Assert
.AreEqual (0, scp
.PermissionEntries
.Count
, "PermissionEntries");
72 Assert
.IsTrue (scp
.IsUnrestricted (), "IsUnrestricted");
74 SecurityElement se
= scp
.ToXml ();
75 // only class and version are present
76 Assert
.AreEqual ("true", se
.Attribute ("Unrestricted"), "Xml-Unrestricted");
77 Assert
.IsNull (se
.Children
, "Xml-Children");
79 ServiceControllerPermission copy
= (ServiceControllerPermission
)scp
.Copy ();
80 Assert
.IsFalse (Object
.ReferenceEquals (scp
, copy
), "ReferenceEquals");
81 Assert
.AreEqual (scp
.PermissionEntries
.Count
, copy
.PermissionEntries
.Count
, "copy-PermissionEntries");
82 Assert
.AreEqual (scp
.IsUnrestricted (), copy
.IsUnrestricted (), "copy-IsUnrestricted ()");
86 // strange as ancestors does the checking (reported as FDBK15131)
87 // [ExpectedException (typeof (ArgumentException))]
88 public void PermissionState_Bad ()
90 PermissionState ps
= (PermissionState
)77;
91 ServiceControllerPermission scp
= new ServiceControllerPermission (ps
);
92 Assert
.IsFalse (scp
.IsUnrestricted (), "IsUnrestricted");
96 public void ServiceControllerPermissionAccesss_Bad ()
98 ServiceControllerPermissionAccess scpa
= (ServiceControllerPermissionAccess
)Int32
.MinValue
;
99 ServiceControllerPermission scp
= new ServiceControllerPermission (scpa
, "localhost", "http");
100 Assert
.AreEqual (1, scp
.PermissionEntries
.Count
, "Count");
101 Assert
.AreEqual ((ServiceControllerPermissionAccess
)Int32
.MinValue
, scp
.PermissionEntries
[0].PermissionAccess
, "PermissionAccess");
105 public void PermissionEntries ()
107 ServiceControllerPermissionAccess scpa
= ServiceControllerPermissionAccess
.None
;
108 ServiceControllerPermission scp
= new ServiceControllerPermission (scpa
, "localhost", "http");
109 ServiceControllerPermissionEntryCollection scpec
= scp
.PermissionEntries
;
110 Assert
.AreEqual (1, scpec
.Count
, "Count==1");
112 ServiceControllerPermissionEntry scpe
= new ServiceControllerPermissionEntry (ServiceControllerPermissionAccess
.Browse
, "*", "ftp");
113 scp
.PermissionEntries
.Add (scpe
);
114 Assert
.AreEqual (2, scpec
.Count
, "Count==2");
116 // remove (same instance)
117 scp
.PermissionEntries
.Remove (scpe
);
118 Assert
.AreEqual (1, scpec
.Count
, "Count==1 (b)");
120 // remove different instance (doesn't work)
121 scpe
= new ServiceControllerPermissionEntry (ServiceControllerPermissionAccess
.None
, "localhost", "http");
122 Assert
.AreEqual (1, scpec
.Count
, "Count==1");
128 foreach (ServiceControllerPermissionAccess scpa
in AllAccess
) {
129 ServiceControllerPermission scp
= new ServiceControllerPermission (PermissionState
.None
);
130 ServiceControllerPermissionEntry scpe
= new ServiceControllerPermissionEntry (scpa
, "localhost", scpa
.ToString ());
131 scp
.PermissionEntries
.Add (scpe
);
132 ServiceControllerPermission copy
= (ServiceControllerPermission
)scp
.Copy ();
133 Assert
.AreEqual (1, copy
.PermissionEntries
.Count
, "Count==1");
134 Assert
.AreEqual (scpa
, scp
.PermissionEntries
[0].PermissionAccess
, scpa
.ToString ());
139 public void Intersect_Null ()
141 ServiceControllerPermission scp
= new ServiceControllerPermission (PermissionState
.None
);
142 // No intersection with null
143 Assert
.IsNull (scp
.Intersect (null), "None N null");
147 public void Intersect_None ()
149 ServiceControllerPermission scp1
= new ServiceControllerPermission (PermissionState
.None
);
150 ServiceControllerPermission scp2
= new ServiceControllerPermission (PermissionState
.None
);
152 ServiceControllerPermission result
= (ServiceControllerPermission
)scp1
.Intersect (scp2
);
153 Assert
.IsNull (result
, "Empty N Empty");
155 scp2
.PermissionEntries
.Add (new ServiceControllerPermissionEntry (ServiceControllerPermissionAccess
.None
, "localhost", "http"));
156 result
= (ServiceControllerPermission
)scp1
.Intersect (scp2
);
157 Assert
.IsNull (result
, "Empty N Entry");
159 result
= (ServiceControllerPermission
)scp2
.Intersect (scp1
);
160 Assert
.IsNull (result
, "Entry N Empty");
164 public void Intersect_Unrestricted ()
166 // Intersection with unrestricted == Copy
167 // a. source (this) is unrestricted
168 ServiceControllerPermission scp1
= new ServiceControllerPermission (PermissionState
.Unrestricted
);
169 ServiceControllerPermission scp2
= new ServiceControllerPermission (PermissionState
.None
);
171 // 1. Unrestricted N None
172 ServiceControllerPermission result
= (ServiceControllerPermission
)scp1
.Intersect (scp2
);
173 Assert
.IsFalse (result
.IsUnrestricted (), "(Unrestricted N None).IsUnrestricted");
174 Assert
.AreEqual (0, result
.PermissionEntries
.Count
, "(Unrestricted N None).Count");
176 // 2. None N Unrestricted
177 result
= (ServiceControllerPermission
)scp2
.Intersect (scp1
);
178 Assert
.IsFalse (result
.IsUnrestricted (), "(None N Unrestricted).IsUnrestricted");
179 Assert
.AreEqual (0, result
.PermissionEntries
.Count
, "(None N Unrestricted).Count");
181 // 3. Unrestricted N Unrestricted
182 result
= (ServiceControllerPermission
)scp1
.Intersect (scp1
);
183 Assert
.IsTrue (result
.IsUnrestricted (), "(Unrestricted N Unrestricted).IsUnrestricted");
184 Assert
.AreEqual (0, result
.PermissionEntries
.Count
, "(Unrestricted N Unrestricted).Count");
186 // 4. Unrestricted N Entry
187 scp2
.PermissionEntries
.Add (new ServiceControllerPermissionEntry (ServiceControllerPermissionAccess
.None
, "localhost", "http"));
188 result
= (ServiceControllerPermission
)scp1
.Intersect (scp2
);
189 Assert
.IsFalse (result
.IsUnrestricted (), "(Unrestricted N Entry).IsUnrestricted");
190 Assert
.AreEqual (1, result
.PermissionEntries
.Count
, "(Unrestricted N Entry).Count");
192 // 5. Entry N Unrestricted
193 result
= (ServiceControllerPermission
)scp2
.Intersect (scp1
);
194 Assert
.IsFalse (result
.IsUnrestricted (), "(Entry N Unrestricted).IsUnrestricted");
195 Assert
.AreEqual (1, result
.PermissionEntries
.Count
, "(Entry N Unrestricted).Count");
197 // 6. Unrestricted N Unrestricted
198 scp1
.PermissionEntries
.Add (new ServiceControllerPermissionEntry (ServiceControllerPermissionAccess
.None
, "localhost", "http"));
199 result
= (ServiceControllerPermission
)scp1
.Intersect (scp1
);
200 Assert
.IsTrue (result
.IsUnrestricted (), "(Unrestricted N Unrestricted).IsUnrestricted");
201 Assert
.AreEqual (1, result
.PermissionEntries
.Count
, "(Unrestricted N Unrestricted).Count");
205 [ExpectedException (typeof (ArgumentException
))]
206 public void Intersect_BadPermission ()
208 ServiceControllerPermission scp1
= new ServiceControllerPermission (PermissionState
.Unrestricted
);
209 scp1
.Intersect (new SecurityPermission (SecurityPermissionFlag
.Assertion
));
213 public void IsSubset_Null ()
215 ServiceControllerPermission scp
= new ServiceControllerPermission (PermissionState
.None
);
216 Assert
.IsTrue (scp
.IsSubsetOf (null), "null");
220 public void IsSubset_None ()
222 // IsSubset with none
223 // a. source (this) is none -> target is never a subset
224 // b. destination (target) is none -> target is always a subset
225 ServiceControllerPermission scp1
= new ServiceControllerPermission (PermissionState
.None
);
226 foreach (ServiceControllerPermissionAccess scpa
in AllAccess
) {
227 ServiceControllerPermission scp2
= new ServiceControllerPermission (PermissionState
.None
);
228 scp2
.PermissionEntries
.Add (new ServiceControllerPermissionEntry (scpa
, "localhost", scpa
.ToString ()));
229 Assert
.IsTrue (scp1
.IsSubsetOf (scp2
), "target " + scpa
.ToString ());
230 Assert
.IsFalse (scp2
.IsSubsetOf (scp1
), "source " + scpa
.ToString ());
235 public void IsSubset_Self ()
237 foreach (ServiceControllerPermissionAccess scpa
in AllAccess
) {
238 ServiceControllerPermission scp
= new ServiceControllerPermission (PermissionState
.None
);
239 scp
.PermissionEntries
.Add (new ServiceControllerPermissionEntry (scpa
, "localhost", scpa
.ToString ()));
240 Assert
.IsTrue (scp
.IsSubsetOf (scp
), scpa
.ToString ());
245 public void IsSubset_Unrestricted ()
247 // IsSubset with unrestricted
248 // a. source (this) is unrestricted -> target is never a subset
249 // b. destination (target) is unrestricted -> source is always a subset
250 ServiceControllerPermission scp1
= new ServiceControllerPermission (PermissionState
.Unrestricted
);
251 foreach (ServiceControllerPermissionAccess scpa
in AllAccess
) {
252 ServiceControllerPermission scp2
= new ServiceControllerPermission (PermissionState
.None
);
253 scp2
.PermissionEntries
.Add (new ServiceControllerPermissionEntry (scpa
, "localhost", scpa
.ToString ()));
254 Assert
.IsFalse (scp1
.IsSubsetOf (scp2
), "target " + scpa
.ToString ());
255 Assert
.IsTrue (scp2
.IsSubsetOf (scp1
), "source " + scpa
.ToString ());
257 Assert
.IsTrue (scp1
.IsSubsetOf (scp1
), "Unrestricted.IsSubsetOf(Unrestricted)");
261 // "special" behavior inherited from ResourceBasePermission
262 // [ExpectedException (typeof (ArgumentException))]
263 public void IsSubsetOf_BadPermission ()
265 ServiceControllerPermission scp1
= new ServiceControllerPermission (PermissionState
.Unrestricted
);
266 Assert
.IsFalse (scp1
.IsSubsetOf (new SecurityPermission (SecurityPermissionFlag
.Assertion
)));
270 public void Union_Null ()
272 ServiceControllerPermission scp
= new ServiceControllerPermission (PermissionState
.None
);
273 scp
.PermissionEntries
.Add (new ServiceControllerPermissionEntry (ServiceControllerPermissionAccess
.None
, "localhost", "http"));
274 // Union with null is a simple copy
275 ServiceControllerPermission union
= (ServiceControllerPermission
)scp
.Union (null);
276 Assert
.IsNotNull (scp
.PermissionEntries
.Count
, "Count");
280 public void Union_None ()
282 ServiceControllerPermission scp1
= new ServiceControllerPermission (PermissionState
.None
);
283 foreach (ServiceControllerPermissionAccess scpa
in AllAccess
) {
284 ServiceControllerPermission scp2
= new ServiceControllerPermission (PermissionState
.None
);
285 scp2
.PermissionEntries
.Add (new ServiceControllerPermissionEntry (scpa
, "localhost", scpa
.ToString ()));
286 ServiceControllerPermission union
= (ServiceControllerPermission
)scp1
.Union (scp2
);
287 Assert
.IsFalse (union
.IsUnrestricted (), "target.IsUnrestricted " + scpa
.ToString ());
288 Assert
.AreEqual (1, union
.PermissionEntries
.Count
, "target.Count " + scpa
.ToString ());
290 union
= (ServiceControllerPermission
)scp2
.Union (scp1
);
291 Assert
.IsFalse (union
.IsUnrestricted (), "source.IsUnrestricted " + scpa
.ToString ());
292 Assert
.AreEqual (1, union
.PermissionEntries
.Count
, "source.Count " + scpa
.ToString ());
297 public void Union_Self ()
299 foreach (ServiceControllerPermissionAccess scpa
in AllAccess
) {
300 ServiceControllerPermission scp
= new ServiceControllerPermission (PermissionState
.None
);
301 scp
.PermissionEntries
.Add (new ServiceControllerPermissionEntry (scpa
, "localhost", scpa
.ToString ()));
302 ServiceControllerPermission union
= (ServiceControllerPermission
)scp
.Union (scp
);
303 Assert
.IsFalse (union
.IsUnrestricted (), "IsUnrestricted " + scpa
.ToString ());
304 Assert
.AreEqual (1, union
.PermissionEntries
.Count
, "Count " + scpa
.ToString ());
309 public void Union_Unrestricted ()
311 // Union with unrestricted is unrestricted
312 ServiceControllerPermission scp1
= new ServiceControllerPermission (PermissionState
.Unrestricted
);
313 foreach (ServiceControllerPermissionAccess scpa
in AllAccess
) {
314 ServiceControllerPermission scp2
= new ServiceControllerPermission (PermissionState
.None
);
315 scp2
.PermissionEntries
.Add (new ServiceControllerPermissionEntry (scpa
, "localhost", scpa
.ToString ()));
316 ServiceControllerPermission union
= (ServiceControllerPermission
)scp1
.Union (scp2
);
317 Assert
.IsTrue (union
.IsUnrestricted (), "target.IsUnrestricted " + scpa
.ToString ());
318 Assert
.AreEqual (0, union
.PermissionEntries
.Count
, "target.Count " + scpa
.ToString ());
320 union
= (ServiceControllerPermission
)scp2
.Union (scp1
);
321 Assert
.IsTrue (union
.IsUnrestricted (), "source.IsUnrestricted " + scpa
.ToString ());
322 Assert
.AreEqual (0, union
.PermissionEntries
.Count
, "source.Count " + scpa
.ToString ());
327 [ExpectedException (typeof (ArgumentException
))]
328 public void Union_BadPermission ()
330 ServiceControllerPermission scp1
= new ServiceControllerPermission (PermissionState
.Unrestricted
);
331 scp1
.Union (new SecurityPermission (SecurityPermissionFlag
.Assertion
));
335 // Problem inherited from ResourcePermissionBase
336 // [ExpectedException (typeof (ArgumentNullException))]
337 [ExpectedException (typeof (NullReferenceException
))]
338 public void FromXml_Null ()
340 ServiceControllerPermission scp
= new ServiceControllerPermission (PermissionState
.None
);
345 public void FromXml_WrongTag ()
347 ServiceControllerPermission scp
= new ServiceControllerPermission (PermissionState
.None
);
348 SecurityElement se
= scp
.ToXml ();
351 // note: normally IPermission classes (in corlib) DO care about the
356 public void FromXml_WrongTagCase ()
358 ServiceControllerPermission scp
= new ServiceControllerPermission (PermissionState
.None
);
359 SecurityElement se
= scp
.ToXml ();
360 se
.Tag
= "IPERMISSION"; // instead of IPermission
362 // note: normally IPermission classes (in corlib) DO care about the
367 public void FromXml_WrongClass ()
369 ServiceControllerPermission scp
= new ServiceControllerPermission (PermissionState
.None
);
370 SecurityElement se
= scp
.ToXml ();
372 SecurityElement w
= new SecurityElement (se
.Tag
);
373 w
.AddAttribute ("class", "Wrong" + se
.Attribute ("class"));
374 w
.AddAttribute ("version", se
.Attribute ("version"));
376 // doesn't care of the class name at that stage
377 // anyway the class has already be created so...
381 public void FromXml_NoClass ()
383 ServiceControllerPermission scp
= new ServiceControllerPermission (PermissionState
.None
);
384 SecurityElement se
= scp
.ToXml ();
386 SecurityElement w
= new SecurityElement (se
.Tag
);
387 w
.AddAttribute ("version", se
.Attribute ("version"));
389 // doesn't even care of the class attribute presence
393 [ExpectedException (typeof (ArgumentException
))]
394 public void FromXml_WrongVersion ()
396 ServiceControllerPermission scp
= new ServiceControllerPermission (PermissionState
.None
);
397 SecurityElement se
= scp
.ToXml ();
398 se
.Attributes
.Remove ("version");
399 se
.Attributes
.Add ("version", "2");
404 public void FromXml_NoVersion ()
406 ServiceControllerPermission scp
= new ServiceControllerPermission (PermissionState
.None
);
407 SecurityElement se
= scp
.ToXml ();
409 SecurityElement w
= new SecurityElement (se
.Tag
);
410 w
.AddAttribute ("class", se
.Attribute ("class"));