You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jspwiki.apache.org by aj...@apache.org on 2008/02/13 07:24:06 UTC

svn commit: r627271 [5/8] - in /incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki: ./ action/ attachment/ auth/ auth/acl/ auth/authorize/ auth/login/ auth/permissions/ auth/user/ dav/ diff/ filters/ htmltowiki/ parser/

Added: incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/acl/DefaultAclManagerTest.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/acl/DefaultAclManagerTest.java?rev=627271&view=auto
==============================================================================
--- incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/acl/DefaultAclManagerTest.java (added)
+++ incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/acl/DefaultAclManagerTest.java Tue Feb 12 22:24:02 2008
@@ -0,0 +1,189 @@
+package com.ecyrd.jspwiki.auth.acl;
+
+import java.security.Principal;
+import java.util.Properties;
+import java.util.regex.Matcher;
+
+import org.apache.commons.lang.ArrayUtils;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import com.ecyrd.jspwiki.TestEngine;
+import com.ecyrd.jspwiki.WikiPage;
+import com.ecyrd.jspwiki.auth.WikiPrincipal;
+import com.ecyrd.jspwiki.auth.permissions.PermissionFactory;
+import com.ecyrd.jspwiki.providers.ProviderException;
+
+public class DefaultAclManagerTest
+    extends TestCase
+{
+    TestEngine m_engine;
+
+    public DefaultAclManagerTest( String s )
+    {
+        super( s );
+    }
+
+    public void setUp()
+        throws Exception
+    {
+        Properties props = new Properties();
+        props.load( TestEngine.findTestProperties() );
+        m_engine = new TestEngine(props);
+
+        String text = "Foo";
+        m_engine.saveText( "TestDefaultPage", text );
+
+        text = "Bar. [{ALLOW edit Charlie, Herman}] ";
+        m_engine.saveText( "TestAclPage", text );
+    }
+
+    public void tearDown()
+    {
+        try
+        {
+            m_engine.deletePage( "TestDefaultPage" );
+            m_engine.deletePage( "TestAclPage" );
+        }
+        catch ( ProviderException e )
+        {
+        }
+    }
+
+    public void testGetPermissions()
+    {
+        WikiPage page = m_engine.getPage( "TestDefaultPage" );
+        Acl acl = m_engine.getAclManager().getPermissions( page );
+        assertNotNull( page.getAcl() );
+        assertTrue(page.getAcl().isEmpty());
+
+        page = m_engine.getPage( "TestAclPage" );
+        acl = m_engine.getAclManager().getPermissions( page );
+        assertNotNull( page.getAcl() );
+        assertFalse(page.getAcl().isEmpty());
+
+        Principal[] p;
+
+        // Charlie is an editor; reading is therefore implied
+        p = acl.findPrincipals( PermissionFactory.getPagePermission(page, "view") );
+        assertEquals( 2, p.length );
+        assertTrue( ArrayUtils.contains( p, new WikiPrincipal("Charlie") ) );
+
+        // Charlie should be in the ACL as an editor
+        p = acl.findPrincipals( PermissionFactory.getPagePermission(page, "edit") );
+        assertEquals( 2, p.length );
+        assertTrue( ArrayUtils.contains( p, new WikiPrincipal("Charlie") ) );
+
+        // Charlie should not be able to delete this page
+        p = acl.findPrincipals( PermissionFactory.getPagePermission(page, "delete") );
+        assertEquals( 0, p.length );
+
+        // Herman is an unregistered user and editor; reading is implied
+        p = acl.findPrincipals( PermissionFactory.getPagePermission(page, "view") );
+        assertEquals( 2, p.length );
+        assertTrue( ArrayUtils.contains( p, new UnresolvedPrincipal("Herman") ) );
+
+        // Herman should be in the ACL as an editor
+        p = acl.findPrincipals( PermissionFactory.getPagePermission(page, "edit") );
+        assertEquals( 2, p.length );
+        assertTrue( ArrayUtils.contains( p, new UnresolvedPrincipal("Herman") ) );
+
+        // Herman should not be able to delete this page
+        p = acl.findPrincipals( PermissionFactory.getPagePermission(page, "delete") );
+        assertEquals( 0, p.length );
+    }
+
+    public void testAclRegex()
+    {
+        String acl;
+        Matcher m;
+
+        acl = "[{ALLOW view Bob, Alice, Betty}] Test text.";
+        m = DefaultAclManager.ACL_PATTERN.matcher( acl );
+        assertTrue ( m.find() );
+        assertEquals( 2, m.groupCount() );
+        assertEquals( "[{ALLOW view Bob, Alice, Betty}]", m.group(0) );
+        assertEquals( "view", m.group(1) );
+        assertEquals( "Bob, Alice, Betty", m.group(2) );
+        assertFalse( m.find() );
+
+        acl = "[{ALLOW view Alice}] Test text.";
+        m = DefaultAclManager.ACL_PATTERN.matcher( acl );
+        assertTrue ( m.find() );
+        System.out.println( m.group() );
+        assertEquals( 2, m.groupCount() );
+        assertEquals( "[{ALLOW view Alice}]", m.group(0) );
+        assertEquals( "view", m.group(1) );
+        assertEquals( "Alice", m.group(2) );
+        assertFalse( m.find() );
+
+        acl = "Test text   [{   ALLOW   view   Alice  }]  Test text.";
+        m = DefaultAclManager.ACL_PATTERN.matcher( acl );
+        assertTrue ( m.find() );
+        System.out.println( m.group() );
+        assertEquals( 2, m.groupCount() );
+        assertEquals( "[{   ALLOW   view   Alice  }]", m.group(0) );
+        assertEquals( "view", m.group(1) );
+        assertEquals( "Alice", m.group(2) );
+        assertFalse( m.find() );
+
+        acl = "Test text   [{   ALLOW   view  Alice  ,  Bob  }]  Test text.";
+        m = DefaultAclManager.ACL_PATTERN.matcher( acl );
+        assertTrue ( m.find() );
+        System.out.println( m.group() );
+        assertEquals( 2, m.groupCount() );
+        assertEquals( "[{   ALLOW   view  Alice  ,  Bob  }]", m.group(0) );
+        assertEquals( "view", m.group(1) );
+        assertEquals( "Alice  ,  Bob", m.group(2) );
+        assertFalse( m.find() );
+
+        acl = "Test text   [{   ALLOW   view  Alice  ,  Bob  }]  Test text  [{ALLOW edit Betty}].";
+        m = DefaultAclManager.ACL_PATTERN.matcher( acl );
+        assertTrue ( m.find() );
+        System.out.println( m.group() );
+        assertEquals( 2, m.groupCount() );
+        assertEquals( "[{   ALLOW   view  Alice  ,  Bob  }]", m.group(0) );
+        assertEquals( "view", m.group(1) );
+        assertEquals( "Alice  ,  Bob", m.group(2) );
+        assertTrue ( m.find() );
+        assertEquals( 2, m.groupCount() );
+        assertEquals( "[{ALLOW edit Betty}]", m.group(0) );
+        assertEquals( "edit", m.group(1) );
+        assertEquals( "Betty", m.group(2) );
+        assertFalse( m.find() );
+    }
+
+    public void testPrintAcl()
+    {
+        // Verify that the printed Acl for the test page is OK
+        WikiPage page = m_engine.getPage( "TestAclPage" );
+        Acl acl = m_engine.getAclManager().getPermissions( page );
+        String aclString = DefaultAclManager.printAcl( acl );
+        assertEquals( "[{ALLOW edit Charlie,Herman}]\n", aclString );
+
+        // Create an ACL from scratch
+        acl = new AclImpl();
+        AclEntry entry = new AclEntryImpl();
+        entry.setPrincipal( new WikiPrincipal( "Charlie" ) );
+        entry.addPermission( PermissionFactory.getPagePermission( "Main:Foo", "view" ) );
+        entry.addPermission( PermissionFactory.getPagePermission( "Main:Foo", "edit" ) );
+        acl.addEntry( entry );
+        entry = new AclEntryImpl();
+        entry.setPrincipal( new WikiPrincipal( "Devin" ) );
+        entry.addPermission( PermissionFactory.getPagePermission( "Main:Foo", "edit" ) );
+        entry.addPermission( PermissionFactory.getPagePermission( "Main:Foo", "delete" ) );
+        acl.addEntry( entry );
+
+        // Verify that the printed ACL is OK
+        String expectedValue = "[{ALLOW delete Devin}]\n[{ALLOW edit Charlie,Devin}]\n[{ALLOW view Charlie}]\n";
+        assertEquals( expectedValue, DefaultAclManager.printAcl( acl ) );
+    }
+
+    public static Test suite()
+    {
+        return new TestSuite( DefaultAclManagerTest.class );
+    }
+
+}

Added: incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/authorize/AllTests.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/authorize/AllTests.java?rev=627271&view=auto
==============================================================================
--- incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/authorize/AllTests.java (added)
+++ incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/authorize/AllTests.java Tue Feb 12 22:24:02 2008
@@ -0,0 +1,26 @@
+package com.ecyrd.jspwiki.auth.authorize;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+/**
+ * @author Andrew R. Jaquith
+ */
+public class AllTests extends TestCase
+{
+    public AllTests( String s )
+    {
+        super( s );
+    }
+
+    public static Test suite()
+    {
+        TestSuite suite = new TestSuite( "Authorizer, group and group database tests" );
+        suite.addTestSuite( GroupTest.class );
+        suite.addTestSuite( WebContainerAuthorizerTest.class );
+        suite.addTestSuite( JDBCGroupDatabaseTest.class );
+        suite.addTestSuite( XMLGroupDatabaseTest.class );
+        return suite;
+    }
+}
\ No newline at end of file

