blob: ad5bdd226b9483044ff43eb497ce4801123d2a88 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.chemistry.opencmis.inmemory;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.chemistry.opencmis.commons.data.Ace;
import org.apache.chemistry.opencmis.commons.data.Acl;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.AccessControlEntryImpl;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.AccessControlListImpl;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.AccessControlPrincipalDataImpl;
import org.apache.chemistry.opencmis.commons.impl.jaxb.EnumBasicPermissions;
import org.apache.chemistry.opencmis.inmemory.storedobj.impl.InMemoryAce;
import org.apache.chemistry.opencmis.inmemory.storedobj.impl.InMemoryAcl;
import org.apache.chemistry.opencmis.inmemory.storedobj.impl.Permission;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class AclTest {
private static final Logger LOG = LoggerFactory.getLogger(AclTest.class);
final static String ANDREAS = "andreas";
final static String BERTA = "berta";
final static String CHRISTIAN = "christian";
final static String DOROTHEE = "dorothee";
final InMemoryAce aceN = new InMemoryAce(ANDREAS, Permission.NONE);
final InMemoryAce aceR = new InMemoryAce(BERTA, Permission.READ);
final InMemoryAce aceW = new InMemoryAce(CHRISTIAN, Permission.WRITE);
final InMemoryAce aceA = new InMemoryAce(DOROTHEE, Permission.ALL);
@Test
public void testCreateAce() {
try {
new InMemoryAce(null, Permission.NONE);
fail("create an ACE with null principalId should fail.");
} catch (RuntimeException e) {
}
try {
new InMemoryAce("xxx", null);
fail("create an ACE with null permission should fail.");
} catch (RuntimeException e) {
}
}
@Test
public void testCreate() {
InMemoryAcl acl = new InMemoryAcl();
acl.addAce(aceA);
assertEquals(1, acl.getAces().size());
assertTrue(acl.getAces().get(0) == aceA);
acl = new InMemoryAcl(createAceList());
LOG.debug(acl.toString());
assertEquals(2, acl.getAces().size());
assertTrue(acl.getAces().get(0) == aceR);
assertTrue(acl.getAces().get(1) == aceA);
acl = createDefaultAcl();
checkDefaultAcl(acl);
try {
List<InMemoryAce> aces = createAceList();
aces.add(null);
acl = new InMemoryAcl(aces);
fail("create an ACL with a null ACE should fail.");
} catch (RuntimeException e) {
}
}
@Test
public void testAdd() {
InMemoryAcl acl = new InMemoryAcl();
acl.addAce(aceR);
assertEquals(1, acl.getAces().size());
assertTrue(acl.getAces().get(0) == aceR);
acl.addAce(aceW);
assertEquals(2, acl.getAces().size());
assertTrue(acl.getAces().get(0) == aceR);
assertTrue(acl.getAces().get(1) == aceW);
acl.addAce(aceN);
assertEquals(3, acl.getAces().size());
assertTrue(acl.getAces().get(0) == aceN);
assertTrue(acl.getAces().get(1) == aceR);
assertTrue(acl.getAces().get(2) == aceW);
acl.addAce(aceA);
assertEquals(4, acl.getAces().size());
assertTrue(acl.getAces().get(0) == aceN);
assertTrue(acl.getAces().get(1) == aceR);
assertTrue(acl.getAces().get(2) == aceW);
assertTrue(acl.getAces().get(3) == aceA);
assertFalse("Adding an existing ACE to an ACL should fail.", acl.addAce(aceN));
assertFalse("Adding null to an ACL should fail.", acl.addAce(null));
}
@Test
public void testRemove() {
InMemoryAcl acl = createDefaultAcl();
checkDefaultAcl(acl);
acl.removeAce(aceR);
assertEquals(3, acl.getAces().size());
assertTrue(acl.getAces().get(0) == aceN);
assertTrue(acl.getAces().get(1) == aceW);
assertTrue(acl.getAces().get(2) == aceA);
acl.removeAce(aceW);
assertEquals(2, acl.getAces().size());
assertTrue(acl.getAces().get(0) == aceN);
assertTrue(acl.getAces().get(1) == aceA);
acl.removeAce(aceN);
assertEquals(1, acl.getAces().size());
assertTrue(acl.getAces().get(0) == aceA);
acl.removeAce(aceA);
assertEquals(0, acl.getAces().size());
acl = createDefaultAcl();
final InMemoryAce ace = new InMemoryAce("xyu", Permission.ALL);
assertFalse("Removing an unknown ACE from an ACL should fail.", acl.removeAce(ace));
assertFalse("Removing null from an ACL should fail.", acl.removeAce(null));
}
@Test
public void testMerge() {
final InMemoryAce aceNew = new InMemoryAce("Hugo", Permission.WRITE); // will
// be
// added
final InMemoryAce aceRCopy = new InMemoryAce(BERTA, Permission.READ); // is
// same
final InMemoryAce aceChange = new InMemoryAce(CHRISTIAN, Permission.ALL); // changes
// permission
InMemoryAcl acl1 = createDefaultAcl();
InMemoryAcl acl2 = new InMemoryAcl(new ArrayList<InMemoryAce>() {
{
add(aceNew);
add(aceRCopy);
add(aceChange);
}
});
acl1.mergeAcl(acl2);
assertEquals(5, acl1.getAces().size());
assertEquals(Permission.NONE, acl1.getPermission(ANDREAS));
assertEquals(Permission.READ, acl1.getPermission(BERTA));
assertEquals(Permission.ALL, acl1.getPermission(CHRISTIAN));
assertEquals(Permission.ALL, acl1.getPermission(DOROTHEE));
assertEquals(Permission.WRITE, acl1.getPermission("Hugo"));
}
@Test
public void testAclEquality() {
final InMemoryAce aceNew = new InMemoryAce("Hugo", Permission.WRITE);
final InMemoryAce aceRCopy = new InMemoryAce(BERTA, Permission.READ);
InMemoryAcl acl1 = createDefaultAcl();
InMemoryAcl acl2 = new InMemoryAcl(new ArrayList<InMemoryAce>() {
{
add(aceRCopy);
add(aceA);
add(aceW);
add(aceN);
}
});
InMemoryAcl acl3 = new InMemoryAcl(new ArrayList<InMemoryAce>() {
{
add(aceR);
add(aceNew);
add(aceW);
add(aceN);
}
});
assertEquals(acl1, acl2);
assertFalse(acl1.equals(acl3));
}
@Test
public void testCheckPermissions() {
InMemoryAcl acl = createDefaultAcl();
assertTrue(acl.hasPermission(ANDREAS, Permission.NONE));
assertFalse(acl.hasPermission(ANDREAS, Permission.READ));
assertFalse(acl.hasPermission(ANDREAS, Permission.WRITE));
assertFalse(acl.hasPermission(ANDREAS, Permission.ALL));
assertTrue(acl.hasPermission(BERTA, Permission.NONE));
assertTrue(acl.hasPermission(BERTA, Permission.READ));
assertFalse(acl.hasPermission(BERTA, Permission.WRITE));
assertFalse(acl.hasPermission(BERTA, Permission.ALL));
assertTrue(acl.hasPermission(CHRISTIAN, Permission.NONE));
assertTrue(acl.hasPermission(CHRISTIAN, Permission.READ));
assertTrue(acl.hasPermission(CHRISTIAN, Permission.WRITE));
assertFalse(acl.hasPermission(CHRISTIAN, Permission.ALL));
assertTrue(acl.hasPermission(DOROTHEE, Permission.NONE));
assertTrue(acl.hasPermission(DOROTHEE, Permission.READ));
assertTrue(acl.hasPermission(DOROTHEE, Permission.WRITE));
assertTrue(acl.hasPermission(DOROTHEE, Permission.ALL));
}
@Test
public void testConvertFomCmisAcl() {
List<Ace> aces = Arrays.asList(new Ace[] { createAce(ANDREAS, EnumBasicPermissions.CMIS_READ.value()),
createAce(DOROTHEE, EnumBasicPermissions.CMIS_WRITE.value()) });
AccessControlListImpl cAcl = new AccessControlListImpl(aces);
InMemoryAcl acl = InMemoryAcl.createFromCommonsAcl(cAcl);
assertEquals(2, acl.size());
assertEquals(Permission.READ, acl.getPermission(ANDREAS));
assertEquals(Permission.WRITE, acl.getPermission(DOROTHEE));
try {
List<Ace> aces2 = Arrays.asList(new Ace[] { new AccessControlEntryImpl(null, Arrays
.asList(new String[] { EnumBasicPermissions.CMIS_READ.value() })) });
acl = InMemoryAcl.createFromCommonsAcl(new AccessControlListImpl(aces2));
fail("create Ace will null principal should raise exception.");
} catch (RuntimeException e) {
}
try {
List<Ace> aces2 = Arrays.asList(new Ace[] { new AccessControlEntryImpl(new AccessControlPrincipalDataImpl(
ANDREAS), null) });
acl = InMemoryAcl.createFromCommonsAcl(new AccessControlListImpl(aces2));
fail("create Ace will null permission should raise exception.");
} catch (RuntimeException e) {
}
}
@Test
public void testConvertToCmisAcl() {
Ace ace = aceN.toCommonsAce();
assertEquals(ANDREAS, ace.getPrincipalId());
assertEquals(1, ace.getPermissions().size());
assertEquals("", ace.getPermissions().get(0));
ace = aceR.toCommonsAce();
assertEquals(BERTA, ace.getPrincipalId());
assertEquals(1, ace.getPermissions().size());
assertEquals(EnumBasicPermissions.CMIS_READ.value(), ace.getPermissions().get(0));
ace = aceW.toCommonsAce();
assertEquals(CHRISTIAN, ace.getPrincipalId());
assertEquals(1, ace.getPermissions().size());
assertEquals(EnumBasicPermissions.CMIS_WRITE.value(), ace.getPermissions().get(0));
ace = aceA.toCommonsAce();
assertEquals(DOROTHEE, ace.getPrincipalId());
assertEquals(1, ace.getPermissions().size());
assertEquals(EnumBasicPermissions.CMIS_ALL.value(), ace.getPermissions().get(0));
InMemoryAcl acl = createDefaultAcl();
Acl commonsAcl = acl.toCommonsAcl();
assertEquals(4, commonsAcl.getAces().size());
assertTrue(hasCommonsAce(commonsAcl, ANDREAS, ""));
assertFalse(hasCommonsAce(commonsAcl, ANDREAS, EnumBasicPermissions.CMIS_READ.value()));
assertFalse(hasCommonsAce(commonsAcl, ANDREAS, EnumBasicPermissions.CMIS_WRITE.value()));
assertFalse(hasCommonsAce(commonsAcl, ANDREAS, EnumBasicPermissions.CMIS_ALL.value()));
assertTrue(hasCommonsAce(commonsAcl, BERTA, EnumBasicPermissions.CMIS_READ.value()));
assertTrue(hasCommonsAce(commonsAcl, CHRISTIAN, EnumBasicPermissions.CMIS_WRITE.value()));
assertTrue(hasCommonsAce(commonsAcl, DOROTHEE, EnumBasicPermissions.CMIS_ALL.value()));
}
@Test
public void testCloneAcl() {
InMemoryAcl acl = createDefaultAcl();
InMemoryAcl acl2 = null;
try {
acl2 = acl.clone();
} catch (CloneNotSupportedException e) {
fail("Clone not supported");
}
assertFalse(acl == acl2);
assertEquals(acl, acl2);
}
private InMemoryAcl createDefaultAcl() {
return new InMemoryAcl(new ArrayList<InMemoryAce>() {
{
add(aceA);
add(aceR);
add(aceN);
add(aceW);
}
});
}
private void checkDefaultAcl(InMemoryAcl acl) {
assertEquals(4, acl.getAces().size());
assertTrue(acl.getAces().get(0) == aceN);
assertTrue(acl.getAces().get(1) == aceR);
assertTrue(acl.getAces().get(2) == aceW);
assertTrue(acl.getAces().get(3) == aceA);
}
private List<InMemoryAce> createAceList() {
return new ArrayList<InMemoryAce>() {
{
add(aceA);
add(aceR);
}
};
}
private Ace createAce(String principalId, String permission) {
AccessControlEntryImpl ace = new AccessControlEntryImpl(new AccessControlPrincipalDataImpl(principalId),
Arrays.asList(new String[] { permission }));
return ace;
}
private boolean hasCommonsAce(Acl acl, String principalId, String permission) {
for (Ace ace : acl.getAces()) {
if (ace.getPrincipalId().equals(principalId) && ace.getPermissions().get(0).equals(permission)) {
return true;
}
}
return false;
}
}