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