Added: incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/authorize/GroupTest.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/authorize/GroupTest.java?rev=627271&view=auto
==============================================================================
--- incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/authorize/GroupTest.java (added)
+++ incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/authorize/GroupTest.java Tue Feb 12 22:24:02 2008
@@ -0,0 +1,161 @@
+package com.ecyrd.jspwiki.auth.authorize;
+
+import java.security.Principal;
+import java.util.Properties;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import com.ecyrd.jspwiki.TestEngine;
+import com.ecyrd.jspwiki.WikiEngine;
+import com.ecyrd.jspwiki.auth.WikiPrincipal;
+
+public class GroupTest extends TestCase
+{
+    Group m_group;
+    String m_wiki;
+    
+    public GroupTest( String s )
+    {
+        super( s );
+    }
+
+    public void setUp() throws Exception
+    {
+        Properties props = new Properties();
+        props.load( TestEngine.findTestProperties() );
+        WikiEngine engine  = new TestEngine( props );
+        m_wiki = engine.getApplicationName();
+        
+        m_group = new Group( "TestGroup", m_wiki );
+    }
+    
+    public void testAdd1()
+    {
+        Principal u1 = new WikiPrincipal( "Alice" );
+        m_group.add( u1 );
+        assertTrue( m_group.isMember( u1 ) );
+    }
+
+    public void testAdd2()
+    {
+        Principal u1 = new WikiPrincipal( "Alice" );
+        Principal u2 = new WikiPrincipal( "Bob" );
+
+        assertTrue( "adding alice", m_group.add( u1 ) );
+
+        assertTrue( "adding bob", m_group.add( u2 ) );
+
+        assertTrue( "Alice", m_group.isMember( u1 ) );
+        assertTrue( "Bob", m_group.isMember( u2 ) );
+    }
+
+    /**
+     * Check that different objects match as well.
+     */
+    public void testAdd3()
+    {
+        Principal u1 = new WikiPrincipal( "Alice" );
+        Principal u2 = new WikiPrincipal( "Bob" );
+        Principal u3 = new WikiPrincipal( "Bob" );
+
+        assertTrue( "adding alice", m_group.add( u1 ) );
+        assertTrue( "adding bob", m_group.add( u2 ) );
+
+        assertTrue( "Alice", m_group.isMember( u1 ) );
+        assertTrue( "Bob", m_group.isMember( u3 ) );
+    }
+
+    public void testRemove()
+    {
+        Principal u1 = new WikiPrincipal( "Alice" );
+        Principal u2 = new WikiPrincipal( "Bob" );
+        Principal u3 = new WikiPrincipal( "Bob" );
+
+        m_group.add( u1 );
+        m_group.add( u2 );
+
+        m_group.remove( u3 );
+
+        assertTrue( "Alice", m_group.isMember( u1 ) );
+        assertFalse( "Bob", m_group.isMember( u2 ) );
+        assertFalse( "Bob 2", m_group.isMember( u3 ) );
+    }
+
+    public void testEquals1()
+    {
+        Principal u1 = new WikiPrincipal( "Alice" );
+        Principal u2 = new WikiPrincipal( "Bob" );
+
+        m_group.add( u1 );
+        m_group.add( u2 );
+
+        Group group2 = new Group( "TestGroup", m_wiki );
+        Principal u3 = new WikiPrincipal( "Alice" );
+        Principal u4 = new WikiPrincipal( "Bob" );
+
+        group2.add( u3 );
+        group2.add( u4 );
+
+        assertTrue( m_group.equals( group2 ) );
+    }
+
+    public void testEquals2()
+    {
+        Principal u1 = new WikiPrincipal( "Alice" );
+        Principal u2 = new WikiPrincipal( "Bob" );
+
+        m_group.add( u1 );
+        m_group.add( u2 );
+
+        Group group2 = new Group( "Group2", m_wiki );
+        Principal u3 = new WikiPrincipal( "Alice" );
+        Principal u4 = new WikiPrincipal( "Charlie" );
+
+        group2.add( u3 );
+        group2.add( u4 );
+
+        assertFalse( m_group.equals( group2 ) );
+    }
+
+    public void testEquals3()
+    {
+        Group group1 = new Group( "Blib", m_wiki );
+        Principal u1 = new WikiPrincipal( "Alice" );
+        Principal u2 = new WikiPrincipal( "Bob" );
+        group1.add( u1 );
+        group1.add( u2 );
+
+        Group group2 = new Group( "Blib", m_wiki );
+        Principal u3 = new WikiPrincipal( "Alice" );
+        Principal u4 = new WikiPrincipal( "Bob" );
+        group2.add( u3 );
+        group2.add( u4 );
+
+        assertTrue( group1.equals( group2 ) );
+    }
+
+    public void testEquals4()
+    {
+        Group group1 = new Group( "BlibBlab", m_wiki );
+        Principal u1 = new WikiPrincipal( "Alice" );
+        Principal u2 = new WikiPrincipal( "Bob" );
+        group1.add( u1 );
+        group1.add( u2 );
+
+        Group group2 = new Group( "Blib", m_wiki );
+        Principal u3 = new WikiPrincipal( "Alice" );
+        Principal u4 = new WikiPrincipal( "Bob" );
+        group2.add( u3 );
+        group2.add( u4 );
+
+        assertFalse( m_group.equals( group2 ) );
+    }
+
+    public static Test suite()
+    {
+        return new TestSuite( GroupTest.class );
+    }
+
+}
\ No newline at end of file

Added: incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/authorize/JDBCGroupDatabaseTest.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/authorize/JDBCGroupDatabaseTest.java?rev=627271&view=auto
==============================================================================
--- incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/authorize/JDBCGroupDatabaseTest.java (added)
+++ incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/authorize/JDBCGroupDatabaseTest.java Tue Feb 12 22:24:02 2008
@@ -0,0 +1,241 @@
+package com.ecyrd.jspwiki.auth.authorize;
+
+import java.io.File;
+import java.security.Principal;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.List;
+import java.util.Properties;
+
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.sql.DataSource;
+
+import junit.framework.TestCase;
+
+import com.ecyrd.jspwiki.*;
+import com.ecyrd.jspwiki.auth.NoSuchPrincipalException;
+import com.ecyrd.jspwiki.auth.WikiPrincipal;
+import com.ecyrd.jspwiki.auth.WikiSecurityException;
+
+/**
+ * @author Andrew Jaquith
+ */
+public class JDBCGroupDatabaseTest extends TestCase
+{
+    private Connection        m_conn = null;
+
+    private JDBCGroupDatabase m_db  = null;
+
+    private String            m_wiki;
+
+    /**
+     * @see junit.framework.TestCase#setUp()
+     */
+    protected void setUp() throws Exception
+    {
+        super.setUp();
+
+        Properties props = new Properties();
+        props.load( TestEngine.findTestProperties() );
+        WikiEngine engine = new TestEngine( props );
+        m_wiki = engine.getApplicationName();
+
+        // Set up the mock JNDI initial context
+        TestJNDIContext.initialize();
+        Context initCtx = new InitialContext();
+        initCtx.bind( "java:comp/env", new TestJNDIContext() );
+        Context ctx = (Context) initCtx.lookup( "java:comp/env" );
+        DataSource ds = new TestJDBCDataSource( new File( "build.properties" ) );
+        ctx.bind( JDBCGroupDatabase.DEFAULT_GROUPDB_DATASOURCE, ds );
+
+        // Get the JDBC connection and init tables
+
+        try
+        {
+            m_conn = ds.getConnection();
+        }
+        catch( SQLException e )
+        {
+            System.err.println("Looks like your database could not be connected to - "+
+                               "please make sure that you have started your database "+
+                               "(e.g. by running ant hsql-start)");
+
+            throw (SQLException) e.fillInStackTrace();
+        }
+
+        // Initialize the user database
+        m_db = new JDBCGroupDatabase();
+        m_db.initialize( engine, new Properties() );
+    }
+
+    public void tearDown() throws Exception
+    {
+        if ( m_conn != null )
+        {
+            m_conn.close();
+        }
+    }
+
+    public void testDelete() throws WikiException
+    {
+        // First, count the number of groups in the db now.
+        int oldUserCount = m_db.groups().length;
+
+        // Create a new group with random name
+        String name = "TestGroup" + String.valueOf( System.currentTimeMillis() );
+        Group group = new Group( name, m_wiki );
+        Principal al = new WikiPrincipal( "Al" );
+        Principal bob = new WikiPrincipal( "Bob" );
+        group.add( al );
+        group.add( bob );
+        m_db.save(group, new WikiPrincipal( "Tester") );
+
+        // Make sure the profile saved successfully
+        group = backendGroup( name );
+        assertEquals( name, group.getName() );
+        assertEquals( oldUserCount+1, m_db.groups().length );
+
+        // Now delete the profile; should be back to old count
+        m_db.delete( group );
+        assertEquals( oldUserCount, m_db.groups().length );
+    }
+
+    public void testGroups() throws WikiSecurityException
+    {
+        // Test file has 4 groups in it: TV, Literature, Art, and Admin
+        Group[] groups = m_db.groups();
+        assertEquals( 4, groups.length );
+
+        Group group;
+
+        // Group TV has 3 members
+        group = backendGroup( "TV" );
+        assertEquals("TV", group.getName() );
+        assertEquals( 3, group.getMembers().size() );
+
+        // Group Literature has 2 members
+        group = backendGroup( "Literature" );
+        assertEquals("Literature", group.getName() );
+        assertEquals( 2, group.getMembers().size() );
+
+        // Group Art has no members
+        group = backendGroup( "Art" );
+        assertEquals("Art", group.getName() );
+        assertEquals( 0, group.getMembers().size() );
+
+        // Group Admin has 1 member (Administrator)
+        group = backendGroup( "Admin" );
+        assertEquals("Admin", group.getName() );
+        assertEquals( 1, group.getMembers().size() );
+        assertEquals( "Administrator", group.getMembers().get(0).getName() );
+
+        // Group Archaeology doesn't exist
+        try
+        {
+            group = backendGroup( "Archaeology" );
+            // We should never get here
+            assertTrue(false);
+        }
+        catch (NoSuchPrincipalException e)
+        {
+            assertTrue(true);
+        }
+    }
+
+    public void testSave() throws Exception
+    {
+        // Create a new group with random name
+        String name = "TestGroup" + String.valueOf( System.currentTimeMillis() );
+        Group group = new Group( name, m_wiki );
+        Principal al = new WikiPrincipal( "Al" );
+        Principal bob = new WikiPrincipal( "Bob" );
+        Principal cookie = new WikiPrincipal( "Cookie" );
+        group.add( al );
+        group.add( bob );
+        group.add( cookie );
+        m_db.save(group, new WikiPrincipal( "Tester" ) );
+
+        // Make sure the profile saved successfully
+        group = backendGroup( name );
+        assertEquals( name, group.getName() );
+        assertEquals( 3, group.getMembers().size() );
+        assertTrue( group.isMember( new WikiPrincipal( "Al" ) ) );
+        assertTrue( group.isMember( new WikiPrincipal( "Bob" ) ) );
+        assertTrue( group.isMember( new WikiPrincipal( "Cookie" ) ) );
+
+        // The back-end should have timestamped the create/modify fields
+        assertNotNull( group.getCreator() );
+        assertEquals( "Tester", group.getCreator() );
+        assertNotNull( group.getCreated() );
+        assertNotNull( group.getModifier() );
+        assertEquals( "Tester", group.getModifier() );
+        assertNotNull( group.getLastModified() );
+        assertNotSame( group.getCreated(), group.getLastModified() );
+
+        // Remove the group
+        m_db.delete( group );
+    }
+
+    public void testResave() throws Exception
+    {
+        // Create a new group with random name & 3 members
+        String name = "TestGroup" + String.valueOf( System.currentTimeMillis() );
+        Group group = new Group( name, m_wiki );
+        Principal al = new WikiPrincipal( "Al" );
+        Principal bob = new WikiPrincipal( "Bob" );
+        Principal cookie = new WikiPrincipal( "Cookie" );
+        group.add( al );
+        group.add( bob );
+        group.add( cookie );
+        m_db.save(group, new WikiPrincipal( "Tester" ) );
+
+        // Make sure the profile saved successfully
+        group = backendGroup( name );
+        assertEquals( name, group.getName() );
+
+        // Modify the members by adding the group; re-add Al while we're at it
+        Principal dave = new WikiPrincipal( "Dave" );
+        group.add( al );
+        group.add( dave );
+        m_db.save(group, new WikiPrincipal( "SecondTester" ) );
+
+        // We should see 4 members and new timestamp info
+        List<Principal> members = group.getMembers();
+        assertEquals( 4, members.size() );
+        assertNotNull( group.getCreator() );
+        assertEquals( "Tester", group.getCreator() );
+        assertNotNull( group.getCreated() );
+        assertNotNull( group.getModifier() );
+        assertEquals( "SecondTester", group.getModifier() );
+        assertNotNull( group.getLastModified() );
+
+        // Check the back-end; We should see the same thing
+        group = backendGroup( name );
+        members = group.getMembers();
+        assertEquals( 4, members.size() );
+        assertNotNull( group.getCreator() );
+        assertEquals( "Tester", group.getCreator() );
+        assertNotNull( group.getCreated() );
+        assertNotNull( group.getModifier() );
+        assertEquals( "SecondTester", group.getModifier() );
+        assertNotNull( group.getLastModified() );
+
+        // Remove the group
+        m_db.delete( group );
+    }
+
+    private Group backendGroup( String name ) throws WikiSecurityException
+    {
+        Group[] groups = m_db.groups();
+        for ( int i = 0; i < groups.length; i++ )
+        {
+            Group group = groups[i];
+            if ( group.getName().equals( name ) )
+            {
+                return group;
+            }
+        }
+        throw new NoSuchPrincipalException( "No group named " + name );
+    }
+}

