blob: 7d3a54e3903a0126d28c11b2fe32cbf979ca0b03 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jackrabbit.oak.security.user;
import org.apache.jackrabbit.guava.common.collect.ImmutableList;
import org.apache.jackrabbit.guava.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.api.security.user.Group;
import org.apache.jackrabbit.api.security.user.User;
import org.apache.jackrabbit.api.security.user.UserManager;
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.namepath.NamePathMapper;
import org.apache.jackrabbit.oak.plugins.tree.TreeUtil;
import org.apache.jackrabbit.oak.security.user.autosave.AutoSaveEnabledManager;
import org.apache.jackrabbit.oak.spi.nodetype.NodeTypeConstants;
import org.apache.jackrabbit.oak.spi.security.SecurityProvider;
import org.apache.jackrabbit.oak.spi.security.principal.EveryonePrincipal;
import org.apache.jackrabbit.oak.spi.security.user.UserConfiguration;
import org.apache.jackrabbit.oak.spi.security.user.UserConstants;
import org.apache.jackrabbit.oak.spi.security.user.action.AuthorizableAction;
import org.apache.jackrabbit.oak.spi.security.user.util.PasswordUtil;
import org.apache.jackrabbit.oak.spi.xml.PropInfo;
import org.apache.jackrabbit.oak.spi.xml.ReferenceChangeTracker;
import org.junit.Test;
import javax.jcr.ImportUUIDBehavior;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.nodetype.ConstraintViolationException;
import javax.jcr.nodetype.PropertyDefinition;
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.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.nullable;
import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.when;
public class UserImporterTest extends UserImporterBaseTest implements UserConstants {
//---------------------------------------------------------------< init >---
@Test
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()));
}
@Test
public void testInitAutosaveEnabledUserManager() throws Exception {
UserManager umgr = new AutoSaveEnabledManager(getUserManager(root), root);
SecurityProvider sp = mock(SecurityProvider.class);
UserConfiguration uc = when(mock(UserConfiguration.class).getUserManager(root, getNamePathMapper())).thenReturn(umgr).getMock();
when(sp.getConfiguration(UserConfiguration.class)).thenReturn(uc);
assertEquals(!isAutosave(), importer.init(mockJackrabbitSession(), root, getNamePathMapper(), false, ImportUUIDBehavior.IMPORT_UUID_COLLISION_REMOVE_EXISTING, new ReferenceChangeTracker(), sp));
}
@Test
public void testInitInvalidUserManager() throws Exception {
UserManager umgr = mock(UserManager.class);
SecurityProvider sp = mock(SecurityProvider.class);
UserConfiguration uc = when(mock(UserConfiguration.class).getUserManager(root, getNamePathMapper())).thenReturn(umgr).getMock();
when(sp.getConfiguration(UserConfiguration.class)).thenReturn(uc);
assertFalse(importer.init(mockJackrabbitSession(), root, getNamePathMapper(), false, ImportUUIDBehavior.IMPORT_UUID_COLLISION_REMOVE_EXISTING, new ReferenceChangeTracker(), sp));
}
@Test(expected = IllegalStateException.class)
public void testInitAlreadyInitialized() throws Exception {
assertTrue(init());
importer.init(mockJackrabbitSession(), root, getNamePathMapper(), isWorkspaceImport(), ImportUUIDBehavior.IMPORT_UUID_COLLISION_REMOVE_EXISTING, new ReferenceChangeTracker(), getSecurityProvider());
}
@Test
public void testInitImportUUIDBehaviorRemove() throws Exception {
assertEquals(!isAutosave(), importer.init(mockJackrabbitSession(), root, getNamePathMapper(), isWorkspaceImport(), ImportUUIDBehavior.IMPORT_UUID_COLLISION_REMOVE_EXISTING, new ReferenceChangeTracker(), getSecurityProvider()));
}
@Test
public void testInitImportUUIDBehaviorReplace() throws Exception {
assertEquals(!isAutosave(), importer.init(mockJackrabbitSession(), root, getNamePathMapper(), isWorkspaceImport(), ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING, new ReferenceChangeTracker(), getSecurityProvider()));
}
@Test
public void testInitImportUUIDBehaviorThrow() throws Exception {
assertEquals(!isAutosave(), importer.init(mockJackrabbitSession(), root, getNamePathMapper(), isWorkspaceImport(), ImportUUIDBehavior.IMPORT_UUID_COLLISION_THROW, new ReferenceChangeTracker(), getSecurityProvider()));
}
@Test
public void testInitImportUUIDBehaviourCreateNew() throws Exception {
assertFalse(importer.init(mockJackrabbitSession(), root, getNamePathMapper(), isWorkspaceImport(), ImportUUIDBehavior.IMPORT_UUID_CREATE_NEW, new ReferenceChangeTracker(), getSecurityProvider()));
}
//-----------------------------------------------------< handlePropInfo >---
@Test(expected = IllegalStateException.class)
public void testHandlePropInfoNotInitialized() throws Exception {
importer.handlePropInfo(createUserTree(), mock(PropInfo.class), mock(PropertyDefinition.class));
}
@Test
public void testHandlePropInfoParentNotAuthorizable() throws Exception {
assertTrue(init());
assertFalse(importer.handlePropInfo(root.getTree(PathUtils.ROOT_PATH), mock(PropInfo.class), mock(PropertyDefinition.class)));
}
@Test
public void testHandleAuthorizableId() throws Exception {
init();
Tree userTree = createUserTree();
assertTrue(importer.handlePropInfo(userTree, createPropInfo(REP_AUTHORIZABLE_ID, TEST_USER_ID), mockPropertyDefinition(NT_REP_AUTHORIZABLE, false)));
assertEquals(TEST_USER_ID, userTree.getProperty(REP_AUTHORIZABLE_ID).getValue(Type.STRING));
assertEquals(userTree.getPath(), getUserManager(root).getAuthorizable(TEST_USER_ID).getPath());
}
@Test(expected = ConstraintViolationException.class)
public void testHandleAuthorizableIdMismatch() throws Exception {
assertTrue(init());
Tree userTree = createUserTree();
importer.handlePropInfo(userTree, createPropInfo(REP_AUTHORIZABLE_ID, "mismatch"), mockPropertyDefinition(NT_REP_AUTHORIZABLE, false));
}
@Test(expected = AuthorizableExistsException.class)
public void testHandleAuthorizableIdConflictExisting() throws Exception {
assertTrue(init());
Tree userTree = createUserTree();
importer.handlePropInfo(userTree, createPropInfo(REP_AUTHORIZABLE_ID, testUser.getID()), mockPropertyDefinition(NT_REP_AUTHORIZABLE, false));
}
@Test
public void testHandleAuthorizableIdMvPropertyDef() throws Exception {
init();
Tree userTree = createUserTree();
assertFalse(importer.handlePropInfo(userTree, createPropInfo(REP_AUTHORIZABLE_ID, TEST_USER_ID), mockPropertyDefinition(NT_REP_AUTHORIZABLE, true)));
assertNull(userTree.getProperty(REP_AUTHORIZABLE_ID));
}
@Test
public void testHandleAuthorizableIdOtherDeclNtDef() throws Exception {
init();
Tree userTree = createUserTree();
assertFalse(importer.handlePropInfo(userTree, createPropInfo(REP_AUTHORIZABLE_ID, TEST_USER_ID), mockPropertyDefinition(NT_REP_AUTHORIZABLE_FOLDER, false)));
assertNull(userTree.getProperty(REP_AUTHORIZABLE_ID));
}
@Test
public void testHandleAuthorizableIdDeclNtDefSubtype() throws Exception {
init();
Tree userTree = createUserTree();
assertTrue(importer.handlePropInfo(userTree, createPropInfo(REP_AUTHORIZABLE_ID, TEST_USER_ID), mockPropertyDefinition(NT_REP_USER, false)));
}
@Test
public void testHandlePrincipalName() throws Exception {
init();
Tree userTree = createUserTree();
assertTrue(importer.handlePropInfo(userTree, createPropInfo(REP_PRINCIPAL_NAME, "principalName"), mockPropertyDefinition(NT_REP_AUTHORIZABLE, false)));
assertEquals("principalName", userTree.getProperty(REP_PRINCIPAL_NAME).getValue(Type.STRING));
}
@Test(expected = IllegalArgumentException.class)
public void testHandleEmptyPrincipalName() throws Exception {
assertTrue(init());
Tree userTree = createUserTree();
importer.handlePropInfo(userTree, createPropInfo(REP_PRINCIPAL_NAME, ""), mockPropertyDefinition(NT_REP_AUTHORIZABLE, false));
}
@Test(expected = IllegalArgumentException.class)
public void testHandleEveryonePrincipalNameOnUser() throws Exception {
assertTrue(init());
Tree userTree = createUserTree();
importer.handlePropInfo(userTree, createPropInfo(REP_PRINCIPAL_NAME, EveryonePrincipal.NAME), mockPropertyDefinition(NT_REP_AUTHORIZABLE, false));
}
@Test
public void testHandlePrincipalNameMvPropertyDef() throws Exception {
init();
Tree userTree = createUserTree();
assertFalse(importer.handlePropInfo(userTree, createPropInfo(REP_PRINCIPAL_NAME, "principalName"), mockPropertyDefinition(NT_REP_AUTHORIZABLE, true)));
assertNull(userTree.getProperty(REP_PRINCIPAL_NAME));
}
@Test
public void testHandlePrincipalNameOtherDeclNtDef() throws Exception {
init();
Tree userTree = createUserTree();
assertFalse(importer.handlePropInfo(userTree, createPropInfo(REP_PRINCIPAL_NAME, "principalName"), mockPropertyDefinition(NT_REP_AUTHORIZABLE_FOLDER, false)));
assertNull(userTree.getProperty(REP_PRINCIPAL_NAME));
}
@Test
public void testHandlePassword() throws Exception {
init();
Tree userTree = createUserTree();
String pwHash = PasswordUtil.buildPasswordHash("pw");
assertTrue(importer.handlePropInfo(userTree, createPropInfo(REP_PASSWORD, pwHash), mockPropertyDefinition(NT_REP_USER, false)));
assertEquals(pwHash, userTree.getProperty(REP_PASSWORD).getValue(Type.STRING));
}
@Test
public void testHandlePasswordOnSystemUser() throws Exception {
init();
Tree userTree = createUserTree();
userTree.setProperty(JcrConstants.JCR_PRIMARYTYPE, NT_REP_SYSTEM_USER, Type.NAME);
assertFalse(importer.handlePropInfo(userTree, createPropInfo(REP_PASSWORD, PasswordUtil.buildPasswordHash("pw")), mockPropertyDefinition(NT_REP_USER, false)));
}
@Test
public void testHandlePasswordOnGroup() throws Exception {
init();
Tree groupTree = createGroupTree();
assertFalse(importer.handlePropInfo(groupTree, createPropInfo(REP_PASSWORD, PasswordUtil.buildPasswordHash("pw")), mockPropertyDefinition(NT_REP_USER, false)));
}
@Test
public void testHandlePasswordMvPropertyDef() throws Exception {
init();
Tree userTree = createUserTree();
assertFalse(importer.handlePropInfo(userTree, createPropInfo(REP_PASSWORD, PasswordUtil.buildPasswordHash("pw")), mockPropertyDefinition(NT_REP_USER, true)));
assertNull(userTree.getProperty(REP_PASSWORD));
}
@Test
public void testHandlePasswordOtherDeclNtDef() throws Exception {
init();
Tree userTree = createUserTree();
assertFalse(importer.handlePropInfo(userTree, createPropInfo(REP_PASSWORD, PasswordUtil.buildPasswordHash("pw")), mockPropertyDefinition(NT_REP_AUTHORIZABLE, false)));
assertNull(userTree.getProperty(REP_PASSWORD));
}
@Test
public void testHandlePwNodePropertyInvalidDef() throws Exception {
init();
Tree userTree = createUserTree();
Tree pwHistory = TreeUtil.addChild(userTree, REP_PWD, NT_REP_PASSWORD);
PropertyDefinition pd = mockPropertyDefinition(NT_REP_PASSWORD, false);
when(pd.getName()).thenReturn(NodeTypeConstants.RESIDUAL_NAME);
assertFalse(importer.handlePropInfo(pwHistory, createPropInfo(null, PasswordUtil.buildPasswordHash("pw")), pd));
}
@Test
public void testHandlePwNodePropertyInvalidDef2() throws Exception {
init();
Tree userTree = createUserTree();
Tree pwHistory = TreeUtil.addChild(userTree, REP_PWD, NT_REP_PASSWORD);
PropertyDefinition pd = mockPropertyDefinition(NT_REP_PASSWORD, false);
when(pd.getName()).thenReturn(null);
assertFalse(importer.handlePropInfo(pwHistory, createPropInfo(null, PasswordUtil.buildPasswordHash("pw")), pd));
}
@Test
public void testHandlePwNodePropertyValidDef() throws Exception {
init();
Tree userTree = createUserTree();
Tree pwHistory = TreeUtil.addChild(userTree, REP_PWD, NT_REP_PASSWORD);
PropertyDefinition pd = mockPropertyDefinition(NT_REP_PASSWORD, true);
when(pd.getName()).thenReturn(REP_PWD_HISTORY);
assertTrue(importer.handlePropInfo(pwHistory, createPropInfo(null, PasswordUtil.buildPasswordHash("pw")), pd));
}
@Test
public void testHandleImpersonators() throws Exception {
init();
Tree userTree = createUserTree();
assertTrue(importer.handlePropInfo(userTree, createPropInfo(REP_IMPERSONATORS, "impersonator1", "impersonator2"), mockPropertyDefinition(NT_REP_USER, true)));
// writing is postponed though and the ref-tracker must not be empty
assertNull(userTree.getProperty(REP_IMPERSONATORS));
assertTrue(refTracker.getProcessedReferences().hasNext());
}
@Test
public void testHandleImpersonatorsOnGroup() throws Exception {
init();
Tree groupTree = createGroupTree();
assertFalse(importer.handlePropInfo(groupTree, createPropInfo(REP_IMPERSONATORS, "impersonator1"), mockPropertyDefinition(NT_REP_USER, true)));
}
@Test
public void testHandleImpersonatorsSinglePropertyDef() throws Exception {
init();
Tree userTree = createUserTree();
assertFalse(importer.handlePropInfo(userTree, createPropInfo(REP_IMPERSONATORS, "impersonator1"), mockPropertyDefinition(NT_REP_USER, false)));
assertNull(userTree.getProperty(REP_IMPERSONATORS));
}
@Test
public void testHandleImpersonatorsOtherDeclNtDef() throws Exception {
init();
Tree userTree = createUserTree();
assertFalse(importer.handlePropInfo(userTree, createPropInfo(REP_IMPERSONATORS, "impersonator1"), mockPropertyDefinition(NT_REP_AUTHORIZABLE, true)));
assertNull(userTree.getProperty(REP_IMPERSONATORS));
}
@Test
public void testHandleMembers() throws Exception {
init();
Tree groupTree = createGroupTree();
assertTrue(importer.handlePropInfo(groupTree, createPropInfo(REP_MEMBERS, "member1", "member2"), mockPropertyDefinition(NT_REP_MEMBER_REFERENCES, true)));
// writing is postponed though
assertNull(groupTree.getProperty(REP_MEMBERS));
}
@Test
public void testHandleMembersOnUser() throws Exception {
init();
Tree userTree = createUserTree();
assertFalse(importer.handlePropInfo(userTree, createPropInfo(REP_MEMBERS, "member1"), mockPropertyDefinition(NT_REP_MEMBER_REFERENCES, true)));
}
@Test
public void testHandleMembersSinglePropertyDef() throws Exception {
init();
Tree groupTree = createGroupTree();
assertFalse(importer.handlePropInfo(groupTree, createPropInfo(REP_MEMBERS, "member1"), mockPropertyDefinition(NT_REP_MEMBER_REFERENCES, false)));
assertNull(groupTree.getProperty(REP_MEMBERS));
}
@Test
public void testHandleMembersOtherDeclNtDef() throws Exception {
init();
Tree groupTree = createGroupTree();
assertFalse(importer.handlePropInfo(groupTree, createPropInfo(REP_MEMBERS, "member1"), mockPropertyDefinition(NT_REP_AUTHORIZABLE, true)));
assertNull(groupTree.getProperty(REP_MEMBERS));
}
@Test
public void testHandleDisabled() throws Exception {
init();
Tree userTree = createUserTree();
assertTrue(importer.handlePropInfo(userTree, createPropInfo(REP_DISABLED, "disabled"), mockPropertyDefinition(NT_REP_USER, false)));
PropertyState property = userTree.getProperty(REP_DISABLED);
assertNotNull(property);
assertEquals("disabled", property.getValue(Type.STRING));
}
@Test
public void testHandleDisabledOnGroup() throws Exception {
init();
Tree groupTree = createGroupTree();
assertFalse(importer.handlePropInfo(groupTree, createPropInfo(REP_DISABLED, "disabled"), mockPropertyDefinition(NT_REP_USER, false)));
assertNull(groupTree.getProperty(REP_DISABLED));
}
@Test(expected = RepositoryException.class)
public void testHandleDisabledMvProperty() throws Exception {
init();
Tree userTree = createUserTree();
importer.handlePropInfo(userTree, createPropInfo(REP_DISABLED, "disabled", "disabled"), mockPropertyDefinition(NT_REP_USER, false));
}
@Test
public void testHandleDisabledMvPropertyDef() throws Exception {
init();
Tree userTree = createUserTree();
assertFalse(importer.handlePropInfo(userTree, createPropInfo(REP_DISABLED, "disabled"), mockPropertyDefinition(NT_REP_USER, true)));
assertNull(userTree.getProperty(REP_DISABLED));
}
@Test
public void testHandleDisabledOtherDeclNtDef() throws Exception {
init();
Tree userTree = createUserTree();
assertFalse(importer.handlePropInfo(userTree, createPropInfo(REP_DISABLED, "disabled"), mockPropertyDefinition(NT_REP_AUTHORIZABLE, false)));
assertNull(userTree.getProperty(REP_DISABLED));
}
@Test
public void testHandleUnknownProperty() throws Exception {
init();
Tree userTree = createUserTree();
assertFalse(importer.handlePropInfo(userTree, createPropInfo("unknownProperty", "value"), mockPropertyDefinition(NT_OAK_UNSTRUCTURED, false)));
assertNull(userTree.getProperty("unknownProperty"));
}
//--------------------------------------------------< processReferences >---
@Test(expected = IllegalStateException.class)
public void testProcessReferencesNotInitialized() throws Exception {
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);
cacheTree.setProperty(JcrConstants.JCR_PRIMARYTYPE, CacheConstants.NT_REP_CACHE);
importer.propertiesCompleted(cacheTree);
assertFalse(cacheTree.exists());
assertFalse(userTree.hasChild(CacheConstants.REP_CACHE));
}
@Test
public void testPropertiesCompletedParentNotAuthorizable() throws Exception {
assertTrue(init());
importer.propertiesCompleted(root.getTree("/"));
}
@Test
public void testPropertiesCompletedIdMissing() throws Exception {
init();
Tree userTree = createUserTree();
importer.propertiesCompleted(userTree);
assertTrue(userTree.hasProperty(REP_AUTHORIZABLE_ID));
}
@Test
public void testPropertiesCompletedIdPresent() throws Exception {
init();
testAction = mock(AuthorizableAction.class);
Tree userTree = createUserTree();
userTree.setProperty(REP_AUTHORIZABLE_ID, "userId");
importer.propertiesCompleted(userTree);
// property must not be touched
assertEquals("userId", userTree.getProperty(REP_AUTHORIZABLE_ID).getValue(Type.STRING));
}
@Test
public void testPropertiesCompletedNewUser() throws Exception {
init(true);
importer.propertiesCompleted(createUserTree());
verify(testAction, times(1)).onCreate(any(User.class), nullable(String.class), any(Root.class), any(NamePathMapper.class));
}
@Test
public void testPropertiesCompletedNewSystemUser() throws Exception {
init(true);
importer.propertiesCompleted(createSystemUserTree());
// create-actions must not be called for system users
verify(testAction).onCreate(any(User.class), any(Root.class), any(NamePathMapper.class));
verify(testAction, never()).onCreate(any(User.class), nullable(String.class), any(Root.class), any(NamePathMapper.class));
}
@Test
public void testPropertiesCompletedNewGroup() throws Exception {
Tree groupTree = createGroupTree();
init(true);
importer.propertiesCompleted(groupTree);
verify(testAction, times(1)).onCreate(any(Group.class), any(Root.class), any(NamePathMapper.class));
}
@Test
public void testPropertiesCompletedExistingUser() throws Exception {
init(true);
importer.propertiesCompleted(root.getTree(testUser.getPath()));
verifyNoInteractions(testAction);
}
//--------------------------------------------------------------< start >---
@Test
public void testStartUserTree() throws Exception {
init(true);
assertFalse(importer.start(createUserTree()));
}
@Test
public void testStartGroupTree() throws Exception {
init(true);
assertFalse(importer.start(createGroupTree()));
}
@Test
public void testStartMembersRefListTree() throws Exception {
init(true);
Tree groupTree = createGroupTree();
Tree memberRefList = groupTree.addChild(REP_MEMBERS_LIST);
memberRefList.setProperty(JcrConstants.JCR_PRIMARYTYPE, NT_REP_MEMBER_REFERENCES_LIST);
assertTrue(importer.start(memberRefList));
}
@Test
public void testStartMembersRefListBelowUserTree() throws Exception {
init(true);
Tree userTree = createUserTree();
Tree memberRefList = userTree.addChild(REP_MEMBERS_LIST);
memberRefList.setProperty(JcrConstants.JCR_PRIMARYTYPE, NT_REP_MEMBER_REFERENCES_LIST);
assertFalse(importer.start(memberRefList));
}
@Test
public void testStartMembersRefBelowAnyTree() throws Exception {
init(true);
Tree memberRefList = root.getTree(PathUtils.ROOT_PATH).addChild(REP_MEMBERS_LIST);
memberRefList.setProperty(JcrConstants.JCR_PRIMARYTYPE, NT_REP_MEMBER_REFERENCES_LIST);
assertFalse(importer.start(memberRefList));
}
@Test
public void testStartRepMembersTree() throws Exception {
init(true);
Tree groupTree = createGroupTree();
Tree repMembers = groupTree.addChild("memberTree");
repMembers.setProperty(JcrConstants.JCR_PRIMARYTYPE, NT_REP_MEMBERS);
repMembers = repMembers.addChild("memberTree");
repMembers.setProperty(JcrConstants.JCR_PRIMARYTYPE, NT_REP_MEMBERS);
assertTrue(importer.start(repMembers));
}
@Test
public void testStartRepMembersBelowUserTree() throws Exception {
init(true);
Tree userTree = createUserTree();
Tree repMembers = userTree.addChild("memberTree");
repMembers.setProperty(JcrConstants.JCR_PRIMARYTYPE, NT_REP_MEMBERS);
repMembers = repMembers.addChild("memberTree");
repMembers.setProperty(JcrConstants.JCR_PRIMARYTYPE, NT_REP_MEMBERS);
assertFalse(importer.start(repMembers));
}
@Test
public void testStartRepMembersBelowRootTree() throws Exception {
init(true);
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);
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)
public void testStartChildInfoIllegalState() {
importer.startChildInfo(createNodeInfo("memberRef", NT_REP_MEMBER_REFERENCES), ImmutableList.of(createPropInfo(REP_MEMBERS, "member1")));
}
@Test(expected = IllegalStateException.class)
public void testStartChildInfoWithoutValidStart() throws Exception {
init(true);
Tree memberRefList = root.getTree(PathUtils.ROOT_PATH).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(REP_MEMBERS, "member1")));
}
@Test
public void testStartChildInfoWithoutRepMembersProperty() throws Exception {
init(true);
Tree groupTree = createGroupTree();
Tree memberRefList = groupTree.addChild(REP_MEMBERS_LIST);
memberRefList.setProperty(JcrConstants.JCR_PRIMARYTYPE, NT_REP_MEMBER_REFERENCES_LIST);
assertTrue(importer.start(memberRefList));
importer.startChildInfo(createNodeInfo("memberRef", NT_REP_MEMBER_REFERENCES), ImmutableList.of());
}
@Test
public void testStartChildInfoWithRepMembersProperty() throws Exception {
init(true);
Tree groupTree = createGroupTree();
Tree memberRefList = groupTree.addChild(REP_MEMBERS_LIST);
memberRefList.setProperty(JcrConstants.JCR_PRIMARYTYPE, NT_REP_MEMBER_REFERENCES_LIST);
assertTrue(importer.start(memberRefList));
importer.startChildInfo(createNodeInfo("memberRef", NT_REP_MEMBER_REFERENCES), ImmutableList.of(createPropInfo(REP_MEMBERS, "member1")));
}
@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();
Tree repMembers = groupTree.addChild("memberTree");
repMembers.setProperty(JcrConstants.JCR_PRIMARYTYPE, NT_REP_MEMBERS);
assertTrue(importer.start(repMembers));
importer.startChildInfo(createNodeInfo("memberTree", NT_REP_MEMBERS), ImmutableList.of(createPropInfo("anyProp", "memberValue")));
}
@Test
public void testStartOtherChildInfo() throws Exception {
init(true);
Tree groupTree = createGroupTree();
Tree memberRefList = groupTree.addChild(REP_MEMBERS_LIST);
memberRefList.setProperty(JcrConstants.JCR_PRIMARYTYPE, NT_REP_MEMBER_REFERENCES_LIST);
assertTrue(importer.start(memberRefList));
importer.startChildInfo(createNodeInfo("memberRef", NT_OAK_UNSTRUCTURED), ImmutableList.of(createPropInfo(REP_MEMBERS, "member1")));
}
//-------------------------------------------------------< endChildInfo >---
@Test
public void testEndChildInfoIsNoop() throws Exception {
Root r = mock(Root.class);
NamePathMapper npmapper = mock(NamePathMapper.class);
ReferenceChangeTracker reftracker = mock(ReferenceChangeTracker.class);
SecurityProvider sp = mock(SecurityProvider.class);
UserConfiguration uc = when(mock(UserConfiguration.class).getUserManager(r, npmapper)).thenReturn(getUserManager(root)).getMock();
when(sp.getConfiguration(UserConfiguration.class)).thenReturn(uc);
importer.init(mockJackrabbitSession(), r, npmapper, false, ImportUUIDBehavior.IMPORT_UUID_COLLISION_REMOVE_EXISTING, reftracker, sp);
clearInvocations(r, npmapper, reftracker, sp);
importer.endChildInfo();
verifyNoInteractions(r, npmapper, reftracker, sp);
}
//----------------------------------------------------------------< 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));
}
}