blob: 3308e6ca359754f3c8c92e602d3100387ff92ff2 [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.spi.security;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import org.apache.jackrabbit.oak.plugins.tree.RootProvider;
import org.apache.jackrabbit.oak.plugins.tree.TreeProvider;
import org.apache.jackrabbit.oak.spi.commit.CommitHook;
import org.apache.jackrabbit.oak.spi.commit.MoveTracker;
import org.apache.jackrabbit.oak.spi.commit.ThreeWayConflictHandler;
import org.apache.jackrabbit.oak.spi.commit.ValidatorProvider;
import org.apache.jackrabbit.oak.spi.lifecycle.CompositeInitializer;
import org.apache.jackrabbit.oak.spi.lifecycle.CompositeWorkspaceInitializer;
import org.apache.jackrabbit.oak.spi.lifecycle.RepositoryInitializer;
import org.apache.jackrabbit.oak.spi.lifecycle.WorkspaceInitializer;
import org.apache.jackrabbit.oak.spi.security.authentication.LoginModuleMonitor;
import org.apache.jackrabbit.oak.spi.xml.ProtectedItemImporter;
import org.apache.jackrabbit.oak.stats.Monitor;
import org.apache.jackrabbit.oak.stats.StatisticsProvider;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.junit.Before;
import org.junit.Test;
import org.osgi.framework.Constants;
import java.security.Principal;
import java.util.List;
import java.util.Set;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
public class CompositeConfigurationTest extends AbstractCompositeConfigurationTest {
private static final String NAME = "test";
@Before
public void before() {
compositeConfiguration = new CompositeConfiguration("test", new SecurityProvider() {
@NotNull
@Override
public ConfigurationParameters getParameters(@Nullable String name) {
throw new UnsupportedOperationException();
}
@NotNull
@Override
public Iterable<? extends SecurityConfiguration> getConfigurations() {
throw new UnsupportedOperationException();
}
@NotNull
@Override
public <T> T getConfiguration(@NotNull Class<T> configClass) {
throw new UnsupportedOperationException();
}
}) {};
}
@Test
public void testGetName() {
assertEquals(NAME, compositeConfiguration.getName());
}
@Test
public void testEmpty() {
assertSame(ConfigurationParameters.EMPTY, compositeConfiguration.getParameters());
assertTrue(getConfigurations().isEmpty());
}
@Test
public void testGetDefaultConfig() {
assertNull(compositeConfiguration.getDefaultConfig());
SecurityConfiguration sc = new SecurityConfiguration.Default();
setDefault(sc);
assertSame(sc, compositeConfiguration.getDefaultConfig());
}
@Test
public void testSetDefaultConfig() {
SecurityConfiguration sc = new SecurityConfiguration.Default();
setDefault(sc);
List<SecurityConfiguration> configurations = getConfigurations();
assertFalse(configurations.isEmpty());
assertEquals(1, configurations.size());
assertEquals(sc, configurations.iterator().next());
}
@Test
public void testAddConfiguration() {
addConfiguration(new SecurityConfiguration.Default());
addConfiguration(new SecurityConfiguration.Default());
List<SecurityConfiguration> configurations = getConfigurations();
assertFalse(configurations.isEmpty());
assertEquals(2, configurations.size());
SecurityConfiguration def = new SecurityConfiguration.Default();
setDefault(def);
configurations = getConfigurations();
assertEquals(2, configurations.size());
assertFalse(configurations.contains(def));
}
@Test
public void testAddConfigurationWithRanking() {
SecurityConfiguration r100 = new SecurityConfiguration.Default();
compositeConfiguration.addConfiguration(r100, ConfigurationParameters.of(Constants.SERVICE_RANKING, 100));
SecurityConfiguration r200 = new SecurityConfiguration.Default();
compositeConfiguration.addConfiguration(r200, ConfigurationParameters.of(Constants.SERVICE_RANKING, 200));
SecurityConfiguration r150 = new SecurityConfiguration.Default() {
@NotNull
@Override
public ConfigurationParameters getParameters() {
return ConfigurationParameters.of(CompositeConfiguration.PARAM_RANKING, 150);
}
};
compositeConfiguration.addConfiguration(r150, ConfigurationParameters.EMPTY);
SecurityConfiguration r50 = new SecurityConfiguration.Default() {
@NotNull
@Override
public ConfigurationParameters getParameters() {
return ConfigurationParameters.of(CompositeConfiguration.PARAM_RANKING, 50);
}
};
compositeConfiguration.addConfiguration(r50, ConfigurationParameters.EMPTY);
SecurityConfiguration rUndef = new SecurityConfiguration.Default();
compositeConfiguration.addConfiguration(rUndef, ConfigurationParameters.EMPTY);
SecurityConfiguration r200second = new SecurityConfiguration.Default();
compositeConfiguration.addConfiguration(r200second, ConfigurationParameters.of(Constants.SERVICE_RANKING, 200));
List<?> l = getConfigurations();
assertArrayEquals(new SecurityConfiguration[]{r200, r200second, r150, r100, r50, rUndef}, l.toArray(new SecurityConfiguration[0]));
// remove and add new
removeConfiguration(r150);
removeConfiguration(r50);
removeConfiguration(r100);
SecurityConfiguration r75 = new SecurityConfiguration.Default();
compositeConfiguration.addConfiguration(r75, ConfigurationParameters.of(Constants.SERVICE_RANKING, 75));
l = getConfigurations();
assertArrayEquals(new SecurityConfiguration[]{r200, r200second, r75, rUndef}, l.toArray(new SecurityConfiguration[0]));
}
@Test
public void testRemoveConfiguration() {
SecurityConfiguration def = new SecurityConfiguration.Default();
setDefault(def);
SecurityConfiguration sc = new SecurityConfiguration.Default();
addConfiguration(sc);
removeConfiguration(def);
List<?> configurations = getConfigurations();
assertEquals(1, configurations.size());
assertEquals(sc, configurations.iterator().next());
removeConfiguration(sc);
configurations = getConfigurations();
assertEquals(1, configurations.size());
assertEquals(def, configurations.iterator().next());
}
@Test(expected = IllegalStateException.class)
public void testGetSecurityProviderNotInitialized() {
CompositeConfiguration cc = new CompositeConfiguration("name") {};
cc.getSecurityProvider();
}
@Test()
public void testSetSecurityProvider() {
CompositeConfiguration cc = new CompositeConfiguration("name") {};
SecurityProvider securityProvider = mock(SecurityProvider.class);
cc.setSecurityProvider(securityProvider);
assertSame(securityProvider, cc.getSecurityProvider());
}
@Test(expected = IllegalStateException.class)
public void testGetRootProviderNotInitialized() {
CompositeConfiguration cc = new CompositeConfiguration("name") {};
cc.getRootProvider();
}
@Test()
public void testSetRootProvider() {
CompositeConfiguration cc = new CompositeConfiguration("name") {};
RootProvider rootProvider = mock(RootProvider.class);
cc.setRootProvider(rootProvider);
assertSame(rootProvider, cc.getRootProvider());
}
@Test(expected = IllegalStateException.class)
public void testGetTreeProviderNotInitialized() {
CompositeConfiguration cc = new CompositeConfiguration("name") {};
cc.getTreeProvider();
}
@Test()
public void testSetTreeProvider() {
CompositeConfiguration cc = new CompositeConfiguration("name") {};
TreeProvider treeProvider = mock(TreeProvider.class);
cc.setTreeProvider(treeProvider);
assertSame(treeProvider, cc.getTreeProvider());
}
@Test
public void testGetProtectedItemImporters() {
assertTrue(compositeConfiguration.getProtectedItemImporters().isEmpty());
addConfiguration(new SecurityConfiguration.Default());
assertTrue(compositeConfiguration.getProtectedItemImporters().isEmpty());
SecurityConfiguration withImporter = new SecurityConfiguration.Default() {
@NotNull
@Override
public List<ProtectedItemImporter> getProtectedItemImporters() {
return ImmutableList.of(mock(ProtectedItemImporter.class));
}
};
addConfiguration(withImporter);
assertEquals(1, compositeConfiguration.getProtectedItemImporters().size());
}
@Test
public void testGetConflictHandlers() {
assertTrue(compositeConfiguration.getConflictHandlers().isEmpty());
addConfiguration(new SecurityConfiguration.Default());
assertTrue(compositeConfiguration.getConflictHandlers().isEmpty());
SecurityConfiguration withConflictHandler = new SecurityConfiguration.Default() {
@NotNull
@Override
public List<ThreeWayConflictHandler> getConflictHandlers() {
return ImmutableList.of(mock(ThreeWayConflictHandler.class));
}
};
addConfiguration(withConflictHandler);
assertEquals(1, compositeConfiguration.getConflictHandlers().size());
}
@Test
public void testGetCommitHooks() {
assertTrue(compositeConfiguration.getCommitHooks(null).isEmpty());
addConfiguration(new SecurityConfiguration.Default());
assertTrue(compositeConfiguration.getCommitHooks(null).isEmpty());
SecurityConfiguration withCommitHook = new SecurityConfiguration.Default() {
@NotNull
@Override
public List<? extends CommitHook> getCommitHooks(@NotNull String workspaceName) {
return ImmutableList.of(mock(CommitHook.class));
}
};
addConfiguration(withCommitHook);
assertEquals(1, compositeConfiguration.getCommitHooks(null).size());
}
@Test
public void testGetValidators() {
assertTrue(compositeConfiguration.getValidators(null, ImmutableSet.of(), new MoveTracker()).isEmpty());
addConfiguration(new SecurityConfiguration.Default());
assertTrue(compositeConfiguration.getValidators(null, ImmutableSet.of(), new MoveTracker()).isEmpty());
SecurityConfiguration withValidator = new SecurityConfiguration.Default() {
@NotNull
@Override
public List<? extends ValidatorProvider> getValidators(@NotNull String workspaceName, @NotNull Set<Principal> principals, @NotNull MoveTracker moveTracker) {
return ImmutableList.of(mock(ValidatorProvider.class));
}
};
addConfiguration(withValidator);
assertEquals(1, compositeConfiguration.getValidators(null, ImmutableSet.of(), new MoveTracker()).size());
}
@Test
public void testGetWorkspaceInitializer() {
assertTrue(compositeConfiguration.getWorkspaceInitializer() instanceof CompositeWorkspaceInitializer);
addConfiguration(new SecurityConfiguration.Default());
assertTrue(compositeConfiguration.getWorkspaceInitializer() instanceof CompositeWorkspaceInitializer);
SecurityConfiguration withWorkspaceInitializer = new SecurityConfiguration.Default() {
@NotNull
@Override
public WorkspaceInitializer getWorkspaceInitializer() {
return mock(WorkspaceInitializer.class);
}
};
addConfiguration(withWorkspaceInitializer);
assertTrue(compositeConfiguration.getWorkspaceInitializer() instanceof CompositeWorkspaceInitializer);
}
@Test
public void testGetRepositoryInitializer() {
assertTrue(compositeConfiguration.getRepositoryInitializer() instanceof CompositeInitializer);
addConfiguration(new SecurityConfiguration.Default());
assertTrue(compositeConfiguration.getRepositoryInitializer() instanceof CompositeInitializer);
SecurityConfiguration withRepositoryInitializer = new SecurityConfiguration.Default() {
@NotNull
@Override
public RepositoryInitializer getRepositoryInitializer() {
return mock(RepositoryInitializer.class);
}
};
addConfiguration(withRepositoryInitializer);
assertTrue(compositeConfiguration.getRepositoryInitializer() instanceof CompositeInitializer);
}
@Test
public void testGetParameters() {
assertSame(ConfigurationParameters.EMPTY, compositeConfiguration.getParameters());
addConfiguration(new SecurityConfiguration.Default());
assertSame(ConfigurationParameters.EMPTY, compositeConfiguration.getParameters());
ConfigurationParameters params = ConfigurationParameters.of("a", "valueA", "b", "valueB");
SecurityConfiguration withParams = new SecurityConfiguration.Default() {
@NotNull
@Override
public ConfigurationParameters getParameters() {
return params;
}
};
addConfiguration(withParams);
assertEquals(ImmutableSet.copyOf(params.keySet()), ImmutableSet.copyOf(compositeConfiguration.getParameters().keySet()));
ConfigurationParameters params2 = ConfigurationParameters.of("a", "valueA2", "c", "valueC");
SecurityConfiguration withParams2 = new SecurityConfiguration.Default() {
@NotNull
@Override
public ConfigurationParameters getParameters() {
return params2;
}
};
addConfiguration(withParams2);
ConfigurationParameters compositeParams = compositeConfiguration.getParameters();
assertEquals(3, compositeParams.size());
assertEquals(ImmutableSet.copyOf(ConfigurationParameters.of(params, params2).keySet()), ImmutableSet.copyOf(compositeParams.keySet()));
assertEquals("valueA2", compositeParams.getConfigValue("a", "def"));
}
@Test
public void testGetMonitors() {
StatisticsProvider statisticsProvider = StatisticsProvider.NOOP;
assertTrue(Iterables.isEmpty(compositeConfiguration.getMonitors(statisticsProvider)));
addConfiguration(new SecurityConfiguration.Default());
assertTrue(Iterables.isEmpty(compositeConfiguration.getMonitors(statisticsProvider)));
Monitor<LoginModuleMonitor> monitor = mock(LoginModuleMonitor.class);
SecurityConfiguration withMonitors = new SecurityConfiguration.Default() {
@NotNull
@Override
public Iterable<Monitor<?>> getMonitors(@NotNull StatisticsProvider statisticsProvider) {
return ImmutableList.of(monitor);
}
};
addConfiguration(withMonitors);
Iterable<Monitor<?>> monitors = compositeConfiguration.getMonitors(statisticsProvider);
assertEquals(1, Iterables.size(monitors));
assertSame(monitor, monitors.iterator().next());
}
}