Added: incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/authorize/WebContainerAuthorizerTest.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/authorize/WebContainerAuthorizerTest.java?rev=627271&view=auto
==============================================================================
--- incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/authorize/WebContainerAuthorizerTest.java (added)
+++ incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/authorize/WebContainerAuthorizerTest.java Tue Feb 12 22:24:02 2008
@@ -0,0 +1,89 @@
+package com.ecyrd.jspwiki.auth.authorize;
+
+import java.security.Principal;
+import java.util.Properties;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.apache.commons.lang.ArrayUtils;
+import org.jdom.Document;
+
+import com.ecyrd.jspwiki.TestEngine;
+import com.ecyrd.jspwiki.WikiEngine;
+
+public class WebContainerAuthorizerTest extends TestCase
+{
+    WikiEngine m_engine;
+    WebContainerAuthorizer m_authorizer;
+    Document   m_webxml;
+
+    public WebContainerAuthorizerTest( String s )
+    {
+        super( s );
+    }
+
+    public void setUp() throws Exception
+    {
+        Properties props = new Properties();
+        props.load( TestEngine.findTestProperties() );
+        m_engine = new TestEngine( props );
+        m_authorizer = new WebContainerAuthorizer();
+        m_authorizer.initialize( m_engine, props );
+        m_webxml = m_authorizer.getWebXml();
+        if ( m_webxml == null )
+        {
+            throw new Exception("Could not load web.xml");
+        }
+    }
+
+    public void testConstraints() throws Exception
+    {
+        assertTrue( m_authorizer.isConstrained( "/Delete.jsp", new Role( "Admin" ) ) );
+        assertTrue( m_authorizer.isConstrained( "/Login.jsp", Role.AUTHENTICATED ) );
+        assertFalse( m_authorizer.isConstrained( "/UserPreferences.jsp", Role.AUTHENTICATED ) );
+    }
+    
+    public void testGetRoles()
+    {
+        // We should find 2 roles: AUTHENTICATED plus custom role "Admin"
+        Principal[] roles = m_authorizer.getRoles();
+        assertEquals( 2, roles.length );
+        assertTrue( ArrayUtils.contains( roles, Role.AUTHENTICATED ) );
+        assertTrue( ArrayUtils.contains( roles, new Role( "Admin" ) ) );
+    }
+    
+    public void testRoles() throws Exception
+    {
+        Role[] roles = m_authorizer.getRoles( m_webxml );
+        boolean found = false;
+        for ( int i = 0; i < roles.length; i++ )
+        {
+            if ( roles[i].equals( Role.AUTHENTICATED ) )
+            {
+                found = true;
+            }
+        }
+        assertTrue( "Didn't find AUTHENTICATED", found );
+        for ( int i = 0; i < roles.length; i++ )
+        {
+            if ( roles[i].equals( new Role( "Admin" ) ) )
+            {
+                found = true;
+            }
+        }
+        assertTrue( "Didn't find ADMIN", found );
+    }
+    
+    public void testIsContainerAuthorized()
+    {
+        assertTrue( m_authorizer.isContainerAuthorized() );
+    }
+
+    public static Test suite()
+    {
+        return new TestSuite( WebContainerAuthorizerTest.class );
+    }
+
+}

Added: incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/authorize/XMLGroupDatabaseTest.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/authorize/XMLGroupDatabaseTest.java?rev=627271&view=auto
==============================================================================
--- incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/authorize/XMLGroupDatabaseTest.java (added)
+++ incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/authorize/XMLGroupDatabaseTest.java Tue Feb 12 22:24:02 2008
@@ -0,0 +1,202 @@
+package com.ecyrd.jspwiki.auth.authorize;
+import java.security.Principal;
+import java.util.List;
+import java.util.Properties;
+
+import junit.framework.TestCase;
+
+import com.ecyrd.jspwiki.TestEngine;
+import com.ecyrd.jspwiki.WikiEngine;
+import com.ecyrd.jspwiki.WikiException;
+import com.ecyrd.jspwiki.auth.NoSuchPrincipalException;
+import com.ecyrd.jspwiki.auth.WikiPrincipal;
+import com.ecyrd.jspwiki.auth.WikiSecurityException;
+
+
+
+/**
+ * @author Andrew Jaquith
+ */
+public class XMLGroupDatabaseTest extends TestCase
+{
+
+  private XMLGroupDatabase m_db;
+
+  private String           m_wiki;
+
+  /**
+   * @see junit.framework.TestCase#setUp()
+   */
+  protected void setUp() throws Exception
+  {
+      super.setUp();
+      Properties props = new Properties();
+      props.load( TestEngine.findTestProperties() );
+      WikiEngine engine  = new TestEngine( props );
+      m_db = new XMLGroupDatabase();
+      m_db.initialize( engine, props );
+      m_wiki = engine.getApplicationName();
+  }
+
+  public void testDelete() throws WikiException
+  {
+      // First, count the number of groups in the db now.
+      int oldUserCount = m_db.groups().length;
+
+      // Create a new group with random name
+      String name = "TestGroup" + String.valueOf( System.currentTimeMillis() );
+      Group group = new Group( name, m_wiki );
+      Principal al = new WikiPrincipal( "Al" );
+      Principal bob = new WikiPrincipal( "Bob" );
+      group.add( al );
+      group.add( bob );
+      m_db.save(group, new WikiPrincipal( "Tester") );
+
+      // Make sure the profile saved successfully
+      group = backendGroup( name );
+      assertEquals( name, group.getName() );
+      assertEquals( oldUserCount+1, m_db.groups().length );
+
+      // Now delete the profile; should be back to old count
+      m_db.delete( group );
+      assertEquals( oldUserCount, m_db.groups().length );
+  }
+
+  public void testGroups() throws WikiSecurityException
+  {
+      // Test file has 4 groups in it: TV, Literature, Art, and Admin
+      Group[] groups = m_db.groups();
+      assertEquals( 4, groups.length );
+
+      Group group;
+
+      // Group TV has 3 members
+      group = backendGroup( "TV" );
+      assertEquals("TV", group.getName() );
+      assertEquals( 3, group.getMembers().size() );
+
+      // Group Literature has 2 members
+      group = backendGroup( "Literature" );
+      assertEquals("Literature", group.getName() );
+      assertEquals( 2, group.getMembers().size() );
+
+      // Group Art has no members
+      group = backendGroup( "Art" );
+      assertEquals("Art", group.getName() );
+      assertEquals( 0, group.getMembers().size() );
+
+      // Group Admin has 1 member (Administrator)
+      group = backendGroup( "Admin" );
+      assertEquals("Admin", group.getName() );
+      assertEquals( 1, group.getMembers().size() );
+      assertEquals( "Administrator", group.getMembers().get(0).getName() );
+
+      // Group Archaeology doesn't exist
+      try
+      {
+          group = backendGroup( "Archaeology" );
+          // We should never get here
+          assertTrue(false);
+      }
+      catch (NoSuchPrincipalException e)
+      {
+          assertTrue(true);
+      }
+  }
+
+  public void testSave() throws Exception
+  {
+      // Create a new group with random name
+      String name = "TestGroup" + String.valueOf( System.currentTimeMillis() );
+      Group group = new Group( name, m_wiki );
+      Principal al = new WikiPrincipal( "Al" );
+      Principal bob = new WikiPrincipal( "Bob" );
+      Principal cookie = new WikiPrincipal( "Cookie" );
+      group.add( al );
+      group.add( bob );
+      group.add( cookie );
+      m_db.save(group, new WikiPrincipal( "Tester" ) );
+
+      // Make sure the profile saved successfully
+      group = backendGroup( name );
+      assertEquals( name, group.getName() );
+      assertEquals( 3, group.getMembers().size() );
+      assertTrue( group.isMember( new WikiPrincipal( "Al" ) ) );
+      assertTrue( group.isMember( new WikiPrincipal( "Bob" ) ) );
+      assertTrue( group.isMember( new WikiPrincipal( "Cookie" ) ) );
+
+      // The back-end should have timestamped the create/modify fields
+      assertNotNull( group.getCreator() );
+      assertEquals( "Tester", group.getCreator() );
+      assertNotNull( group.getCreated() );
+      assertNotNull( group.getModifier() );
+      assertEquals( "Tester", group.getModifier() );
+      assertNotNull( group.getLastModified() );
+      assertNotSame( group.getCreated(), group.getLastModified() );
+
+      // Remove the group
+      m_db.delete( group );
+  }
+
+  public void testResave() throws Exception
+  {
+      // Create a new group with random name & 3 members
+      String name = "TestGroup" + String.valueOf( System.currentTimeMillis() );
+      Group group = new Group( name, m_wiki );
+      Principal al = new WikiPrincipal( "Al" );
+      Principal bob = new WikiPrincipal( "Bob" );
+      Principal cookie = new WikiPrincipal( "Cookie" );
+      group.add( al );
+      group.add( bob );
+      group.add( cookie );
+      m_db.save(group, new WikiPrincipal( "Tester" ) );
+
+      // Make sure the profile saved successfully
+      group = backendGroup( name );
+      assertEquals( name, group.getName() );
+
+      // Modify the members by adding the group; re-add Al while we're at it
+      Principal dave = new WikiPrincipal( "Dave" );
+      group.add( al );
+      group.add( dave );
+      m_db.save(group, new WikiPrincipal( "SecondTester" ) );
+
+      // We should see 4 members and new timestamp info
+      List<Principal> members = group.getMembers();
+      assertEquals( 4, members.size() );
+      assertNotNull( group.getCreator() );
+      assertEquals( "Tester", group.getCreator() );
+      assertNotNull( group.getCreated() );
+      assertNotNull( group.getModifier() );
+      assertEquals( "SecondTester", group.getModifier() );
+      assertNotNull( group.getLastModified() );
+
+      // Check the back-end; We should see the same thing
+      group = backendGroup( name );
+      members = group.getMembers();
+      assertEquals( 4, members.size() );
+      assertNotNull( group.getCreator() );
+      assertEquals( "Tester", group.getCreator() );
+      assertNotNull( group.getCreated() );
+      assertNotNull( group.getModifier() );
+      assertEquals( "SecondTester", group.getModifier() );
+      assertNotNull( group.getLastModified() );
+
+      // Remove the group
+      m_db.delete( group );
+  }
+
+  private Group backendGroup( String name ) throws WikiSecurityException
+  {
+      Group[] groups = m_db.groups();
+      for ( int i = 0; i < groups.length; i++ )
+      {
+          Group group = groups[i];
+          if ( group.getName().equals( name ) )
+          {
+              return group;
+          }
+      }
+      throw new NoSuchPrincipalException( "No group named " + name );
+  }
+}

