Author: angela
Date: Tue Aug 20 15:23:14 2019
New Revision: 1865540

URL: http://svn.apache.org/viewvc?rev=1865540&view=rev
Log:
OAK-8562 : Improve cug tests

Modified:
    jackrabbit/oak/trunk/oak-authorization-cug/pom.xml
    
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/AbstractCugTest.java
    
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugAccessControlManagerTest.java
    
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugConfigurationTest.java
    
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugContextTest.java
    
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugEvaluationTest.java
    
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugExcludeDefaultTest.java
    
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugImportBaseTest.java
    
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugPermissionProviderTest.java
    
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugPolicyImplTest.java
    
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugTreePermissionTest.java
    
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugUtilTest.java
    
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugValidatorTest.java
    
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/NestedCugHookTest.java

Modified: jackrabbit/oak/trunk/oak-authorization-cug/pom.xml
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-cug/pom.xml?rev=1865540&r1=1865539&r2=1865540&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-authorization-cug/pom.xml (original)
+++ jackrabbit/oak/trunk/oak-authorization-cug/pom.xml Tue Aug 20 15:23:14 2019
@@ -27,8 +27,8 @@
   <properties>
     <!-- enable execution of jacoco and set minimal line coverage -->
     <skip.coverage>false</skip.coverage>
-    <minimum.line.coverage>0.97</minimum.line.coverage>
-    <minimum.branch.coverage>0.93</minimum.branch.coverage>
+    <minimum.line.coverage>0.99</minimum.line.coverage>
+    <minimum.branch.coverage>0.98</minimum.branch.coverage>
   </properties>
 
   <artifactId>oak-authorization-cug</artifactId>

Modified: 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/AbstractCugTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/AbstractCugTest.java?rev=1865540&r1=1865539&r2=1865540&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/AbstractCugTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/AbstractCugTest.java
 Tue Aug 20 15:23:14 2019
@@ -19,6 +19,7 @@ package org.apache.jackrabbit.oak.spi.se
 import java.security.Principal;
 import java.util.Set;
 import java.util.UUID;
+import javax.jcr.AccessDeniedException;
 import javax.jcr.RepositoryException;
 import javax.jcr.SimpleCredentials;
 import javax.jcr.security.AccessControlList;
@@ -37,6 +38,7 @@ import org.apache.jackrabbit.oak.Abstrac
 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;
 import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.apache.jackrabbit.oak.plugins.tree.TreeUtil;
 import org.apache.jackrabbit.oak.spi.nodetype.NodeTypeConstants;
@@ -49,7 +51,6 @@ import org.apache.jackrabbit.oak.spi.sec
 import 
org.apache.jackrabbit.oak.spi.security.authorization.permission.TreePermission;
 import org.apache.jackrabbit.oak.spi.security.principal.EveryonePrincipal;
 import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants;
-import org.apache.jackrabbit.oak.util.NodeUtil;
 import org.apache.jackrabbit.util.Text;
 import org.jetbrains.annotations.NotNull;
 
@@ -94,17 +95,12 @@ public class AbstractCugTest extends Abs
          *   + testNode
          *     + child
          */
-        NodeUtil rootNode = new NodeUtil(root.getTree("/"));
+        Tree rootNode = root.getTree("/");
 
-        NodeUtil content = rootNode.addChild("content", 
NodeTypeConstants.NT_OAK_UNSTRUCTURED);
-        content.addChild("subtree", NodeTypeConstants.NT_OAK_UNSTRUCTURED);
-
-        rootNode.addChild("content2", NodeTypeConstants.NT_OAK_UNSTRUCTURED);
-
-        rootNode.addChild("some", 
NodeTypeConstants.NT_OAK_UNSTRUCTURED).addChild("content", 
NodeTypeConstants.NT_OAK_UNSTRUCTURED).addChild("tree", 
NodeTypeConstants.NT_OAK_UNSTRUCTURED);
-
-        NodeUtil testNode = rootNode.addChild("testNode", 
NodeTypeConstants.NT_OAK_UNSTRUCTURED);
-        testNode.addChild("child", NodeTypeConstants.NT_OAK_UNSTRUCTURED);
+        createTrees(rootNode, NT_OAK_UNSTRUCTURED, "content", "subtree");
+        createTrees(rootNode, NT_OAK_UNSTRUCTURED, "content2");
+        createTrees(rootNode, NT_OAK_UNSTRUCTURED, "some", "content", "tree");
+        createTrees(rootNode, NT_OAK_UNSTRUCTURED, "testNode", "child");
         root.commit();
     }
 
@@ -152,6 +148,13 @@ public class AbstractCugTest extends Abs
         return new CugPermissionProvider(root, 
root.getContentSession().getWorkspaceName(), ImmutableSet.copyOf(principals), 
supportedPaths, getConfig(AuthorizationConfiguration.class).getContext(), 
getRootProvider(), getTreeProvider());
     }
 
+    void createTrees(@NotNull Tree tree, @NotNull String ntName, @NotNull 
String... names) throws AccessDeniedException {
+        Tree parent = tree;
+        for (String n : names) {
+            parent = TreeUtil.addChild(parent, n, ntName);
+        }
+    }
+
     void setupCugsAndAcls() throws Exception {
         UserManager uMgr = getUserManager(root);
         Principal testGroupPrincipal = getTestGroupPrincipal();
@@ -163,9 +166,9 @@ public class AbstractCugTest extends Abs
         User testUser = getTestUser();
 
         // add more child nodes
-        NodeUtil n = new NodeUtil(root.getTree(SUPPORTED_PATH));
-        n.addChild("a", NT_OAK_UNSTRUCTURED).addChild("b", 
NT_OAK_UNSTRUCTURED).addChild("c", NT_OAK_UNSTRUCTURED);
-        n.addChild("aa", NT_OAK_UNSTRUCTURED).addChild("bb", 
NT_OAK_UNSTRUCTURED).addChild("cc", NT_OAK_UNSTRUCTURED);
+        Tree n = root.getTree(SUPPORTED_PATH);
+        createTrees(n, NT_OAK_UNSTRUCTURED, "a", "b", "c");
+        createTrees(n, NT_OAK_UNSTRUCTURED, "aa", "bb", "cc");
 
         // create cugs
         // - /content/a     : allow testGroup, deny everyone
@@ -214,7 +217,7 @@ public class AbstractCugTest extends Abs
         Preconditions.checkState(tree.exists());
 
         TreeUtil.addMixin(tree, MIX_REP_CUG_MIXIN, 
root.getTree(NODE_TYPES_PATH), null);
-        new NodeUtil(tree).addChild(REP_CUG_POLICY, 
NT_REP_CUG_POLICY).setStrings(REP_PRINCIPAL_NAMES, principalName);
+        TreeUtil.addChild(tree, REP_CUG_POLICY, 
NT_REP_CUG_POLICY).setProperty(REP_PRINCIPAL_NAMES, 
ImmutableSet.of(principalName), Type.STRINGS);
     }
 
     Principal getTestGroupPrincipal() throws Exception {

Modified: 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugAccessControlManagerTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugAccessControlManagerTest.java?rev=1865540&r1=1865539&r2=1865540&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugAccessControlManagerTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugAccessControlManagerTest.java
 Tue Aug 20 15:23:14 2019
@@ -32,6 +32,8 @@ import javax.jcr.security.Privilege;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+import org.apache.jackrabbit.JcrConstants;
 import org.apache.jackrabbit.api.security.JackrabbitAccessControlPolicy;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Tree;
@@ -46,10 +48,10 @@ import org.apache.jackrabbit.oak.spi.sec
 import org.apache.jackrabbit.oak.spi.security.principal.EveryonePrincipal;
 import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants;
 import org.apache.jackrabbit.oak.spi.xml.ImportBehavior;
-import org.apache.jackrabbit.oak.util.NodeUtil;
 import org.jetbrains.annotations.NotNull;
 import org.junit.Test;
 
+import static org.apache.jackrabbit.oak.api.Type.NAMES;
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -92,6 +94,11 @@ public class CugAccessControlManagerTest
         }
     }
 
