Author: angela
Date: Thu Apr 27 08:53:56 2017
New Revision: 1792852

URL: http://svn.apache.org/viewvc?rev=1792852&view=rev
Log:
OAK-6038 : Drop dependency of spi.security.* tests from AbstractSecurityTest 
(wip)

Added:
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/accesscontrol/AbstractAccessControlTest.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/accesscontrol/EntryTest.java
Modified:
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/accesscontrol/ACLTest.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/accesscontrol/AccessControlManagerImplTest.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/accesscontrol/AccessControlValidatorTest.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/accesscontrol/ReadPolicyTest.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/permission/PermissionHookTest.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/restriction/RestrictionProviderImplTest.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/accesscontrol/ACETest.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/accesscontrol/AbstractAccessControlListTest.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/accesscontrol/AbstractAccessControlManagerTest.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/accesscontrol/AbstractAccessControlTest.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/accesscontrol/ImmutableACLTest.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/accesscontrol/TestACL.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/accesscontrol/ACLTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/accesscontrol/ACLTest.java?rev=1792852&r1=1792851&r2=1792852&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/accesscontrol/ACLTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/accesscontrol/ACLTest.java
 Thu Apr 27 08:53:56 2017
@@ -16,23 +16,16 @@
  */
 package org.apache.jackrabbit.oak.security.authorization.accesscontrol;
 
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
 import java.security.Principal;
 import java.security.acl.Group;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.jcr.PropertyType;
@@ -44,99 +37,175 @@ import javax.jcr.security.AccessControlE
 import javax.jcr.security.AccessControlException;
 import javax.jcr.security.Privilege;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 import org.apache.jackrabbit.JcrConstants;
 import org.apache.jackrabbit.api.security.JackrabbitAccessControlEntry;
 import org.apache.jackrabbit.api.security.JackrabbitAccessControlList;
-import org.apache.jackrabbit.api.security.authorization.PrivilegeManager;
-import org.apache.jackrabbit.api.security.principal.PrincipalManager;
 import org.apache.jackrabbit.oak.api.Tree;
 import org.apache.jackrabbit.oak.api.Type;
+import org.apache.jackrabbit.oak.namepath.GlobalNameMapper;
+import org.apache.jackrabbit.oak.namepath.LocalNameMapper;
+import org.apache.jackrabbit.oak.namepath.NameMapper;
 import org.apache.jackrabbit.oak.namepath.NamePathMapper;
+import org.apache.jackrabbit.oak.namepath.NamePathMapperImpl;
 import org.apache.jackrabbit.oak.spi.security.authorization.accesscontrol.ACE;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.accesscontrol.AbstractAccessControlList;
-import 
org.apache.jackrabbit.oak.spi.security.authorization.accesscontrol.AbstractAccessControlListTest;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.accesscontrol.AccessControlConstants;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.restriction.AbstractRestrictionProvider;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.restriction.Restriction;
+import 
org.apache.jackrabbit.oak.spi.security.authorization.restriction.RestrictionDefinition;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.restriction.RestrictionDefinitionImpl;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.restriction.RestrictionPattern;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.restriction.RestrictionProvider;
 import org.apache.jackrabbit.oak.spi.security.principal.EveryonePrincipal;
 import org.apache.jackrabbit.oak.spi.security.principal.PrincipalImpl;
-import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeBits;
 import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants;
-import org.junit.Before;
 import org.junit.Test;
 
+import static java.util.Collections.singletonMap;
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
 /**
- * Test abstract {@code ACL} implementation.
+ * Test {@code ACL} implementation.
  */
