com.jpeterson.littles3.bo.AcpTest.java Source code

Java tutorial

Introduction

Here is the source code for com.jpeterson.littles3.bo.AcpTest.java

Source

/*
 * Copyright 2007 Jesse Peterson
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *     http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.jpeterson.littles3.bo;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.AccessControlException;
import java.util.Enumeration;

import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class AcpTest extends TestCase {
    private Log logger;

    /**
     * Create the test case
     * 
     * @param testName
     *            name of the test case
     */
    public AcpTest(String testName) {
        super(testName);

        logger = LogFactory.getLog(this.getClass());
        logger.debug("AcpTest");
    }

    /**
     * @return the suite of tests being tested
     */
    public static Test suite() {
        return new TestSuite(AcpTest.class);
    }

    /**
     * Test the <code>grant()</code> method.
     */
    public void test_grant() {
        Acp acp;
        Grantee id, foo, bar, baz, anonymous;

        acp = new Acp();

        id = new CanonicalUser("id");
        foo = new CanonicalUser("foo");
        bar = new CanonicalUser("bar");
        baz = new CanonicalUser("baz");
        anonymous = new CanonicalUser(CanonicalUser.ID_ANONYMOUS);

        acp.grant(id, ResourcePermission.ACTION_FULL_CONTROL);
        acp.grant(foo, ResourcePermission.ACTION_WRITE);
        acp.grant(foo, ResourcePermission.ACTION_READ_ACP);
        acp.grant(bar, ResourcePermission.ACTION_WRITE);
        acp.grant(bar, ResourcePermission.ACTION_READ_ACP);
        acp.grant(AllUsersGroup.getInstance(), ResourcePermission.ACTION_READ);

        acp.checkPermission(new ResourcePermission(id, ResourcePermission.ACTION_READ));
        acp.checkPermission(new ResourcePermission(id, ResourcePermission.ACTION_WRITE));
        acp.checkPermission(new ResourcePermission(id, ResourcePermission.ACTION_READ_ACP));
        acp.checkPermission(new ResourcePermission(id, ResourcePermission.ACTION_WRITE_ACP));

        acp.checkPermission(new ResourcePermission(foo, ResourcePermission.ACTION_READ));
        acp.checkPermission(new ResourcePermission(foo, ResourcePermission.ACTION_WRITE));
        acp.checkPermission(new ResourcePermission(foo, ResourcePermission.ACTION_READ_ACP));
        try {
            acp.checkPermission(new ResourcePermission(foo, ResourcePermission.ACTION_WRITE_ACP));
            fail("Should have thrown an exception");
        } catch (AccessControlException e) {
            // expected
        }

        acp.checkPermission(new ResourcePermission(baz, ResourcePermission.ACTION_READ));
        try {
            acp.checkPermission(new ResourcePermission(baz, ResourcePermission.ACTION_WRITE));
            fail("Should have thrown an exception");
        } catch (AccessControlException e) {
            // expected
        }
        try {
            acp.checkPermission(new ResourcePermission(baz, ResourcePermission.ACTION_READ_ACP));
            fail("Should have thrown an exception");
        } catch (AccessControlException e) {
            // expected
        }
        try {
            acp.checkPermission(new ResourcePermission(baz, ResourcePermission.ACTION_WRITE_ACP));
        } catch (AccessControlException e) {
            // expected
        }

        acp.checkPermission(new ResourcePermission(anonymous, ResourcePermission.ACTION_READ));
        try {
            acp.checkPermission(new ResourcePermission(anonymous, ResourcePermission.ACTION_WRITE));
            fail("Should have thrown an exception");
        } catch (AccessControlException e) {
            // expected
        }
        try {
            acp.checkPermission(new ResourcePermission(anonymous, ResourcePermission.ACTION_READ_ACP));
            fail("Should have thrown an exception");
        } catch (AccessControlException e) {
            // expected
        }
        try {
            acp.checkPermission(new ResourcePermission(anonymous, ResourcePermission.ACTION_WRITE_ACP));
        } catch (AccessControlException e) {
            // expected
        }
    }

    /**
     * Test granting an illegal permission.
     */
    public void test_grantIllegalPermission() {
        Acp acp = new Acp();

        try {
            acp.grant(new CanonicalUser("foo"), "delete");
            fail("Should have thrown an exception");
        } catch (IllegalArgumentException e) {
            // expected
        }
    }

    /**
     * Test the owner property access methods.
     */
    public void test_owner() {
        Acp acp = new Acp();
        CanonicalUser owner = new CanonicalUser("foo");

        assertNull("Unexpected value", acp.getOwner());
        acp.setOwner(owner);
        assertEquals("Unexpected value", owner, acp.getOwner());
    }

    /**
     * Test the ability to get the grants.
     */
    public void test_grants() {
        Acp acp = new Acp();
        ResourcePermission grant;

        acp.grant(new CanonicalUser("foo"), "FULL_CONTROL");
        acp.grant(new CanonicalUser("bar"), "WRITE");
        acp.grant(AuthenticatedUsersGroup.getInstance(), "READ_ACP");

        Enumeration grants = acp.grants();

        assertTrue("Should be more grants", grants.hasMoreElements());
        grant = (ResourcePermission) grants.nextElement();
        grant.getGrantee();
        assertTrue("Should be more grants", grants.hasMoreElements());
        grants.nextElement();
        assertTrue("Should be more grants", grants.hasMoreElements());
        grants.nextElement();
        assertFalse("Should not be more grants", grants.hasMoreElements());
    }

    /**
     * Test the size property.
     */
    public void test_size() {
        Acp acp = new Acp();

        assertEquals("Unexpected size", 0, acp.size());
        acp.grant(new CanonicalUser("foo"), "FULL_CONTROL");
        assertEquals("Unexpected size", 1, acp.size());
        acp.grant(new CanonicalUser("bar"), "WRITE");
        assertEquals("Unexpected size", 2, acp.size());
        acp.grant(AuthenticatedUsersGroup.getInstance(), "READ_ACP");
        assertEquals("Unexpected size", 3, acp.size());
    }

    /**
     * Test the limit on the number of grants.
     */
    public void test_tooManyGrants() {
        Acp acp = new Acp();

        for (int i = 0; i < 100; i++) {
            acp.grant(AllUsersGroup.getInstance(), "read");
        }

        try {
            acp.grant(AuthenticatedUsersGroup.getInstance(), "write");
            fail("Should have thrown an exception");
        } catch (IndexOutOfBoundsException e) {
            // expected
        }
    }

    /**
     * Test the <code>canRead()</code> method.
     */
    public void test_canRead() {
        Acp acp;
        Grantee id, foo, bar, baz, anonymous;

        acp = new Acp();

        id = new CanonicalUser("id");
        foo = new CanonicalUser("foo");
        bar = new CanonicalUser("bar");
        baz = new CanonicalUser("baz");
        anonymous = new CanonicalUser(CanonicalUser.ID_ANONYMOUS);

        acp.grant(id, ResourcePermission.ACTION_FULL_CONTROL);
        acp.grant(foo, ResourcePermission.ACTION_WRITE);
        acp.grant(foo, ResourcePermission.ACTION_READ_ACP);
        acp.grant(bar, ResourcePermission.ACTION_WRITE);
        acp.grant(bar, ResourcePermission.ACTION_READ_ACP);
        acp.grant(AllUsersGroup.getInstance(), ResourcePermission.ACTION_READ);

        acp.canRead(id);
        acp.canRead(foo);
        acp.canRead(bar);
        try {
            acp.canRead(baz);
            fail("Should have thrown an exception");
        } catch (AccessControlException e) {
            // expected
        }
        try {
            acp.canRead(anonymous);
            fail("Should have thrown an exception");
        } catch (AccessControlException e) {
            // expected
        }
    }

    /**
     * Test the <code>canRead()</code> method where the owner implicitly can
     * read.
     */
    public void test_canReadOwnerImplicitly() {
        Acp acp;
        CanonicalUser id;
        Grantee foo, bar, baz, anonymous;

        acp = new Acp();

        id = new CanonicalUser("id");
        foo = new CanonicalUser("foo");
        bar = new CanonicalUser("bar");
        baz = new CanonicalUser("baz");
        anonymous = new CanonicalUser(CanonicalUser.ID_ANONYMOUS);

        acp.setOwner(id);

        acp.grant(foo, ResourcePermission.ACTION_WRITE);
        acp.grant(foo, ResourcePermission.ACTION_READ_ACP);
        acp.grant(bar, ResourcePermission.ACTION_WRITE);
        acp.grant(bar, ResourcePermission.ACTION_READ_ACP);
        acp.grant(AllUsersGroup.getInstance(), ResourcePermission.ACTION_READ);

        acp.canRead(id);
        acp.canRead(foo);
        acp.canRead(bar);
        try {
            acp.canRead(baz);
            fail("Should have thrown an exception");
        } catch (AccessControlException e) {
            // expected
        }
        try {
            acp.canRead(anonymous);
            fail("Should have thrown an exception");
        } catch (AccessControlException e) {
            // expected
        }
    }

    /**
     * Test the <code>canWrite()</code> method.
     */
    public void test_canWrite() {
        Acp acp;
        Grantee id, foo, bar, baz, anonymous;

        acp = new Acp();

        id = new CanonicalUser("id");
        foo = new CanonicalUser("foo");
        bar = new CanonicalUser("bar");
        baz = new CanonicalUser("baz");
        anonymous = new CanonicalUser(CanonicalUser.ID_ANONYMOUS);

        acp.grant(id, ResourcePermission.ACTION_FULL_CONTROL);
        acp.grant(foo, ResourcePermission.ACTION_WRITE);
        acp.grant(foo, ResourcePermission.ACTION_READ_ACP);
        acp.grant(bar, ResourcePermission.ACTION_WRITE);
        acp.grant(bar, ResourcePermission.ACTION_READ_ACP);
        acp.grant(AllUsersGroup.getInstance(), ResourcePermission.ACTION_READ);

        acp.canWrite(id);
        try {
            acp.canWrite(foo);
            fail("Should have thrown an exception");
        } catch (AccessControlException e) {
            // expected
        }
        try {
            acp.canWrite(bar);
            fail("Should have thrown an exception");
        } catch (AccessControlException e) {
            // expected
        }
        try {
            acp.canWrite(baz);
            fail("Should have thrown an exception");
        } catch (AccessControlException e) {
            // expected
        }
        try {
            acp.canWrite(anonymous);
            fail("Should have thrown an exception");
        } catch (AccessControlException e) {
            // expected
        }
    }

    /**
     * Test the <code>canWrite()</code> method where the owner implicitly can
     * write.
     */
    public void test_canWriteOwnerImplicitly() {
        Acp acp;
        CanonicalUser id;
        Grantee foo, bar, baz, anonymous;

        acp = new Acp();

        id = new CanonicalUser("id");
        foo = new CanonicalUser("foo");
        bar = new CanonicalUser("bar");
        baz = new CanonicalUser("baz");
        anonymous = new CanonicalUser(CanonicalUser.ID_ANONYMOUS);

        acp.setOwner(id);

        acp.grant(foo, ResourcePermission.ACTION_WRITE);
        acp.grant(foo, ResourcePermission.ACTION_READ_ACP);
        acp.grant(bar, ResourcePermission.ACTION_WRITE);
        acp.grant(bar, ResourcePermission.ACTION_READ_ACP);
        acp.grant(AllUsersGroup.getInstance(), ResourcePermission.ACTION_READ);

        acp.canWrite(id);
        try {
            acp.canWrite(foo);
            fail("Should have thrown an exception");
        } catch (AccessControlException e) {
            // expected
        }
        try {
            acp.canWrite(bar);
            fail("Should have thrown an exception");
        } catch (AccessControlException e) {
            // expected
        }
        try {
            acp.canWrite(baz);
            fail("Should have thrown an exception");
        } catch (AccessControlException e) {
            // expected
        }
        try {
            acp.canWrite(anonymous);
            fail("Should have thrown an exception");
        } catch (AccessControlException e) {
            // expected
        }
    }

    /**
     * Test the method <code>encode</code>. Doesn't really test though. Just
     * prints out the encoded document.
     */
    public void xtest_encode() {
        Acp acp;
        CanonicalUser id, foo, bar;

        acp = new Acp();

        id = new CanonicalUser("id");
        foo = new CanonicalUser("foo");
        bar = new CanonicalUser("bar");

        acp.setOwner(id);

        acp.grant(id, ResourcePermission.ACTION_FULL_CONTROL);
        acp.grant(foo, ResourcePermission.ACTION_WRITE);
        acp.grant(foo, ResourcePermission.ACTION_READ_ACP);
        acp.grant(bar, ResourcePermission.ACTION_WRITE);
        acp.grant(bar, ResourcePermission.ACTION_READ_ACP);
        acp.grant(AllUsersGroup.getInstance(), ResourcePermission.ACTION_READ);

        System.out.println("XML formatted Acp. vvvv");
        System.out.print(Acp.encode(acp));
        System.out.println("XML formatted Acp. ^^^^");
    }

    /**
     * Test the method <code>decode</code>.
     */
    public void test_decode() {
        Acp acp = null;
        CanonicalUser canonicalUser;
        ResourcePermission grant;

        StringBuffer buffer = new StringBuffer();
        buffer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
        buffer.append("<AccessControlPolicy xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">");
        buffer.append("<Owner>");
        buffer.append("<ID>id</ID>");
        buffer.append("<DisplayName>unit test id</DisplayName>");
        buffer.append("</Owner>");
        buffer.append("<AccessControlList>");
        buffer.append("<Grant>");
        buffer.append(
                "<Grantee xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"CanonicalUser\">");
        buffer.append("<ID>id</ID>");
        buffer.append("<DisplayName>unit test id</DisplayName>");
        buffer.append("</Grantee>");
        buffer.append("<Permission>FULL_CONTROL</Permission>");
        buffer.append("</Grant>");
        buffer.append("</AccessControlList>");
        buffer.append("</AccessControlPolicy>");

        try {
            acp = Acp.decode(new ByteArrayInputStream(buffer.toString().getBytes()));
        } catch (IOException e) {
            e.printStackTrace();
            fail("Unexpected exception");
        }

        canonicalUser = acp.getOwner();
        assertEquals("Unexpected value", "id", canonicalUser.getId());
        assertEquals("Unexpected value", "unit test id", canonicalUser.getDisplayName());
        Enumeration grants = acp.grants();
        assertTrue("Should be more grants", grants.hasMoreElements());
        grant = (ResourcePermission) grants.nextElement();
        canonicalUser = (CanonicalUser) grant.getGrantee();
        assertEquals("Unexpected value", "id", canonicalUser.getId());
        assertEquals("Unexpected value", "unit test id", canonicalUser.getDisplayName());
        assertEquals("Unexpect value", ResourcePermission.ACTION_FULL_CONTROL, grant.getActions());
        assertFalse("Should be no more grants", grants.hasMoreElements());
    }

    /**
     * Test the method <code>encode</code> by using the <code>decode</code>.
     */
    public void test_ecodeDecode() {
        Acp acp;
        CanonicalUser id, foo, user;
        ResourcePermission grant;
        Grantee grantee;

        acp = new Acp();

        id = new CanonicalUser("id");
        id.setDisplayName("id display name");
        foo = new CanonicalUser("foo");
        foo.setDisplayName("foo display name");

        acp.setOwner(id);

        acp.grant(id, ResourcePermission.ACTION_FULL_CONTROL);
        acp.grant(foo, ResourcePermission.ACTION_WRITE);
        acp.grant(AllUsersGroup.getInstance(), ResourcePermission.ACTION_READ);

        Acp decodedAcp = null;

        try {
            decodedAcp = Acp.decode(new ByteArrayInputStream(Acp.encode(acp).getBytes()));
        } catch (IOException e) {
            e.printStackTrace();
            fail("Unexpected exception");
        }

        user = decodedAcp.getOwner();
        assertEquals("Unexpected value", "id", user.getId());
        assertEquals("Unexpected value", "id display name", user.getDisplayName());

        Enumeration grants = acp.grants();
        assertTrue("Should be more grants", grants.hasMoreElements());
        grant = (ResourcePermission) grants.nextElement();
        grantee = grant.getGrantee();
        if (grantee instanceof AllUsersGroup) {
            assertEquals("Unexpected value", AllUsersGroup.getInstance(), grantee);
            assertEquals("Unexpect value", ResourcePermission.ACTION_READ, grant.getActions());
            assertTrue("Should be more grants", grants.hasMoreElements());

            grant = (ResourcePermission) grants.nextElement();
            user = (CanonicalUser) grant.getGrantee();
            if (user.getId().equals("id")) {
                assertEquals("Unexpected value", "id display name", user.getDisplayName());
                assertEquals("Unexpect value", ResourcePermission.ACTION_FULL_CONTROL, grant.getActions());
                assertTrue("Should be more grants", grants.hasMoreElements());

                grant = (ResourcePermission) grants.nextElement();
                user = (CanonicalUser) grant.getGrantee();
                assertEquals("Unexpected value", "foo", user.getId());
                assertEquals("Unexpected value", "foo display name", user.getDisplayName());
                assertEquals("Unexpect value", ResourcePermission.ACTION_WRITE, grant.getActions());
                assertFalse("Should be no more grants", grants.hasMoreElements());
            } else if (user.getId().equals("foo")) {
                assertEquals("Unexpected value", "foo display name", user.getDisplayName());
                assertEquals("Unexpect value", ResourcePermission.ACTION_WRITE, grant.getActions());
                assertTrue("Should be more grants", grants.hasMoreElements());

                grant = (ResourcePermission) grants.nextElement();
                user = (CanonicalUser) grant.getGrantee();
                assertEquals("Unexpected value", "id", user.getId());
                assertEquals("Unexpected value", "id display name", user.getDisplayName());
                assertEquals("Unexpect value", ResourcePermission.ACTION_FULL_CONTROL, grant.getActions());
                assertFalse("Should be no more grants", grants.hasMoreElements());
            } else {
                fail("Unexpected id: " + user.getId());
            }
        } else {
            user = (CanonicalUser) grantee;
            if (user.getId().equals("id")) {
                assertEquals("Unexpected value", "id display name", user.getDisplayName());
                assertEquals("Unexpect value", ResourcePermission.ACTION_FULL_CONTROL, grant.getActions());
                assertTrue("Should be more grants", grants.hasMoreElements());

                grant = (ResourcePermission) grants.nextElement();
                grantee = grant.getGrantee();
                if (grantee instanceof AllUsersGroup) {
                    assertEquals("Unexpected value", AllUsersGroup.getInstance(), grantee);
                    assertEquals("Unexpect value", ResourcePermission.ACTION_READ, grant.getActions());
                    assertTrue("Should be more grants", grants.hasMoreElements());

                    grant = (ResourcePermission) grants.nextElement();
                    user = (CanonicalUser) grant.getGrantee();
                    assertEquals("Unexpected value", "foo", user.getId());
                    assertEquals("Unexpected value", "foo display name", user.getDisplayName());
                    assertEquals("Unexpect value", ResourcePermission.ACTION_WRITE, grant.getActions());
                    assertFalse("Should be no more grants", grants.hasMoreElements());
                } else {
                    user = (CanonicalUser) grantee;
                    assertEquals("Unexpected value", "foo", user.getId());
                    assertEquals("Unexpected value", "foo display name", user.getDisplayName());
                    assertEquals("Unexpect value", ResourcePermission.ACTION_WRITE, grant.getActions());
                    assertTrue("Should be more grants", grants.hasMoreElements());

                    grant = (ResourcePermission) grants.nextElement();
                    assertEquals("Unexpected value", AllUsersGroup.getInstance(), grant.getGrantee());
                    assertEquals("Unexpect value", ResourcePermission.ACTION_READ, grant.getActions());
                    assertFalse("Should be no more grants", grants.hasMoreElements());
                }
            } else if (user.getId().equals("foo")) {
                assertEquals("Unexpected value", "foo display name", user.getDisplayName());
                assertEquals("Unexpect value", ResourcePermission.ACTION_WRITE, grant.getActions());
                assertTrue("Should be more grants", grants.hasMoreElements());

                grant = (ResourcePermission) grants.nextElement();
                grantee = grant.getGrantee();
                if (grantee instanceof AllUsersGroup) {
                    assertEquals("Unexpected value", AllUsersGroup.getInstance(), grantee);
                    assertEquals("Unexpect value", ResourcePermission.ACTION_READ, grant.getActions());
                    assertTrue("Should be more grants", grants.hasMoreElements());

                    grant = (ResourcePermission) grants.nextElement();
                    user = (CanonicalUser) grant.getGrantee();
                    assertEquals("Unexpected value", "id", user.getId());
                    assertEquals("Unexpected value", "id display name", user.getDisplayName());
                    assertEquals("Unexpect value", ResourcePermission.ACTION_FULL_CONTROL, grant.getActions());
                    assertFalse("Should be no more grants", grants.hasMoreElements());
                } else {
                    user = (CanonicalUser) grantee;
                    assertEquals("Unexpected value", "id", user.getId());
                    assertEquals("Unexpected value", "id display name", user.getDisplayName());
                    assertEquals("Unexpect value", ResourcePermission.ACTION_FULL_CONTROL, grant.getActions());
                    assertTrue("Should be more grants", grants.hasMoreElements());

                    grant = (ResourcePermission) grants.nextElement();
                    assertEquals("Unexpected value", AllUsersGroup.getInstance(), grant.getGrantee());
                    assertEquals("Unexpect value", ResourcePermission.ACTION_READ, grant.getActions());
                    assertFalse("Should be no more grants", grants.hasMoreElements());
                }
            } else {
                fail("Unexpected grantee id: " + user.getId());
            }
        }
    }

    /**
     * Test that an instance is serializable.
     */
    public void test_serialization() {
        Acp acp, reconstitutedAcp;
        ByteArrayInputStream bais;
        ByteArrayOutputStream baos;
        ObjectInputStream ois;
        ObjectOutputStream oos;
        CanonicalUser id;

        acp = new Acp();

        id = new CanonicalUser("id");

        acp.setOwner(id);

        acp.grant(id, ResourcePermission.ACTION_FULL_CONTROL);

        assertEquals("Unexpected value", id, acp.getOwner());
        acp.checkPermission(new ResourcePermission(id, ResourcePermission.ACTION_READ));

        try {
            baos = new ByteArrayOutputStream();
            oos = new ObjectOutputStream(baos);

            oos.writeObject(acp);

            bais = new ByteArrayInputStream(baos.toByteArray());
            ois = new ObjectInputStream(bais);

            reconstitutedAcp = (Acp) ois.readObject();

            assertEquals("Unexpected value", id, reconstitutedAcp.getOwner());
            reconstitutedAcp.checkPermission(new ResourcePermission(id, ResourcePermission.ACTION_READ));
        } catch (IOException e) {
            e.printStackTrace();
            fail("Unexpected exception");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            fail("Unexpected exception");
        }
    }
}