Added: incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/login/AllTests.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/login/AllTests.java?rev=627271&view=auto
==============================================================================
--- incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/login/AllTests.java (added)
+++ incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/login/AllTests.java Tue Feb 12 22:24:02 2008
@@ -0,0 +1,26 @@
+package com.ecyrd.jspwiki.auth.login;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+/**
+ * @author Andrew R. Jaquith
+ */
+public class AllTests extends TestCase
+{
+    public AllTests( String s )
+    {
+        super( s );
+    }
+
+    public static Test suite()
+    {
+        TestSuite suite = new TestSuite( "Login module tests" );
+        suite.addTestSuite( AnonymousLoginModuleTest.class );
+        suite.addTestSuite( CookieAssertionLoginModuleTest.class );
+        suite.addTestSuite( UserDatabaseLoginModuleTest.class );
+        suite.addTestSuite( WebContainerLoginModuleTest.class );
+        return suite;
+    }
+}
\ No newline at end of file

Added: incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/login/AnonymousLoginModuleTest.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/login/AnonymousLoginModuleTest.java?rev=627271&view=auto
==============================================================================
--- incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/login/AnonymousLoginModuleTest.java (added)
+++ incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/login/AnonymousLoginModuleTest.java Tue Feb 12 22:24:02 2008
@@ -0,0 +1,106 @@
+package com.ecyrd.jspwiki.auth.login;
+
+import java.util.Properties;
+import java.util.Set;
+
+import javax.security.auth.Subject;
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.login.LoginContext;
+import javax.security.auth.login.LoginException;
+
+import junit.framework.TestCase;
+import net.sourceforge.stripes.mock.MockHttpServletRequest;
+
+import com.ecyrd.jspwiki.NoRequiredPropertyException;
+import com.ecyrd.jspwiki.TestAuthorizer;
+import com.ecyrd.jspwiki.TestEngine;
+import com.ecyrd.jspwiki.action.ViewActionBean;
+import com.ecyrd.jspwiki.auth.Authorizer;
+import com.ecyrd.jspwiki.auth.WikiPrincipal;
+import com.ecyrd.jspwiki.auth.authorize.Role;
+import com.ecyrd.jspwiki.auth.user.UserDatabase;
+import com.ecyrd.jspwiki.auth.user.XMLUserDatabase;
+
+/**
+ * @author Andrew R. Jaquith
+ */
+public class AnonymousLoginModuleTest extends TestCase
+{
+    Authorizer authorizer;
+
+    UserDatabase db;
+
+    Subject      subject;
+
+    private TestEngine m_engine;
+
+    public final void testLogin()
+    {
+        MockHttpServletRequest request = m_engine.guestTrip( ViewActionBean.class ).getRequest();
+        try
+        {
+            // Test using IP address (AnonymousLoginModule succeeds)
+            CallbackHandler handler = new WebContainerCallbackHandler( m_engine, request, authorizer );
+            LoginContext context = new LoginContext( "JSPWiki-container", subject, handler );
+            context.login();
+            Set principals = subject.getPrincipals();
+            assertEquals( 3, principals.size() );
+            assertTrue( principals.contains( new WikiPrincipal( "127.0.0.1" ) ) );
+            assertTrue( principals.contains( Role.ANONYMOUS ) );
+            assertTrue( principals.contains( Role.ALL ) );
+        }
+        catch( LoginException e )
+        {
+            System.err.println( e.getMessage() );
+            assertTrue( false );
+        }
+    }
+
+    public final void testLogout()
+    {
+        MockHttpServletRequest request = m_engine.guestTrip( ViewActionBean.class ).getRequest();
+        try
+        {
+            CallbackHandler handler = new WebContainerCallbackHandler( m_engine, request, authorizer );
+            LoginContext context = new LoginContext( "JSPWiki-container", subject, handler );
+            context.login();
+            Set principals = subject.getPrincipals();
+            assertEquals( 3, principals.size() );
+            assertTrue( principals.contains( new WikiPrincipal( "127.0.0.1" ) ) );
+            assertTrue( principals.contains( Role.ANONYMOUS ) );
+            assertTrue( principals.contains( Role.ALL ) );
+            context.logout();
+            assertEquals( 0, principals.size() );
+        }
+        catch( LoginException e )
+        {
+            System.err.println( e.getMessage() );
+            assertTrue( false );
+        }
+    }
+
+    /**
+     * @see junit.framework.TestCase#setUp()
+     */
+    protected void setUp() throws Exception
+    {
+        Properties props = new Properties();
+        props.load( TestEngine.findTestProperties() );
+        props.put(XMLUserDatabase.PROP_USERDATABASE, "tests/etc/userdatabase.xml");
+        m_engine = new TestEngine(props);
+        authorizer = new TestAuthorizer();
+        authorizer.initialize( m_engine, props );
+        db = new XMLUserDatabase();
+        subject = new Subject();
+        try
+        {
+            db.initialize( m_engine, props );
+        }
+        catch( NoRequiredPropertyException e )
+        {
+            System.err.println( e.getMessage() );
+            assertTrue( false );
+        }
+    }
+
+}

Added: incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/login/CookieAssertionLoginModuleTest.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/login/CookieAssertionLoginModuleTest.java?rev=627271&view=auto
==============================================================================
--- incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/login/CookieAssertionLoginModuleTest.java (added)
+++ incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/login/CookieAssertionLoginModuleTest.java Tue Feb 12 22:24:02 2008
@@ -0,0 +1,115 @@
+package com.ecyrd.jspwiki.auth.login;
+
+import java.util.Properties;
+import java.util.Set;
+
+import javax.security.auth.Subject;
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.login.LoginContext;
+import javax.security.auth.login.LoginException;
+import javax.servlet.http.Cookie;
+
+import junit.framework.TestCase;
+import net.sourceforge.stripes.mock.MockHttpServletRequest;
+
+import com.ecyrd.jspwiki.NoRequiredPropertyException;
+import com.ecyrd.jspwiki.TestAuthorizer;
+import com.ecyrd.jspwiki.TestEngine;
+import com.ecyrd.jspwiki.action.ViewActionBean;
+import com.ecyrd.jspwiki.auth.AuthenticationManager;
+import com.ecyrd.jspwiki.auth.Authorizer;
+import com.ecyrd.jspwiki.auth.WikiPrincipal;
+import com.ecyrd.jspwiki.auth.authorize.Role;
+import com.ecyrd.jspwiki.auth.user.UserDatabase;
+import com.ecyrd.jspwiki.auth.user.XMLUserDatabase;
+
+/**
+ * @author Andrew R. Jaquith
+ */
+public class CookieAssertionLoginModuleTest extends TestCase
+{
+    Authorizer authorizer;
+
+    UserDatabase db;
+
+    Subject      subject;
+
+    private TestEngine m_engine;
+
+    public final void testLogin()
+    {
+        MockHttpServletRequest request = m_engine.guestTrip( ViewActionBean.class ).getRequest();
+        try
+        {
+            // We can use cookies right?
+            assertTrue( AuthenticationManager.allowsCookieAssertions() );
+
+            // Test using Cookie and IP address (AnonymousLoginModule succeeds)
+            Cookie cookie = new Cookie( CookieAssertionLoginModule.PREFS_COOKIE_NAME, "Bullwinkle" );
+            request.setCookies( new Cookie[]
+            { cookie } );
+            subject = new Subject();
+            CallbackHandler handler = new WebContainerCallbackHandler( m_engine, request, authorizer );
+            LoginContext context = new LoginContext( "JSPWiki-container", subject, handler );
+            context.login();
+            Set principals = subject.getPrincipals();
+            assertEquals( 3, principals.size() );
+            assertTrue( principals.contains( new WikiPrincipal( "Bullwinkle" ) ) );
+            assertTrue( principals.contains( Role.ASSERTED ) );
+            assertTrue( principals.contains( Role.ALL ) );
+        }
+        catch( LoginException e )
+        {
+            System.err.println( e.getMessage() );
+            assertTrue( false );
+        }
+    }
+
+    public final void testLogout()
+    {
+        MockHttpServletRequest request = m_engine.guestTrip( ViewActionBean.class ).getRequest();
+        try
+        {
+            CallbackHandler handler = new WebContainerCallbackHandler( m_engine, request, authorizer );
+            LoginContext context = new LoginContext( "JSPWiki-container", subject, handler );
+            context.login();
+            Set principals = subject.getPrincipals();
+            assertEquals( 3, principals.size() );
+            assertTrue( principals.contains( new WikiPrincipal( "127.0.0.1" ) ) );  // Stripes mock requests always return this
+            assertTrue( principals.contains( Role.ANONYMOUS ) );
+            assertTrue( principals.contains( Role.ALL ) );
+            context.logout();
+            assertEquals( 0, principals.size() );
+        }
+        catch( LoginException e )
+        {
+            System.err.println( e.getMessage() );
+            assertTrue( false );
+        }
+    }
+
+    /**
+     * @see junit.framework.TestCase#setUp()
+     */
+    protected void setUp() throws Exception
+    {
+        Properties props = new Properties();
+        props.load( TestEngine.findTestProperties() );
+        props.put(XMLUserDatabase.PROP_USERDATABASE, "tests/etc/userdatabase.xml");
+        m_engine = new TestEngine(props);
+        authorizer = new TestAuthorizer();
+        authorizer.initialize( m_engine, props );
+        db = new XMLUserDatabase();
+        subject = new Subject();
+        try
+        {
+            db.initialize( m_engine, props );
+        }
+        catch( NoRequiredPropertyException e )
+        {
+            System.err.println( e.getMessage() );
+            assertTrue( false );
+        }
+    }
+
+}