+    @Test
+    public void testGetSupportedPrivilegesNullPath() throws Exception {
+        assertArrayEquals(new Privilege[0], 
cugAccessControlManager.getSupportedPrivileges(null));
+    }
+
     @Test(expected = PathNotFoundException.class)
     public void testGetSupportedPrivilegesInvalidPath() throws Exception {
         cugAccessControlManager.getSupportedPrivileges(INVALID_PATH);
@@ -148,8 +155,8 @@ public class CugAccessControlManagerTest
 
     @Test
     public void testGetPoliciesAfterManualCreation() throws Exception {
-        NodeUtil n = new NodeUtil(root.getTree(SUPPORTED_PATH));
-        NodeUtil cug = n.addChild(REP_CUG_POLICY, NT_REP_CUG_POLICY);
+        Tree n = root.getTree(SUPPORTED_PATH);
+        Tree cug = TreeUtil.addChild(n, REP_CUG_POLICY, NT_REP_CUG_POLICY);
 
         AccessControlPolicy[] policies = 
cugAccessControlManager.getPolicies(SUPPORTED_PATH);
         assertEquals(1, policies.length);
@@ -157,7 +164,7 @@ public class CugAccessControlManagerTest
         CugPolicy cugPolicy = (CugPolicy) policies[0];
         assertTrue(cugPolicy.getPrincipals().isEmpty());
 
-        cug.setStrings(REP_PRINCIPAL_NAMES, "unknownPrincipalName", 
EveryonePrincipal.NAME);
+        cug.setProperty(REP_PRINCIPAL_NAMES, 
ImmutableList.of("unknownPrincipalName", EveryonePrincipal.NAME), Type.STRINGS);
 
         policies = cugAccessControlManager.getPolicies(SUPPORTED_PATH);
         cugPolicy = (CugPolicy) policies[0];
@@ -275,11 +282,7 @@ public class CugAccessControlManagerTest
     public void testSetInvalidPolicy() throws Exception {
         List<AccessControlPolicy> invalidPolicies = ImmutableList.of(
                 new AccessControlPolicy() {},
-                new NamedAccessControlPolicy() {
-                    public String getName() {
-                        return "name";
-                    }
-                },
+                (NamedAccessControlPolicy) () -> "name",
                 InvalidCug.INSTANCE
         );
 
@@ -311,12 +314,45 @@ public class CugAccessControlManagerTest
     @Test(expected = AccessControlException.class)
     public void testSetInvalidCugNode() throws Exception {
         Tree supportedTree = root.getTree(SUPPORTED_PATH);
-        new NodeUtil(supportedTree).addChild(REP_CUG_POLICY, 
NodeTypeConstants.NT_OAK_UNSTRUCTURED);
+        TreeUtil.addChild(supportedTree, REP_CUG_POLICY, 
NodeTypeConstants.NT_OAK_UNSTRUCTURED);
 
         cugAccessControlManager.setPolicy(SUPPORTED_PATH, new 
CugPolicyImpl(SUPPORTED_PATH, NamePathMapper.DEFAULT, 
getPrincipalManager(root), ImportBehavior.BESTEFFORT, getExclude()));
     }
 
     @Test
+    public void testSetPolicyMixinAlreadyPresent() throws Exception {
+        CugPolicy cug = getApplicableCug(SUPPORTED_PATH);
+        cug.addPrincipals(EveryonePrincipal.getInstance());
+
+        TreeUtil.addMixin(root.getTree(SUPPORTED_PATH), MIX_REP_CUG_MIXIN, 
root.getTree(NODE_TYPES_PATH), "uid");
+
+        cugAccessControlManager.setPolicy(SUPPORTED_PATH, cug);
+        root.commit();
+
+        ReadOnlyNodeTypeManager ntMgr = 
ReadOnlyNodeTypeManager.getInstance(root, NamePathMapper.DEFAULT);
+        assertTrue(ntMgr.isNodeType(root.getTree(SUPPORTED_PATH), 
MIX_REP_CUG_MIXIN));
+    }
+
+    @Test
+    public void testResetPolicy() throws Exception {
+        CugPolicy cug = getApplicableCug(SUPPORTED_PATH);
+        cug.addPrincipals(EveryonePrincipal.getInstance());
+        cugAccessControlManager.setPolicy(SUPPORTED_PATH, cug);
+
+        cug = (CugPolicy) 
cugAccessControlManager.getPolicies(SUPPORTED_PATH)[0];
+        assertTrue(cug.removePrincipals(EveryonePrincipal.getInstance()));
+        assertTrue(cug.getPrincipals().isEmpty());
+
+        Principal testprincipal = getTestGroupPrincipal();
+        cug.addPrincipals(testprincipal);
+
+        cugAccessControlManager.setPolicy(SUPPORTED_PATH, cug);
+
+        cug = (CugPolicy) 
cugAccessControlManager.getPolicies(SUPPORTED_PATH)[0];
+        assertEquals(ImmutableSet.of(testprincipal), cug.getPrincipals());
+    }
+
+    @Test
     public void testRemovePolicy() throws Exception {
         CugPolicy cug = getApplicableCug(SUPPORTED_PATH);
         cugAccessControlManager.setPolicy(SUPPORTED_PATH, cug);
@@ -354,14 +390,29 @@ public class CugAccessControlManagerTest
     }
 
     @Test
+    public void testRemovePolicyMixinAlreadyRemoved() throws Exception {
+        ReadOnlyNodeTypeManager ntMgr = 
ReadOnlyNodeTypeManager.getInstance(root, NamePathMapper.DEFAULT);
+
+        CugPolicy cug = getApplicableCug(SUPPORTED_PATH);
+        cugAccessControlManager.setPolicy(SUPPORTED_PATH, cug);
+        root.commit();
+
+        Tree tree = root.getTree(SUPPORTED_PATH);
+        Set<String> mixins = Sets.newHashSet(TreeUtil.getNames(tree, 
NodeTypeConstants.JCR_MIXINTYPES));
+        mixins.remove(MIX_REP_CUG_MIXIN);
+        tree.setProperty(JcrConstants.JCR_MIXINTYPES, mixins, NAMES);
+
+        assertFalse(ntMgr.isNodeType(root.getTree(SUPPORTED_PATH), 
MIX_REP_CUG_MIXIN));
+
+        cugAccessControlManager.removePolicy(SUPPORTED_PATH, cug);
+        root.commit();
+    }
+
+    @Test
     public void testRemoveInvalidPolicy() throws Exception {
         List<AccessControlPolicy> invalidPolicies = ImmutableList.of(
                 new AccessControlPolicy() {},
-                new NamedAccessControlPolicy() {
-                    public String getName() {
-                        return "name";
-                    }
-                },
+                (NamedAccessControlPolicy) () -> "name",
                 InvalidCug.INSTANCE
         );
 
@@ -378,7 +429,7 @@ public class CugAccessControlManagerTest
     @Test(expected = AccessControlException.class)
     public void testRemoveInvalidCugNode() throws Exception {
         Tree supportedTree = root.getTree(SUPPORTED_PATH);
-        new NodeUtil(supportedTree).addChild(REP_CUG_POLICY, 
NodeTypeConstants.NT_OAK_UNSTRUCTURED);
+        TreeUtil.addChild(supportedTree, REP_CUG_POLICY, 
NodeTypeConstants.NT_OAK_UNSTRUCTURED);
 
         cugAccessControlManager.removePolicy(SUPPORTED_PATH, new 
CugPolicyImpl(SUPPORTED_PATH, NamePathMapper.DEFAULT, 
getPrincipalManager(root), ImportBehavior.BESTEFFORT, getExclude()));
     }
@@ -419,6 +470,23 @@ public class CugAccessControlManagerTest
         assertEquals(0, applicable.length);
     }
 
+    @Test
+    public void testDefinesPathMismatch() {
+        assertFalse(cugAccessControlManager.defines(null, 
createCug(SUPPORTED_PATH)));
+        assertFalse(cugAccessControlManager.defines(SUPPORTED_PATH2, 
createCug(SUPPORTED_PATH)));
+    }
+
+    @Test
+    public void testDefinesUnsupportedPolicy() {
+        
assertFalse(cugAccessControlManager.defines(InvalidCug.INSTANCE.getPath(), 
InvalidCug.INSTANCE));
+    }
+
+    @Test
+    public void testDefines() {
+        CugPolicy cugPolicy = createCug(SUPPORTED_PATH);
+        assertTrue(cugAccessControlManager.defines(cugPolicy.getPath(), 
cugPolicy));
+    }
+
     /**
      * An invalid (unsupported) implementation of {@link CugPolicy}.
      */

Modified: 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugConfigurationTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugConfigurationTest.java?rev=1865540&r1=1865539&r2=1865540&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugConfigurationTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugConfigurationTest.java
 Tue Aug 20 15:23:14 2019
@@ -16,6 +16,7 @@
  */
 package org.apache.jackrabbit.oak.spi.security.authorization.cug.impl;
 
+import java.lang.reflect.Field;
 import java.security.Principal;
 import java.util.List;
 import java.util.Set;
@@ -24,13 +25,18 @@ import javax.jcr.security.AccessControlM
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
+import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.apache.jackrabbit.oak.namepath.NamePathMapper;
+import 
org.apache.jackrabbit.oak.security.authorization.composite.CompositeAuthorizationConfiguration;
 import org.apache.jackrabbit.oak.spi.commit.CommitHook;
 import org.apache.jackrabbit.oak.spi.commit.MoveTracker;
 import org.apache.jackrabbit.oak.spi.commit.ValidatorProvider;
+import org.apache.jackrabbit.oak.spi.lifecycle.RepositoryInitializer;
+import org.apache.jackrabbit.oak.spi.mount.MountInfoProvider;
 import org.apache.jackrabbit.oak.spi.security.ConfigurationParameters;
 import org.apache.jackrabbit.oak.spi.security.SecurityProvider;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.AuthorizationConfiguration;
+import org.apache.jackrabbit.oak.spi.security.authorization.cug.CugExclude;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.permission.EmptyPermissionProvider;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.permission.PermissionProvider;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.restriction.RestrictionProvider;
@@ -38,13 +44,19 @@ import org.apache.jackrabbit.oak.spi.sec
 import org.apache.jackrabbit.oak.spi.security.principal.EveryonePrincipal;
 import org.apache.jackrabbit.oak.spi.security.principal.SystemPrincipal;
 import org.apache.jackrabbit.oak.spi.security.principal.SystemUserPrincipal;
+import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.xml.ProtectedItemImporter;
 import org.jetbrains.annotations.NotNull;
 import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;
+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.mockito.Mockito.calls;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
 
 public class CugConfigurationTest extends AbstractCugTest {
 
@@ -177,18 +189,8 @@ public class CugConfigurationTest extend
 
         List<Principal> excluded = ImmutableList.of(
                 SystemPrincipal.INSTANCE,
-                new AdminPrincipal() {
-                    @Override
-                    public String getName() {
-                        return "admin";
-                    }
-                },
-                new SystemUserPrincipal() {
-                    @Override
-                    public String getName() {
-                        return "systemUser";
-                    }
-                });
+                (AdminPrincipal) () -> "admin",
+                (SystemUserPrincipal) () -> "systemUser");
 
         for (Principal p : excluded) {
             Set<Principal> principals = ImmutableSet.of(p, 
EveryonePrincipal.getInstance());
@@ -221,4 +223,44 @@ public class CugConfigurationTest extend
         Set<String> expected = ImmutableSet.copyOf(paths);
         assertEquals(expected, 
configuration.getParameters().getConfigValue(CugConstants.PARAM_CUG_SUPPORTED_PATHS,
 ImmutableSet.of()));
     }
+
+    @Test
+    public void testUnbindMountInfoProvider() throws Exception {
+        CugConfiguration cugConfiguration = 
createConfiguration(ConfigurationParameters.EMPTY);
+        
cugConfiguration.unbindMountInfoProvider(mock(MountInfoProvider.class));
+
+        Field f = 
cugConfiguration.getClass().getDeclaredField("mountInfoProvider");
+        f.setAccessible(true);
+        assertNull(f.get(cugConfiguration));
+    }
+
+    @Test
+    public void testUnbindCugExclude() throws Exception {
+        CugConfiguration cugConfiguration = 
createConfiguration(ConfigurationParameters.EMPTY);
+        cugConfiguration.unbindExclude(mock(CugExclude.class));
+
+        Field f = cugConfiguration.getClass().getDeclaredField("exclude");
+        f.setAccessible(true);
+        assertNull(f.get(cugConfiguration));
+    }
+
+    @Test
+    public void testRepositoryInitializerAlreadyInitialized() {
+        AuthorizationConfiguration ac = 
getConfig(AuthorizationConfiguration.class);
+        assertTrue(ac instanceof CompositeAuthorizationConfiguration);
+
+        AuthorizationConfiguration cugConfig = null;
+        for (AuthorizationConfiguration config : 
((CompositeAuthorizationConfiguration) ac).getConfigurations()) {
+            if (config instanceof CugConfiguration) {
+                cugConfig = config;
+                break;
+            }
+        }
+        assertNotNull(cugConfig);
+        RepositoryInitializer ri = cugConfig.getRepositoryInitializer();
+        NodeBuilder rootBuilder = 
spy(getTreeProvider().asNodeState(root.getTree(PathUtils.ROOT_PATH)).builder());
+        ri.initialize(rootBuilder);
+
+        calls(1);
+    }
 }

Modified: 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugContextTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugContextTest.java?rev=1865540&r1=1865539&r2=1865540&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugContextTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugContextTest.java
 Tue Aug 20 15:23:14 2019
@@ -28,10 +28,10 @@ import org.apache.jackrabbit.oak.api.Pro
 import org.apache.jackrabbit.oak.api.Tree;
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.plugins.memory.PropertyStates;
+import org.apache.jackrabbit.oak.plugins.tree.TreeUtil;
 import org.apache.jackrabbit.oak.spi.nodetype.NodeTypeConstants;
 import org.apache.jackrabbit.oak.plugins.tree.TreeLocation;
 import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants;
-import org.apache.jackrabbit.oak.util.NodeUtil;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -56,9 +56,9 @@ public class CugContextTest extends Abst
         super.before();
 
         // add more child nodes
-        NodeUtil n = new NodeUtil(root.getTree(SUPPORTED_PATH));
-        n.addChild("a", NT_OAK_UNSTRUCTURED).addChild("b", 
NT_OAK_UNSTRUCTURED).addChild("c", NT_OAK_UNSTRUCTURED);
-        n.addChild("aa", NT_OAK_UNSTRUCTURED).addChild("bb", 
NT_OAK_UNSTRUCTURED).addChild("cc", NT_OAK_UNSTRUCTURED);
+        Tree n = root.getTree(SUPPORTED_PATH);
+        createTrees(n, NT_OAK_UNSTRUCTURED, "a", "b", "c");
+        createTrees(n, NT_OAK_UNSTRUCTURED, "aa", "bb", "cc");
 
         // create cugs
         createCug("/content/a", getTestUser().getPrincipal());
@@ -141,7 +141,7 @@ public class CugContextTest extends Abst
         PropertyState ps = 
PropertyStates.createProperty(CugConstants.REP_PRINCIPAL_NAMES, 
ImmutableSet.of(getTestUser().getPrincipal().getName()), Type.STRINGS);
 
         // cug at unsupported path -> context doesn't take supported paths 
into account.
-        Tree invalidCug = new 
NodeUtil(root.getTree(UNSUPPORTED_PATH)).addChild(CugConstants.REP_CUG_POLICY, 
CugConstants.NT_REP_CUG_POLICY).getTree();
+        Tree invalidCug = TreeUtil.addChild(root.getTree(UNSUPPORTED_PATH), 
CugConstants.REP_CUG_POLICY, CugConstants.NT_REP_CUG_POLICY);
         invalidCug.setProperty(ps);
 
         assertTrue(CugContext.INSTANCE.definesContextRoot(invalidCug));
@@ -149,7 +149,7 @@ public class CugContextTest extends Abst
         assertTrue(CugContext.INSTANCE.definesProperty(invalidCug, 
invalidCug.getProperty(CugConstants.REP_PRINCIPAL_NAMES)));
 
         // 'cug' with wrong node type -> detected as no-cug by context
-        invalidCug = new 
NodeUtil(root.getTree(UNSUPPORTED_PATH)).addChild(CugConstants.REP_CUG_POLICY, 
NT_OAK_UNSTRUCTURED).getTree();
+        invalidCug = TreeUtil.addChild(root.getTree(UNSUPPORTED_PATH), 
CugConstants.REP_CUG_POLICY, NT_OAK_UNSTRUCTURED);
         invalidCug.setProperty(ps);
 
         assertFalse(CugContext.INSTANCE.definesContextRoot(invalidCug));

Modified: 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugEvaluationTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugEvaluationTest.java?rev=1865540&r1=1865539&r2=1865540&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugEvaluationTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugEvaluationTest.java
 Tue Aug 20 15:23:14 2019
@@ -30,6 +30,7 @@ import org.apache.jackrabbit.oak.api.Con
 import org.apache.jackrabbit.oak.api.Root;
 import org.apache.jackrabbit.oak.api.Tree;
 import org.apache.jackrabbit.oak.api.Type;
+import org.apache.jackrabbit.oak.plugins.tree.TreeUtil;
 import org.apache.jackrabbit.oak.spi.nodetype.NodeTypeConstants;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.AuthorizationConfiguration;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.accesscontrol.AccessControlConstants;
@@ -37,7 +38,6 @@ import org.apache.jackrabbit.oak.spi.sec
 import 
org.apache.jackrabbit.oak.spi.security.authorization.permission.Permissions;
 import org.apache.jackrabbit.oak.spi.security.principal.EveryonePrincipal;
 import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants;
-import org.apache.jackrabbit.oak.util.NodeUtil;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -165,8 +165,8 @@ public class CugEvaluationTest extends A
         List<String> readOnly = ImmutableList.of("/content", "/content/a/b/c");
         for (String p : readOnly) {
             try {
-                NodeUtil content = new NodeUtil(testRoot.getTree(p));
-                content.addChild("writeTest", NT_OAK_UNSTRUCTURED);
+                Tree content = testRoot.getTree(p);
+                TreeUtil.addChild(content, "writeTest", NT_OAK_UNSTRUCTURED);
                 testRoot.commit();
                 fail();
             } catch (CommitFailedException e) {
@@ -188,8 +188,8 @@ public class CugEvaluationTest extends A
 
             List<String> paths = ImmutableList.of("/content", 
"/content/a/b/c");
             for (String p : paths) {
-                NodeUtil content = new NodeUtil(r.getTree(p));
-                content.addChild("writeTest", NT_OAK_UNSTRUCTURED);
+                Tree content = r.getTree(p);
+                TreeUtil.addChild(content, "writeTest", NT_OAK_UNSTRUCTURED);
                 r.commit();
             }
         } finally {

Modified: 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugExcludeDefaultTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugExcludeDefaultTest.java?rev=1865540&r1=1865539&r2=1865540&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugExcludeDefaultTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugExcludeDefaultTest.java
 Tue Aug 20 15:23:14 2019
@@ -60,23 +60,13 @@ public class CugExcludeDefaultTest {
 
     @Test
     public void testAdminPrincipal() {
-        Set<Principal> principals = ImmutableSet.<Principal>of(new 
AdminPrincipal() {
-            @Override
-            public String getName() {
-                return "admin";
-            }
-        });
+        Set<Principal> principals = 
ImmutableSet.<Principal>of((AdminPrincipal) () -> "admin");
         assertTrue(exclude.isExcluded(principals));
     }
 
     @Test
     public void testSystemUserPrincipal() {
-        Set<Principal> principals = ImmutableSet.<Principal>of(new 
SystemUserPrincipal() {
-            @Override
-            public String getName() {
-                return "test";
-            }
-        });
+        Set<Principal> principals = 
ImmutableSet.<Principal>of((SystemUserPrincipal) () -> "test");
         assertTrue(exclude.isExcluded(principals));
     }
 
@@ -107,12 +97,7 @@ public class CugExcludeDefaultTest {
     public void testMixedPrincipals() {
         Set<Principal> principals = new HashSet<>();
         principals.add(new PrincipalImpl("test"));
-        principals.add(new SystemUserPrincipal() {
-            @Override
-            public String getName() {
-                return "test";
-            }
-        });
+        principals.add((SystemUserPrincipal) () -> "test");
 
         assertTrue(exclude.isExcluded(principals));
     }

Modified: 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugImportBaseTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugImportBaseTest.java?rev=1865540&r1=1865539&r2=1865540&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugImportBaseTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugImportBaseTest.java
 Tue Aug 20 15:23:14 2019
@@ -29,7 +29,6 @@ import javax.jcr.Value;
 import javax.jcr.nodetype.ConstraintViolationException;
 import javax.jcr.security.AccessControlException;
 
-import com.google.common.base.Function;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import org.apache.jackrabbit.api.JackrabbitRepository;
@@ -47,7 +46,6 @@ import org.apache.jackrabbit.oak.spi.sec
 import org.apache.jackrabbit.oak.spi.security.user.UserConstants;
 import org.apache.jackrabbit.oak.spi.xml.ProtectedItemImporter;
 import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -191,15 +189,11 @@ public abstract class CugImportBaseTest
 
     static void assertPrincipalNames(@NotNull Set<String> 
expectedPrincipalNames, @NotNull Value[] principalNames) {
         assertEquals(expectedPrincipalNames.size(), principalNames.length);
-        Set<String> result = 
ImmutableSet.copyOf(Iterables.transform(ImmutableSet.copyOf(principalNames), 
new Function<Value, String>() {
-            @Nullable
-            @Override
-            public String apply(@Nullable Value principalName) {
-                try {
-                    return (principalName == null) ? null : 
principalName.getString();
-                } catch (RepositoryException e) {
-                    throw new IllegalStateException(e);
-                }
+        Set<String> result = 
ImmutableSet.copyOf(Iterables.transform(ImmutableSet.copyOf(principalNames), 
principalName -> {
+            try {
+                return (principalName == null) ? null : 
principalName.getString();
+            } catch (RepositoryException e) {
+                throw new IllegalStateException(e);
             }
         }));
         assertEquals(expectedPrincipalNames, result);

Modified: 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugPermissionProviderTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugPermissionProviderTest.java?rev=1865540&r1=1865539&r2=1865540&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugPermissionProviderTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugPermissionProviderTest.java
 Tue Aug 20 15:23:14 2019
@@ -31,6 +31,13 @@ import com.google.common.collect.Iterabl
 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;
+import org.apache.jackrabbit.oak.commons.PathUtils;
+import org.apache.jackrabbit.oak.plugins.memory.PropertyStates;
+import org.apache.jackrabbit.oak.plugins.tree.ReadOnly;
+import org.apache.jackrabbit.oak.plugins.tree.TreeType;
+import org.apache.jackrabbit.oak.plugins.tree.TreeTypeAware;
+import org.apache.jackrabbit.oak.plugins.tree.TreeUtil;
 import org.apache.jackrabbit.oak.spi.nodetype.NodeTypeConstants;
 import org.apache.jackrabbit.oak.plugins.tree.TreeLocation;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.permission.PermissionProvider;
@@ -41,7 +48,7 @@ import org.apache.jackrabbit.oak.spi.sec
 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.spi.version.VersionConstants;
 import org.jetbrains.annotations.NotNull;
 import org.junit.Before;
 import org.junit.Test;
@@ -49,9 +56,13 @@ import org.junit.Test;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.withSettings;
 
 public class CugPermissionProviderTest extends AbstractCugTest implements 
NodeTypeConstants {
 
@@ -107,10 +118,10 @@ public class CugPermissionProviderTest e
         testGroupPrincipal = getTestGroupPrincipal();
 
         // add more child nodes
-        NodeUtil n = new NodeUtil(root.getTree(SUPPORTED_PATH));
-        n.addChild("a", NT_OAK_UNSTRUCTURED).addChild("b", 
NT_OAK_UNSTRUCTURED).addChild("c", NT_OAK_UNSTRUCTURED);
-        n.addChild("aa", NT_OAK_UNSTRUCTURED).addChild("bb", 
NT_OAK_UNSTRUCTURED).addChild("cc", NT_OAK_UNSTRUCTURED);
-        n.addChild("no", NT_OAK_UNSTRUCTURED).addChild("cug", 
NT_OAK_UNSTRUCTURED).addChild("in", NT_OAK_UNSTRUCTURED).addChild("subtree", 
NT_OAK_UNSTRUCTURED);
+        Tree n = root.getTree(SUPPORTED_PATH);
+        createTrees(n, NT_OAK_UNSTRUCTURED, "a", "b", "c");
+        createTrees(n, NT_OAK_UNSTRUCTURED, "aa", "bb", "cc");
+        createTrees(n, NT_OAK_UNSTRUCTURED, "no", "cug", "in", "subtree");
 
         createCug("/content/a", testGroupPrincipal);
         createCug("/content/a/b/c", EveryonePrincipal.getInstance());
@@ -235,6 +246,20 @@ public class CugPermissionProviderTest e
     }
 
     /**
+     * @see 
org.apache.jackrabbit.oak.spi.security.authorization.permission.AggregatedPermissionProvider#supportedPermissions(org.apache.jackrabbit.oak.api.Tree,
 org.apache.jackrabbit.oak.api.PropertyState, long)
+     */
+    @Test
+    public void testSupportedPermissionsByNonExistingVersionTree() {
+        Tree versionTree = mock(Tree.class, 
withSettings().extraInterfaces(TreeTypeAware.class, ReadOnly.class));
+        when(versionTree.exists()).thenReturn(false);
+        
when(versionTree.getPath()).thenReturn(VersionConstants.VERSION_STORE_PATH + 
"/some/version");
+        
when(versionTree.getProperty(JCR_PRIMARYTYPE)).thenReturn(PropertyStates.createProperty(JCR_PRIMARYTYPE,
 NT_VERSION, Type.NAME));
+        
when(((TreeTypeAware)versionTree).getType()).thenReturn(TreeType.VERSION);
+
+        assertEquals(Permissions.NO_PERMISSION, 
cugPermProvider.supportedPermissions(versionTree, null, Permissions.READ));
+    }
+
+    /**
      * @see 
org.apache.jackrabbit.oak.spi.security.authorization.permission.AggregatedPermissionProvider#supportedPermissions(org.apache.jackrabbit.oak.plugins.tree.TreeLocation,
 long)
      */
     @Test
@@ -269,6 +294,20 @@ public class CugPermissionProviderTest e
     }
 
     /**
+     * @see 
org.apache.jackrabbit.oak.spi.security.authorization.permission.AggregatedPermissionProvider#supportedPermissions(org.apache.jackrabbit.oak.plugins.tree.TreeLocation,
 long)
+     */
+    @Test
+    public void testSupportedPermissionsByNullLocation() {
+        Tree t = mock(Tree.class);
+        when(t.getPath()).thenReturn(PathUtils.ROOT_PATH);
+        when(t.exists()).thenReturn(false);
+
+        TreeLocation location = TreeLocation.create(t);
+        assertNull(location.getTree());
+        assertEquals(Permissions.NO_PERMISSION, 
cugPermProvider.supportedPermissions(location, Permissions.READ));
+    }
+
+    /**
      * @see 
org.apache.jackrabbit.oak.spi.security.authorization.permission.AggregatedPermissionProvider#supportedPermissions(org.apache.jackrabbit.oak.spi.security.authorization.permission.TreePermission,
 org.apache.jackrabbit.oak.api.PropertyState, long)
      */
     @Test
@@ -429,6 +468,24 @@ public class CugPermissionProviderTest e
         assertTrue(cugPermProvider.getPrivileges(null).isEmpty());
     }
 
+    /**
+     * @see 
PermissionProvider#getPrivileges(org.apache.jackrabbit.oak.api.Tree)
+     */
+    @Test
+    public void testGetPrivilegesWithInvalidCugTree() {
+        Tree invalidCug = mock(Tree.class);
+        
when(invalidCug.getProperty(JCR_PRIMARYTYPE)).thenReturn(PropertyStates.createProperty(JCR_PRIMARYTYPE,
 NT_OAK_UNSTRUCTURED, Type.NAME));
+
+        Tree t = mock(Tree.class, 
withSettings().extraInterfaces(TreeTypeAware.class, ReadOnly.class));
+        when(t.exists()).thenReturn(true);
+        when(t.getPath()).thenReturn(SUPPORTED_PATH);
+        when(((TreeTypeAware)t).getType()).thenReturn(TreeType.DEFAULT);
+        when(t.hasChild(REP_CUG_POLICY)).thenReturn(true);
+        when(t.getChild(REP_CUG_POLICY)).thenReturn(invalidCug);
+
+        assertTrue(cugPermProvider.getPrivileges(t).isEmpty());
+    }
+
     //------------------------------------------------------< hasPrivileges 
>---
     /**
      * @see 
PermissionProvider#hasPrivileges(org.apache.jackrabbit.oak.api.Tree, String...)
@@ -487,6 +544,20 @@ public class CugPermissionProviderTest e
         assertFalse(cugPermProvider.hasPrivileges(null, 
PrivilegeConstants.JCR_READ));
     }
 
+    /**
+     * @see 
PermissionProvider#hasPrivileges(org.apache.jackrabbit.oak.api.Tree, String...)
+     */
+    @Test
+    public void testHasPrivilegesNonExistingVersionTree() {
+        Tree versionTree = mock(Tree.class, 
withSettings().extraInterfaces(TreeTypeAware.class, ReadOnly.class));
+        when(versionTree.exists()).thenReturn(false);
+        
when(versionTree.getPath()).thenReturn(VersionConstants.VERSION_STORE_PATH + 
"/some/version");
+        
when(versionTree.getProperty(JCR_PRIMARYTYPE)).thenReturn(PropertyStates.createProperty(JCR_PRIMARYTYPE,
 NT_VERSION, Type.NAME));
+        
when(((TreeTypeAware)versionTree).getType()).thenReturn(TreeType.VERSION);
+
+        assertFalse(cugPermProvider.hasPrivileges(versionTree, 
PrivilegeConstants.JCR_READ));
+    }
+
     //--------------------------------------------< getRepositoryPermission 
>---
     /**
      * @see 
org.apache.jackrabbit.oak.spi.security.authorization.permission.PermissionProvider#getRepositoryPermission()
@@ -528,7 +599,7 @@ public class CugPermissionProviderTest e
 
         // false cug-policy node (wrong nt)
         Tree aaTree = root.getTree("/content/aa");
-        new NodeUtil(aaTree).addChild(CugConstants.REP_CUG_POLICY, 
NT_OAK_UNSTRUCTURED);
+        TreeUtil.addChild(aaTree, CugConstants.REP_CUG_POLICY, 
NT_OAK_UNSTRUCTURED);
         TreePermission aaTp2 = 
cugPermProvider.getTreePermission(root.getTree("/content/aa"), contentTp);
         assertTrue(aaTp2 instanceof CugTreePermission);
 
@@ -555,6 +626,16 @@ public class CugPermissionProviderTest e
         }
     }
 
+    @Test
+    public void testGetTreePermissionNonExistingVersionTree() {
+        Tree versionTree = mock(Tree.class);
+        when(versionTree.exists()).thenReturn(false);
+        
when(versionTree.getProperty(JCR_PRIMARYTYPE)).thenReturn(PropertyStates.createProperty(JCR_PRIMARYTYPE,
 NT_VERSION, Type.NAME));
+
+        TreePermission tp = cugPermProvider.getTreePermission(versionTree, 
TreeType.VERSION, mock(TreePermission.class));
+        assertSame(TreePermission.NO_RECOURSE, tp);
+    }
+
     //-------------------------------< isGranted(Tree, PropertyState, long) 
>---
     /**
      * @see PermissionProvider#isGranted(org.apache.jackrabbit.oak.api.Tree, 
org.apache.jackrabbit.oak.api.PropertyState, long)
@@ -625,4 +706,12 @@ public class CugPermissionProviderTest e
         assertFalse(cugPermProvider.isGranted(p, Session.ACTION_ADD_NODE));
         assertFalse(cugPermProvider.isGranted(p, Session.ACTION_READ + ',' + 
Session.ACTION_ADD_NODE));
     }
+
+    
//--------------------------------------------------------------------------
+    @Test
+    public void testIsAllowMissingPrincipalNames() {
+        Tree cugTree = root.getTree("/content/a").getChild(REP_CUG_POLICY);
+        cugTree.removeProperty(REP_PRINCIPAL_NAMES);
+        assertFalse(cugPermProvider.isAllow(cugTree));
+    }
 }

Modified: 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugPolicyImplTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugPolicyImplTest.java?rev=1865540&r1=1865539&r2=1865540&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugPolicyImplTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugPolicyImplTest.java
 Tue Aug 20 15:23:14 2019
@@ -80,7 +80,7 @@ public class CugPolicyImplTest extends A
     private Principal getExcludedPrincipal() {
         return (SystemUserPrincipal) () -> "excluded";
     }
-    
+
     @Test
     public void testPrincipalSetPolicy() {
         assertTrue(createCugPolicy(principals) instanceof PrincipalSetPolicy);
@@ -190,12 +190,7 @@ public class CugPolicyImplTest extends A
     @Test(expected = AccessControlException.class)
     public void testAddNullPrincipalName() throws Exception {
         CugPolicy cug = createEmptyCugPolicy(ImportBehavior.BESTEFFORT);
-        cug.addPrincipals(new Principal() {
-            @Override
-            public String getName() {
-                return null;
-            }
-        });
+        cug.addPrincipals((Principal) () -> null);
     }
 
     @Test

Modified: 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugTreePermissionTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugTreePermissionTest.java?rev=1865540&r1=1865539&r2=1865540&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugTreePermissionTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugTreePermissionTest.java
 Tue Aug 20 15:23:14 2019
@@ -23,11 +23,11 @@ import org.apache.jackrabbit.oak.api.Tre
 import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.apache.jackrabbit.oak.plugins.memory.PropertyStates;
 import org.apache.jackrabbit.oak.plugins.tree.TreeProvider;
+import org.apache.jackrabbit.oak.plugins.tree.TreeUtil;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.permission.Permissions;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.permission.TreePermission;
 import org.apache.jackrabbit.oak.spi.security.principal.EveryonePrincipal;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
-import org.apache.jackrabbit.oak.util.NodeUtil;
 import org.jetbrains.annotations.NotNull;
 import org.junit.Test;
 
@@ -138,9 +138,9 @@ public class CugTreePermissionTest exten
 
     @Test
     public void testIsInCugSupportedPathWithoutCug() throws Exception {
-        NodeUtil node = new NodeUtil(root.getTree(SUPPORTED_PATH2));
-        Tree c1 = node.addChild("c1", NT_OAK_UNSTRUCTURED).getTree();
-        Tree c2 = node.addChild("c2", NT_OAK_UNSTRUCTURED).getTree();
+        Tree node = root.getTree(SUPPORTED_PATH2);
+        Tree c1 = TreeUtil.addChild(node, "c1", NT_OAK_UNSTRUCTURED);
+        Tree c2 = TreeUtil.addChild(node, "c2", NT_OAK_UNSTRUCTURED);
 
         String cugPath = c2.getPath();
         createCug(cugPath, getTestGroupPrincipal());

Modified: 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugUtilTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugUtilTest.java?rev=1865540&r1=1865539&r2=1865540&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugUtilTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugUtilTest.java
 Tue Aug 20 15:23:14 2019
@@ -20,6 +20,7 @@ import java.util.Set;
 import com.google.common.collect.ImmutableSet;
 import org.apache.jackrabbit.oak.api.Tree;
 import org.apache.jackrabbit.oak.commons.PathUtils;
+import org.apache.jackrabbit.oak.plugins.tree.TreeUtil;
 import org.apache.jackrabbit.oak.spi.nodetype.NodeTypeConstants;
 import org.apache.jackrabbit.oak.spi.mount.MountInfoProvider;
 import org.apache.jackrabbit.oak.spi.mount.Mounts;
@@ -28,7 +29,6 @@ import org.apache.jackrabbit.oak.spi.sec
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.jackrabbit.oak.spi.xml.ImportBehavior;
-import org.apache.jackrabbit.oak.util.NodeUtil;
 import org.jetbrains.annotations.NotNull;
 import org.junit.Test;
 
@@ -71,8 +71,9 @@ public class CugUtilTest extends Abstrac
             assertFalse(CugUtil.hasCug(root.getTree(path)));
         }
 
-        new NodeUtil(root.getTree(SUPPORTED_PATH2)).addChild(REP_CUG_POLICY, 
NodeTypeConstants.NT_OAK_UNSTRUCTURED).getTree();
-        assertTrue(CugUtil.hasCug(root.getTree(SUPPORTED_PATH2)));
+        Tree t = root.getTree(SUPPORTED_PATH2);
+        TreeUtil.addChild(t, REP_CUG_POLICY, 
NodeTypeConstants.NT_OAK_UNSTRUCTURED);
+        assertTrue(CugUtil.hasCug(t));
     }
 
     @Test
@@ -85,7 +86,7 @@ public class CugUtilTest extends Abstrac
             assertFalse(CugUtil.hasCug(getNodeState(root.getTree(path))));
         }
 
-        new NodeUtil(root.getTree(SUPPORTED_PATH2)).addChild(REP_CUG_POLICY, 
NodeTypeConstants.NT_OAK_UNSTRUCTURED);
+        TreeUtil.addChild(root.getTree(SUPPORTED_PATH2), REP_CUG_POLICY, 
NodeTypeConstants.NT_OAK_UNSTRUCTURED);
         
assertTrue(CugUtil.hasCug(getNodeState(root.getTree(SUPPORTED_PATH2))));
     }
 
@@ -98,7 +99,7 @@ public class CugUtilTest extends Abstrac
             
assertFalse(CugUtil.hasCug(getNodeState(root.getTree(path)).builder()));
         }
 
-        new NodeUtil(root.getTree(SUPPORTED_PATH2)).addChild(REP_CUG_POLICY, 
NodeTypeConstants.NT_OAK_UNSTRUCTURED);
+        TreeUtil.addChild(root.getTree(SUPPORTED_PATH2), REP_CUG_POLICY, 
NodeTypeConstants.NT_OAK_UNSTRUCTURED);
         
assertTrue(CugUtil.hasCug(getNodeState(root.getTree(SUPPORTED_PATH2)).builder()));
     }
 
@@ -110,7 +111,7 @@ public class CugUtilTest extends Abstrac
             assertNull(CugUtil.getCug(root.getTree(path)));
         }
 
-        new NodeUtil(root.getTree(SUPPORTED_PATH2)).addChild(REP_CUG_POLICY, 
NodeTypeConstants.NT_OAK_UNSTRUCTURED);
+        TreeUtil.addChild(root.getTree(SUPPORTED_PATH2), REP_CUG_POLICY, 
NodeTypeConstants.NT_OAK_UNSTRUCTURED);
         assertNull(CugUtil.getCug(root.getTree(SUPPORTED_PATH2)));
     }
 
@@ -119,7 +120,7 @@ public class CugUtilTest extends Abstrac
         
assertFalse(CugUtil.definesCug(root.getTree(PathUtils.concat(INVALID_PATH, 
REP_CUG_POLICY))));
         
assertTrue(CugUtil.definesCug(root.getTree(PathUtils.concat(SUPPORTED_PATH, 
REP_CUG_POLICY))));
 
-        Tree invalid = new 
NodeUtil(root.getTree(SUPPORTED_PATH2)).addChild(REP_CUG_POLICY, 
NodeTypeConstants.NT_OAK_UNSTRUCTURED).getTree();
+        Tree invalid = TreeUtil.addChild(root.getTree(SUPPORTED_PATH2), 
REP_CUG_POLICY, NodeTypeConstants.NT_OAK_UNSTRUCTURED);
         assertFalse(CugUtil.definesCug(invalid));
     }
 

Modified: 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugValidatorTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugValidatorTest.java?rev=1865540&r1=1865539&r2=1865540&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugValidatorTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugValidatorTest.java
 Tue Aug 20 15:23:14 2019
@@ -16,42 +16,49 @@
  */
 package org.apache.jackrabbit.oak.spi.security.authorization.cug.impl;
 
-import javax.jcr.nodetype.NodeDefinitionTemplate;
-import javax.jcr.nodetype.NodeTypeTemplate;
-
+import com.google.common.collect.ImmutableList;
 import org.apache.jackrabbit.JcrConstants;
 import org.apache.jackrabbit.oak.api.CommitFailedException;
+import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Root;
 import org.apache.jackrabbit.oak.api.Tree;
-import org.apache.jackrabbit.oak.spi.nodetype.NodeTypeConstants;
+import org.apache.jackrabbit.oak.api.Type;
+import org.apache.jackrabbit.oak.plugins.memory.PropertyStates;
 import 
org.apache.jackrabbit.oak.plugins.nodetype.write.ReadWriteNodeTypeManager;
+import org.apache.jackrabbit.oak.plugins.tree.TreeUtil;
+import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
+import org.apache.jackrabbit.oak.spi.commit.Validator;
+import org.apache.jackrabbit.oak.spi.nodetype.NodeTypeConstants;
 import org.apache.jackrabbit.oak.spi.security.principal.EveryonePrincipal;
-import org.apache.jackrabbit.oak.util.NodeUtil;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
 import org.junit.Test;
 
+import javax.jcr.nodetype.NodeDefinitionTemplate;
+import javax.jcr.nodetype.NodeTypeTemplate;
+
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
+import static org.mockito.Mockito.mock;
 
 public class CugValidatorTest extends AbstractCugTest {
 
-    private NodeUtil node;
+    private Tree node;
 
     @Override
     public void before() throws Exception {
         super.before();
 
-        node = new NodeUtil(root.getTree(SUPPORTED_PATH));
+        node = root.getTree(SUPPORTED_PATH);
     }
 
     @Test
     public void testChangePrimaryType() {
-        node = new NodeUtil(root.getTree(SUPPORTED_PATH2));
+        node = root.getTree(SUPPORTED_PATH2);
         try {
-            node.setName(JcrConstants.JCR_PRIMARYTYPE, NT_REP_CUG_POLICY);
-            node.setStrings(REP_PRINCIPAL_NAMES, EveryonePrincipal.NAME);
+            node.setProperty(JcrConstants.JCR_PRIMARYTYPE, NT_REP_CUG_POLICY, 
Type.NAME);
+            node.setProperty(REP_PRINCIPAL_NAMES, 
ImmutableList.of(EveryonePrincipal.NAME), Type.STRINGS);
             root.commit();
             fail();
         } catch (CommitFailedException e) {
@@ -61,14 +68,57 @@ public class CugValidatorTest extends Ab
     }
 
     @Test
+    public void testPropertyChangedBeforeWasCug() throws Exception {
+        NodeState ns = mock(NodeState.class);
+        Validator validator = new CugValidatorProvider().getRootValidator(ns, 
ns, new CommitInfo("sid", "uid"));
+        try {
+            PropertyState before = 
PropertyStates.createProperty(JCR_PRIMARYTYPE, NT_REP_CUG_POLICY);
+            PropertyState after = 
PropertyStates.createProperty(JCR_PRIMARYTYPE, NT_OAK_UNSTRUCTURED);
+
+            validator.propertyChanged(before, after);
+            fail();
+        } catch (CommitFailedException e) {
+            assertTrue(e.isAccessControlViolation());
+            assertEquals(20, e.getCode());
+        }
+    }
+
+    @Test
+    public void testPropertyChangedAfterIsCug() throws Exception {
+        NodeState ns = mock(NodeState.class);
+        Validator validator = new CugValidatorProvider().getRootValidator(ns, 
ns, new CommitInfo("sid", "uid"));
+        try {
+            PropertyState before = 
PropertyStates.createProperty(JCR_PRIMARYTYPE, NT_OAK_UNSTRUCTURED);
+            PropertyState after = 
PropertyStates.createProperty(JCR_PRIMARYTYPE, NT_REP_CUG_POLICY);
+
+            validator.propertyChanged(before, after);
+            fail();
+        } catch (CommitFailedException e) {
+            assertTrue(e.isAccessControlViolation());
+            assertEquals(20, e.getCode());
+        }
+    }
+
+    @Test
+    public void testPropertyChangedNoCugInvolved() throws Exception {
+        NodeState ns = mock(NodeState.class);
+        Validator validator = new CugValidatorProvider().getRootValidator(ns, 
ns, new CommitInfo("sid", "uid"));
+
+        PropertyState before = PropertyStates.createProperty(JCR_PRIMARYTYPE, 
NT_OAK_UNSTRUCTURED);
+        PropertyState after = PropertyStates.createProperty(JCR_PRIMARYTYPE, 
NT_UNSTRUCTURED);
+
+        validator.propertyChanged(before, after);
+    }
+
+    @Test
     public void testChangePrimaryTypeOfCug() throws Exception {
-        node.setNames(JcrConstants.JCR_MIXINTYPES, MIX_REP_CUG_MIXIN);
-        NodeUtil cug = node.addChild(REP_CUG_POLICY, NT_REP_CUG_POLICY);
-        cug.setStrings(REP_PRINCIPAL_NAMES, EveryonePrincipal.NAME);
+        node.setProperty(JcrConstants.JCR_MIXINTYPES, 
ImmutableList.of(MIX_REP_CUG_MIXIN), Type.NAMES);
+        Tree cug = TreeUtil.addChild(node, REP_CUG_POLICY, NT_REP_CUG_POLICY);
+        cug.setProperty(REP_PRINCIPAL_NAMES, 
ImmutableList.of(EveryonePrincipal.NAME), Type.STRINGS);
         root.commit();
 
         try {
-            cug.setName(JcrConstants.JCR_PRIMARYTYPE, 
NodeTypeConstants.NT_OAK_UNSTRUCTURED);
+            cug.setProperty(JcrConstants.JCR_PRIMARYTYPE, 
NodeTypeConstants.NT_OAK_UNSTRUCTURED, Type.NAME);
             root.commit();
             fail();
         } catch (CommitFailedException e) {
@@ -79,8 +129,8 @@ public class CugValidatorTest extends Ab
 
     @Test
     public void testInvalidPrimaryType() throws Exception {
-        NodeUtil cug = node.addChild(REP_CUG_POLICY, 
NodeTypeConstants.NT_OAK_UNSTRUCTURED);
-        cug.setStrings(REP_PRINCIPAL_NAMES, EveryonePrincipal.NAME);
+        Tree cug = TreeUtil.addChild(node, REP_CUG_POLICY, 
NodeTypeConstants.NT_OAK_UNSTRUCTURED);
+        cug.setProperty(REP_PRINCIPAL_NAMES, 
ImmutableList.of(EveryonePrincipal.NAME), Type.STRINGS);
 
         try {
             root.commit();
@@ -95,8 +145,8 @@ public class CugValidatorTest extends Ab
 
     @Test
     public void testMissingMixin() throws Exception {
-        NodeUtil cug = node.addChild(REP_CUG_POLICY, NT_REP_CUG_POLICY);
-        cug.setStrings(REP_PRINCIPAL_NAMES, EveryonePrincipal.NAME);
+        Tree cug = TreeUtil.addChild(node, REP_CUG_POLICY, NT_REP_CUG_POLICY);
+        cug.setProperty(REP_PRINCIPAL_NAMES, 
ImmutableList.of(EveryonePrincipal.NAME), Type.STRINGS);
 
         try {
             root.commit();
@@ -111,9 +161,9 @@ public class CugValidatorTest extends Ab
 
     @Test
     public void testRemoveMixin() throws Exception {
-        node.setNames(JcrConstants.JCR_MIXINTYPES, MIX_REP_CUG_MIXIN);
-        NodeUtil cug = node.addChild(REP_CUG_POLICY, NT_REP_CUG_POLICY);
-        cug.setStrings(REP_PRINCIPAL_NAMES, EveryonePrincipal.NAME);
+        node.setProperty(JcrConstants.JCR_MIXINTYPES, 
ImmutableList.of(MIX_REP_CUG_MIXIN), Type.NAMES);
+        Tree cug = TreeUtil.addChild(node, REP_CUG_POLICY, NT_REP_CUG_POLICY);
+        cug.setProperty(REP_PRINCIPAL_NAMES, 
ImmutableList.of(EveryonePrincipal.NAME), Type.STRINGS);
         root.commit();
 
         try {
@@ -130,9 +180,9 @@ public class CugValidatorTest extends Ab
 
     @Test
     public void testCugPolicyWithDifferentName() throws Exception {
-        node.setNames(JcrConstants.JCR_MIXINTYPES, MIX_REP_CUG_MIXIN);
-        NodeUtil cug = node.addChild("anotherName", NT_REP_CUG_POLICY);
-        cug.setStrings(REP_PRINCIPAL_NAMES, EveryonePrincipal.NAME);
+        node.setProperty(JcrConstants.JCR_MIXINTYPES, 
ImmutableList.of(MIX_REP_CUG_MIXIN), Type.NAMES);
+        Tree cug = TreeUtil.addChild(node, "anotherName", NT_REP_CUG_POLICY);
+        cug.setProperty(REP_PRINCIPAL_NAMES, 
ImmutableList.of(EveryonePrincipal.NAME), Type.STRINGS);
         try {
             root.commit();
             fail();
@@ -167,4 +217,21 @@ public class CugValidatorTest extends Ab
         ntTemplate.getNodeDefinitionTemplates().add(ndt);
         ntMgr.registerNodeType(ntTemplate, true);
     }
+
+    @Test
+    public void testJcrNodeTypesOutsideOfSystemIsValidated() throws Exception {
+        Tree n = TreeUtil.addChild(node, JCR_NODE_TYPES, NT_OAK_UNSTRUCTURED);
+        Tree cug = TreeUtil.addChild(n, REP_CUG_POLICY, NT_REP_CUG_POLICY);
+        cug.setProperty(REP_PRINCIPAL_NAMES, 
ImmutableList.of(EveryonePrincipal.NAME), Type.STRINGS);
+
+        try {
+            root.commit();
+            fail();
+        }  catch (CommitFailedException e) {
+            assertTrue(e.isAccessControlViolation());
+            assertEquals(22, e.getCode());
+        } finally {
+            root.refresh();
+        }
+    }
 }

Modified: 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/NestedCugHookTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/NestedCugHookTest.java?rev=1865540&r1=1865539&r2=1865540&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/NestedCugHookTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/NestedCugHookTest.java
 Tue Aug 20 15:23:14 2019
@@ -16,28 +16,39 @@
  */
 package org.apache.jackrabbit.oak.spi.security.authorization.cug.impl;
 
-import java.util.Set;
-import javax.jcr.security.AccessControlManager;
-import javax.jcr.security.AccessControlPolicy;
-
 import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Root;
 import org.apache.jackrabbit.oak.api.Tree;
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.commons.PathUtils;
+import org.apache.jackrabbit.oak.plugins.memory.MemoryChildNodeEntry;
 import org.apache.jackrabbit.oak.plugins.tree.RootProvider;
 import org.apache.jackrabbit.oak.plugins.tree.TreeUtil;
+import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
 import org.apache.jackrabbit.oak.spi.security.authorization.cug.CugPolicy;
 import org.apache.jackrabbit.oak.spi.security.principal.EveryonePrincipal;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.jetbrains.annotations.NotNull;
 import org.junit.Test;
 
+import javax.jcr.security.AccessControlManager;
+import javax.jcr.security.AccessControlPolicy;
+import java.util.Collections;
+import java.util.Set;
+
+import static org.apache.jackrabbit.oak.commons.PathUtils.ROOT_PATH;
 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.apache.jackrabbit.oak.commons.PathUtils.ROOT_PATH;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 public class NestedCugHookTest extends AbstractCugTest {
 
@@ -371,4 +382,66 @@ public class NestedCugHookTest extends A
         assertNestedCugs(root, getRootProvider(), SUPPORTED_PATH3, true);
         assertNestedCugs(root, getRootProvider(), SUPPORTED_PATH2, true, 
destPath);
     }
+
+    @Test
+    public void testHiddenChildNodeAdded() throws Exception {
+        NestedCugHook nch = new NestedCugHook();
+
+        NodeState before = 
getTreeProvider().asNodeState(root.getTree(PathUtils.ROOT_PATH));
+        NodeState after = spy(before);
+
+        NodeState child = mock(NodeState.class);
+        Iterable newCnes = Collections.singleton(new 
MemoryChildNodeEntry(":hidden", child));
+        Iterable cnes = Iterables.concat(newCnes, 
before.getChildNodeEntries());
+        when(after.getChildNodeEntries()).thenReturn(cnes);
+        when(after.getChildNode(":hidden")).thenReturn(child);
+
+        nch.processCommit(before, after, new CommitInfo("sid", null));
+
+        verify(child, never()).getProperty(anyString());
+    }
+
+    @Test
+    public void testHiddenChildNodeChanged() {
+        NestedCugHook nch = new NestedCugHook();
+
+        NodeState nodeState = 
getTreeProvider().asNodeState(root.getTree(PathUtils.ROOT_PATH));
+        NodeState after = spy(nodeState);
+        NodeState before = spy(nodeState);
+
+        NodeState child = mock(NodeState.class);
+        Iterable hidden = Collections.singleton(new 
MemoryChildNodeEntry(":hidden", child));
+        Iterable cnes = Iterables.concat(hidden, 
nodeState.getChildNodeEntries());
+        when(before.getChildNodeEntries()).thenReturn(cnes);
+        when(before.getChildNode(":hidden")).thenReturn(child);
+
+        NodeState child2 = 
when(mock(NodeState.class).exists()).thenReturn(true).getMock();
+        hidden = Collections.singleton(new MemoryChildNodeEntry(":hidden", 
child2));
+        cnes = Iterables.concat(hidden, nodeState.getChildNodeEntries());
+        when(after.getChildNodeEntries()).thenReturn(cnes);
+        when(after.getChildNode(":hidden")).thenReturn(child2);
+
+        nch.processCommit(before, after, new CommitInfo("sid", null));
+
+        verify(child, never()).getProperty(anyString());
+        verify(child2, never()).getProperty(anyString());
+    }
+
+    @Test
+    public void testHiddenChildNodeDeleted() {
+        NestedCugHook nch = new NestedCugHook();
+
+        NodeState after = 
getTreeProvider().asNodeState(root.getTree(PathUtils.ROOT_PATH));
+        NodeState before = spy(after);
+
+        NodeState child = mock(NodeState.class);
+        Iterable deletedCnes = Collections.singleton(new 
MemoryChildNodeEntry(":hidden", child));
+        Iterable cnes = Iterables.concat(deletedCnes, 
after.getChildNodeEntries());
+        when(before.getChildNodeEntries()).thenReturn(cnes);
+        when(before.getChildNode(":hidden")).thenReturn(child);
+
+        nch.processCommit(before, after, new CommitInfo("sid", null));
+
+        verify(child, never()).getProperty(anyString());
+    }
 }


Reply via email to