Author: angela
Date: Tue May 28 14:30:57 2019
New Revision: 1860280

URL: http://svn.apache.org/viewvc?rev=1860280&view=rev
Log:
OAK-8362 : UserImporter: redundant check for null principals

Added:
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserImporterPasswordTreeTest.java
   (with props)
Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserImporter.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserImporterBaseTest.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserImporterTest.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserImporter.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserImporter.java?rev=1860280&r1=1860279&r2=1860280&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserImporter.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserImporter.java
 Tue May 28 14:30:57 2019
@@ -220,7 +220,6 @@ class UserImporter implements ProtectedP
     public boolean handlePropInfo(@NotNull Tree parent, @NotNull PropInfo 
propInfo, @NotNull PropertyDefinition def) throws RepositoryException {
         checkInitialized();
 
-        String propName = propInfo.getName();
         if (isPwdNode(parent)) {
             // overwrite any properties generated underneath the rep:pwd node
             // by "UserManagerImpl#setPassword" by the properties defined by
@@ -233,6 +232,7 @@ class UserImporter implements ProtectedP
                 return false;
             }
 
+            String propName = propInfo.getName();
             if (REP_AUTHORIZABLE_ID.equals(propName)) {
                 if (!isValid(def, NT_REP_AUTHORIZABLE, false)) {
                     return false;
@@ -262,13 +262,10 @@ class UserImporter implements ProtectedP
                 userManager.checkValidPrincipal(principal, a.isGroup());
                 userManager.setPrincipal(parent, principal);
 
-            /*
-             Remember principal of new user/group for further processing
-             of impersonators
-             */
-                if (principals == null) {
-                    principals = new HashMap<>();
-                }
+                /*
+                 Remember principal of new user/group for further processing
+                 of impersonators
+                 */
                 principals.put(principalName, a.getPrincipal());
 
                 return true;

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserImporterBaseTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserImporterBaseTest.java?rev=1860280&r1=1860279&r2=1860280&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserImporterBaseTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserImporterBaseTest.java
 Tue May 28 14:30:57 2019
@@ -54,6 +54,7 @@ import org.apache.jackrabbit.oak.spi.xml
 import org.apache.jackrabbit.oak.spi.xml.TextValue;
 import org.apache.jackrabbit.oak.util.NodeUtil;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 import org.mockito.Mockito;
 
 import static org.junit.Assert.assertEquals;
@@ -135,6 +136,7 @@ public abstract class UserImporterBaseTe
         return importer.init(mockJackrabbitSession(), root, 
getNamePathMapper(), isWorkspaceImport(), 
ImportUUIDBehavior.IMPORT_UUID_COLLISION_REMOVE_EXISTING, refTracker, 
getSecurityProvider());
     }
 
+    @NotNull
     Tree createUserTree() {
         Tree folder = 
root.getTree(getUserConfiguration().getParameters().getConfigValue(PARAM_USER_PATH,
 DEFAULT_USER_PATH));
         Tree userTree = folder.addChild("userTree");
@@ -143,6 +145,7 @@ public abstract class UserImporterBaseTe
         return userTree;
     }
 
+    @NotNull
     Tree createSystemUserTree() {
         Tree folder = 
root.getTree(getUserConfiguration().getParameters().getConfigValue(PARAM_USER_PATH,
 DEFAULT_USER_PATH));
         Tree userTree = folder.addChild("systemUserTree");
@@ -151,6 +154,7 @@ public abstract class UserImporterBaseTe
         return userTree;
     }
 
+    @NotNull
     Tree createGroupTree() throws Exception {
         String groupPath = 
getUserConfiguration().getParameters().getConfigValue(PARAM_GROUP_PATH, 
DEFAULT_GROUP_PATH);
 
@@ -162,7 +166,8 @@ public abstract class UserImporterBaseTe
         return groupTree;
     }
 
-    PropInfo createPropInfo(@NotNull String name, final String... values) {
+    @NotNull
+    PropInfo createPropInfo(@Nullable String name, final String... values) {
         List<TextValue> txtValues = Lists.newArrayList();
         for (final String v : values) {
             txtValues.add(new TextValue() {
@@ -185,6 +190,7 @@ public abstract class UserImporterBaseTe
         return new PropInfo(name, PropertyType.STRING, txtValues);
     }
 
+    @NotNull
     PropertyDefinition mockPropertyDefinition(@NotNull String declaringNt, 
boolean mv) throws Exception {
         PropertyDefinition def = Mockito.mock(PropertyDefinition.class);
         when(def.isMultiple()).thenReturn(mv);
@@ -192,6 +198,7 @@ public abstract class UserImporterBaseTe
         return def;
     }
 
+    @NotNull
     NodeInfo createNodeInfo(@NotNull String name, @NotNull String 
primaryTypeName) {
         return new NodeInfo(name, primaryTypeName, ImmutableList.<String>of(), 
null);
     }

Added: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserImporterPasswordTreeTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserImporterPasswordTreeTest.java?rev=1860280&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserImporterPasswordTreeTest.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserImporterPasswordTreeTest.java
 Tue May 28 14:30:57 2019
@@ -0,0 +1,139 @@
+/*
+ * 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.user;
+
+import org.apache.jackrabbit.oak.api.PropertyState;
+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.xml.PropInfo;
+import org.junit.Test;
+
+import javax.jcr.PropertyType;
+import javax.jcr.nodetype.PropertyDefinition;
+
+import static org.apache.jackrabbit.JcrConstants.JCR_PRIMARYTYPE;
+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.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+public class UserImporterPasswordTreeTest extends UserImporterBaseTest {
+
+    private Tree userTree;
+    private Tree pwTree;
+
+    @Override
+    public void before() throws Exception {
+        super.before();
+
+        init();
+        userTree = createUserTree();
+        pwTree = TreeUtil.addChild(userTree, REP_PWD, NT_REP_PASSWORD);
+    }
+
+    @Test
+    public void testNotRepPassword() throws Exception {
+        pwTree.setProperty(JCR_PRIMARYTYPE, 
NodeTypeConstants.NT_OAK_UNSTRUCTURED, Type.NAME);
+
+        PropInfo propInfo = mock(PropInfo.class);
+        PropertyDefinition propDef = mock(PropertyDefinition.class);
+        assertFalse(importer.handlePropInfo(pwTree, propInfo, propDef));
+
+        verify(propInfo, never()).getName();
+        verify(propDef, never()).getRequiredType();
+    }
+
+    @Test
+    public void testInvalidPropName() throws Exception {
+        PropInfo propInfo = createPropInfo(null, "value");
+        PropertyDefinition propDef = 
when(mock(PropertyDefinition.class).getName()).thenReturn(null).getMock();
+        assertFalse(importer.handlePropInfo(pwTree, propInfo, propDef));
+    }
+
+    @Test
+    public void testInvalidPropName2() throws Exception {
+        PropInfo propInfo = createPropInfo(null, "value");
+        PropertyDefinition propDef = 
when(mock(PropertyDefinition.class).getName()).thenReturn(NodeTypeConstants.RESIDUAL_NAME).getMock();
+        assertFalse(importer.handlePropInfo(pwTree, propInfo, propDef));
+    }
+
+    @Test
+    public void testLastModifiedUndefinedRequiredType() throws Exception {
+        PropInfo propInfo = createPropInfo(REP_PASSWORD_LAST_MODIFIED, 
"23000");
+        PropertyDefinition propDef = 
when(mock(PropertyDefinition.class).getRequiredType()).thenReturn(PropertyType.UNDEFINED).getMock();
+        when(propDef.isMultiple()).thenReturn(false);
+
+        assertTrue(importer.handlePropInfo(pwTree, propInfo, propDef));
+
+        PropertyState ps = pwTree.getProperty(REP_PASSWORD_LAST_MODIFIED);
+        assertNotNull(ps);
+        assertSame(Type.LONG, ps.getType());
+        assertEquals(23000, ps.getValue(Type.LONG).longValue());
+        assertFalse(ps.isArray());
+    }
+
+    @Test
+    public void testLastModifiedWithRequiredType() throws Exception {
+        PropInfo propInfo = createPropInfo(REP_PASSWORD_LAST_MODIFIED, 
"23000");
+        PropertyDefinition propDef = 
when(mock(PropertyDefinition.class).getRequiredType()).thenReturn(PropertyType.LONG).getMock();
+        when(propDef.isMultiple()).thenReturn(true);
+
+        assertTrue(importer.handlePropInfo(pwTree, propInfo, propDef));
+
+        PropertyState ps = pwTree.getProperty(REP_PASSWORD_LAST_MODIFIED);
+        assertNotNull(ps);
+        assertSame(Type.LONGS, ps.getType());
+        assertEquals(1, ps.count());
+        assertEquals(23000, ps.getValue(Type.LONG, 0).longValue());
+    }
+
+    @Test
+    public void testAnyPropNameUndefinedRequiredType() throws Exception {
+        PropInfo propInfo = createPropInfo("any", "value");
+        PropertyDefinition propDef = 
when(mock(PropertyDefinition.class).getRequiredType()).thenReturn(PropertyType.UNDEFINED).getMock();
+        when(propDef.isMultiple()).thenReturn(true);
+
+        assertTrue(importer.handlePropInfo(pwTree, propInfo, propDef));
+
+        PropertyState ps = pwTree.getProperty("any");
+        assertNotNull(ps);
+        assertSame(Type.STRINGS, ps.getType());
+        assertTrue(ps.isArray());
+        assertEquals("value", ps.getValue(Type.STRING, 0));
+    }
+
+    @Test
+    public void testAnyPropNameWithRequiredType() throws Exception {
+        PropInfo propInfo = createPropInfo("any", "true");
+        PropertyDefinition propDef = 
when(mock(PropertyDefinition.class).getRequiredType()).thenReturn(PropertyType.BOOLEAN).getMock();
+        when(propDef.isMultiple()).thenReturn(false);
+
+        assertTrue(importer.handlePropInfo(pwTree, propInfo, propDef));
+
+        PropertyState ps = pwTree.getProperty("any");
+        assertNotNull(ps);
+        assertSame(Type.BOOLEAN, ps.getType());
+        assertTrue(ps.getValue(Type.BOOLEAN));
+    }
+}
\ No newline at end of file

Propchange: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserImporterPasswordTreeTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserImporterTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserImporterTest.java?rev=1860280&r1=1860279&r2=1860280&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserImporterTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserImporterTest.java
 Tue May 28 14:30:57 2019
@@ -23,12 +23,15 @@ import javax.jcr.nodetype.ConstraintViol
 import javax.jcr.nodetype.PropertyDefinition;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterators;
 import org.apache.jackrabbit.JcrConstants;
+import org.apache.jackrabbit.api.JackrabbitSession;
 import org.apache.jackrabbit.api.security.user.AuthorizableExistsException;
 import org.apache.jackrabbit.oak.api.PropertyState;
 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;
 import org.apache.jackrabbit.oak.spi.security.principal.EveryonePrincipal;
 import org.apache.jackrabbit.oak.spi.security.user.UserConstants;
@@ -38,18 +41,36 @@ import org.apache.jackrabbit.oak.spi.xml
 import org.junit.Test;
 import org.mockito.Mockito;
 
+import java.lang.reflect.Field;
+import java.util.Collections;
+import java.util.Map;
+
+import static 
org.apache.jackrabbit.oak.spi.nodetype.NodeTypeConstants.NT_OAK_UNSTRUCTURED;
 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.assertTrue;
+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.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 public class UserImporterTest extends UserImporterBaseTest implements 
UserConstants {
 
     //---------------------------------------------------------------< init 
>---
     @Test
-    public void testInitNoJackrabbitSession() throws Exception {
-        Session s = Mockito.mock(Session.class);
+    public void testInitNoJackrabbitSession() {
+        Session s = mock(Session.class);
+        assertFalse(importer.init(s, root, getNamePathMapper(), false, 
ImportUUIDBehavior.IMPORT_UUID_COLLISION_THROW, new ReferenceChangeTracker(), 
getSecurityProvider()));
+    }
+
+    @Test
+    public void testInitGetUserManagerFails() throws Exception {
+        Session s = 
when(mock(JackrabbitSession.class).getUserManager()).thenThrow(new 
RepositoryException()).getMock();
         assertFalse(importer.init(s, root, getNamePathMapper(), false, 
ImportUUIDBehavior.IMPORT_UUID_COLLISION_THROW, new ReferenceChangeTracker(), 
getSecurityProvider()));
     }
 
@@ -64,7 +85,6 @@ public class UserImporterTest extends Us
         assertTrue(importer.init(mockJackrabbitSession(), root, 
getNamePathMapper(), isWorkspaceImport(), 
ImportUUIDBehavior.IMPORT_UUID_COLLISION_REMOVE_EXISTING, new 
ReferenceChangeTracker(), getSecurityProvider()));
     }
 
-
     @Test
     public void testInitImportUUIDBehaviorReplace() throws Exception {
         assertTrue(importer.init(mockJackrabbitSession(), root, 
getNamePathMapper(), isWorkspaceImport(), 
ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING, new 
ReferenceChangeTracker(), getSecurityProvider()));
@@ -82,7 +102,7 @@ public class UserImporterTest extends Us
 
     @Test(expected = IllegalStateException.class)
     public void testHandlePropInfoNotInitialized() throws Exception {
-        importer.handlePropInfo(createUserTree(), 
Mockito.mock(PropInfo.class), Mockito.mock(PropertyDefinition.class));
+        importer.handlePropInfo(createUserTree(), mock(PropInfo.class), 
mock(PropertyDefinition.class));
     }
 
     //-----------------------------------------------------< handlePropInfo 
>---
@@ -90,7 +110,7 @@ public class UserImporterTest extends Us
     @Test
     public void testHandlePropInfoParentNotAuthorizable() throws Exception {
         init();
-        assertFalse(importer.handlePropInfo(root.getTree("/"), 
Mockito.mock(PropInfo.class), Mockito.mock(PropertyDefinition.class)));
+        assertFalse(importer.handlePropInfo(root.getTree(PathUtils.ROOT_PATH), 
mock(PropInfo.class), mock(PropertyDefinition.class)));
     }
 
     @Test
@@ -327,7 +347,7 @@ public class UserImporterTest extends Us
     public void testHandleUnknownProperty() throws Exception {
         init();
         Tree userTree = createUserTree();
-        assertFalse(importer.handlePropInfo(userTree, 
createPropInfo("unknownProperty", "value"), 
mockPropertyDefinition(NodeTypeConstants.NT_OAK_UNSTRUCTURED, false)));
+        assertFalse(importer.handlePropInfo(userTree, 
createPropInfo("unknownProperty", "value"), 
mockPropertyDefinition(NT_OAK_UNSTRUCTURED, false)));
         assertNull(userTree.getProperty("unknownProperty"));
     }
 
@@ -338,9 +358,41 @@ public class UserImporterTest extends Us
         importer.processReferences();
     }
 
+    @Test
+    public void testProcessReferencesUnknownReferenceObject() throws Exception 
{
+        init();
+        Map unknownReferenceObj = Collections.EMPTY_MAP;
+        refTracker.processedReference(unknownReferenceObj);
+
+        importer.processReferences();
+        assertTrue(Iterators.contains(refTracker.getProcessedReferences(), 
unknownReferenceObj));
+    }
+
     //------------------------------------------------< propertiesCompleted 
>---
 
     @Test
+    public void testPropertiesCompletedNonExistingTree() throws Exception {
+        init();
+
+        Tree nonExisting = 
when(mock(Tree.class).exists()).thenReturn(false).getMock();
+        importer.propertiesCompleted(nonExisting);
+
+        verify(nonExisting, times(2)).exists();
+        verify(nonExisting, never()).getProperty(anyString());
+    }
+
+    @Test
+    public void testPropertiesCompletedInvalidCacheTree() throws Exception {
+        init();
+
+        Tree userTree = createUserTree();
+        Tree cacheTree = TreeUtil.addChild(userTree, CacheConstants.REP_CACHE, 
NT_OAK_UNSTRUCTURED);
+
+        importer.propertiesCompleted(cacheTree);
+        assertTrue(cacheTree.exists());
+    }
+
+    @Test
     public void testPropertiesCompletedClearsCache() throws Exception {
         Tree userTree = createUserTree();
         Tree cacheTree = userTree.addChild(CacheConstants.REP_CACHE);
@@ -480,17 +532,33 @@ public class UserImporterTest extends Us
     }
 
     @Test
-    public void testStartRepMembersBelowAnyTree() throws Exception {
+    public void testStartRepMembersBelowRootTree() throws Exception {
         init(true);
-        Tree repMembers = 
root.getTree(PathUtils.ROOT_PATH).addChild("memberTree");
-        repMembers.setProperty(JcrConstants.JCR_PRIMARYTYPE, NT_REP_MEMBERS);
+        Tree repMembers = TreeUtil.addChild(root.getTree(PathUtils.ROOT_PATH), 
"memberTree", NT_REP_MEMBERS);
+        repMembers = TreeUtil.addChild(repMembers, "memberTree", 
NT_REP_MEMBERS);
+        repMembers = TreeUtil.addChild(repMembers, "memberTree", 
NT_REP_MEMBERS);
 
-        repMembers = repMembers.addChild("memberTree");
-        repMembers.setProperty(JcrConstants.JCR_PRIMARYTYPE, NT_REP_MEMBERS);
+        assertFalse(importer.start(repMembers));
+    }
+
+    @Test
+    public void testStartRepMembersBelowAnyTree() throws Exception {
+        init(true);
+        Tree anyTree = TreeUtil.addChild(root.getTree(PathUtils.ROOT_PATH), 
"anyTree", NT_OAK_UNSTRUCTURED);
+        Tree repMembers = TreeUtil.addChild(anyTree, "memberTree", 
NT_REP_MEMBERS);
+        repMembers = TreeUtil.addChild(repMembers, "memberTree", 
NT_REP_MEMBERS);
 
         assertFalse(importer.start(repMembers));
     }
 
+    @Test
+    public void testStartNonExistingTree() throws Exception {
+        init();
+
+        Tree tree = 
when(mock(Tree.class).exists()).thenReturn(false).getMock();
+        assertFalse(importer.start(tree));
+    }
+
     //-----------------------------------------------------< startChildInfo 
>---
 
     @Test(expected = IllegalStateException.class)
@@ -531,6 +599,22 @@ public class UserImporterTest extends Us
     }
 
     @Test
+    public void testStartChildInfoWithOtherProperty() throws Exception {
+        init(true);
+        Tree groupTree = createGroupTree();
+        Tree memberRefList = groupTree.addChild(REP_MEMBERS_LIST);
+        memberRefList.setProperty(JcrConstants.JCR_PRIMARYTYPE, 
NT_REP_MEMBER_REFERENCES_LIST);
+
+        importer.start(memberRefList);
+        importer.startChildInfo(createNodeInfo("memberRef", 
NT_REP_MEMBER_REFERENCES), ImmutableList.of(createPropInfo("otherName", 
"member1")));
+        importer.processReferences();
+
+        // no members should have been added to the group node
+        assertFalse(groupTree.hasProperty(REP_MEMBERS));
+        assertFalse(memberRefList.getChildren().iterator().hasNext());
+    }
+
+    @Test
     public void testStartRepMembersChildInfo() throws Exception {
         init(true);
         Tree groupTree = createGroupTree();
@@ -549,6 +633,30 @@ public class UserImporterTest extends Us
         memberRefList.setProperty(JcrConstants.JCR_PRIMARYTYPE, 
NT_REP_MEMBER_REFERENCES_LIST);
 
         importer.start(memberRefList);
-        importer.startChildInfo(createNodeInfo("memberRef", 
NodeTypeConstants.NT_OAK_UNSTRUCTURED), 
ImmutableList.of(createPropInfo(REP_MEMBERS, "member1")));
+        importer.startChildInfo(createNodeInfo("memberRef", 
NT_OAK_UNSTRUCTURED), ImmutableList.of(createPropInfo(REP_MEMBERS, "member1")));
+    }
+
+    //-------------------------------------------------------< endChildInfo 
>---
+    @Test
+    public void testEndChildInfoIsNoop() {
+        importer.endChildInfo();
+    }
+
+    //----------------------------------------------------------------< end 
>---
+    @Test
+    public void testEnd() throws Exception {
+        init();
+        Tree groupTree = createGroupTree();
+        Tree memberRefList = groupTree.addChild(REP_MEMBERS_LIST);
+        memberRefList.setProperty(JcrConstants.JCR_PRIMARYTYPE, 
NT_REP_MEMBER_REFERENCES_LIST);
+        importer.start(memberRefList);
+
+        Field f = UserImporter.class.getDeclaredField("currentMembership");
+        f.setAccessible(true);
+        assertNotNull(f.get(importer));
+
+        importer.end(memberRefList);
+        assertNull(f.get(importer));
     }
+
 }
\ No newline at end of file


Reply via email to