Added: incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/login/UserDatabaseLoginModuleTest.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/login/UserDatabaseLoginModuleTest.java?rev=627271&view=auto
==============================================================================
--- incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/login/UserDatabaseLoginModuleTest.java (added)
+++ incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/login/UserDatabaseLoginModuleTest.java Tue Feb 12 22:24:02 2008
@@ -0,0 +1,106 @@
+package com.ecyrd.jspwiki.auth.login;
+
+import java.util.Properties;
+import java.util.Set;
+
+import javax.security.auth.Subject;
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.login.LoginContext;
+import javax.security.auth.login.LoginException;
+
+import junit.framework.TestCase;
+
+import com.ecyrd.jspwiki.NoRequiredPropertyException;
+import com.ecyrd.jspwiki.TestEngine;
+import com.ecyrd.jspwiki.WikiEngine;
+import com.ecyrd.jspwiki.auth.WikiPrincipal;
+import com.ecyrd.jspwiki.auth.authorize.Role;
+import com.ecyrd.jspwiki.auth.user.UserDatabase;
+import com.ecyrd.jspwiki.auth.user.XMLUserDatabase;
+
+/**
+ * @author Andrew R. Jaquith
+ */
+public class UserDatabaseLoginModuleTest extends TestCase
+{
+    UserDatabase db;
+
+    Subject      subject;
+
+    public final void testLogin()
+    {
+        try
+        {
+            // Log in with a user that isn't in the database
+            CallbackHandler handler = new WikiCallbackHandler( db, "user", "password" );
+            LoginContext context = new LoginContext( "JSPWiki-custom", subject, handler );
+            context.login();
+            Set principals = subject.getPrincipals();
+            assertEquals( 3, principals.size() );
+            assertTrue( principals.contains( new PrincipalWrapper( new WikiPrincipal( "user", WikiPrincipal.LOGIN_NAME ) ) ) );
+            assertTrue( principals.contains( Role.AUTHENTICATED ) );
+            assertTrue( principals.contains( Role.ALL ) );
+            
+            // Login with a user that IS in the databasse
+            subject = new Subject();
+            handler = new WikiCallbackHandler( db, "janne", "myP@5sw0rd" );
+            context = new LoginContext( "JSPWiki-custom", subject, handler );
+            context.login();
+            principals = subject.getPrincipals();
+            assertEquals( 3, principals.size() );
+            assertTrue( principals.contains( new PrincipalWrapper( new WikiPrincipal( "janne", WikiPrincipal.LOGIN_NAME ) ) ) );
+            assertTrue( principals.contains( Role.AUTHENTICATED ) );
+            assertTrue( principals.contains( Role.ALL ) );            
+        }
+        catch( LoginException e )
+        {
+            System.err.println( e.getMessage() );
+            assertTrue( false );
+        }
+    }
+
+    public final void testLogout()
+    {
+        try
+        {
+            CallbackHandler handler = new WikiCallbackHandler( db, "user", "password" );
+            LoginContext context = new LoginContext( "JSPWiki-custom", subject, handler );
+            context.login();
+            Set principals = subject.getPrincipals();
+            assertEquals( 3, principals.size() );
+            assertTrue( principals.contains( new PrincipalWrapper( new WikiPrincipal( "user",  WikiPrincipal.LOGIN_NAME ) ) ) );
+            assertTrue( principals.contains( Role.AUTHENTICATED ) );
+            assertTrue( principals.contains( Role.ALL ) );
+            context.logout();
+            assertEquals( 0, principals.size() );
+        }
+        catch( LoginException e )
+        {
+            System.err.println( e.getMessage() );
+            assertTrue( false );
+        }
+    }
+
+    /**
+     * @see junit.framework.TestCase#setUp()
+     */
+    protected void setUp() throws Exception
+    {
+        Properties props = new Properties();
+        props.load( TestEngine.findTestProperties() );
+        props.put(XMLUserDatabase.PROP_USERDATABASE, "tests/etc/userdatabase.xml");
+        WikiEngine m_engine  = new TestEngine(props);
+        db = new XMLUserDatabase();
+        subject = new Subject();
+        try
+        {
+            db.initialize( m_engine, props );
+        }
+        catch( NoRequiredPropertyException e )
+        {
+            System.err.println( e.getMessage() );
+            assertTrue( false );
+        }
+    }
+
+}
\ No newline at end of file

Added: incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/login/WebContainerLoginModuleTest.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/login/WebContainerLoginModuleTest.java?rev=627271&view=auto
==============================================================================
--- incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/login/WebContainerLoginModuleTest.java (added)
+++ incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/login/WebContainerLoginModuleTest.java Tue Feb 12 22:24:02 2008
@@ -0,0 +1,172 @@
+package com.ecyrd.jspwiki.auth.login;
+
+import java.security.Principal;
+import java.util.HashSet;
+import java.util.Properties;
+import java.util.Set;
+
+import javax.security.auth.Subject;
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.login.LoginContext;
+import javax.security.auth.login.LoginException;
+
+import junit.framework.TestCase;
+import net.sourceforge.stripes.mock.MockHttpServletRequest;
+
+import com.ecyrd.jspwiki.NoRequiredPropertyException;
+import com.ecyrd.jspwiki.TestAuthorizer;
+import com.ecyrd.jspwiki.TestEngine;
+import com.ecyrd.jspwiki.action.ViewActionBean;
+import com.ecyrd.jspwiki.auth.Authorizer;
+import com.ecyrd.jspwiki.auth.WikiPrincipal;
+import com.ecyrd.jspwiki.auth.authorize.Role;
+import com.ecyrd.jspwiki.auth.user.UserDatabase;
+import com.ecyrd.jspwiki.auth.user.XMLUserDatabase;
+
+/**
+ * @author Andrew R. Jaquith
+ */
+public class WebContainerLoginModuleTest extends TestCase
+{
+    Authorizer authorizer;
+
+    UserDatabase db;
+
+    Subject      subject;
+
+    private TestEngine m_engine;
+
+    public final void testLogin()
+    {
+        Principal principal = new WikiPrincipal( "Andrew Jaquith" );
+        Principal wrapper = new PrincipalWrapper( principal );
+        MockHttpServletRequest request = m_engine.guestTrip( ViewActionBean.class ).getRequest();
+        request.setUserPrincipal( principal );
+        try
+        {
+            // Test using Principal (WebContainerLoginModule succeeds)
+            CallbackHandler handler = new WebContainerCallbackHandler( m_engine, request, authorizer );
+            LoginContext context = new LoginContext( "JSPWiki-container", subject, handler );
+            context.login();
+            Set principals = subject.getPrincipals();
+            assertEquals( 3, principals.size() );
+            assertTrue(  principals.contains( wrapper ) );
+            assertFalse( principals.contains( Role.ANONYMOUS ) );
+            assertFalse( principals.contains( Role.ASSERTED ) );
+            assertTrue(  principals.contains( Role.AUTHENTICATED ) );
+            assertTrue(  principals.contains( Role.ALL ) );
+
+            // Test using remote user (WebContainerLoginModule succeeds)
+            subject = new Subject();
+            request = m_engine.guestTrip( ViewActionBean.class ).getRequest();
+            request.setUserPrincipal( new WikiPrincipal( "Andrew Jaquith" ) );
+            handler = new WebContainerCallbackHandler( m_engine, request, authorizer );
+            context = new LoginContext( "JSPWiki-container", subject, handler );
+            context.login();
+            principals = subject.getPrincipals();
+            assertEquals( 3, principals.size() );
+            assertTrue(  principals.contains( wrapper ) );
+            assertFalse( principals.contains( Role.ANONYMOUS ) );
+            assertFalse( principals.contains( Role.ASSERTED ) );
+            assertTrue(  principals.contains( Role.AUTHENTICATED ) );
+            assertTrue(  principals.contains( Role.ALL ) );
+
+            // Test using IP address (AnonymousLoginModule succeeds)
+            subject = new Subject();
+            request = m_engine.guestTrip( ViewActionBean.class ).getRequest();
+            handler = new WebContainerCallbackHandler( m_engine, request, authorizer );
+            context = new LoginContext( "JSPWiki-container", subject, handler );
+            context.login();
+            principals = subject.getPrincipals();
+            assertEquals( 3, principals.size() );
+            assertFalse( principals.contains( principal ) );
+            assertTrue(  principals.contains( Role.ANONYMOUS ) );
+            assertFalse( principals.contains( Role.ASSERTED ) );
+            assertFalse( principals.contains( Role.AUTHENTICATED ) );
+            assertTrue(  principals.contains( Role.ALL ) );
+        }
+        catch( LoginException e )
+        {
+            System.err.println( e.getMessage() );
+            assertTrue( false );
+        }
+    }
+
+    public final void testLoginWithRoles() throws Exception
+    {
+        // Create user with 2 container roles; TestAuthorizer knows about these
+        Principal principal = new WikiPrincipal( "Andrew Jaquith" );
+        Principal wrapper = new PrincipalWrapper( principal );
+        MockHttpServletRequest request = m_engine.guestTrip( ViewActionBean.class ).getRequest();
+        request.setUserPrincipal( principal );
+        Set<String> roles = new HashSet<String>();
+        roles.add( "IT" );
+        roles.add( "Engineering" );
+        request.setRoles( roles );
+
+        // Test using Principal (WebContainerLoginModule succeeds)
+        CallbackHandler handler = new WebContainerCallbackHandler( m_engine, request, authorizer );
+        LoginContext context = new LoginContext( "JSPWiki-container", subject, handler );
+        context.login();
+        Set principals = subject.getPrincipals();
+        assertEquals( 5, principals.size() );
+        assertTrue( principals.contains( wrapper ) );
+        assertFalse( principals.contains( Role.ANONYMOUS ) );
+        assertFalse( principals.contains( Role.ASSERTED ) );
+        assertTrue(  principals.contains( Role.AUTHENTICATED ) );
+        assertTrue(  principals.contains( Role.ALL ) );
+        assertTrue(  principals.contains( new Role( "IT" ) ) );
+        assertTrue(  principals.contains( new Role( "Engineering" ) ) );
+    }
+
+    public final void testLogout()
+    {
+        Principal principal = new WikiPrincipal( "Andrew Jaquith" );
+        Principal wrapper = new PrincipalWrapper( principal );
+        MockHttpServletRequest request = m_engine.guestTrip( ViewActionBean.class ).getRequest();
+        request.setUserPrincipal( principal );
+        try
+        {
+            CallbackHandler handler = new WebContainerCallbackHandler( m_engine, request, authorizer );
+            LoginContext context = new LoginContext( "JSPWiki-container", subject, handler );
+            context.login();
+            Set principals = subject.getPrincipals();
+            assertEquals( 3, principals.size() );
+            assertTrue( principals.contains( wrapper ) );
+            assertTrue( principals.contains( Role.AUTHENTICATED ) );
+            assertTrue( principals.contains( Role.ALL ) );
+            context.logout();
+            assertEquals( 0, principals.size() );
+        }
+        catch( LoginException e )
+        {
+            System.err.println( e.getMessage() );
+            assertTrue( false );
+        }
+    }
+
+    /**
+     * @see junit.framework.TestCase#setUp()
+     */
+    protected void setUp() throws Exception
+    {
+        Properties props = new Properties();
+        props.load( TestEngine.findTestProperties() );
+        props.put(XMLUserDatabase.PROP_USERDATABASE, "tests/etc/userdatabase.xml");
+        m_engine = new TestEngine(props);
+        authorizer = new TestAuthorizer();
+        authorizer.initialize( m_engine, props );
+        db = new XMLUserDatabase();
+        subject = new Subject();
+        try
+        {
+            db.initialize( m_engine, props );
+        }
+        catch( NoRequiredPropertyException e )
+        {
+            System.err.println( e.getMessage() );
+            assertTrue( false );
+        }
+    }
+
+}

