//
// MonoTests.System.Security.Policy.CodeGroupTest
//
// Authors:
// Nick Drochak (ndrochak@gol.com)
// Sebastien Pouliot (spouliot@motus.com)
//
// (C) 2001 Nick Drochak, All rights reserved.
// Portions (C) 2004 Motus Technologies Inc. (http://www.motus.com)
//
using NUnit.Framework;
using System;
using System.Collections;
using System.Security;
using System.Security.Policy;
using System.Security.Permissions;
namespace MonoTests.System.Security.Policy {
public class MyCodeGroup : CodeGroup {
public MyCodeGroup (IMembershipCondition membershipCondition, PolicyStatement policy)
: base (membershipCondition, policy) {}
public override CodeGroup Copy ()
{
return this;
}
public override string MergeLogic {
get { return ""; }
}
public override PolicyStatement Resolve (Evidence evidence)
{
return null;
}
public override CodeGroup ResolveMatchingCodeGroups (Evidence evidence)
{
return this;
}
}
// this version has a constructor with no parameters
public class MySecondCodeGroup : CodeGroup {
// must be public (else the ToFromXmlRoundtrip_WithChildren_Second will fail)
public MySecondCodeGroup () : base (new AllMembershipCondition (), null) {}
public MySecondCodeGroup (IMembershipCondition membershipCondition, PolicyStatement policy)
: base (membershipCondition, policy) {}
public override CodeGroup Copy () {
return this;
}
public override string MergeLogic {
get { return ""; }
}
public override PolicyStatement Resolve (Evidence evidence) {
return null;
}
public override CodeGroup ResolveMatchingCodeGroups (Evidence evidence) {
return this;
}
}
[TestFixture]
public class CodeGroupTest : Assertion {
private const string ps_Name = "TestName";
[Test]
[ExpectedException (typeof (ArgumentNullException))]
public void Constructor_MembershipConditionNullPolicyStatement ()
{
MyCodeGroup cg = new MyCodeGroup (null, new PolicyStatement(new PermissionSet(PermissionState.None)));
}
[Test]
public void Constructor_MembershipConditionPolicyStatementNull ()
{
// legal
MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition(), null);
AssertNull ("PolicyStatement", cg.PolicyStatement);
}
[Test]
public void Constructor ()
{
MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition(), new PolicyStatement(new PermissionSet(PermissionState.None)));
AssertNotNull ("PolicyStatement property not set correctly by constructor.", cg.PolicyStatement);
AssertNotNull ("MembershipCondition property not set correctly by constructor.", cg.MembershipCondition);
}
[Test]
public void Description ()
{
const string description = "Test Description";
MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition(), new PolicyStatement(new PermissionSet(PermissionState.None)));
cg.Description = description;
AssertEquals ("Description not the expected value", description, cg.Description);
}
[Test]
public void Name ()
{
const string name = "Test Name";
MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition(), new PolicyStatement(new PermissionSet(PermissionState.None)));
cg.Name = name;
AssertEquals ("Description not the expected value", name, cg.Name);
}
[Test]
public void AddChild ()
{
MyCodeGroup cg = new MyCodeGroup(new AllMembershipCondition (), new PolicyStatement(new PermissionSet (PermissionState.None)));
AssertEquals ("Unexpected number of children (before add)", 0, cg.Children.Count);
cg.AddChild (new MyCodeGroup (new AllMembershipCondition (), new PolicyStatement(new PermissionSet (PermissionState.Unrestricted))));
AssertEquals ("Unexpected number of children (after add)", 1, cg.Children.Count);
}
[Test]
[ExpectedException (typeof (ArgumentNullException))]
public void AddChild_Null ()
{
MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition (), new PolicyStatement(new PermissionSet (PermissionState.None)));
cg.AddChild (null);
}
[Test]
public void AttributeString ()
{
PolicyStatementAttribute psa = PolicyStatementAttribute.LevelFinal;
PolicyStatement ps = new PolicyStatement (new PermissionSet (PermissionState.None));
ps.Attributes = psa;
MyCodeGroup cg = new MyCodeGroup(new AllMembershipCondition (), ps);
AssertEquals ("AttributeString", psa.ToString(), cg.AttributeString);
}
[Test]
[ExpectedException (typeof (ArgumentNullException))]
public void Children_Null ()
{
MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition (), new PolicyStatement(new PermissionSet (PermissionState.None)));
cg.Children = null;
}
[Test]
public void PermissionSetName ()
{
PolicyStatement ps = new PolicyStatement(new NamedPermissionSet (ps_Name));
MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition (), ps);
AssertEquals ("PermissionSetName", ps_Name, cg.PermissionSetName);
}
[Test]
public void Equals ()
{
PolicyStatement ps = new PolicyStatement (new NamedPermissionSet (ps_Name));
MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition (), ps);
cg.Name = "SomeName";
cg.Description = "Some Description";
Assert ("Equals (itself)", cg.Equals (cg));
Assert ("Equals (string)", !cg.Equals ("Not Equal to this"));
MyCodeGroup cg2 = new MyCodeGroup(new AllMembershipCondition(), ps);
cg2.Name = "SomeOtherName";
cg2.Description = "Some Other Description";
Assert ("Equals (another)", !cg.Equals (cg2));
cg2 = new MyCodeGroup (new ApplicationDirectoryMembershipCondition(), ps);
cg2.Name = cg.Name;
cg2.Description = cg.Description;
Assert ("Equals (different Membership Condition)", !cg.Equals (cg2));
}
[Test]
public void EqualsWithChildren ()
{
PolicyStatement ps = new PolicyStatement (new NamedPermissionSet (ps_Name));
MyCodeGroup cgChild = new MyCodeGroup(new ApplicationDirectoryMembershipCondition(), ps);
cgChild.Name = "ChildName";
cgChild.Description = "Child Descripiton";
MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition (), ps);
cg.Name = "SomeName";
cg.Description = "Some Description";
cg.AddChild (cgChild);
MyCodeGroup cg2 = new MyCodeGroup (cg.MembershipCondition, cg.PolicyStatement);
cg2.Name = cg.Name;
cg2.Description = cg.Description;
Assert ("Should be equal when Children are ignored", cg.Equals (cg2));
Assert ("Should not be equal when Child count is different", !cg.Equals(cg2, true));
cg2.AddChild(cgChild);
Assert ("Should be equal when children are equal", cg2.Equals(cg, true));
}
[Test]
public void RemoveChild ()
{
PolicyStatement ps = new PolicyStatement (new NamedPermissionSet (ps_Name));
MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition (), ps);
cg.Name = "SomeName";
cg.Description = "Some Description";
MyCodeGroup cgChild = new MyCodeGroup (new ApplicationDirectoryMembershipCondition (), ps);
cgChild.Name = "ChildName";
cgChild.Description = "Child Descripiton";
cg.AddChild (cgChild);
MyCodeGroup cgChild2 = new MyCodeGroup (new ApplicationDirectoryMembershipCondition (), ps);
cgChild2.Name = "ChildName2";
cgChild2.Description = "Child Descripiton 2";
cg.AddChild (cgChild2);
AssertEquals ("Should be two children before the call to Remove()", 2, cg.Children.Count);
cg.RemoveChild(cgChild);
AssertEquals ("Should be one children after the call to Remove()", 1, cg.Children.Count);
AssertEquals("Remaining child does not have correct name", "ChildName2", ((CodeGroup)cg.Children[0]).Name);
}
[Test]
public void RemoveChild_NonExistant ()
{
PolicyStatement ps = new PolicyStatement (new NamedPermissionSet (ps_Name));
MyCodeGroup cgChild = new MyCodeGroup (new ApplicationDirectoryMembershipCondition (), ps);
cgChild.Name = "ChildName";
cgChild.Description = "Child Descripiton";
MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition (), ps);
cg.AddChild (cgChild);
cg.RemoveChild (cgChild);
cg.RemoveChild (cgChild);
// no exception
}
[Test]
public void RemoveChild_Null ()
{
MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition (), new PolicyStatement(new PermissionSet (PermissionState.None)));
cg.RemoveChild (null);
// no exception
}
[Test]
public void ToXml ()
{
MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition (), new PolicyStatement(new PermissionSet (PermissionState.None)));
SecurityElement se = cg.ToXml ();
string s = se.ToString ();
Assert ("ToXml-Starts", s.StartsWith ("" + Environment.NewLine + "" + Environment.NewLine));
cg.AddChild (new MyCodeGroup (new AllMembershipCondition (), new PolicyStatement(new PermissionSet (PermissionState.Unrestricted))));
se = cg.ToXml ();
s = se.ToString ();
Assert ("ToXml-Child", s.IndexOf (" 0);
}
[Test]
public void ToFromXmlRoundtrip ()
{
PolicyStatement ps = new PolicyStatement (new NamedPermissionSet (ps_Name));
MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition (), ps);
cg.Name = "SomeName";
cg.Description = "Some Description";
Assert ("Equals (itself)", cg.Equals (cg));
SecurityElement se = cg.ToXml ();
MyCodeGroup cg2 = new MyCodeGroup (new AllMembershipCondition(), ps);
cg2.Name = "SomeOtherName";
cg2.Description = "Some Other Description";
Assert ("Equals (another)", !cg.Equals (cg2));
cg2.FromXml (se);
Assert ("Equals (FromXml)", cg.Equals (cg2));
}
[Test]
[ExpectedException (typeof (MissingMethodException))]
public void ToFromXmlRoundtrip_WithChildren ()
{
PolicyStatement ps = new PolicyStatement (new NamedPermissionSet (ps_Name));
MyCodeGroup cgChild = new MyCodeGroup (new ApplicationDirectoryMembershipCondition (), ps);
cgChild.Name = "ChildName";
cgChild.Description = "Child Descripiton";
MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition (), ps);
cg.Name = "SomeName";
cg.Description = "Some Description";
cg.AddChild (cgChild);
cg.AddChild (cgChild);
Assert ("Equals (itself)", cg.Equals (cg));
SecurityElement se = cg.ToXml ();
MyCodeGroup cg2 = (MyCodeGroup) cg.Copy ();
cg2.FromXml (se);
// MissingMethodException down here (stangely not up here ?!? delayed ?)
Assert ("Equals (FromXml)", cg.Equals (cg2, true));
}
[Test]
public void ToFromXmlRoundtrip_WithChildren_Second ()
{
PolicyStatement ps = new PolicyStatement (new NamedPermissionSet (ps_Name));
// only the child is MySecondCodeGroup
MySecondCodeGroup cgChild = new MySecondCodeGroup (new ApplicationDirectoryMembershipCondition (), ps);
cgChild.Name = "ChildName";
cgChild.Description = "Child Descripiton";
MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition (), ps);
cg.Name = "SomeName";
cg.Description = "Some Description";
cg.AddChild (cgChild);
Assert ("Equals (itself)", cg.Equals (cg));
SecurityElement se = cg.ToXml ();
MyCodeGroup cg2 = (MyCodeGroup) cg.Copy ();
cg2.FromXml (se);
Assert ("Equals (FromXml)", cg.Equals (cg2, true));
}
[Test]
public void FromXml_Bad ()
{
MyCodeGroup cg = new MyCodeGroup (new AllMembershipCondition (), new PolicyStatement(new PermissionSet (PermissionState.None)));
SecurityElement se = cg.ToXml ();
se.Tag = "Mono";
// strangely this works :(
cg.FromXml (se);
// let's get weirder :)
foreach (SecurityElement child in se.Children) {
child.Tag = "Mono";
}
cg.FromXml (se);
// it's not enough :(( - very relax parsing
se.Attributes = new Hashtable ();
cg.FromXml (se);
// arghh - I will prevail!
foreach (SecurityElement child in se.Children) {
child.Attributes = new Hashtable ();
}
cg.FromXml (se);
// huh ? well maybe not (but this is both cruel and injust)
}
} // public class CodeGroupTest
} // namespace MonoTests.System.Security.Policy