-public class ACLTest extends AbstractAccessControlListTest implements 
PrivilegeConstants, AccessControlConstants {
+public class ACLTest extends AbstractAccessControlTest implements 
PrivilegeConstants, AccessControlConstants {
+
+    private static void assertACE(JackrabbitAccessControlEntry ace, boolean 
isAllow, Privilege... privileges) {
+        assertEquals(isAllow, ace.isAllow());
+        assertEquals(Sets.newHashSet(privileges), 
Sets.newHashSet(ace.getPrivileges()));
+    }
 
-    private PrivilegeManager privilegeManager;
-    private PrincipalManager principalManager;
+    @Test
+    public void testGetNamePathMapper() throws Exception {
+        assertSame(getNamePathMapper(), createEmptyACL().getNamePathMapper());
+        assertSame(NamePathMapper.DEFAULT, createACL(TEST_PATH, 
ImmutableList.<ACE>of(), NamePathMapper.DEFAULT).getNamePathMapper());
+    }
 
-    private AbstractAccessControlList acl;
-    private Principal testPrincipal;
-    private Privilege[] testPrivileges;
-
-    @Override
-    @Before
-    public void before() throws Exception {
-        super.before();
-
-        privilegeManager = getPrivilegeManager(root);
-        principalManager = getPrincipalManager(root);
-
-        acl = createEmptyACL();
-        testPrincipal = getTestPrincipal();
-        testPrivileges = privilegesFromNames(JCR_ADD_CHILD_NODES, 
JCR_LOCK_MANAGEMENT);
-    }
-
-    @Override
-    protected AbstractAccessControlList createACL(@Nullable String jcrPath,
-                                                  @Nonnull List<ACE> entries,
-                                                  @Nonnull NamePathMapper 
namePathMapper,
-                                                  final @Nonnull 
RestrictionProvider restrictionProvider) {
-        String path = (jcrPath == null) ? null : 
namePathMapper.getOakPath(jcrPath);
-        return new ACL(path, entries, namePathMapper) {
-            @Nonnull
-            @Override
-            public RestrictionProvider getRestrictionProvider() {
-                return restrictionProvider;
-            }
+    @Test
+    public void testGetPath() {
+        NameMapper nameMapper = new GlobalNameMapper(
+                Collections.singletonMap("jr", 
"http://jackrabbit.apache.org";));
+        NamePathMapper npMapper = new NamePathMapperImpl(nameMapper);
 
-            @Override
-            ACE createACE(Principal principal, PrivilegeBits privilegeBits, 
boolean isAllow, Set<Restriction> restrictions) throws RepositoryException {
-                return createEntry(principal, privilegeBits, isAllow, 
restrictions);
-            }
+        // map of jcr-path to standard jcr-path
+        Map<String, String> paths = new HashMap<String, String>();
+        paths.put(null, null);
+        paths.put(TEST_PATH, TEST_PATH);
+        paths.put("/", "/");
+        paths.put("/jr:testPath", "/jr:testPath");
+        paths.put("/{http://jackrabbit.apache.org}testPath";, "/jr:testPath");
 
-            @Override
-            boolean checkValidPrincipal(Principal principal) throws 
AccessControlException {
-                Util.checkValidPrincipal(principal, principalManager);
-                return true;
-            }
+        for (String path : paths.keySet()) {
+            AbstractAccessControlList acl = createACL(path, 
Collections.<ACE>emptyList(), npMapper);
+            assertEquals(paths.get(path), acl.getPath());
+        }
+    }
 
-            @Override
-            PrivilegeManager getPrivilegeManager() {
-                return privilegeManager;
-            }
+    @Test
+    public void testGetOakPath() {
+        NamePathMapper npMapper = new NamePathMapperImpl(new LocalNameMapper(
+                singletonMap("oak", "http://jackrabbit.apache.org";),
+                singletonMap("jcr", "http://jackrabbit.apache.org";)));
+        // map of jcr-path to oak path
+        Map<String, String> paths = new HashMap();
+        paths.put(null, null);
+        paths.put(TEST_PATH, TEST_PATH);
+        paths.put("/", "/");
+        String oakPath = "/oak:testPath";
+        String jcrPath = "/jcr:testPath";
+        paths.put(jcrPath, oakPath);
+        jcrPath = "/{http://jackrabbit.apache.org}testPath";;
+        paths.put(jcrPath, oakPath);
 
-            @Override
-            PrivilegeBits getPrivilegeBits(Privilege[] privileges) {
-                return getBitsProvider().getBits(privileges, 
getNamePathMapper());
-            }
-        };
+        // test if oak-path is properly set.
+        for (String path : paths.keySet()) {
+            AbstractAccessControlList acl = createACL(path, 
Collections.<ACE>emptyList(), npMapper);
+            assertEquals(paths.get(path), acl.getOakPath());
+        }
     }
 
-    private static void assertACE(JackrabbitAccessControlEntry ace, boolean 
isAllow, Privilege... privileges) {
-        assertEquals(isAllow, ace.isAllow());
-        assertEquals(Sets.newHashSet(privileges), 
Sets.newHashSet(ace.getPrivileges()));
+    @Test
+    public void testEmptyAcl() throws RepositoryException {
+        AbstractAccessControlList acl = createEmptyACL();
+
+        assertNotNull(acl.getAccessControlEntries());
+        assertNotNull(acl.getEntries());
+
+        assertTrue(acl.getAccessControlEntries().length == 0);
+        assertEquals(acl.getAccessControlEntries().length, 
acl.getEntries().size());
+        assertEquals(0, acl.size());
+        assertTrue(acl.isEmpty());
     }
 
     @Test
+    public void testSize() throws RepositoryException {
+        AbstractAccessControlList acl = createACL(createTestEntries());
+        assertEquals(3, acl.size());
+    }
+
+    @Test
+    public void testIsEmpty() throws RepositoryException {
+        AbstractAccessControlList acl = createACL(createTestEntries());
+        assertFalse(acl.isEmpty());
+    }
+
+    @Test
+    public void testGetEntries() throws RepositoryException {
+        List<ACE> aces = createTestEntries();
+        AbstractAccessControlList acl = createACL(TEST_PATH, aces, 
getNamePathMapper());
+
+        assertNotNull(acl.getEntries());
+        assertNotNull(acl.getAccessControlEntries());
+
+        assertEquals(aces.size(), acl.getEntries().size());
+        assertEquals(aces.size(), acl.getAccessControlEntries().length);
+        assertTrue(acl.getEntries().containsAll(aces));
+        
assertTrue(Arrays.asList(acl.getAccessControlEntries()).containsAll(aces));
+    }
+
+    @Test
+    public void testGetRestrictionNames() throws RepositoryException {
+        AbstractAccessControlList acl = createEmptyACL();
+
+        String[] restrNames = acl.getRestrictionNames();
+        assertNotNull(restrNames);
+        List<String> names = Lists.newArrayList(restrNames);
+        for (RestrictionDefinition def : 
getRestrictionProvider().getSupportedRestrictions(TEST_PATH)) {
+            
assertTrue(names.remove(getNamePathMapper().getJcrName(def.getName())));
+        }
+        assertTrue(names.isEmpty());
+    }
+
+    @Test
+    public void testGetRestrictionType() throws RepositoryException {
+        AbstractAccessControlList acl = createEmptyACL();
+        for (RestrictionDefinition def : 
getRestrictionProvider().getSupportedRestrictions(TEST_PATH)) {
+            int reqType = 
acl.getRestrictionType(getNamePathMapper().getJcrName(def.getName()));
+
+            assertTrue(reqType > PropertyType.UNDEFINED);
+            assertEquals(def.getRequiredType().tag(), reqType);
+        }
+    }
+
+    @Test
+    public void testGetRestrictionTypeForUnknownName() throws 
RepositoryException {
+        AbstractAccessControlList acl = createEmptyACL();
+        // for backwards compatibility getRestrictionType(String) must return
+        // UNDEFINED for a unknown restriction name:
+        assertEquals(PropertyType.UNDEFINED, 
acl.getRestrictionType("unknownRestrictionName"));
+    }
+
+
+    @Test
     public void testUnknownPrincipal() throws Exception {
         Principal unknownPrincipal = new InvalidTestPrincipal("unknown");
         try {
@@ -253,7 +322,7 @@ public class ACLTest extends AbstractAcc
 
     @Test
     public void testRemoveEntries() throws Exception {
-        JackrabbitAccessControlList acl = createACL(getTestPath(), 
createTestEntries(), namePathMapper);
+        JackrabbitAccessControlList acl = createACL(TEST_PATH, 
createTestEntries(), namePathMapper);
         for (AccessControlEntry ace : acl.getAccessControlEntries()) {
             acl.removeAccessControlEntry(ace);
         }
@@ -740,7 +809,7 @@ public class ACLTest extends AbstractAcc
     public void testUnsupportedRestrictions2() throws Exception {
         RestrictionProvider rp = new TestRestrictionProvider("restr", 
Type.NAME, false);
 
-        JackrabbitAccessControlList acl = createACL(getTestPath(), new 
ArrayList(), namePathMapper, rp);
+        JackrabbitAccessControlList acl = createACL(TEST_PATH, new 
ArrayList(), namePathMapper, rp);
         try {
             acl.addEntry(testPrincipal, testPrivileges, false, 
Collections.<String, Value>singletonMap("unsupported", 
getValueFactory().createValue("value")));
             fail("Unsupported restriction must be detected.");
@@ -753,7 +822,7 @@ public class ACLTest extends AbstractAcc
     public void testInvalidRestrictionType() throws Exception {
         RestrictionProvider rp = new TestRestrictionProvider("restr", 
Type.NAME, false);
 
-        JackrabbitAccessControlList acl = createACL(getTestPath(), new 
ArrayList(), namePathMapper, rp);
+        JackrabbitAccessControlList acl = createACL(TEST_PATH, new 
ArrayList(), namePathMapper, rp);
         try {
             acl.addEntry(testPrincipal, testPrivileges, false, 
Collections.<String, Value>singletonMap("restr", 
getValueFactory().createValue(true)));
             fail("Invalid restriction type.");
@@ -766,7 +835,7 @@ public class ACLTest extends AbstractAcc
     public void testMandatoryRestrictions() throws Exception {
         RestrictionProvider rp = new TestRestrictionProvider("mandatory", 
Type.NAME, true);
 
-        JackrabbitAccessControlList acl = createACL(getTestPath(), new 
ArrayList(), namePathMapper, rp);
+        JackrabbitAccessControlList acl = createACL(TEST_PATH, new 
ArrayList(), namePathMapper, rp);
         try {
             acl.addEntry(testPrincipal, testPrivileges, false, 
Collections.<String, Value>emptyMap());
             fail("Mandatory restriction must be enforced.");

Added: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/accesscontrol/AbstractAccessControlTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/accesscontrol/AbstractAccessControlTest.java?rev=1792852&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/accesscontrol/AbstractAccessControlTest.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/accesscontrol/AbstractAccessControlTest.java
 Thu Apr 27 08:53:56 2017
@@ -0,0 +1,169 @@
+/*
+ * 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.jackrabbit.oak.security.authorization.accesscontrol;
+
+import java.security.Principal;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import javax.jcr.RepositoryException;
+import javax.jcr.security.AccessControlException;
+import javax.jcr.security.AccessControlPolicy;
+import javax.jcr.security.AccessControlPolicyIterator;
+import javax.jcr.security.Privilege;
+
+import org.apache.jackrabbit.JcrConstants;
+import org.apache.jackrabbit.api.security.authorization.PrivilegeManager;
+import org.apache.jackrabbit.api.security.principal.PrincipalManager;
+import org.apache.jackrabbit.oak.AbstractSecurityTest;
+import org.apache.jackrabbit.oak.namepath.NamePathMapper;
+import 
org.apache.jackrabbit.oak.spi.security.authorization.AuthorizationConfiguration;
+import org.apache.jackrabbit.oak.spi.security.authorization.accesscontrol.ACE;
+import 
org.apache.jackrabbit.oak.spi.security.authorization.restriction.Restriction;
+import 
org.apache.jackrabbit.oak.spi.security.authorization.restriction.RestrictionProvider;
+import org.apache.jackrabbit.oak.spi.security.principal.PrincipalImpl;
+import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeBits;
+import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeBitsProvider;
+import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants;
+import org.apache.jackrabbit.oak.util.NodeUtil;
+import org.junit.Before;
+
+public abstract class AbstractAccessControlTest extends AbstractSecurityTest 
implements PrivilegeConstants {
+
+    static final String TEST_PATH = "/testPath";
+
+    PrivilegeManager privilegeManager;
+    PrincipalManager principalManager;
+
+    ACL acl;
+    Principal testPrincipal;
+    Privilege[] testPrivileges;
+
+    @Override
+    @Before
+    public void before() throws Exception {
+        super.before();
+
+        NodeUtil rootNode = new NodeUtil(root.getTree("/"), 
getNamePathMapper());
+        rootNode.addChild("testPath", JcrConstants.NT_UNSTRUCTURED);
+        root.commit();
+
+        testPrincipal = getTestUser().getPrincipal();
+        testPrivileges = privilegesFromNames(JCR_ADD_CHILD_NODES, 
JCR_LOCK_MANAGEMENT);
+
+        privilegeManager = getPrivilegeManager(root);
+        principalManager = getPrincipalManager(root);
+
+        acl = createEmptyACL();
+    }
+
+    RestrictionProvider getRestrictionProvider() {
+        return 
getConfig(AuthorizationConfiguration.class).getRestrictionProvider();
+    }
+
+    PrivilegeBitsProvider getBitsProvider() {
+        return new PrivilegeBitsProvider(root);
+    }
+
+    List<ACE> createTestEntries() throws RepositoryException {
+        List<ACE> entries = new ArrayList(3);
+        for (int i = 0; i < 3; i++) {
+            entries.add(createEntry(
+                    new PrincipalImpl("testPrincipal" + i), true, null, 
PrivilegeConstants.JCR_READ));
+        }
+        return entries;
+    }
+
+    ACE createEntry(Principal principal, boolean isAllow, Set<Restriction> 
restrictions, String... privilegeNames) throws RepositoryException {
+        return createEntry(principal, privilegesFromNames(privilegeNames), 
isAllow, restrictions);
+    }
+
+    ACE createEntry(Principal principal, Privilege[] privileges, boolean 
isAllow)
+            throws RepositoryException {
+        return createEntry(principal, privileges, isAllow, null);
+    }
+
+    ACE createEntry(Principal principal, PrivilegeBits bits, boolean isAllow, 
Set<Restriction> restrictions) throws RepositoryException {
+        AccessControlPolicyIterator it = 
getAccessControlManager(root).getApplicablePolicies(TEST_PATH);
+        while (it.hasNext()) {
+            AccessControlPolicy policy = it.nextAccessControlPolicy();
+            if (policy instanceof ACL) {
+                return ((ACL) policy).createACE(principal, bits, isAllow, 
restrictions);
+            }
+        }
+
+        throw new UnsupportedOperationException();
+    }
+
+    private ACE createEntry(@Nonnull Principal principal, @Nonnull Privilege[] 
privileges, boolean isAllow, @Nullable Set<Restriction> restrictions)
+            throws RepositoryException {
+        ACL acl = createEmptyACL();
+        return acl.createACE(principal, getBitsProvider().getBits(privileges, 
getNamePathMapper()), isAllow, restrictions);
+    }
+
+    ACL createEmptyACL() {
+        return createACL(TEST_PATH, Collections.<ACE>emptyList(), 
getNamePathMapper(), getRestrictionProvider());
+    }
+
+    ACL createACL(@Nonnull List<ACE> entries) {
+        return createACL(TEST_PATH, entries, namePathMapper, 
getRestrictionProvider());
+    }
+
+    ACL createACL(@Nullable String jcrPath,
+                  @Nonnull List<ACE> entries,
+                  @Nonnull NamePathMapper namePathMapper) {
+        return createACL(jcrPath, entries, namePathMapper, 
getRestrictionProvider());
+    }
+
+    ACL createACL(@Nullable String jcrPath,
+                  @Nonnull List<ACE> entries,
+                  @Nonnull NamePathMapper namePathMapper,
+                  final @Nonnull RestrictionProvider restrictionProvider) {
+        String path = (jcrPath == null) ? null : 
namePathMapper.getOakPath(jcrPath);
+        return new ACL(path, entries, namePathMapper) {
+            @Nonnull
+            @Override
+            public RestrictionProvider getRestrictionProvider() {
+                return restrictionProvider;
+            }
+
+            @Override
+            ACE createACE(Principal principal, PrivilegeBits privilegeBits, 
boolean isAllow, Set<Restriction> restrictions) throws RepositoryException {
+                return createEntry(principal, privilegeBits, isAllow, 
restrictions);
+            }
+
+            @Override
+            boolean checkValidPrincipal(Principal principal) throws 
AccessControlException {
+                Util.checkValidPrincipal(principal, principalManager);
+                return true;
+            }
+
+            @Override
+            PrivilegeManager getPrivilegeManager() {
+                return privilegeManager;
+            }
+
+            @Override
+            PrivilegeBits getPrivilegeBits(Privilege[] privileges) {
+                return new PrivilegeBitsProvider(root).getBits(privileges, 
getNamePathMapper());
+            }
+        };
+    }
+}
\ No newline at end of file

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/accesscontrol/AccessControlManagerImplTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/accesscontrol/AccessControlManagerImplTest.java?rev=1792852&r1=1792851&r2=1792852&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/accesscontrol/AccessControlManagerImplTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/accesscontrol/AccessControlManagerImplTest.java
 Thu Apr 27 08:53:56 2017
@@ -43,7 +43,6 @@ import javax.jcr.security.AccessControlP
 import javax.jcr.security.AccessControlPolicyIterator;
 import javax.jcr.security.Privilege;
 
-import com.google.common.base.Function;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
@@ -54,6 +53,8 @@ import org.apache.jackrabbit.api.securit
 import org.apache.jackrabbit.api.security.JackrabbitAccessControlPolicy;
 import org.apache.jackrabbit.api.security.authorization.PrivilegeManager;
 import org.apache.jackrabbit.api.security.principal.PrincipalManager;
+import org.apache.jackrabbit.oak.AbstractSecurityTest;
+import org.apache.jackrabbit.oak.api.ContentSession;
 import org.apache.jackrabbit.oak.api.Root;
 import org.apache.jackrabbit.oak.api.Tree;
 import org.apache.jackrabbit.oak.api.Type;
@@ -65,8 +66,9 @@ import org.apache.jackrabbit.oak.namepat
 import org.apache.jackrabbit.oak.plugins.name.ReadWriteNamespaceRegistry;
 import org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants;
 import org.apache.jackrabbit.oak.plugins.value.jcr.ValueFactoryImpl;
+import 
org.apache.jackrabbit.oak.spi.security.authorization.AuthorizationConfiguration;
 import org.apache.jackrabbit.oak.spi.security.authorization.accesscontrol.ACE;
-import 
org.apache.jackrabbit.oak.spi.security.authorization.accesscontrol.AbstractAccessControlManagerTest;
+import 
org.apache.jackrabbit.oak.spi.security.authorization.accesscontrol.AbstractAccessControlManager;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.accesscontrol.AccessControlConstants;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.accesscontrol.TestACL;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.restriction.Restriction;
@@ -74,9 +76,11 @@ import org.apache.jackrabbit.oak.spi.sec
 import org.apache.jackrabbit.oak.spi.security.principal.EveryonePrincipal;
 import org.apache.jackrabbit.oak.spi.security.principal.PrincipalImpl;
 import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeBits;
+import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeBitsProvider;
 import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants;
 import org.apache.jackrabbit.oak.util.NodeUtil;
 import org.apache.jackrabbit.oak.util.TreeUtil;
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -93,32 +97,64 @@ import static org.junit.Assert.fail;
 /**
  * Tests for the default {@code AccessControlManager} implementation.
  */
-public class AccessControlManagerImplTest extends 
AbstractAccessControlManagerTest implements AccessControlConstants {
+public class AccessControlManagerImplTest extends AbstractSecurityTest 
implements AccessControlConstants {
 
     public static final String TEST_LOCAL_PREFIX = "test";
+    public static final String TEST_PREFIX = "jr";
+    public static final String TEST_URI = "http://jackrabbit.apache.org";;
 
+    private final String testName = TEST_PREFIX + ":testRoot";
+    private final String testPath = '/' + testName;
+
+    private Principal testPrincipal;
+    private Privilege[] testPrivileges;
+
+    private AccessControlManagerImpl acMgr;
     private NamePathMapper npMapper;
     private ValueFactory valueFactory;
 
+    private Root testRoot;
+
     @Override
     @Before
     public void before() throws Exception {
         super.before();
 
+        registerNamespace(TEST_PREFIX, TEST_URI);
+
+        NameMapper nameMapper = new GlobalNameMapper(root);
+        npMapper = new NamePathMapperImpl(nameMapper);
+
+        acMgr = new AccessControlManagerImpl(root, npMapper, 
getSecurityProvider());
+
+        NodeUtil rootNode = new NodeUtil(root.getTree("/"), 
getNamePathMapper());
+        rootNode.addChild(testName, JcrConstants.NT_UNSTRUCTURED);
+        root.commit();
+
         valueFactory = new ValueFactoryImpl(root, npMapper);
+
+        testPrivileges = 
privilegesFromNames(PrivilegeConstants.JCR_ADD_CHILD_NODES, 
PrivilegeConstants.JCR_READ);
+        testPrincipal = getTestUser().getPrincipal();
     }
 
-    @Override
-    protected NamePathMapper getNamePathMapper() {
-        if (npMapper == null) {
-            try {
-                registerNamespace(TEST_PREFIX, TEST_URI);
-            } catch (Exception e) {
-                throw new RuntimeException(e);
+    @After
+    public void after() throws Exception {
+        try {
+            root.refresh();
+            root.getTree(testPath).remove();
+            root.commit();
+
+            if (testRoot != null) {
+                testRoot.getContentSession().close();
+                testRoot = null;
             }
-            NameMapper nameMapper = new GlobalNameMapper(root);
-            npMapper = new NamePathMapperImpl(nameMapper);
+        } finally {
+            super.after();
         }
+    }
+
+    @Override
+    protected NamePathMapper getNamePathMapper() {
         return npMapper;
     }
 
@@ -132,16 +168,47 @@ public class AccessControlManagerImplTes
         nsRegistry.registerNamespace(prefix, uri);
     }
 
-    @Override
-    protected AccessControlManagerImpl createAccessControlManager(@Nonnull 
Root root, @Nonnull NamePathMapper namePathMapper) {
+    private AccessControlManagerImpl createAccessControlManager(@Nonnull Root 
root, @Nonnull NamePathMapper namePathMapper) {
         return new AccessControlManagerImpl(root, namePathMapper, 
getSecurityProvider());
     }
 
-    @Override
-    protected AccessControlManagerImpl getTestAccessControlManager() throws 
Exception {
+    private RestrictionProvider getRestrictionProvider() {
+        return 
getConfig(AuthorizationConfiguration.class).getRestrictionProvider();
+    }
+
+    private PrivilegeBitsProvider getBitsProvider() {
+        return new PrivilegeBitsProvider(root);
+    }
+
+    private AccessControlManagerImpl getTestAccessControlManager() throws 
Exception {
         return new AccessControlManagerImpl(getTestRoot(), 
getNamePathMapper(), getSecurityProvider());
     }
 
+    private Root getTestRoot() throws Exception {
+        if (testRoot == null) {
+            testRoot = createTestSession().getLatestRoot();
+        }
+        return testRoot;
+    }
+
+    private List<String> getInvalidPaths() {
+        List<String> invalid = new ArrayList<String>();
+        invalid.add("");
+        invalid.add("../../jcr:testRoot");
+        invalid.add("jcr:testRoot");
+        invalid.add("jcr:test/Root");
+        invalid.add("./jcr:testRoot");
+        return invalid;
+    }
+
+    private static Set<Principal> getPrincipals(ContentSession session) {
+        return session.getAuthInfo().getPrincipals();
+    }
+
+    private static Set<Principal> getEveryonePrincipalSet() {
+        return ImmutableSet.<Principal>of(EveryonePrincipal.getInstance());
+    }
+
     private ACL getApplicablePolicy(@Nullable String path) throws 
RepositoryException {
         AccessControlPolicyIterator itr = acMgr.getApplicablePolicies(path);
         if (itr.hasNext()) {
@@ -229,6 +296,47 @@ public class AccessControlManagerImplTes
 
     //---------------------------------------------< getSupportedPrivileges 
>---
     @Test
+    public void testGetSupportedPrivileges() throws Exception {
+        List<Privilege> allPrivileges = 
Arrays.asList(getPrivilegeManager(root).getRegisteredPrivileges());
+
+        List<String> testPaths = new ArrayList<String>();
+        testPaths.add(null);
+        testPaths.add("/");
+        testPaths.add("/jcr:system");
+        testPaths.add(testPath);
+
+        for (String path : testPaths) {
+            Privilege[] supported = acMgr.getSupportedPrivileges(path);
+
+            assertNotNull(supported);
+            assertEquals(allPrivileges.size(), supported.length);
+            assertTrue(allPrivileges.containsAll(Arrays.asList(supported)));
+        }
+    }
+
+    @Test
+    public void testGetSupportedPrivilegesInvalidPath() throws Exception {
+        for (String path : getInvalidPaths()) {
+            try {
+                acMgr.getSupportedPrivileges(path);
+                fail("Expects valid node path, found: " + path);
+            } catch (RepositoryException e) {
+                // success
+            }
+        }
+    }
+
+    @Test(expected = PathNotFoundException.class)
+    public void testGetSupportedPrivilegesPropertyPath() throws Exception {
+        acMgr.getSupportedPrivileges("/jcr:primaryType");
+    }
+
+    @Test(expected = PathNotFoundException.class)
+    public void testGetSupportedPrivilegesNonExistingPath() throws Exception {
+        acMgr.getSupportedPrivileges("/non/existing/node");
+    }
+
+    @Test
     public void testGetSupportedPrivilegesIncludingPathConversion() throws 
Exception {
         List<Privilege> allPrivileges = 
Arrays.asList(getPrivilegeManager(root).getRegisteredPrivileges());
 
@@ -262,16 +370,239 @@ public class AccessControlManagerImplTes
         }
     }
 
-
     //--------------------------------------------------< privilegeFromName 
>---
+
+    @Test
+    public void testPrivilegeFromName() throws Exception {
+        List<Privilege> allPrivileges = 
Arrays.asList(getPrivilegeManager(root).getRegisteredPrivileges());
+        for (Privilege privilege : allPrivileges) {
+            Privilege p = acMgr.privilegeFromName(privilege.getName());
+            assertEquals(privilege, p);
+        }
+    }
+
     @Test
     public void testPrivilegeFromExpandedName() throws Exception {
         Privilege readPriv = 
getPrivilegeManager(root).getPrivilege(PrivilegeConstants.JCR_READ);
         assertEquals(readPriv, acMgr.privilegeFromName(Privilege.JCR_READ));
     }
 
+    @Test
+    public void testPrivilegeFromInvalidName() throws Exception {
+        List<String> invalid = new ArrayList<String>();
+        invalid.add(null);
+        invalid.add("");
+        invalid.add("test:read");
+
+        for (String privilegeName : invalid) {
+            try {
+                acMgr.privilegeFromName(privilegeName);
+                fail("Invalid privilege name " + privilegeName);
+            } catch (RepositoryException e) {
+                // success
+            }
+        }
+    }
+
+    @Test
+    public void testPrivilegeFromUnknownName() throws Exception {
+        List<String> invalid = new ArrayList<String>();
+        invalid.add("unknownPrivilege");
+        invalid.add('{' + NamespaceRegistry.NAMESPACE_JCR + "}unknown");
+
+        for (String privilegeName : invalid) {
+            try {
+                acMgr.privilegeFromName(privilegeName);
+                fail("Invalid privilege name " + privilegeName);
+            } catch (AccessControlException e) {
+                // success
+            }
+        }
+    }
+
     //------------------------------------------------------< hasPrivileges 
>---
     @Test
+    public void testHasNullPrivileges() throws Exception {
+        assertTrue(acMgr.hasPrivileges(testPath, null));
+    }
+
+    @Test
+    public void testHasEmptyPrivileges() throws Exception {
+        assertTrue(acMgr.hasPrivileges(testPath, new Privilege[0]));
+    }
+
+    @Test(expected = PathNotFoundException.class)
+    public void testHasPrivilegesForPropertyPath() throws Exception {
+        String propertyPath = "/jcr:primaryType";
+        Privilege[] privs = privilegesFromNames(PrivilegeConstants.JCR_ALL);
+
+        acMgr.hasPrivileges(propertyPath, privs);
+    }
+
+    @Test(expected = PathNotFoundException.class)
+    public void testHasPrivilegesForPropertyPathSessionPrincipals() throws 
Exception {
+        String propertyPath = "/jcr:primaryType";
+        Privilege[] privs = privilegesFromNames(PrivilegeConstants.JCR_ALL);
+
+        acMgr.hasPrivileges(propertyPath, getPrincipals(adminSession), privs);
+    }
+
+    @Test
+    public void testHasPrivilegesNonExistingNodePath() throws Exception {
+        String nonExistingPath = "/not/existing";
+        Privilege[] privs = privilegesFromNames(PrivilegeConstants.JCR_ALL);
+        try {
+            acMgr.hasPrivileges(nonExistingPath, privs);
+            fail("AccessControlManager#hasPrivileges  for node that doesn't 
exist should fail.");
+        } catch (PathNotFoundException e) {
+            // success
+        }
+        try {
+            acMgr.hasPrivileges(nonExistingPath, getPrincipals(adminSession), 
privs);
+            fail("AccessControlManager#hasPrivileges  for node that doesn't 
exist should fail.");
+        } catch (PathNotFoundException e) {
+            // success
+        }
+        try {
+            acMgr.hasPrivileges(nonExistingPath, getEveryonePrincipalSet(), 
privs);
+            fail("AccessControlManager#hasPrivileges for node that doesn't 
exist should fail.");
+        } catch (PathNotFoundException e) {
+            // success
+        }
+        try {
+            acMgr.hasPrivileges(nonExistingPath, ImmutableSet.<Principal>of(), 
privs);
+            fail("AccessControlManager#hasPrivileges for node that doesn't 
exist should fail.");
+        } catch (PathNotFoundException e) {
+            // success
+        }
+    }
+
+    @Test
+    public void testHasPrivilegesInvalidPaths() throws Exception {
+        Privilege[] privs = privilegesFromNames(PrivilegeConstants.JCR_ALL);
+        for (String path : getInvalidPaths()) {
+            try {
+                acMgr.hasPrivileges(path, privs);
+                fail("AccessControlManager#hasPrivileges for node that doesn't 
exist should fail.");
+            } catch (RepositoryException e) {
+                // success
+            }
+        }
+        for (String path : getInvalidPaths()) {
+            try {
+                acMgr.hasPrivileges(path, getPrincipals(adminSession), privs);
+                fail("AccessControlManager#hasPrivileges for node that doesn't 
exist should fail.");
+            } catch (RepositoryException e) {
+                // success
+            }
+        }
+        for (String path : getInvalidPaths()) {
+            try {
+                acMgr.hasPrivileges(path, 
ImmutableSet.<Principal>of(EveryonePrincipal.getInstance()), privs);
+                fail("AccessControlManager#hasPrivileges for node that doesn't 
exist should fail.");
+            } catch (RepositoryException e) {
+                // success
+            }
+        }
+    }
+
+    @Test
+    public void testHasPrivilegesAccessControlledNodePath() throws Exception {
+        Privilege[] privs = privilegesFromNames(PrivilegeConstants.JCR_ALL);
+        for (String path : getAcContentPaths()) {
+            assertTrue(acMgr.hasPrivileges(path, privs));
+            assertTrue(acMgr.hasPrivileges(path, getPrincipals(adminSession), 
privs));
+            assertFalse(acMgr.hasPrivileges(path, 
ImmutableSet.<Principal>of(EveryonePrincipal.getInstance()), privs));
+        }
+    }
+
+    /**
+     * @since OAK 1.0 As of OAK AccessControlManager#hasPrivilege will throw
+     * PathNotFoundException in case the node associated with a given path is
+     * not readable to the editing session (compatibility with the 
specification
+     * which was missing in jackrabbit).
+     */
+    @Test
+    public void testHasPrivilegesNotAccessiblePath() throws Exception {
+        List<String> notAccessible = new ArrayList();
+        notAccessible.add("/");
+        notAccessible.addAll(getAcContentPaths());
+
+        Privilege[] privs = privilegesFromNames(PrivilegeConstants.JCR_ALL);
+        AbstractAccessControlManager testAcMgr = getTestAccessControlManager();
+        for (String path : notAccessible) {
+            try {
+                testAcMgr.hasPrivileges(path, privs);
+                fail("AccessControlManager#hasPrivileges for node that is not 
accessible should fail.");
+            } catch (PathNotFoundException e) {
+                // success
+            }
+        }
+        for (String path : notAccessible) {
+            try {
+                testAcMgr.hasPrivileges(path, 
getPrincipals(root.getContentSession()), privs);
+                fail("AccessControlManager#hasPrivileges for node that is not 
accessible should fail.");
+            } catch (PathNotFoundException e) {
+                // success
+            }
+        }
+        for (String path : notAccessible) {
+            try {
+                testAcMgr.hasPrivileges(path, 
getPrincipals(getTestRoot().getContentSession()), privs);
+                fail("AccessControlManager#hasPrivileges for node that is not 
accessible should fail.");
+            } catch (PathNotFoundException e) {
+                // success
+            }
+        }
+        for (String path : notAccessible) {
+            try {
+                testAcMgr.hasPrivileges(path, ImmutableSet.<Principal>of(), 
privs);
+                fail("AccessControlManager#hasPrivileges for node that is not 
accessible should fail.");
+            } catch (PathNotFoundException e) {
+                // success
+            }
+        }
+    }
+
+    @Test
+    public void testHasRepoPrivileges() throws Exception {
+        assertTrue(acMgr.hasPrivileges(null, 
privilegesFromNames(PrivilegeConstants.JCR_ALL)));
+        assertTrue(acMgr.hasPrivileges(null, getPrincipals(adminSession), 
privilegesFromNames(PrivilegeConstants.JCR_ALL)));
+    }
+
+    @Test
+    public void testHasRepoPrivilegesEmptyPrincipalSet() throws Exception {
+        assertFalse(acMgr.hasPrivileges(null, ImmutableSet.<Principal>of(), 
privilegesFromNames(PrivilegeConstants.JCR_ALL)));
+    }
+
+    @Test
+    public void testTestSessionHasRepoPrivileges() throws Exception {
+        AbstractAccessControlManager testAcMgr = getTestAccessControlManager();
+
+        assertFalse(testAcMgr.hasPrivileges(null, testPrivileges));
+        assertFalse(testAcMgr.hasPrivileges(null, 
getPrincipals(getTestRoot().getContentSession()), testPrivileges));
+    }
+
+    @Test
+    public void testHasRepoPrivilegesNoAccessToPrincipals() throws Exception {
+        AbstractAccessControlManager testAcMgr = getTestAccessControlManager();
+        // the test-session doesn't have sufficient permissions to read 
privilege set for admin session.
+        try {
+            testAcMgr.getPrivileges(null, getPrincipals(adminSession));
+            fail("testSession doesn't have sufficient permission to read 
access control information");
+        } catch (AccessDeniedException e) {
+            // success
+        }
+    }
+
+    @Test(expected = AccessDeniedException.class)
+    public void testHasRepoPrivilegesForEmptyPrincipalSet() throws Exception {
+        AbstractAccessControlManager testAcMgr = getTestAccessControlManager();
+        // the test-session doesn't have sufficient permissions to read 
privilege set.
+        testAcMgr.getPrivileges(null, ImmutableSet.<Principal>of());
+    }
+
+    @Test
     public void testTestSessionHasPrivileges() throws Exception {
         setupPolicy(testPath);
         root.commit();
@@ -304,22 +635,195 @@ public class AccessControlManagerImplTes
         }
     }
 
-    @Test
+    @Test(expected = AccessDeniedException.class)
     public void testTestSessionHasPrivilegesForPrincipals() throws Exception {
         setupPolicy(testPath);
         root.commit();
 
         AccessControlManagerImpl testAcMgr = getTestAccessControlManager();
         // but for 'admin' the test-session doesn't have sufficient privileges
+        testAcMgr.getPrivileges(testPath, getPrincipals(adminSession));
+    }
+
+    //------------------------------------------------------< getPrivileges 
>---
+    @Test
+    public void testGetPrivilegesForPropertyPath() throws Exception {
+        String propertyPath = "/jcr:primaryType";
         try {
-            testAcMgr.getPrivileges(testPath, getPrincipals(adminSession));
-            fail("testSession doesn't have sufficient permission to read 
access control information at testPath");
-        } catch (AccessDeniedException e) {
+            acMgr.getPrivileges(propertyPath);
+            fail("AccessControlManager#getPrivileges for property should 
fail.");
+        } catch (PathNotFoundException e) {
+            // success
+        }
+
+        try {
+            acMgr.getPrivileges(propertyPath, 
Collections.singleton(testPrincipal));
+            fail("AccessControlManager#getPrivileges for property should 
fail.");
+        } catch (PathNotFoundException e) {
+            // success
+        }
+
+        try {
+            acMgr.getPrivileges(propertyPath, getPrincipals(adminSession));
+            fail("AccessControlManager#getPrivileges for property should 
fail.");
+        } catch (PathNotFoundException e) {
             // success
         }
     }
 
-    //------------------------------------------------------< getPrivileges 
>---
+    @Test
+    public void testGetPrivilegesNonExistingNodePath() throws Exception {
+        String nonExistingPath = "/not/existing";
+        try {
+            acMgr.getPrivileges(nonExistingPath);
+            fail("AccessControlManager#getPrivileges  for node that doesn't 
exist should fail.");
+        } catch (PathNotFoundException e) {
+            // success
+        }
+
+        try {
+            acMgr.getPrivileges(nonExistingPath, getPrincipals(adminSession));
+            fail("AccessControlManager#getPrivileges  for node that doesn't 
exist should fail.");
+        } catch (PathNotFoundException e) {
+            // success
+        }
+
+        try {
+            acMgr.getPrivileges(nonExistingPath, 
Collections.singleton(testPrincipal));
+            fail("AccessControlManager#getPrivileges  for node that doesn't 
exist should fail.");
+        } catch (PathNotFoundException e) {
+            // success
+        }
+
+        try {
+            acMgr.getPrivileges(nonExistingPath, ImmutableSet.<Principal>of());
+            fail("AccessControlManager#getPrivileges  for node that doesn't 
exist should fail.");
+        } catch (PathNotFoundException e) {
+            // success
+        }
+    }
+
+    @Test
+    public void testGetPrivilegesInvalidPaths() throws Exception {
+        for (String path : getInvalidPaths()) {
+            try {
+                acMgr.getPrivileges(path);
+                fail("AccessControlManager#getPrivileges  for node that 
doesn't exist should fail.");
+            } catch (RepositoryException e) {
+                // success
+            }
+        }
+
+        for (String path : getInvalidPaths()) {
+            try {
+                acMgr.getPrivileges(path, getPrincipals(adminSession));
+                fail("AccessControlManager#getPrivileges  for node that 
doesn't exist should fail.");
+            } catch (RepositoryException e) {
+                // success
+            }
+        }
+
+        for (String path : getInvalidPaths()) {
+            try {
+                acMgr.getPrivileges(path, 
Collections.singleton(testPrincipal));
+                fail("AccessControlManager#getPrivileges  for node that 
doesn't exist should fail.");
+            } catch (RepositoryException e) {
+                // success
+            }
+        }
+
+        for (String path : getInvalidPaths()) {
+            try {
+                acMgr.getPrivileges(path, ImmutableSet.<Principal>of());
+                fail("AccessControlManager#getPrivileges  for node that 
doesn't exist should fail.");
+            } catch (RepositoryException e) {
+                // success
+            }
+        }
+    }
+
+    /**
+     * @since OAK 1.0 As of OAK AccessControlManager#hasPrivilege will throw
+     * PathNotFoundException in case the node associated with a given path is
+     * not readable to the editing session.
+     */
+    @Test
+    public void testGetPrivilegesNotAccessiblePath() throws Exception {
+        List<String> notAccessible = new ArrayList();
+        notAccessible.add("/");
+        notAccessible.addAll(getAcContentPaths());
+
+        for (String path : notAccessible) {
+            try {
+                getTestAccessControlManager().getPrivileges(path);
+                fail("AccessControlManager#getPrivileges for node that is not 
accessible should fail.");
+            } catch (PathNotFoundException e) {
+                // success
+            }
+        }
+
+        for (String path : notAccessible) {
+            try {
+                getTestAccessControlManager().getPrivileges(path, 
getPrincipals(adminSession));
+                fail("AccessControlManager#getPrivileges for node that is not 
accessible should fail.");
+            } catch (PathNotFoundException e) {
+                // success
+            }
+        }
+
+        for (String path : notAccessible) {
+            try {
+                getTestAccessControlManager().getPrivileges(path, 
Collections.singleton(testPrincipal));
+                fail("AccessControlManager#getPrivileges for node that is not 
accessible should fail.");
+            } catch (PathNotFoundException e) {
+                // success
+            }
+        }
+
+    }
+
+    @Test
+    public void testGetPrivilegesAccessControlledNodePath() throws Exception {
+        Privilege[] expected = privilegesFromNames(PrivilegeConstants.JCR_ALL);
+        for (String path : getAcContentPaths()) {
+            assertArrayEquals(expected, acMgr.getPrivileges(path));
+            assertArrayEquals(expected, acMgr.getPrivileges(path, 
getPrincipals(adminSession)));
+        }
+    }
+
+    @Test
+    public void testGetPrivilegesForPrincipalsAccessControlledNodePath() 
throws Exception {
+        Set<Principal> testPrincipals = ImmutableSet.of(testPrincipal);
+        Privilege[] expected = new Privilege[0];
+        for (String path : getAcContentPaths()) {
+            assertArrayEquals(expected, acMgr.getPrivileges(path, 
testPrincipals));
+        }
+    }
+
+    @Test
+    public void testGetPrivilegesForNoPrincipalsAccessControlledNodePath() 
throws Exception {
+        Privilege[] expected = new Privilege[0];
+        for (String path : getAcContentPaths()) {
+            assertArrayEquals(expected, acMgr.getPrivileges(path, 
ImmutableSet.<Principal>of()));
+        }
+    }
+
+    @Test
+    public void testGetRepoPrivileges() throws Exception {
+        assertArrayEquals(privilegesFromNames(PrivilegeConstants.JCR_ALL), 
acMgr.getPrivileges(null));
+        assertArrayEquals(privilegesFromNames(PrivilegeConstants.JCR_ALL), 
acMgr.getPrivileges(null, getPrincipals(adminSession)));
+    }
+
+    @Test
+    public void testGetRepoPrivilegesEveryonePrincipalSet() throws Exception {
+        assertArrayEquals(new Privilege[0], acMgr.getPrivileges(null, 
getEveryonePrincipalSet()));
+    }
+
+    @Test
+    public void testGetRepoPrivilegesEmptyPrincipalSet() throws Exception {
+        assertArrayEquals(new Privilege[0], acMgr.getPrivileges(null, 
ImmutableSet.<Principal>of()));
+    }
+
     @Test
     public void testTestSessionGetPrivileges() throws Exception {
         setupPolicy(testPath);
@@ -930,7 +1434,7 @@ public class AccessControlManagerImplTes
     @Test
     public void testSetInvalidPolicy() throws Exception {
         try {
-            acMgr.setPolicy(testPath, new TestACL(testPath, 
getRestrictionProvider()));
+            acMgr.setPolicy(testPath, new TestACL(testPath, 
getRestrictionProvider(), getNamePathMapper()));
             fail("Setting invalid policy must fail");
         } catch (AccessControlException e) {
             // success
@@ -938,7 +1442,7 @@ public class AccessControlManagerImplTes
 
         ACL acl = setupPolicy(testPath);
         try {
-            acMgr.setPolicy(testPath, new TestACL(testPath, 
getRestrictionProvider()));
+            acMgr.setPolicy(testPath, new TestACL(testPath, 
getRestrictionProvider(), getNamePathMapper()));
             fail("Setting invalid policy must fail");
         } catch (AccessControlException e) {
             // success
@@ -1071,12 +1575,7 @@ public class AccessControlManagerImplTes
         assertEquals(4, acl.getAccessControlEntries().length);
 
         Iterable<Tree> aceTrees = 
root.getTree(testPath).getChild(AccessControlConstants.REP_POLICY).getChildren();
-        String[] aceNodeNames = 
Iterables.toArray(Iterables.transform(aceTrees, new Function<Tree, String>() {
-            @Override
-            public String apply(Tree aceTree) {
-                return aceTree.getName();
-            }
-        }), String.class);
+        String[] aceNodeNames = 
Iterables.toArray(Iterables.transform(aceTrees, aceTree -> aceTree.getName()), 
String.class);
         assertArrayEquals(new String[]{"allow", "allow1", "deny2", "deny3"}, 
aceNodeNames);
     }
 
@@ -1105,7 +1604,7 @@ public class AccessControlManagerImplTes
     public void testRemoveInvalidPolicy() throws Exception {
         ACL acl = setupPolicy(testPath);
         try {
-            acMgr.removePolicy(testPath, new TestACL(testPath, 
getRestrictionProvider()));
+            acMgr.removePolicy(testPath, new TestACL(testPath, 
getRestrictionProvider(), getNamePathMapper()));
             fail("Invalid policy -> removal must fail");
         } catch (AccessControlException e) {
             // success
@@ -1411,7 +1910,7 @@ public class AccessControlManagerImplTes
         // no ACLs containing entries for the specified principals
         // -> no effective policies expected
         Set<Set<Principal>> principalSets = new HashSet<Set<Principal>>();
-        principalSets.add(Collections.singleton(getTestPrincipal()));
+        principalSets.add(Collections.singleton(testPrincipal));
         
principalSets.add(Collections.<Principal>singleton(EveryonePrincipal.getInstance()));
         principalSets.add(ImmutableSet.of(testPrincipal, 
EveryonePrincipal.getInstance()));
 
@@ -1434,7 +1933,7 @@ public class AccessControlManagerImplTes
         for (Set<Principal> principals : principalSets) {
             AccessControlPolicy[] policies = 
acMgr.getEffectivePolicies(principals);
             assertNotNull(policies);
-            if (principals.contains(getTestPrincipal())) {
+            if (principals.contains(testPrincipal)) {
                 assertEquals(1, policies.length);
             } else {
                 assertEquals(0, policies.length);
@@ -1448,7 +1947,7 @@ public class AccessControlManagerImplTes
         for (Set<Principal> principals : principalSets) {
             AccessControlPolicy[] policies = 
acMgr.getEffectivePolicies(principals);
             assertNotNull(policies);
-            if (principals.contains(getTestPrincipal())) {
+            if (principals.contains(testPrincipal)) {
                 assertEquals(1, policies.length);
             } else {
                 assertEquals(0, policies.length);
@@ -1460,7 +1959,7 @@ public class AccessControlManagerImplTes
         for (Set<Principal> principals : principalSets) {
             AccessControlPolicy[] policies = 
acMgr.getEffectivePolicies(principals);
             assertNotNull(policies);
-            if (principals.contains(getTestPrincipal())) {
+            if (principals.contains(testPrincipal)) {
                 assertEquals(2, policies.length);
             } else {
                 assertEquals(0, policies.length);
@@ -1586,7 +2085,7 @@ public class AccessControlManagerImplTes
         testRoot.refresh();
         JackrabbitAccessControlManager testAcMgr = 
getTestAccessControlManager();
 
-        AccessControlPolicy[] effective = 
testAcMgr.getEffectivePolicies(Collections.singleton(getTestPrincipal()));
+        AccessControlPolicy[] effective = 
testAcMgr.getEffectivePolicies(Collections.singleton(testPrincipal));
         assertNotNull(effective);
         assertEquals(2, effective.length);
     }
@@ -1611,7 +2110,7 @@ public class AccessControlManagerImplTes
         testRoot.refresh();
         JackrabbitAccessControlManager testAcMgr = 
getTestAccessControlManager();
 
-        AccessControlPolicy[] effective = 
testAcMgr.getEffectivePolicies(Collections.singleton(getTestPrincipal()));
+        AccessControlPolicy[] effective = 
testAcMgr.getEffectivePolicies(Collections.singleton(testPrincipal));
         assertNotNull(effective);
         assertEquals(1, effective.length);
     }
@@ -1633,7 +2132,7 @@ public class AccessControlManagerImplTes
         testRoot.refresh();
         JackrabbitAccessControlManager testAcMgr = 
getTestAccessControlManager();
 
-        AccessControlPolicy[] effective = 
testAcMgr.getEffectivePolicies(Collections.singleton(getTestPrincipal()));
+        AccessControlPolicy[] effective = 
testAcMgr.getEffectivePolicies(Collections.singleton(testPrincipal));
         assertNotNull(effective);
         assertEquals(1, effective.length);
     }
@@ -1656,7 +2155,7 @@ public class AccessControlManagerImplTes
         testRoot.refresh();
         JackrabbitAccessControlManager testAcMgr = 
getTestAccessControlManager();
 
-        Set<Principal> principals = ImmutableSet.of(getTestPrincipal(), 
EveryonePrincipal.getInstance());
+        Set<Principal> principals = ImmutableSet.of(testPrincipal, 
EveryonePrincipal.getInstance());
         AccessControlPolicy[] policies = 
testAcMgr.getEffectivePolicies(principals);
         assertNotNull(policies);
         assertEquals(2, policies.length);
@@ -1675,7 +2174,7 @@ public class AccessControlManagerImplTes
 
         // create policy on testPath -> but deny access to test session
         JackrabbitAccessControlList acl = getApplicablePolicy(testPath);
-        acl.addEntry(getTestPrincipal(), privs, false);
+        acl.addEntry(testPrincipal, privs, false);
         acMgr.setPolicy(testPath, acl);
 
         // grant access at childpath
@@ -1686,7 +2185,7 @@ public class AccessControlManagerImplTes
         testRoot.refresh();
         JackrabbitAccessControlManager testAcMgr = 
getTestAccessControlManager();
 
-        Set<Principal> principals = ImmutableSet.of(getTestPrincipal(), 
EveryonePrincipal.getInstance());
+        Set<Principal> principals = ImmutableSet.of(testPrincipal, 
EveryonePrincipal.getInstance());
         AccessControlPolicy[] policies = 
testAcMgr.getEffectivePolicies(principals);
         assertNotNull(policies);
         assertEquals(1, policies.length);

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/accesscontrol/AccessControlValidatorTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/accesscontrol/AccessControlValidatorTest.java?rev=1792852&r1=1792851&r2=1792852&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/accesscontrol/AccessControlValidatorTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/accesscontrol/AccessControlValidatorTest.java
 Thu Apr 27 08:53:56 2017
@@ -28,13 +28,13 @@ import org.apache.jackrabbit.JcrConstant
 import org.apache.jackrabbit.api.security.JackrabbitAccessControlList;
 import org.apache.jackrabbit.api.security.authorization.PrivilegeManager;
 import 
org.apache.jackrabbit.commons.jackrabbit.authorization.AccessControlUtils;
+import org.apache.jackrabbit.oak.AbstractSecurityTest;
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.api.Tree;
 import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeStore;
 import org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants;
 import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
 import org.apache.jackrabbit.oak.spi.commit.Validator;
-import 
org.apache.jackrabbit.oak.spi.security.authorization.accesscontrol.AbstractAccessControlTest;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.accesscontrol.AccessControlConstants;
 import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
@@ -52,7 +52,7 @@ import static org.junit.Assert.assertTha
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
-public class AccessControlValidatorTest extends AbstractAccessControlTest 
implements AccessControlConstants {
+public class AccessControlValidatorTest extends AbstractSecurityTest 
implements AccessControlConstants {
 
     private final String testName = "testRoot";
     private final String testPath = '/' + testName;
@@ -69,7 +69,7 @@ public class AccessControlValidatorTest
 
         root.commit();
 
-        testPrincipal = getTestPrincipal();
+        testPrincipal = getTestUser().getPrincipal();
     }
 
     @After

Added: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/accesscontrol/EntryTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/accesscontrol/EntryTest.java?rev=1792852&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/accesscontrol/EntryTest.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/accesscontrol/EntryTest.java
 Thu Apr 27 08:53:56 2017
@@ -0,0 +1,604 @@
+/*
+ * 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.jackrabbit.oak.security.authorization.accesscontrol;
+
+import java.security.Principal;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import javax.jcr.PropertyType;
+import javax.jcr.RepositoryException;
+import javax.jcr.Value;
+import javax.jcr.ValueFactory;
+import javax.jcr.ValueFormatException;
+import javax.jcr.security.AccessControlEntry;
+import javax.jcr.security.AccessControlException;
+import javax.jcr.security.AccessControlManager;
+import javax.jcr.security.Privilege;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Lists;
+import org.apache.jackrabbit.api.security.JackrabbitAccessControlEntry;
+import 
org.apache.jackrabbit.commons.jackrabbit.authorization.AccessControlUtils;
+import org.apache.jackrabbit.oak.spi.security.authorization.accesscontrol.ACE;
+import 
org.apache.jackrabbit.oak.spi.security.authorization.accesscontrol.AccessControlConstants;
+import 
org.apache.jackrabbit.oak.spi.security.authorization.restriction.Restriction;
+import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeBits;
+import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+public class EntryTest extends AbstractAccessControlTest {
+
+    private AccessControlManager acMgr;
+
+    private Value globValue;
+    private Value[] nameValues;
+    private Value nameValue;
+
+    @Override
+    @Before
+    public void before() throws Exception {
+        super.before();
+
+        acMgr = getAccessControlManager(root);
+        testPrincipal = new Principal() {
+            public String getName() {
+                return "TestPrincipal";
+            }
+        };
+        ValueFactory valueFactory = getValueFactory(root);
+        globValue = valueFactory.createValue("*");
+        nameValue = valueFactory.createValue("nt:file", PropertyType.NAME);
+        nameValues = new Value[] {
+                valueFactory.createValue("nt:folder", PropertyType.NAME),
+                valueFactory.createValue("nt:file", PropertyType.NAME)
+        };
+    }
+
+    private ACE createEntry(String... privilegeNames)
+            throws RepositoryException {
+        return createEntry(testPrincipal, true, null, privilegeNames);
+    }
+
+    private ACE createEntry(String[] privilegeNames, boolean isAllow)
+            throws RepositoryException {
+        return createEntry(testPrincipal, isAllow, null, privilegeNames);
+    }
+
+    private ACE createEntry(Set<Restriction> restrictions) throws Exception {
+        return createEntry(testPrincipal, true, restrictions, 
PrivilegeConstants.JCR_READ);
+    }
+
+    private Restriction createRestriction(String name, Value value) throws 
Exception {
+        return getRestrictionProvider().createRestriction("/a/b/c", name, 
value);
+    }
+
+    private Restriction createRestriction(String name, Value[] values) throws 
Exception {
+        return getRestrictionProvider().createRestriction("/a/b/c", name, 
values);
+    }
+
+    @Test
+    public void testIsAllow() throws RepositoryException {
+        ACE ace = createEntry(new String[]{PrivilegeConstants.JCR_READ}, true);
+        assertTrue(ace.isAllow());
+
+        ace = createEntry(new String[]{PrivilegeConstants.JCR_READ}, false);
+        assertFalse(ace.isAllow());
+    }
+
+    @Test
+    public void testGetPrincipal() throws RepositoryException {
+        ACE tmpl = createEntry(new String[]{PrivilegeConstants.JCR_READ}, 
true);
+        assertNotNull(tmpl.getPrincipal());
+        assertEquals(testPrincipal.getName(), tmpl.getPrincipal().getName());
+        assertSame(testPrincipal, tmpl.getPrincipal());
+    }
+
+    @Test
+    public void testNullPrincipal() throws Exception {
+        try {
+            Privilege[] privs = new Privilege[]{
+                    acMgr.privilegeFromName(PrivilegeConstants.JCR_ALL)
+            };
+            createEntry(null, privs, true);
+            fail("Principal must not be null");
+        } catch (AccessControlException e) {
+            // success
+        }
+    }
+
+    @Test
+    public void testGetPrivileges() throws RepositoryException {
+        ACE entry = createEntry(new String[]{PrivilegeConstants.JCR_READ}, 
true);
+
+        Privilege[] privs = entry.getPrivileges();
+        assertNotNull(privs);
+        assertEquals(1, privs.length);
+        assertEquals(privs[0], 
acMgr.privilegeFromName(PrivilegeConstants.JCR_READ));
+
+        entry = createEntry(new String[]{PrivilegeConstants.REP_WRITE}, true);
+        privs = entry.getPrivileges();
+        assertNotNull(privs);
+        assertEquals(1, privs.length);
+        assertEquals(privs[0], 
acMgr.privilegeFromName(PrivilegeConstants.REP_WRITE));
+
+        entry = createEntry(new 
String[]{PrivilegeConstants.JCR_ADD_CHILD_NODES,
+                PrivilegeConstants.JCR_REMOVE_CHILD_NODES}, true);
+        privs = entry.getPrivileges();
+        assertNotNull(privs);
+        assertEquals(2, privs.length);
+
+        Privilege[] expected = AccessControlUtils.privilegesFromNames(acMgr,
+                PrivilegeConstants.JCR_ADD_CHILD_NODES,
+                PrivilegeConstants.JCR_REMOVE_CHILD_NODES);
+        assertEquals(ImmutableSet.copyOf(expected), 
ImmutableSet.copyOf(privs));
+    }
+
+    @Test
+    public void testGetPrivilegeBits() throws RepositoryException {
+        ACE entry = createEntry(new String[]{PrivilegeConstants.JCR_READ}, 
true);
+
+        PrivilegeBits bits = entry.getPrivilegeBits();
+        assertNotNull(bits);
+        assertEquals(bits, 
getBitsProvider().getBits(PrivilegeConstants.JCR_READ));
+
+        entry = createEntry(new String[]{PrivilegeConstants.REP_WRITE}, true);
+        bits = entry.getPrivilegeBits();
+        assertNotNull(bits);
+        assertEquals(bits, 
getBitsProvider().getBits(PrivilegeConstants.REP_WRITE));
+
+        entry = createEntry(new 
String[]{PrivilegeConstants.JCR_ADD_CHILD_NODES,
+                PrivilegeConstants.JCR_REMOVE_CHILD_NODES}, true);
+        bits = entry.getPrivilegeBits();
+        assertNotNull(bits);
+
+        PrivilegeBits expected = getBitsProvider().getBits(
+                PrivilegeConstants.JCR_ADD_CHILD_NODES,
+                PrivilegeConstants.JCR_REMOVE_CHILD_NODES);
+        assertEquals(expected, bits);
+    }
+
+    @Test(expected = AccessControlException.class)
+    public void testNullPrivileges() throws Exception {
+        new EmptyACE(null);
+    }
+
+    @Test(expected = AccessControlException.class)
+    public void testEmptyPrivileges() throws Exception {
+        new EmptyACE(PrivilegeBits.EMPTY);
+    }
+
+    @Test
+    public void testRedundantPrivileges() throws Exception {
+        ACE ace = createEntry(PrivilegeConstants.JCR_READ, 
PrivilegeConstants.JCR_READ);
+        assertEquals(getBitsProvider().getBits(PrivilegeConstants.JCR_READ), 
ace.getPrivilegeBits());
+    }
+
+    /**
+     * @since oak 1.0 ACE doesn't validate privileges.
+     */
+    @Test
+    public void testUnknownPrivilege() throws Exception {
+        Privilege invalidPriv = new Privilege() {
+            public String getName() {
+                return "";
+            }
+
+            public boolean isAbstract() {
+                return false;
+            }
+
+            public boolean isAggregate() {
+                return false;
+            }
+
+            public Privilege[] getDeclaredAggregatePrivileges() {
+                return new Privilege[0];
+            }
+
+            public Privilege[] getAggregatePrivileges() {
+                return new Privilege[0];
+            }
+        };
+        Privilege[] privs = new Privilege[]{invalidPriv, 
acMgr.privilegeFromName(PrivilegeConstants.JCR_READ)};
+        ACE entry = createEntry(testPrincipal, privs, true);
+        assertEquals(getBitsProvider().getBits(PrivilegeConstants.JCR_READ), 
entry.getPrivilegeBits());
+    }
+
+    @Test
+    public void testAggregatePrivileges() throws Exception {
+        ACE ace = createEntry(PrivilegeConstants.REP_READ_NODES, 
PrivilegeConstants.REP_READ_PROPERTIES);
+
+        assertEquals(getBitsProvider().getBits(PrivilegeConstants.JCR_READ), 
ace.getPrivilegeBits());
+        assertArrayEquals(privilegesFromNames(PrivilegeConstants.JCR_READ), 
ace.getPrivileges());
+    }
+
+    @Test
+    public void testGetRestrictionNames() throws Exception {
+        // empty restrictions
+        String[] restrictionNames = 
createEntry(Collections.<Restriction>emptySet()).getRestrictionNames();
+        assertNotNull(restrictionNames);
+        assertEquals(0, restrictionNames.length);
+
+        Restriction globRestr = 
createRestriction(AccessControlConstants.REP_GLOB, globValue);
+        Restriction nameRestr = 
createRestriction(AccessControlConstants.REP_NT_NAMES, nameValues);
+
+        // single restriction
+        restrictionNames = 
createEntry(ImmutableSet.of(globRestr)).getRestrictionNames();
+        assertEquals(1, restrictionNames.length);
+
+        // 2 restrictions
+        restrictionNames = createEntry(ImmutableSet.of(globRestr, 
nameRestr)).getRestrictionNames();
+        assertEquals(2, restrictionNames.length);
+    }
+
+    @Test
+    public void testGetRestrictionForEmpty() throws Exception {
+        // empty restrictions
+        Value val = 
createEntry(Collections.<Restriction>emptySet()).getRestriction(AccessControlConstants.REP_GLOB);
+        assertNull(val);
+    }
+
+    @Test
+    public void testGetNonExistingRestriction() throws Exception {
+        // single valued restriction
+        Restriction globRestr = 
createRestriction(AccessControlConstants.REP_GLOB, globValue);
+        ACE ace = createEntry(ImmutableSet.of(globRestr));
+        assertNull(ace.getRestriction(AccessControlConstants.REP_NT_NAMES));
+    }
+
+    @Test
+    public void testGetRestrictionForSingleValued() throws Exception {
+        // single valued restriction
+        Restriction globRestr = 
createRestriction(AccessControlConstants.REP_GLOB, globValue);
+        ACE ace = createEntry(ImmutableSet.of(globRestr));
+        Value val = ace.getRestriction(AccessControlConstants.REP_GLOB);
+        assertNotNull(val);
+        assertEquals(globValue, val);
+    }
+
+    /**
+     * @since OAK 1.0: support for multi-value restrictions
+     */
+    @Test(expected = ValueFormatException.class)
+    public void testGetRestrictionForMultiValued() throws Exception {
+        // multivalued restriction
+        Restriction nameRestr = 
createRestriction(AccessControlConstants.REP_NT_NAMES, nameValues);
+        ACE ace = createEntry(ImmutableSet.of(nameRestr));
+
+        ace.getRestriction(AccessControlConstants.REP_NT_NAMES);
+    }
+
+    /**
+     * @since OAK 1.0: support for multi-value restrictions
+     */
+    @Test
+    public void testGetRestrictionForMultiValued2() throws Exception {
+        // single value restriction stored in multi-value property
+        Restriction singleNameRestr = 
createRestriction(AccessControlConstants.REP_NT_NAMES, new Value[] {nameValue});
+
+        ACE ace = createEntry(ImmutableSet.of(singleNameRestr));
+        Value val = ace.getRestriction(AccessControlConstants.REP_NT_NAMES);
+        assertEquals(nameValue, val);
+    }
+
+    /**
+     * @since OAK 1.0: support for multi-value restrictions
+     */
+    @Test
+    public void testGetEmptyRestrictions() throws Exception {
+        // empty restrictions
+        Value[] vs = 
createEntry(Collections.<Restriction>emptySet()).getRestrictions(AccessControlConstants.REP_GLOB);
+        assertNull(vs);
+    }
+
+    /**
+     * @since OAK 1.0: support for multi-value restrictions
+     */
+    @Test
+    public void testGetNonExistingRestrictions() throws Exception {
+        Restriction nameRestr = 
createRestriction(AccessControlConstants.REP_NT_NAMES, nameValues);
+        ACE ace = createEntry(ImmutableSet.of(nameRestr));
+        assertNull(ace.getRestrictions(AccessControlConstants.REP_GLOB));
+    }
+
+    /**
+     * @since OAK 1.0: support for multi-value restrictions
+     */
+    @Test
+    public void testGetRestrictionsForSingleValue() throws Exception {
+        // single valued restriction
+        Restriction globRestr = 
createRestriction(AccessControlConstants.REP_GLOB, globValue);
+        ACE ace = createEntry(ImmutableSet.of(globRestr));
+        Value[] vs = ace.getRestrictions(AccessControlConstants.REP_GLOB);
+        assertNotNull(vs);
+        assertArrayEquals(new Value[]{globValue}, vs);
+    }
+
+    /**
+     * @since OAK 1.0: support for multi-value restrictions
+     */
+    @Test
+    public void testGetRestrictionsForMultiValued() throws Exception {
+        // multivalued restriction
+        Restriction nameRestr = 
createRestriction(AccessControlConstants.REP_NT_NAMES, nameValues);
+        ACE ace = createEntry(ImmutableSet.of(nameRestr));
+        Value[] vs = ace.getRestrictions(AccessControlConstants.REP_NT_NAMES);
+        assertEquals(2, vs.length);
+        assertArrayEquals(nameValues, vs);
+    }
+
+    /**
+     * @since OAK 1.0: support for multi-value restrictions
+     */
+    @Test
+    public void testGetRestrictionsForMultiValued2() throws Exception {
+        // single value restriction stored in multi-value property
+        Restriction singleNameRestr = 
createRestriction(AccessControlConstants.REP_NT_NAMES, new Value[]{nameValue});
+        ACE ace = createEntry(ImmutableSet.of(singleNameRestr));
+        Value[] vs = ace.getRestrictions(AccessControlConstants.REP_NT_NAMES);
+        assertEquals(1, vs.length);
+        assertEquals(nameValue, vs[0]);
+    }
+
+    @Test
+    public void testGetRestrictions() throws Exception {
+        Restriction nameRestr = 
createRestriction(AccessControlConstants.REP_NT_NAMES, nameValues);
+        Restriction globRestr = 
createRestriction(AccessControlConstants.REP_GLOB, globValue);
+
+        Set<Restriction> expected = ImmutableSet.of(nameRestr, globRestr);
+        ACE ace = createEntry(expected);
+
+        assertEquals(expected, ace.getRestrictions());
+    }
+
+    @Test
+    public void testGetRestrictionsNone() throws Exception {
+        ACE ace = createEntry(ImmutableSet.<Restriction>of());
+
+        assertTrue(ace.getRestrictions().isEmpty());
+    }
+
+    @Test
+    public void testEquals() throws RepositoryException {
+
+        Map<AccessControlEntry, AccessControlEntry> equalAces = new 
HashMap<AccessControlEntry, AccessControlEntry>();
+
+        ACE ace = createEntry(PrivilegeConstants.JCR_ALL);
+        // create same entry again
+        equalAces.put(ace, createEntry(PrivilegeConstants.JCR_ALL));
+
+        // create entry with declared aggregate privileges
+        Privilege[] declaredAllPrivs = 
acMgr.privilegeFromName(PrivilegeConstants.JCR_ALL).getDeclaredAggregatePrivileges();
+        equalAces.put(ace, createEntry(testPrincipal, declaredAllPrivs, true));
+
+        // create entry with aggregate privileges
+        Privilege[] aggregateAllPrivs = 
acMgr.privilegeFromName(PrivilegeConstants.JCR_ALL).getAggregatePrivileges();
+        equalAces.put(ace, createEntry(testPrincipal, aggregateAllPrivs, 
true));
+
+        // create entry with different privilege order
+        List<Privilege> reordered = new 
ArrayList<Privilege>(Arrays.asList(aggregateAllPrivs));
+        reordered.add(reordered.remove(0));
+        equalAces.put(createEntry(testPrincipal, reordered.toArray(new 
Privilege[reordered.size()]), true),
+                createEntry(testPrincipal, aggregateAllPrivs, true));
+
+        // even if entries are build with aggregated or declared aggregate 
privileges
+        equalAces.put(createEntry(testPrincipal, declaredAllPrivs, true),
+                createEntry(testPrincipal, aggregateAllPrivs, true));
+
+        for (AccessControlEntry entry : equalAces.keySet()) {
+            assertEquals(entry, equalAces.get(entry));
+        }
+    }
+
+    @Test
+    public void testEquals2() throws RepositoryException {
+        ACE ace = createEntry(PrivilegeConstants.JCR_ADD_CHILD_NODES, 
PrivilegeConstants.JCR_READ);
+        // priv array contains duplicates
+        ACE ace2 = createEntry(PrivilegeConstants.JCR_ADD_CHILD_NODES, 
PrivilegeConstants.JCR_ADD_CHILD_NODES, PrivilegeConstants.JCR_READ);
+
+        assertEquals(ace, ace2);
+    }
+
+    @Test
+    public void testNotEquals() throws RepositoryException {
+        ACE ace = createEntry(new String[]{PrivilegeConstants.JCR_ALL}, true);
+        List<JackrabbitAccessControlEntry> otherAces = new 
ArrayList<JackrabbitAccessControlEntry>();
+
+        try {
+            // ACE template with different principal
+            Principal princ = new Principal() {
+                public String getName() {
+                    return "a name";
+                }
+            };
+            Privilege[] privs = new Privilege[]{
+                    acMgr.privilegeFromName(PrivilegeConstants.JCR_ALL)
+            };
+            otherAces.add(createEntry(princ, privs, true));
+        } catch (RepositoryException e) {
+        }
+
+        // ACE template with different privileges
+        try {
+            otherAces.add(createEntry(new 
String[]{PrivilegeConstants.JCR_READ}, true));
+        } catch (RepositoryException e) {
+        }
+        // ACE template with different 'allow' flag
+        try {
+            otherAces.add(createEntry(new 
String[]{PrivilegeConstants.JCR_ALL}, false));
+        } catch (RepositoryException e) {
+        }
+        // ACE template with different privileges and 'allows
+        try {
+            otherAces.add(createEntry(new 
String[]{PrivilegeConstants.REP_WRITE}, false));
+        } catch (RepositoryException e) {
+        }
+
+        // other ace impl
+        final Privilege[] privs = new Privilege[]{
+                acMgr.privilegeFromName(PrivilegeConstants.JCR_ALL)
+        };
+
+        JackrabbitAccessControlEntry pe = new JackrabbitAccessControlEntry() {
+            public boolean isAllow() {
+                return true;
+            }
+
+            public String[] getRestrictionNames() {
+                return new String[0];
+            }
+
+            public Value getRestriction(String restrictionName) {
+                return null;
+            }
+
+            public Value[] getRestrictions(String restrictionName) {
+                return null;
+            }
+
+            public Principal getPrincipal() {
+                return testPrincipal;
+            }
+
+            public Privilege[] getPrivileges() {
+                return privs;
+            }
+        };
+        otherAces.add(pe);
+
+        for (JackrabbitAccessControlEntry otherAce : otherAces) {
+            assertFalse(ace.equals(otherAce));
+        }
+    }
+
+    @Test
+    public void testHashCode() throws RepositoryException {
+        JackrabbitAccessControlEntry ace = 
createEntry(PrivilegeConstants.JCR_ALL);
+        Privilege[] declaredAllPrivs = 
acMgr.privilegeFromName(PrivilegeConstants.JCR_ALL).getDeclaredAggregatePrivileges();
+        Privilege[] aggregateAllPrivs = 
acMgr.privilegeFromName(PrivilegeConstants.JCR_ALL).getAggregatePrivileges();
+        List<Privilege> l = Lists.newArrayList(aggregateAllPrivs);
+        l.add(l.remove(0));
+        Privilege[] reordered = l.toArray(new Privilege[l.size()]);
+
+        Map<AccessControlEntry, AccessControlEntry> equivalent = new 
HashMap<AccessControlEntry, AccessControlEntry>();
+        // create same entry again
+        equivalent.put(ace, createEntry(PrivilegeConstants.JCR_ALL));
+        // create entry with duplicate privs
+        equivalent.put(ace, createEntry(PrivilegeConstants.JCR_ALL, 
PrivilegeConstants.JCR_ALL));
+        // create entry with declared aggregate privileges
+        equivalent.put(ace, createEntry(testPrincipal, declaredAllPrivs, 
true));
+        // create entry with aggregate privileges
+        equivalent.put(ace, createEntry(testPrincipal, aggregateAllPrivs, 
true));
+        // create entry with different privilege order
+        equivalent.put(ace, createEntry(testPrincipal, reordered, true));
+        equivalent.put(createEntry(testPrincipal, declaredAllPrivs, true),
+                createEntry(testPrincipal, reordered, true));
+        // even if entries are build with aggregated or declared aggregate 
privileges
+        equivalent.put(createEntry(testPrincipal, declaredAllPrivs, true),
+                createEntry(testPrincipal, aggregateAllPrivs, true));
+
+        for (AccessControlEntry entry : equivalent.keySet()) {
+            AccessControlEntry eqv = equivalent.get(entry);
+            assertEquals(entry.hashCode(), eqv.hashCode());
+        }
+    }
+
+    @Test
+    public void testHashCode2() throws Exception {
+        JackrabbitAccessControlEntry ace = createEntry(new 
String[]{PrivilegeConstants.JCR_ALL}, true);
+        final Privilege[] privs = 
AccessControlUtils.privilegesFromNames(acMgr, PrivilegeConstants.JCR_ALL);
+
+        // and the opposite:
+        List<JackrabbitAccessControlEntry> otherAces = new 
ArrayList<JackrabbitAccessControlEntry>();
+        // ACE template with different principal
+        Principal princ = new Principal() {
+            public String getName() {
+                return "a name";
+            }
+        };
+        otherAces.add(createEntry(princ, privs, true));
+
+        // ACE template with different privileges
+        otherAces.add(createEntry(new String[]{PrivilegeConstants.JCR_READ}, 
true));
+
+        // ACE template with different 'allow' flag
+        otherAces.add(createEntry(new String[]{PrivilegeConstants.JCR_ALL}, 
false));
+
+        // ACE template with different privileges and 'allows
+        otherAces.add(createEntry(new String[]{PrivilegeConstants.REP_WRITE}, 
false));
+
+        // other ace impl
+        JackrabbitAccessControlEntry pe = new JackrabbitAccessControlEntry() {
+            public boolean isAllow() {
+                return true;
+            }
+
+            public String[] getRestrictionNames() {
+                return new String[0];
+            }
+
+            public Value getRestriction(String restrictionName) {
+                return null;
+            }
+
+            public Value[] getRestrictions(String restrictionName) {
+                return null;
+            }
+
+            public Principal getPrincipal() {
+                return testPrincipal;
+            }
+
+            public Privilege[] getPrivileges() {
+                return privs;
+            }
+        };
+        otherAces.add(pe);
+
+        for (JackrabbitAccessControlEntry otherAce : otherAces) {
+            assertFalse(ace.hashCode() == otherAce.hashCode());
+        }
+
+    }
+
+    private class EmptyACE extends ACE {
+
+        public EmptyACE(PrivilegeBits privilegeBits) throws 
AccessControlException {
+            super(testPrincipal, privilegeBits, true, null, namePathMapper);
+        }
+
+        @Override
+        public Privilege[] getPrivileges() {
+            return new Privilege[0];
+        }
+    }
+}
\ No newline at end of file

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/accesscontrol/ReadPolicyTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/accesscontrol/ReadPolicyTest.java?rev=1792852&r1=1792851&r2=1792852&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/accesscontrol/ReadPolicyTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/authorization/accesscontrol/ReadPolicyTest.java
 Thu Apr 27 08:53:56 2017
@@ -19,9 +19,9 @@ package org.apache.jackrabbit.oak.securi
 import java.util.Set;
 import javax.jcr.security.AccessControlPolicy;
 
+import org.apache.jackrabbit.oak.AbstractSecurityTest;
 import org.apache.jackrabbit.oak.spi.security.ConfigurationParameters;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.AuthorizationConfiguration;
-import 
org.apache.jackrabbit.oak.spi.security.authorization.accesscontrol.AbstractAccessControlTest;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.permission.PermissionConstants;
 import org.junit.Before;
 import org.junit.Test;
@@ -33,7 +33,7 @@ import static org.junit.Assert.assertTru
  *
  * @since OAK 1.0
  */
-public class ReadPolicyTest extends AbstractAccessControlTest {
+public class ReadPolicyTest extends AbstractSecurityTest {
 
     private Set<String> readPaths;
 


Reply via email to