Added: incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/permissions/AllPermissionCollectionTest.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/permissions/AllPermissionCollectionTest.java?rev=627271&view=auto
==============================================================================
--- incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/permissions/AllPermissionCollectionTest.java (added)
+++ incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/permissions/AllPermissionCollectionTest.java Tue Feb 12 22:24:02 2008
@@ -0,0 +1,249 @@
+package com.ecyrd.jspwiki.auth.permissions;
+
+import java.security.Permission;
+import java.util.Enumeration;
+
+import junit.framework.TestCase;
+
+/**
+ * @author Andrew R. Jaquith
+ */
+public class AllPermissionCollectionTest extends TestCase
+{
+
+    AllPermissionCollection c_all;
+
+    /**
+     * @see junit.framework.TestCase#setUp()
+     */
+    protected void setUp() throws Exception
+    {
+        super.setUp();
+        c_all = new AllPermissionCollection();
+    }
+
+    public void testAddAllPermission()
+    {
+        AllPermission all1 = new AllPermission( "*" );
+        AllPermission all2 = new AllPermission( "JSPWiki" );
+        AllPermission all3 = new AllPermission( "myWiki" );
+        AllPermission all4 = new AllPermission( "*" );
+
+        c_all.add( all1 );
+        assertEquals( 1, count( c_all ) );
+
+        c_all.add( all2 );
+        assertEquals( 2, count( c_all ) );
+
+        c_all.add( all3 );
+        assertEquals( 3, count( c_all ) );
+
+        // The last one is a duplicate and shouldn't be counted...
+        c_all.add( all4 );
+        assertEquals( 3, count( c_all ) );
+    }
+    
+    public void testAddPagePermission()
+    {
+        PagePermission p1 = new PagePermission( "JSPWiki:Main", "edit" );
+        PagePermission p2 = new PagePermission( "JSPWiki:GroupAdmin", "edit" );
+        PagePermission p3 = new PagePermission( "JSPWiki:Foobar", "delete" );
+        PagePermission p4 = new PagePermission( "JSPWiki:Main", "edit" );
+
+        c_all.add( p1 );
+        assertEquals( 1, count( c_all ) );
+
+        c_all.add( p2 );
+        assertEquals( 2, count( c_all ) );
+
+        c_all.add( p3 );
+        assertEquals( 3, count( c_all ) );
+
+        // The last one is a duplicate and shouldn't be counted...
+        c_all.add( p4 );
+        assertEquals( 3, count( c_all ) );
+    }
+    
+    public void testAddWikiPermission()
+    {
+        WikiPermission p1 = new WikiPermission( "JSPWiki", "login" );
+        WikiPermission p2 = new WikiPermission( "JSPWiki", "createGroups" );
+        WikiPermission p3 = new WikiPermission( "JSPWiki", "editPreferences" );
+        WikiPermission p4 = new WikiPermission( "JSPWiki", "login" );
+
+        c_all.add( p1 );
+        assertEquals( 1, count( c_all ) );
+
+        c_all.add( p2 );
+        assertEquals( 2, count( c_all ) );
+
+        c_all.add( p3 );
+        assertEquals( 3, count( c_all ) );
+
+        // The last one is a duplicate and shouldn't be counted...
+        c_all.add( p4 );
+        assertEquals( 3, count( c_all ) );
+    }
+    
+    public void testReadOnly()
+    {
+        AllPermission all1 = new AllPermission( "*" );
+        AllPermission all2 = new AllPermission( "JSPWiki" );
+
+        assertFalse( c_all.isReadOnly() );
+        c_all.add( all1 );
+        assertFalse( c_all.isReadOnly() );
+
+        // Mark as read-only; isReadOnly should return "true", as we'll get an
+        // error
+        c_all.setReadOnly();
+        assertTrue( c_all.isReadOnly() );
+        boolean exception = false;
+        try
+        {
+            c_all.add( all2 );
+        }
+        catch( SecurityException e )
+        {
+            exception = true;
+        }
+
+        if ( !exception )
+        {
+            // We should never get here
+            assertTrue( false );
+        }
+    }
+
+    public void testImpliesAllPermission()
+    {
+        AllPermission all1 = new AllPermission( "JSPWiki" );
+        AllPermission all2 = new AllPermission( "myWiki" );
+        AllPermission all3 = new AllPermission( "big*" );
+        AllPermission all4 = new AllPermission( "*" );
+
+        c_all.add( all1 );
+        assertTrue( c_all.implies( new AllPermission( "JSPWiki" ) ) );
+        assertFalse( c_all.implies( new AllPermission( "myWiki" ) ) );
+
+        c_all.add( all2 );
+        assertTrue( c_all.implies( new AllPermission( "JSPWiki" ) ) );
+        assertTrue( c_all.implies( new AllPermission( "myWiki" ) ) );
+        assertFalse( c_all.implies( new AllPermission( "bigTimeWiki" ) ) );
+
+        c_all.add( all3 );
+        assertTrue( c_all.implies( new AllPermission( "JSPWiki" ) ) );
+        assertTrue( c_all.implies( new AllPermission( "myWiki" ) ) );
+        assertTrue( c_all.implies( new AllPermission( "bigTimeWiki" ) ) );
+        assertTrue( c_all.implies( new AllPermission( "bigBigBigWiki" ) ) );
+        assertFalse( c_all.implies( new AllPermission( "bittyWiki" ) ) );
+
+        c_all.add( all4 );
+        assertTrue( c_all.implies( new AllPermission( "JSPWiki" ) ) );
+        assertTrue( c_all.implies( new AllPermission( "myWiki" ) ) );
+        assertTrue( c_all.implies( new AllPermission( "bigTimeWiki" ) ) );
+        assertTrue( c_all.implies( new AllPermission( "bigBigBigWiki" ) ) );
+        assertTrue( c_all.implies( new AllPermission( "bittyWiki" ) ) );
+    }
+
+    public void testImpliesPagePermission()
+    {
+        AllPermission all1 = new AllPermission( "JSPWiki" );
+        AllPermission all2 = new AllPermission( "*" );
+
+        c_all.add( all1 );
+        assertTrue( c_all.implies( new PagePermission( "JSPWiki:Main", "edit" ) ) );
+        assertTrue( c_all.implies( new PagePermission( "JSPWiki:GroupAdmin", "edit" ) ) );
+        assertTrue( c_all.implies( new PagePermission( "JSPWiki:Foobar", "delete" ) ) );
+        assertFalse( c_all.implies( new PagePermission( "myWiki:Foobar", "delete" ) ) );
+        assertFalse( c_all.implies( new PagePermission( "bigTimeWiki:*", "view" ) ) );
+
+        c_all.add( all2 );
+        assertTrue( c_all.implies( new PagePermission( "JSPWiki:Main", "edit" ) ) );
+        assertTrue( c_all.implies( new PagePermission( "JSPWiki:GroupAdmin", "edit" ) ) );
+        assertTrue( c_all.implies( new PagePermission( "JSPWiki:Foobar", "delete" ) ) );
+        assertTrue( c_all.implies( new PagePermission( "myWiki:Foobar", "delete" ) ) );
+        assertTrue( c_all.implies( new PagePermission( "bigTimeWiki:*", "view" ) ) );
+    }
+
+    public void testImpliesWikiPermission()
+    {
+        AllPermission all1 = new AllPermission( "JSPWiki" );
+        AllPermission all2 = new AllPermission( "*" );
+
+        c_all.add( all1 );
+        assertTrue( c_all.implies( new WikiPermission( "JSPWiki", "login" ) ) );
+        assertTrue( c_all.implies( new WikiPermission( "JSPWiki", "createGroups" ) ) );
+        assertTrue( c_all.implies( new WikiPermission( "JSPWiki", "editPreferences" ) ) );
+        assertFalse( c_all.implies( new WikiPermission( "myWiki", "editPreferences" ) ) );
+        assertFalse( c_all.implies( new WikiPermission( "bigTimeWiki", "login" ) ) );
+
+        c_all.add( all2 );
+        assertTrue( c_all.implies( new WikiPermission( "JSPWiki", "login" ) ) );
+        assertTrue( c_all.implies( new WikiPermission( "JSPWiki", "createGroups" ) ) );
+        assertTrue( c_all.implies( new WikiPermission( "JSPWiki", "editPreferences" ) ) );
+        assertTrue( c_all.implies( new WikiPermission( "myWiki", "editPreferences" ) ) );
+        assertTrue( c_all.implies( new WikiPermission( "bigTimeWiki", "login" ) ) );
+    }
+    
+    public void testImpliesMixedPermissions()
+    {
+        Permission p1 = new AllPermission( "JSPWiki" );
+        Permission p2 = new WikiPermission( "myWiki", "editPreferences" );
+        Permission p3 = new PagePermission( "bigTimeWiki:FooBar", "modify" );
+        Permission p4 = new AllPermission( "*" );
+
+        c_all.add( p1 );
+        assertTrue( c_all.implies( new WikiPermission( "JSPWiki", "login" ) ) );
+        assertTrue( c_all.implies( new PagePermission( "JSPWiki:FooBar", "edit" ) ) );
+        assertFalse( c_all.implies( new WikiPermission( "myWiki", "editPreferences" ) ) );
+        assertFalse( c_all.implies( new WikiPermission( "myWiki", "login" ) ) );
+        assertFalse( c_all.implies( new WikiPermission( "bigTimeWiki", "login" ) ) );
+        assertFalse( c_all.implies( new PagePermission( "bigTimeWiki:FooBar", "edit" ) ) );
+        assertFalse( c_all.implies( new PagePermission( "bigTimeWiki:FooBar", "delete" ) ) );
+        assertFalse( c_all.implies( new PagePermission( "bigTimeWiki:Bar", "delete" ) ) );
+
+        c_all.add( p2 );
+        assertTrue( c_all.implies( new WikiPermission( "JSPWiki", "login" ) ) );
+        assertTrue( c_all.implies( new PagePermission( "JSPWiki:FooBar", "edit" ) ) );
+        assertTrue( c_all.implies( new WikiPermission( "myWiki", "editPreferences" ) ) );
+        assertFalse( c_all.implies( new WikiPermission( "myWiki", "login" ) ) );
+        assertFalse( c_all.implies( new WikiPermission( "bigTimeWiki", "login" ) ) );
+        assertFalse( c_all.implies( new PagePermission( "bigTimeWiki:FooBar", "edit" ) ) );
+        assertFalse( c_all.implies( new PagePermission( "bigTimeWiki:FooBar", "delete" ) ) );
+        assertFalse( c_all.implies( new PagePermission( "bigTimeWiki:Bar", "delete" ) ) );
+        
+        c_all.add( p3 );
+        assertTrue( c_all.implies( new WikiPermission( "JSPWiki", "login" ) ) );
+        assertTrue( c_all.implies( new PagePermission( "JSPWiki:FooBar", "edit" ) ) );
+        assertTrue( c_all.implies( new WikiPermission( "myWiki", "editPreferences" ) ) );
+        assertFalse( c_all.implies( new WikiPermission( "myWiki", "login" ) ) );
+        assertFalse( c_all.implies( new WikiPermission( "bigTimeWiki", "login" ) ) );
+        assertTrue( c_all.implies( new PagePermission( "bigTimeWiki:FooBar", "edit" ) ) );
+        assertFalse( c_all.implies( new PagePermission( "bigTimeWiki:FooBar", "delete" ) ) );
+        assertFalse( c_all.implies( new PagePermission( "bigTimeWiki:Bar", "delete" ) ) );
+        
+        c_all.add( p4 );
+        assertTrue( c_all.implies( new WikiPermission( "JSPWiki", "login" ) ) );
+        assertTrue( c_all.implies( new PagePermission( "JSPWiki:FooBar", "edit" ) ) );
+        assertTrue( c_all.implies( new WikiPermission( "myWiki", "editPreferences" ) ) );
+        assertTrue( c_all.implies( new WikiPermission( "myWiki", "login" ) ) );
+        assertTrue( c_all.implies( new WikiPermission( "bigTimeWiki", "login" ) ) );
+        assertTrue( c_all.implies( new PagePermission( "bigTimeWiki:FooBar", "edit" ) ) );
+        assertTrue( c_all.implies( new PagePermission( "bigTimeWiki:FooBar", "delete" ) ) );
+        assertTrue( c_all.implies( new PagePermission( "bigTimeWiki:Bar", "delete" ) ) );
+    }
+    
+    private int count( AllPermissionCollection collection )
+    {
+        int i = 0;
+        Enumeration perms = collection.elements();
+        while( perms.hasMoreElements() )
+        {
+            perms.nextElement();
+            i++;
+        }
+        return i;
+    }
+
+}

