New test.
[mono.git] / mcs / class / corlib / Test / System.Security.Policy / CodeGroupTest.cs
1 //
2 // MonoTests.System.Security.Policy.CodeGroupTest
3 //
4 // Authors:
5 //      Nick Drochak (ndrochak@gol.com)
6 //      Sebastien Pouliot (spouliot@motus.com)
7 //
8 // (C) 2001 Nick Drochak, All rights reserved.
9 // Portions (C) 2004 Motus Technologies Inc. (http://www.motus.com)
10 //
11
12 using NUnit.Framework;
13 using System;
14 using System.Collections;
15 using System.Security;
16 using System.Security.Policy;
17 using System.Security.Permissions;
18
19 namespace MonoTests.System.Security.Policy {
20
21         public class MyCodeGroup : CodeGroup {
22
23                 public MyCodeGroup (IMembershipCondition membershipCondition, PolicyStatement policy) 
24                         : base (membershipCondition, policy) {}
25
26                 public override CodeGroup Copy () 
27                 {
28                         return this;
29                 }
30
31                 public override string MergeLogic {
32                         get { return ""; }
33                 }
34
35                 public override PolicyStatement Resolve (Evidence evidence) 
36                 {
37                         return null;
38                 }
39
40                 public override CodeGroup ResolveMatchingCodeGroups (Evidence evidence) 
41                 {
42                         return this;
43                 }
44         }
45
46         // this version has a constructor with no parameters
47         public class MySecondCodeGroup : CodeGroup {
48
49                 // must be public (else the ToFromXmlRoundtrip_WithChildren_Second will fail)
50                 public MySecondCodeGroup () : base (new AllMembershipCondition (), null) {}
51
52                 public MySecondCodeGroup (IMembershipCondition membershipCondition, PolicyStatement policy) 
53                         : base (membershipCondition, policy) {}
54
55                 public override CodeGroup Copy () {
56                         return this;
57                 }
58
59                 public override string MergeLogic {
60                         get { return ""; }
61                 }
62
63                 public override PolicyStatement Resolve (Evidence evidence) {
64                         return null;
65                 }
66
67                 public override CodeGroup ResolveMatchingCodeGroups (Evidence evidence) {
68                         return this;
69                 }
70         }
71
72         [TestFixture]
73         public class CodeGroupTest : Assertion {
74
75                 private const string ps_Name = "TestName";
76                 
77                 [Test]
78                 [ExpectedException (typeof (ArgumentNullException))]
79                 public void Constructor_MembershipConditionNullPolicyStatement ()
80                 {
81                         MyCodeGroup cg = new MyCodeGroup (null, new PolicyStatement(new PermissionSet(PermissionState.None)));
82                 }
83
84                 [Test]
85                 public void Constructor_MembershipConditionPolicyStatementNull () 
86                 {
87                         // legal
88                         MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition(), null);
89                         AssertNull ("PolicyStatement", cg.PolicyStatement);
90                 }
91
92                 [Test]
93                 public void Constructor ()
94                 {
95                         MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition(), new PolicyStatement(new PermissionSet(PermissionState.None)));
96                         AssertNotNull ("PolicyStatement property not set correctly by constructor.", cg.PolicyStatement);
97                         AssertNotNull ("MembershipCondition property not set correctly by constructor.", cg.MembershipCondition);
98                 }
99
100                 [Test]
101                 public void Description ()
102                 {
103                         const string description = "Test Description";
104                         MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition(), new PolicyStatement(new PermissionSet(PermissionState.None)));
105                         cg.Description = description;
106                         AssertEquals ("Description not the expected value", description, cg.Description);
107                 }
108
109                 [Test]
110                 public void Name ()
111                 {
112                         const string name = "Test Name";
113                         MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition(), new PolicyStatement(new PermissionSet(PermissionState.None)));
114                         cg.Name = name;
115                         AssertEquals ("Description not the expected value", name, cg.Name);
116                 }
117
118                 [Test]
119                 public void AddChild ()
120                 {
121                         MyCodeGroup cg = new MyCodeGroup(new AllMembershipCondition (), new PolicyStatement(new PermissionSet (PermissionState.None)));
122                         AssertEquals ("Unexpected number of children (before add)", 0, cg.Children.Count);
123                         cg.AddChild (new MyCodeGroup (new AllMembershipCondition (), new PolicyStatement(new PermissionSet (PermissionState.Unrestricted))));
124                         AssertEquals ("Unexpected number of children (after add)", 1, cg.Children.Count);
125                 }
126
127                 [Test]
128                 [ExpectedException (typeof (ArgumentNullException))]
129                 public void AddChild_Null () 
130                 {
131                         MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition (), new PolicyStatement(new PermissionSet (PermissionState.None)));
132                         cg.AddChild (null);
133                 }
134
135                 [Test]
136                 public void AttributeString ()
137                 {
138                         PolicyStatementAttribute psa = PolicyStatementAttribute.LevelFinal;
139                         PolicyStatement ps = new PolicyStatement (new PermissionSet (PermissionState.None));
140                         ps.Attributes = psa;
141                         MyCodeGroup cg = new MyCodeGroup(new AllMembershipCondition (), ps);
142                         AssertEquals ("AttributeString", psa.ToString(), cg.AttributeString);
143                 }
144
145                 [Test]
146                 [ExpectedException (typeof (ArgumentNullException))]
147                 public void Children_Null () 
148                 {
149                         MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition (), new PolicyStatement(new PermissionSet (PermissionState.None)));
150                         cg.Children = null;
151                 }
152
153                 [Test]
154                 public void PermissionSetName ()
155                 {
156                         PolicyStatement ps = new PolicyStatement(new NamedPermissionSet (ps_Name));
157                         MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition (), ps);
158                         AssertEquals ("PermissionSetName", ps_Name, cg.PermissionSetName);
159                 }
160
161                 [Test]
162                 public void Equals ()
163                 {
164                         PolicyStatement ps = new PolicyStatement (new NamedPermissionSet (ps_Name));
165                         MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition (), ps);
166                         cg.Name = "SomeName";
167                         cg.Description = "Some Description";
168                         Assert ("Equals (itself)", cg.Equals (cg));
169                         Assert ("Equals (string)", !cg.Equals ("Not Equal to this"));
170
171                         MyCodeGroup cg2 = new MyCodeGroup(new AllMembershipCondition(), ps);
172                         cg2.Name = "SomeOtherName";
173                         cg2.Description = "Some Other Description";
174                         Assert ("Equals (another)", !cg.Equals (cg2));
175
176                         cg2 = new MyCodeGroup (new ApplicationDirectoryMembershipCondition(), ps);
177                         cg2.Name = cg.Name;
178                         cg2.Description = cg.Description;
179                         Assert ("Equals (different Membership Condition)", !cg.Equals (cg2));
180                 }
181
182                 [Test]
183                 public void EqualsWithChildren ()
184                 {
185                         PolicyStatement ps = new PolicyStatement (new NamedPermissionSet (ps_Name));
186                         
187                         MyCodeGroup cgChild = new MyCodeGroup(new ApplicationDirectoryMembershipCondition(), ps);
188                         cgChild.Name = "ChildName";
189                         cgChild.Description = "Child Descripiton";
190
191                         MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition (), ps);
192                         cg.Name = "SomeName";
193                         cg.Description = "Some Description";
194                         cg.AddChild (cgChild);
195
196                         MyCodeGroup cg2 = new MyCodeGroup (cg.MembershipCondition, cg.PolicyStatement);
197                         cg2.Name = cg.Name;
198                         cg2.Description = cg.Description;
199
200                         Assert ("Should be equal when Children are ignored", cg.Equals (cg2));
201                         Assert ("Should not be equal when Child count is different", !cg.Equals(cg2, true));
202
203                         cg2.AddChild(cgChild);
204                         Assert ("Should be equal when children are equal", cg2.Equals(cg, true));
205                 }
206
207                 [Test]
208                 public void RemoveChild ()
209                 {
210                         PolicyStatement ps = new PolicyStatement (new NamedPermissionSet (ps_Name));
211                         MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition (), ps);
212                         cg.Name = "SomeName";
213                         cg.Description = "Some Description";
214
215                         MyCodeGroup cgChild = new MyCodeGroup (new ApplicationDirectoryMembershipCondition (), ps);
216                         cgChild.Name = "ChildName";
217                         cgChild.Description = "Child Descripiton";
218                         cg.AddChild (cgChild);
219
220                         MyCodeGroup cgChild2 = new MyCodeGroup (new ApplicationDirectoryMembershipCondition (), ps);
221                         cgChild2.Name = "ChildName2";
222                         cgChild2.Description = "Child Descripiton 2";
223                         cg.AddChild (cgChild2);
224
225                         AssertEquals ("Should be two children before the call to Remove()", 2, cg.Children.Count);
226                         cg.RemoveChild(cgChild);
227                         AssertEquals ("Should be one children after the call to Remove()", 1, cg.Children.Count);
228                         AssertEquals("Remaining child does not have correct name", "ChildName2", ((CodeGroup)cg.Children[0]).Name);
229                 }
230
231                 [Test]
232                 public void RemoveChild_NonExistant () 
233                 {
234                         PolicyStatement ps = new PolicyStatement (new NamedPermissionSet (ps_Name));
235
236                         MyCodeGroup cgChild = new MyCodeGroup (new ApplicationDirectoryMembershipCondition (), ps);
237                         cgChild.Name = "ChildName";
238                         cgChild.Description = "Child Descripiton";
239
240                         MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition (), ps);
241                         cg.AddChild (cgChild);
242                         cg.RemoveChild (cgChild);
243                         cg.RemoveChild (cgChild);
244                         // no exception
245                 }
246
247                 [Test]
248                 public void RemoveChild_Null () 
249                 {
250                         MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition (), new PolicyStatement(new PermissionSet (PermissionState.None)));
251                         cg.RemoveChild (null);
252                         // no exception
253                 }
254
255                 [Test]
256                 public void ToXml () 
257                 {
258                         MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition (), new PolicyStatement(new PermissionSet (PermissionState.None)));
259                         SecurityElement se = cg.ToXml ();
260                         string s = se.ToString ();
261                         Assert ("ToXml-Starts", s.StartsWith ("<CodeGroup class=\"MonoTests.System.Security.Policy.MyCodeGroup,"));
262                         Assert ("ToXml-Ends", s.EndsWith ("version=\"1\"/>" + Environment.NewLine + "</CodeGroup>" + Environment.NewLine));
263
264                         cg.AddChild (new MyCodeGroup (new AllMembershipCondition (), new PolicyStatement(new PermissionSet (PermissionState.Unrestricted))));
265                         se = cg.ToXml ();
266                         s = se.ToString ();
267                         Assert ("ToXml-Child", s.IndexOf ("<CodeGroup class=\"MonoTests.System.Security.Policy.MyCodeGroup,", 1) > 0);
268                 }
269
270                 [Test]
271                 public void ToFromXmlRoundtrip () 
272                 {
273                         PolicyStatement ps = new PolicyStatement (new NamedPermissionSet (ps_Name));
274                         MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition (), ps);
275                         cg.Name = "SomeName";
276                         cg.Description = "Some Description";
277                         Assert ("Equals (itself)", cg.Equals (cg));
278                         SecurityElement se = cg.ToXml ();
279
280                         MyCodeGroup cg2 = new MyCodeGroup (new AllMembershipCondition(), ps);
281                         cg2.Name = "SomeOtherName";
282                         cg2.Description = "Some Other Description";
283                         Assert ("Equals (another)", !cg.Equals (cg2));
284
285                         cg2.FromXml (se);
286                         Assert ("Equals (FromXml)", cg.Equals (cg2));
287                 }
288
289                 [Test]
290                 [ExpectedException (typeof (MissingMethodException))]
291                 public void ToFromXmlRoundtrip_WithChildren () 
292                 {
293                         PolicyStatement ps = new PolicyStatement (new NamedPermissionSet (ps_Name));
294
295                         MyCodeGroup cgChild = new MyCodeGroup (new ApplicationDirectoryMembershipCondition (), ps);
296                         cgChild.Name = "ChildName";
297                         cgChild.Description = "Child Descripiton";
298
299                         MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition (), ps);
300                         cg.Name = "SomeName";
301                         cg.Description = "Some Description";
302                         cg.AddChild (cgChild);
303                         cg.AddChild (cgChild);
304                         Assert ("Equals (itself)", cg.Equals (cg));
305                         SecurityElement se = cg.ToXml ();
306
307                         MyCodeGroup cg2 = (MyCodeGroup) cg.Copy ();
308                         cg2.FromXml (se);
309                         // MissingMethodException down here (stangely not up here ?!? delayed ?)
310                         Assert ("Equals (FromXml)", cg.Equals (cg2, true));
311                 }
312
313                 [Test]
314                 public void ToFromXmlRoundtrip_WithChildren_Second () 
315                 {
316                         PolicyStatement ps = new PolicyStatement (new NamedPermissionSet (ps_Name));
317
318                         // only the child is MySecondCodeGroup
319                         MySecondCodeGroup cgChild = new MySecondCodeGroup (new ApplicationDirectoryMembershipCondition (), ps);
320                         cgChild.Name = "ChildName";
321                         cgChild.Description = "Child Descripiton";
322
323                         MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition (), ps);
324                         cg.Name = "SomeName";
325                         cg.Description = "Some Description";
326                         cg.AddChild (cgChild);
327                         Assert ("Equals (itself)", cg.Equals (cg));
328                         SecurityElement se = cg.ToXml ();
329
330                         MyCodeGroup cg2 = (MyCodeGroup) cg.Copy ();
331                         cg2.FromXml (se);
332                         Assert ("Equals (FromXml)", cg.Equals (cg2, true));
333                 }
334
335                 [Test]
336                 public void FromXml_Bad () 
337                 {
338                         MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition (), new PolicyStatement(new PermissionSet (PermissionState.None)));
339                         SecurityElement se = cg.ToXml ();
340                         se.Tag = "Mono";
341                         // strangely this works :(
342                         cg.FromXml (se);
343                         // let's get weirder :)
344                         foreach (SecurityElement child in se.Children) {
345                                 child.Tag = "Mono";
346                         }
347                         cg.FromXml (se);
348                         // it's not enough :(( - very relax parsing
349                         se.Attributes = new Hashtable ();
350                         cg.FromXml (se);
351                         // arghh - I will prevail!
352                         foreach (SecurityElement child in se.Children) {
353                                 child.Attributes = new Hashtable ();
354                         }
355                         cg.FromXml (se);
356                         // huh ? well maybe not (but this is both cruel and injust)
357                 }
358         }  // public class CodeGroupTest 
359 }  // namespace MonoTests.System.Security.Policy