blob: ffc2c655333ef07ca7679f659deba2c3aa7bbbd6 [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.autosave;
import org.apache.jackrabbit.api.security.user.Authorizable;
import org.apache.jackrabbit.api.security.user.Group;
import org.apache.jackrabbit.api.security.user.Impersonation;
import org.apache.jackrabbit.api.security.user.Query;
import org.apache.jackrabbit.api.security.user.User;
import org.apache.jackrabbit.api.security.user.UserManager;
import org.apache.jackrabbit.oak.query.QueryEngineSettings;
import org.apache.jackrabbit.oak.spi.security.principal.PrincipalImpl;
import org.apache.jackrabbit.oak.spi.security.user.UserConstants;
import org.junit.After;
import org.junit.Test;
import javax.jcr.RepositoryException;
import javax.jcr.Value;
import java.security.Principal;
import java.util.Iterator;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
public class AutoSaveEnabledManagerTest extends AbstractAutoSaveTest {
@After
@Override
public void after() throws Exception {
try {
Authorizable a = mgrDlg.getAuthorizable("u");
if (a != null) {
a.remove();
}
a = mgrDlg.getAuthorizable("g");
if (a != null) {
a.remove();
}
if (root.hasPendingChanges()) {
root.commit();
}
} finally {
super.after();
}
}
@Override
protected QueryEngineSettings getQueryEngineSettings() {
if (querySettings == null) {
querySettings = new QueryEngineSettings();
querySettings.setFailTraversal(false);
}
return querySettings;
}
@Test
public void testIsAutoSave() {
assertTrue(autosaveMgr.isAutoSave());
verify(mgrDlg, never()).isAutoSave();
}
@Test
public void testSetAutoSave() throws Exception {
assertTrue(autosaveMgr.isAutoSave());
autosaveMgr.autoSave(false);
assertFalse(autosaveMgr.isAutoSave());
autosaveMgr.autoSave(true);
assertTrue(autosaveMgr.isAutoSave());
verify(mgrDlg, never()).isAutoSave();
verify(mgrDlg, never()).autoSave(true);
verify(mgrDlg, never()).autoSave(false);
}
@Test
public void testGetAuthorizable() throws RepositoryException {
Authorizable a = autosaveMgr.getAuthorizable(UserConstants.DEFAULT_ANONYMOUS_ID);
assertNotNull(a);
assertTrue(a instanceof AuthorizableImpl);
assertTrue(a instanceof UserImpl);
a = autosaveMgr.getAuthorizableByPath(a.getPath());
assertNotNull(a);
assertTrue(a instanceof AuthorizableImpl);
assertTrue(a instanceof UserImpl);
a = autosaveMgr.getAuthorizable(a.getPrincipal());
assertNotNull(a);
assertTrue(a instanceof AuthorizableImpl);
assertTrue(a instanceof UserImpl);
assertNull(autosaveMgr.getAuthorizable("unknown"));
}
@Test
public void testFindAuthorizable() throws RepositoryException {
Iterator<Authorizable> res = autosaveMgr.findAuthorizables(UserConstants.REP_AUTHORIZABLE_ID, UserConstants.DEFAULT_ANONYMOUS_ID);
assertTrue(res.hasNext());
Authorizable a = res.next();
assertNotNull(a);
assertTrue(a instanceof AuthorizableImpl);
}
@Test
public void testFindAuthorizableWithSearchType() throws RepositoryException {
Iterator<Authorizable> res = autosaveMgr.findAuthorizables(UserConstants.REP_AUTHORIZABLE_ID, UserConstants.DEFAULT_ANONYMOUS_ID, UserManager.SEARCH_TYPE_GROUP);
assertFalse(res.hasNext());
verify(mgrDlg, times(1)).findAuthorizables(UserConstants.REP_AUTHORIZABLE_ID, UserConstants.DEFAULT_ANONYMOUS_ID, UserManager.SEARCH_TYPE_GROUP);
verify(autosaveMgr, never()).autosave();
}
@Test
public void testFindAuthorizableWithQuery() throws RepositoryException {
Query q = mock(Query.class);
autosaveMgr.findAuthorizables(q);
verify(mgrDlg, times(1)).findAuthorizables(q);
verify(autosaveMgr, never()).autosave();
}
@Test
public void testCreateRemoveUser() throws RepositoryException {
User u = autosaveMgr.createUser("u", "u");
assertFalse(root.hasPendingChanges());
u.remove();
assertFalse(root.hasPendingChanges());
}
@Test
public void testCreateUserWithPath() throws Exception {
autosaveMgr.createUser("u", "u", new PrincipalImpl("u"), "rel/path");
assertFalse(root.hasPendingChanges());
verify(mgrDlg, times(1)).createUser("u", "u", new PrincipalImpl("u"), "rel/path");
verify(autosaveMgr, times(1)).autosave();
}
@Test
public void testCreateSystemUser() throws Exception {
autosaveMgr.createSystemUser("u", null);
assertFalse(root.hasPendingChanges());
verify(mgrDlg, times(1)).createSystemUser("u", null);
verify(autosaveMgr, times(1)).autosave();
}
@Test
public void testCreateRemoveGroup() throws RepositoryException {
Group g = autosaveMgr.createGroup("g");
assertFalse(root.hasPendingChanges());
g.remove();
assertFalse(root.hasPendingChanges());
verify(mgrDlg, times(1)).createGroup("g");
verify(autosaveMgr, times(2)).autosave();
}
@Test
public void testCreateGroupFromPrincipal() throws RepositoryException {
Principal principal = new PrincipalImpl("g");
autosaveMgr.createGroup(principal);
assertFalse(root.hasPendingChanges());
verify(mgrDlg, times(1)).createGroup(principal);
verify(autosaveMgr, times(1)).autosave();
}
@Test
public void testCreateGroupFromPrincipalAndID() throws RepositoryException {
Principal principal = new PrincipalImpl("g");
autosaveMgr.createGroup(principal, "g");
assertFalse(root.hasPendingChanges());
verify(mgrDlg, times(1)).createGroup(principal, "g");
verify(autosaveMgr, times(1)).autosave();
}
@Test
public void testCreateGroupFromIdPrincipalAndPath() throws RepositoryException {
Principal principal = new PrincipalImpl("g");
autosaveMgr.createGroup("g", principal, "rel/path");
assertFalse(root.hasPendingChanges());
verify(mgrDlg, times(1)).createGroup("g", principal, "rel/path");
verify(autosaveMgr, times(1)).autosave();
}
@Test
public void testCommitFailedRevertChanges() throws RepositoryException {
autosaveMgr.createUser("u", "u");
try {
autosaveMgr.createUser("u", "u");
fail();
} catch (RepositoryException e) {
// success
assertFalse(root.hasPendingChanges());
}
verify(autosaveMgr, times(2)).autosave();
}
@Test
public void testAuthorizable() throws Exception {
User u = autosaveMgr.createUser("u", "u");
u.setProperty("prop", getValueFactory().createValue("value"));
assertFalse(root.hasPendingChanges());
u.setProperty("prop", new Value[] {getValueFactory().createValue(true)});
assertFalse(root.hasPendingChanges());
u.removeProperty("prop");
assertFalse(root.hasPendingChanges());
verify(autosaveMgr, times(4)).autosave();
}
@Test
public void testUser() throws Exception {
User u = autosaveMgr.createUser("u", "u");
u.disable("disabled");
assertTrue(u.isDisabled());
assertFalse(root.hasPendingChanges());
u.disable(null);
assertFalse(u.isDisabled());
assertFalse(root.hasPendingChanges());
u.changePassword("t");
assertFalse(root.hasPendingChanges());
u.changePassword("tt", "t");
assertFalse(root.hasPendingChanges());
}
@Test
public void testImpersonation() throws Exception {
User u = autosaveMgr.createUser("u", "u");
Impersonation imp = u.getImpersonation();
Principal p = autosaveMgr.getAuthorizable("anonymous").getPrincipal();
assertTrue(imp.grantImpersonation(p));
assertFalse(root.hasPendingChanges());
assertTrue(imp.revokeImpersonation(p));
assertFalse(root.hasPendingChanges());
}
@Test
public void testGroup() throws Exception {
User u = autosaveMgr.createUser("u", "u");
Group g = autosaveMgr.createGroup("g");
assertTrue(g.addMember(u));
assertFalse(root.hasPendingChanges());
assertTrue(g.isDeclaredMember(u));
Iterator<Authorizable> it = g.getDeclaredMembers();
if (it.hasNext()) {
Authorizable a = it.next();
assertTrue(a instanceof AuthorizableImpl);
a.setProperty("prop", getValueFactory().createValue("blub"));
assertFalse(root.hasPendingChanges());
}
it = g.getMembers();
if (it.hasNext()) {
Authorizable a = it.next();
assertTrue(a instanceof AuthorizableImpl);
a.setProperty("prop", getValueFactory().createValue("blub"));
assertFalse(root.hasPendingChanges());
}
assertTrue(g.removeMember(u));
assertFalse(root.hasPendingChanges());
assertFalse(g.isDeclaredMember(u));
}
@Test
public void testDeclaredMemberOf() throws Exception {
User u = autosaveMgr.createUser("u", "u");
Group g = autosaveMgr.createGroup("g");
assertTrue(g.addMember(u));
Iterator<Group> groups = u.declaredMemberOf();
assertTrue(groups.hasNext());
Group gAgain = groups.next();
assertTrue(gAgain instanceof GroupImpl);
assertTrue(gAgain.removeMember(u));
assertFalse(root.hasPendingChanges());
assertFalse(u.declaredMemberOf().hasNext());
}
@Test
public void testMemberOf() throws Exception {
User u = autosaveMgr.createUser("u", "u");
Group g = autosaveMgr.createGroup("g");
assertTrue(g.addMember(u));
Iterator<Group> groups = u.memberOf();
assertTrue(groups.hasNext());
Group gAgain = groups.next();
assertTrue(gAgain instanceof GroupImpl);
assertTrue(gAgain.removeMember(u));
assertFalse(root.hasPendingChanges());
assertFalse(u.declaredMemberOf().hasNext());
}
@Test
public void testAddMembers() throws Exception {
User u = autosaveMgr.createUser("u", "u");
Group g = autosaveMgr.createGroup("g");
assertTrue(g.addMembers(u.getID()).isEmpty());
assertFalse(root.hasPendingChanges());
}
@Test
public void testRemoveMembers() throws Exception {
User u = autosaveMgr.createUser("u", "u");
Group g = autosaveMgr.createGroup("g");
g.addMember(u);
assertTrue(g.removeMembers(u.getID()).isEmpty());
assertFalse(root.hasPendingChanges());
}
@Test
public void testUnwrap() {
assertSame(mgrDlg, autosaveMgr.unwrap());
}
}