Added: incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/permissions/AllPermissionTest.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/permissions/AllPermissionTest.java?rev=627271&view=auto
==============================================================================
--- incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/permissions/AllPermissionTest.java (added)
+++ incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/permissions/AllPermissionTest.java Tue Feb 12 22:24:02 2008
@@ -0,0 +1,83 @@
+package com.ecyrd.jspwiki.auth.permissions;
+
+import junit.framework.TestCase;
+
+/**
+ * @author Andrew Jaquith
+ */
+public class AllPermissionTest extends TestCase
+{
+
+    /*
+     * Class under test for boolean equals(Object)
+     */
+    public void testEqualsObject()
+    {
+        AllPermission p1 = new AllPermission( "*" );
+        AllPermission p2 = new AllPermission( "*" );
+        AllPermission p3 = new AllPermission( "myWiki" );
+        assertTrue( p1.equals( p2 ) );
+        assertTrue( p2.equals( p1 ) );
+        assertFalse( p1.equals( p3 ) );
+        assertFalse( p3.equals( p1 ) );
+    }
+
+    public void testImpliesAllPermission()
+    {
+        AllPermission p1 = new AllPermission( "*" );
+        AllPermission p2 = new AllPermission( "*" );
+        assertTrue( p1.equals( p2 ) );
+        assertTrue( p2.equals( p1 ) );
+
+        p2 = new AllPermission( "myWiki" );
+        assertTrue( p1.implies( p2 ) );
+        assertFalse( p2.implies( p1 ) );
+    }
+
+    public void testImpliesPagePermission()
+    {
+        AllPermission p1 = new AllPermission( "*" );
+        PagePermission p2 = new PagePermission( "*:TestPage", "delete" );
+        assertTrue( p1.implies( p2 ) );
+        assertFalse( p2.implies( p1 ) );
+
+        p2 = new PagePermission( "myWiki:TestPage", "delete" );
+        assertTrue( p1.implies( p2 ) );
+        assertFalse( p2.implies( p1 ) );
+        
+        p2 = new PagePermission( "*:GroupTest", "delete" );
+        assertTrue( p1.implies( p2 ) );
+        assertFalse( p2.implies( p1 ) );
+        
+        p2 = new PagePermission( "myWiki:GroupTest", "delete" );
+        assertTrue( p1.implies( p2 ) );
+        assertFalse( p2.implies( p1 ) );
+    }
+
+    public void testImpliesWikiPermission()
+    {
+        AllPermission p1 = new AllPermission( "*" );
+        WikiPermission p2 = new WikiPermission( "*", "createPages" );
+        assertTrue( p1.implies( p2 ) );
+        assertFalse( p2.implies( p1 ) );
+
+        p2 = new WikiPermission( "myWiki", "createPages" );
+        assertTrue( p1.implies( p2 ) );
+        assertFalse( p2.implies( p1 ) );
+    }
+
+    /*
+     * Class under test for String toString()
+     */
+    public void testToString()
+    {
+        AllPermission p = new AllPermission( "myWiki" );
+        String result = "(\"com.ecyrd.jspwiki.auth.permissions.AllPermission\",\"myWiki\")";
+        assertEquals( result, p.toString() );
+
+        p = new AllPermission( "*" );
+        result = "(\"com.ecyrd.jspwiki.auth.permissions.AllPermission\",\"*\")";
+        assertEquals( result, p.toString() );
+    }
+
+}

Added: incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/permissions/AllTests.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/permissions/AllTests.java?rev=627271&view=auto
==============================================================================
--- incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/permissions/AllTests.java (added)
+++ incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/permissions/AllTests.java Tue Feb 12 22:24:02 2008
@@ -0,0 +1,27 @@
+package com.ecyrd.jspwiki.auth.permissions;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+/**
+ * @author Andrew R. Jaquith
+ */
+public class AllTests extends TestCase
+{
+    public AllTests( String s )
+    {
+        super( s );
+    }
+
+    public static Test suite()
+    {
+        TestSuite suite = new TestSuite( "Permissions tests" );
+        suite.addTestSuite( AllPermissionTest.class );
+        suite.addTestSuite( AllPermissionCollectionTest.class );
+        suite.addTestSuite( GroupPermissionTest.class );
+        suite.addTestSuite( PagePermissionTest.class );
+        suite.addTestSuite( WikiPermissionTest.class );
+        return suite;
+    }
+}
\ No newline at end of file

Added: incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/permissions/GroupPermissionTest.java
URL: http://svn.apache.org/viewvc/incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/permissions/GroupPermissionTest.java?rev=627271&view=auto
==============================================================================
--- incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/permissions/GroupPermissionTest.java (added)
+++ incubator/jspwiki/branches/JSPWIKI_STRIPES_BRANCH/tests/com/ecyrd/jspwiki/auth/permissions/GroupPermissionTest.java Tue Feb 12 22:24:02 2008
@@ -0,0 +1,314 @@
+package com.ecyrd.jspwiki.auth.permissions;
+
+import java.security.AccessControlException;
+import java.security.Permission;
+import java.security.PrivilegedAction;
+
+import javax.security.auth.Subject;
+
+import com.ecyrd.jspwiki.auth.GroupPrincipal;
+import com.ecyrd.jspwiki.auth.WikiPrincipal;
+
+import junit.framework.TestCase;
+
+/**
+ * @author Andrew R. Jaquith
+ */
+public class GroupPermissionTest extends TestCase
+{
+
+    public static void main( String[] args )
+    {
+        junit.textui.TestRunner.run( GroupPermissionTest.class );
+    }
+
+    /*
+     * Class under test for boolean equals(java.lang.Object)
+     */
+    public final void testEqualsObject()
+    {
+        GroupPermission p1 = new GroupPermission( "mywiki:Test", "view,edit,delete" );
+        GroupPermission p2 = new GroupPermission( "mywiki:Test", "view,edit,delete" );
+        GroupPermission p3 = new GroupPermission( "mywiki:Test", "delete,view,edit" );
+        GroupPermission p4 = new GroupPermission( "mywiki:Test*", "delete,view,edit" );
+        assertEquals( p1, p2 );
+        assertEquals( p1, p3 );
+        assertFalse( p3.equals( p4 ) );
+    }
+
+    public final void testCreateMask()
+    {
+        assertEquals( 1, GroupPermission.createMask( "view" ) );
+        assertEquals( 7, GroupPermission.createMask( "view,edit,delete" ) );
+        assertEquals( 7, GroupPermission.createMask( "edit,delete,view" ) );
+        assertEquals( 2, GroupPermission.createMask( "edit" ) );
+        assertEquals( 6, GroupPermission.createMask( "edit,delete" ) );
+    }
+
+    /*
+     * Class under test for java.lang.String toString()
+     */
+    public final void testToString()
+    {
+        GroupPermission p;
+        p = new GroupPermission( "Test", "view,edit,delete" );
+        assertEquals( "(\"com.ecyrd.jspwiki.auth.permissions.GroupPermission\",\"*:Test\",\"delete,edit,view\")", p
+                .toString() );
+        p = new GroupPermission( "mywiki:Test", "view,edit,delete" );
+        assertEquals( "(\"com.ecyrd.jspwiki.auth.permissions.GroupPermission\",\"mywiki:Test\",\"delete,edit,view\")", p
+                .toString() );
+    }
+
+    /**
+     * Tests wiki name support.
+     */
+    public final void testWikiNames()
+    {
+        GroupPermission p1;
+        GroupPermission p2;
+
+        // Permissions without prepended wiki name should imply themselves
+        p1 = new GroupPermission( "Test", "edit" );
+        p2 = new GroupPermission( "Test", "edit" );
+        assertTrue( p1.implies( p1 ) );
+        assertTrue( p1.implies( p2 ) );
+
+        // Permissions with a wildcard wiki should imply other wikis
+        p1 = new GroupPermission( "*:Test", "edit" );
+        p2 = new GroupPermission( "mywiki:Test", "edit" );
+        assertTrue( p1.implies( p2 ) );
+        assertFalse( p2.implies( p1 ) );
+
+        // Permissions that start with ":" are just like "*:"
+        p1 = new GroupPermission( "*:Test", "edit" );
+        p2 = new GroupPermission( "Test", "edit" );
+        assertTrue( p1.implies( p1 ) );
+        assertTrue( p1.implies( p2 ) );
+    }
+
+    public final void testImpliesMember()
+    {
+        GroupPermission p1;
+        Permission p2;
+        Subject s;
+        
+        // <groupmember> implies TestGroup if Subject has GroupPermission("TestGroup")
+        p1 = new GroupPermission( "*:<groupmember>", "view" );
+        p2 = new GroupPermission ("*:TestGroup", "view" );
+        s = new Subject();
+        s.getPrincipals().add( new GroupPrincipal( "TestGroup" ) );
+        assertTrue( subjectImplies( s, p1, p2 ) );
+        
+        // <groupmember> doesn't imply it if Subject has no GroupPermission("TestGroup")
+        s = new Subject();
+        s.getPrincipals().add( new WikiPrincipal( "TestGroup" ) );
+        assertFalse( subjectImplies( s, p1, p2 ) );
+        
+        // <groupmember> doesn't imply it if Subject's GP doesn't match
+        s = new Subject();
+        s.getPrincipals().add( new GroupPrincipal( "FooGroup" ) );
+        assertFalse( subjectImplies( s, p1, p2 ) );
+        
+        // <groupmember> doesn't imply it if p2 isn't GroupPermission type
+        p2 = new PagePermission ("*:TestGroup", "view" );
+        s = new Subject();
+        s.getPrincipals().add( new GroupPrincipal( "TestGroup" ) );
+        assertFalse( subjectImplies( s, p1, p2 ) );
+        
+        // <groupmember> implies TestGroup if not called with Subject combiner
+        p1 = new GroupPermission( "*:<groupmember>", "view" );
+        p2 = new GroupPermission ("*:TestGroup", "view" );
+        assertFalse( p1.impliesMember( p2 ) );
+    }
+    
+    
+    /*
+     * Class under test for boolean implies(java.security.Permission)
+     */
+    public final void testImpliesPermission()
+    {
+        GroupPermission p1;
+        GroupPermission p2;
+        GroupPermission p3;
+
+        // The same permission should imply itself
+        p1 = new GroupPermission( "mywiki:Test", "view,edit,delete" );
+        p2 = new GroupPermission( "mywiki:Test", "view,edit,delete" );
+        assertTrue( p1.implies( p2 ) );
+        assertTrue( p2.implies( p1 ) );
+
+        // The same permission should imply itself for wildcard wikis
+        p1 = new GroupPermission( "Test", "view,edit,delete" );
+        p2 = new GroupPermission( "*:Test", "view,edit,delete" );
+        p3 = new GroupPermission( "mywiki:Test", "view,edit,delete" );
+        assertTrue( p1.implies( p2 ) );
+        assertTrue( p2.implies( p1 ) );
+        assertTrue( p1.implies( p3 ) );
+        assertTrue( p2.implies( p3 ) );
+        assertFalse( p3.implies( p1 ) );
+        assertFalse( p3.implies( p2 ) );
+
+        // Actions on collection should imply permission for group with same
+        // actions
+        p1 = new GroupPermission( "*:*", "view,edit,delete" );
+        p2 = new GroupPermission( "*:Test", "view,edit,delete" );
+        p3 = new GroupPermission( "mywiki:Test", "view,edit,delete" );
+        assertTrue( p1.implies( p2 ) );
+        assertTrue( p1.implies( p3 ) );
+        assertTrue( p2.implies( p3 ) );
+        assertFalse( p2.implies( p1 ) );
+        assertFalse( p3.implies( p1 ) );
+
+        // Actions on single group should imply subset of those actions
+        p1 = new GroupPermission( "*:Test", "view,edit,delete" );
+        p2 = new GroupPermission( "*:Test", "view" );
+        p3 = new GroupPermission( "mywiki:Test", "view" );
+        assertTrue( p1.implies( p2 ) );
+        assertTrue( p1.implies( p3 ) );
+        assertFalse( p2.implies( p1 ) );
+        assertFalse( p3.implies( p1 ) );
+        assertFalse( p3.implies( p2 ) );
+
+        // Actions on collection should imply subset of actions on single group
+        p1 = new GroupPermission( "*:*", "view,edit,delete" );
+        p2 = new GroupPermission( "*:Test", "view" );
+        p3 = new GroupPermission( "mywiki:Test", "view" );
+        assertTrue( p1.implies( p2 ) );
+        assertTrue( p1.implies( p3 ) );
+        assertFalse( p2.implies( p1 ) );
+        assertFalse( p3.implies( p1 ) );
+
+        p1 = new GroupPermission( "*:Tes*", "view,edit,delete" );
+        p2 = new GroupPermission( "*:Test", "view" );
+        p3 = new GroupPermission( "mywiki:Test", "view" );
+        assertTrue( p1.implies( p2 ) );
+        assertTrue( p1.implies( p3 ) );
+        assertFalse( p2.implies( p1 ) );
+        assertFalse( p3.implies( p1 ) );
+
+        p1 = new GroupPermission( "*:*st", "view,edit,delete" );
+        p2 = new GroupPermission( "*:Test", "view" );
+        p3 = new GroupPermission( "mywiki:Test", "view" );
+        assertTrue( p1.implies( p2 ) );
+        assertTrue( p1.implies( p3 ) );
+        assertFalse( p2.implies( p1 ) );
+        assertFalse( p3.implies( p1 ) );
+
+        // Delete action on collection should imply edit/view on
+        // single group
+        p1 = new GroupPermission( "*:*st", "delete" );
+        p2 = new GroupPermission( "*:Test", "edit" );
+        p3 = new GroupPermission( "mywiki:Test", "edit" );
+        assertTrue( p1.implies( p2 ) );
+        assertTrue( p1.implies( p3 ) );
+        assertFalse( p2.implies( p1 ) );
+        assertFalse( p3.implies( p1 ) );
+
+        p2 = new GroupPermission( "*:Test", "view" );
+        p3 = new GroupPermission( "mywiki:Test", "view" );
+        assertTrue( p1.implies( p2 ) );
+        assertTrue( p1.implies( p3 ) );
+        assertFalse( p2.implies( p1 ) );
+        assertFalse( p3.implies( p1 ) );
+
+        // Edit action on collection should imply view on single group
+        p1 = new GroupPermission( "*:*st", "edit" );
+        p2 = new GroupPermission( "*:Test", "view" );
+        p3 = new GroupPermission( "mywiki:Test", "view" );
+        assertTrue( p1.implies( p2 ) );
+        assertTrue( p1.implies( p3 ) );
+        assertFalse( p2.implies( p1 ) );
+        assertFalse( p3.implies( p1 ) );
+
+
+        // Pre- and post- wildcards should also be fine
+        p1 = new GroupPermission( "*:Test*", "view" );
+        p2 = new GroupPermission( "*:TestGroup", "view" );
+        p3 = new GroupPermission( "mywiki:TestGroup", "view" );
+        assertTrue( p1.implies( p2 ) );
+        assertTrue( p1.implies( p3 ) );
+        assertFalse( p2.implies( p1 ) );
+        assertFalse( p3.implies( p1 ) );
+
+        p1 = new GroupPermission( "*:*Group", "view" );
+        p2 = new GroupPermission( "*:TestGroup", "view" );
+        p3 = new GroupPermission( "mywiki:TestGroup", "view" );
+        assertTrue( p1.implies( p2 ) );
+        assertTrue( p1.implies( p3 ) );
+        assertFalse( p2.implies( p1 ) );
+        assertFalse( p3.implies( p1 ) );
+        
+        // Wildcards don't imply the <groupmember> target
+        p1 = new GroupPermission( "*:*", "view" );
+        p2 = new GroupPermission( "*:<groupmember>", "view" );
+        assertFalse( p1.implies( p2 ) );
+        assertFalse( p2.implies( p1 ) );
+        
+        p1 = new GroupPermission( "*:*ber>", "view" );
+        assertFalse( p1.implies( p2 ) );
+        assertFalse( p2.implies( p1 ) );
+    }
+    
+    public final void testImplies()
+    {
+        assertTrue( GroupPermission.DELETE.implies( GroupPermission.EDIT ) );
+        assertTrue( GroupPermission.DELETE.implies( GroupPermission.VIEW ) );
+        assertTrue( GroupPermission.EDIT.implies( GroupPermission.VIEW ) );
+    }
+
+    public final void testImpliedMask()
+    {
+        int result = ( GroupPermission.DELETE_MASK | GroupPermission.EDIT_MASK | GroupPermission.VIEW_MASK );
+        assertEquals( result, GroupPermission.impliedMask( GroupPermission.DELETE_MASK ) );
+
+        result = ( GroupPermission.EDIT_MASK | GroupPermission.VIEW_MASK );
+        assertEquals( result, GroupPermission.impliedMask( GroupPermission.EDIT_MASK ) );
+    }
+
+    public final void testGetName()
+    {
+        GroupPermission p;
+        p = new GroupPermission( "Test", "view,edit,delete" );
+        assertEquals( "Test", p.getName() );
+        p = new GroupPermission( "mywiki:Test", "view,edit,delete" );
+        assertEquals( "mywiki:Test", p.getName() );
+        assertNotSame( "*:Test", p.getName() );
+    }
+
+    /*
+     * Class under test for java.lang.String getActions()
+     */
+    public final void testGetActions()
+    {
+        GroupPermission p = new GroupPermission( "Test", "VIEW,edit,delete" );
+        assertEquals( "delete,edit,view", p.getActions() );
+    }
+
+    /**
+     * Binds a Subject to the current AccessControlContext and calls 
+     * p1.implies(p2).
+     * @param subject
+     * @param p1
+     * @param p2
+     * @return
+     */
+    protected final boolean subjectImplies( final Subject subject, final GroupPermission p1, final Permission p2 )
+    {
+        try
+        {
+            Boolean result = (Boolean)Subject.doAsPrivileged( subject, new PrivilegedAction()
+            {
+                public Object run()
+                {
+                    return Boolean.valueOf( p1.impliesMember( p2 ) );
+                }
+            }, null );
+            return result.booleanValue();
+        }
+        catch( AccessControlException e )
+        {
+            return false;
+        }
+    }
+
+}