blob: daa1ef7d583698dc6e765419743ea7d5f9509bed [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.commons.configuration2.builder.combined;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.configuration2.ConfigurationAssert;
import org.apache.commons.configuration2.XMLConfiguration;
import org.apache.commons.configuration2.beanutils.BeanHelper;
import org.apache.commons.configuration2.builder.BasicBuilderParameters;
import org.apache.commons.configuration2.builder.BasicConfigurationBuilder;
import org.apache.commons.configuration2.builder.BuilderParameters;
import org.apache.commons.configuration2.builder.ConfigurationBuilder;
import org.apache.commons.configuration2.builder.DefaultParametersHandler;
import org.apache.commons.configuration2.builder.DefaultParametersManager;
import org.apache.commons.configuration2.builder.XMLBuilderParametersImpl;
import org.apache.commons.configuration2.builder.fluent.FileBasedBuilderParameters;
import org.easymock.EasyMock;
import org.junit.Test;
/**
* Test class for {@code CombinedBuilderParametersImpl}.
*
*/
public class TestCombinedBuilderParametersImpl
{
/**
* Tests fromParameters() if the map does not contain an instance.
*/
@Test
public void testFromParametersNotFound()
{
assertNull("Got an instance",
CombinedBuilderParametersImpl
.fromParameters(new HashMap<>()));
}
/**
* Tests whether a new instance can be created if none is found in the
* parameters map.
*/
@Test
public void testFromParametersCreate()
{
final CombinedBuilderParametersImpl params =
CombinedBuilderParametersImpl.fromParameters(
new HashMap<>(), true);
assertNotNull("No instance", params);
assertNull("Got data", params.getDefinitionBuilder());
}
/**
* Tests whether an instance can be obtained from a parameters map.
*/
@Test
public void testFromParametersExisting()
{
final CombinedBuilderParametersImpl params = new CombinedBuilderParametersImpl();
final Map<String, Object> map = params.getParameters();
assertSame("Wrong result", params,
CombinedBuilderParametersImpl.fromParameters(map));
}
/**
* Tests that inherited properties are also stored in the parameters map.
*/
@Test
public void testGetParametersInherited()
{
final CombinedBuilderParametersImpl params =
new CombinedBuilderParametersImpl();
params.setThrowExceptionOnMissing(true);
final Map<String, Object> map = params.getParameters();
assertEquals("Exception flag not found", Boolean.TRUE,
map.get("throwExceptionOnMissing"));
}
/**
* Tests whether the flag that controls settings inheritance can be set.
*/
@Test
public void testSetInheritSettings()
{
final CombinedBuilderParametersImpl params =
new CombinedBuilderParametersImpl();
assertTrue("Wrong initial value", params.isInheritSettings());
assertSame("Wrong result", params, params.setInheritSettings(false));
assertFalse("Property not set", params.isInheritSettings());
}
/**
* Tests whether the definition builder can be set.
*/
@Test
public void testSetDefinitionBuilder()
{
final CombinedBuilderParametersImpl params = new CombinedBuilderParametersImpl();
assertNull("Got a definition builder", params.getDefinitionBuilder());
final ConfigurationBuilder<XMLConfiguration> builder =
new BasicConfigurationBuilder<>(
XMLConfiguration.class);
assertSame("Wrong result", params, params.setDefinitionBuilder(builder));
assertSame("Builder was not set", builder,
params.getDefinitionBuilder());
}
/**
* Tests whether the map with providers is initially empty.
*/
@Test
public void testGetProvidersInitial()
{
final CombinedBuilderParametersImpl params = new CombinedBuilderParametersImpl();
assertTrue("Got providers", params.getProviders().isEmpty());
}
/**
* Tests whether a new builder provider can be registered.
*/
@Test
public void testRegisterProvider()
{
final ConfigurationBuilderProvider provider =
EasyMock.createMock(ConfigurationBuilderProvider.class);
EasyMock.replay(provider);
final String tagName = "testTag";
final CombinedBuilderParametersImpl params = new CombinedBuilderParametersImpl();
assertSame("Wrong result", params,
params.registerProvider(tagName, provider));
final Map<String, ConfigurationBuilderProvider> providers =
params.getProviders();
assertEquals("Wrong number of providers", 1, providers.size());
assertSame("Wrong provider (1)", provider, providers.get(tagName));
assertSame("Wrong provider (2)", provider,
params.providerForTag(tagName));
}
/**
* Tries to register a provider without a tag name.
*/
@Test(expected = IllegalArgumentException.class)
public void testRegisterProviderNoTag()
{
new CombinedBuilderParametersImpl().registerProvider(null,
EasyMock.createMock(ConfigurationBuilderProvider.class));
}
/**
* Tries to register a null provider.
*/
@Test(expected = IllegalArgumentException.class)
public void testRegisterProviderNoProvider()
{
new CombinedBuilderParametersImpl().registerProvider("aTag", null);
}
/**
* Tests that the map with providers cannot be modified.
*/
@Test(expected = UnsupportedOperationException.class)
public void testGetProvidersModify()
{
final CombinedBuilderParametersImpl params = new CombinedBuilderParametersImpl();
params.getProviders().put("tag",
EasyMock.createMock(ConfigurationBuilderProvider.class));
}
/**
* Tests whether missing providers can be registered.
*/
@Test
public void testRegisterMissingProviders()
{
final ConfigurationBuilderProvider provider1 =
EasyMock.createMock(ConfigurationBuilderProvider.class);
final ConfigurationBuilderProvider provider2 =
EasyMock.createMock(ConfigurationBuilderProvider.class);
final ConfigurationBuilderProvider provider3 =
EasyMock.createMock(ConfigurationBuilderProvider.class);
final String tagPrefix = "testTag";
final CombinedBuilderParametersImpl params = new CombinedBuilderParametersImpl();
params.registerProvider(tagPrefix, provider1);
final Map<String, ConfigurationBuilderProvider> map =
new HashMap<>();
map.put(tagPrefix, provider2);
map.put(tagPrefix + 1, provider3);
assertSame("Wrong result", params, params.registerMissingProviders(map));
assertEquals("Wrong number of providers", 2, params.getProviders()
.size());
assertSame("Wrong provider (1)", provider1,
params.providerForTag(tagPrefix));
assertSame("Wrong provider (2)", provider3,
params.providerForTag(tagPrefix + 1));
}
/**
* Tries to register a null map with missing providers.
*/
@Test(expected = IllegalArgumentException.class)
public void testRegisterMissingProvidersNullMap()
{
final Map<String, ConfigurationBuilderProvider> map = null;
new CombinedBuilderParametersImpl().registerMissingProviders(map);
}
/**
* Tries to register a map with missing providers containing a null entry.
*/
@Test(expected = IllegalArgumentException.class)
public void testRegisterMissingProvidersNullEntry()
{
final Map<String, ConfigurationBuilderProvider> map =
new HashMap<>();
map.put("tag", null);
new CombinedBuilderParametersImpl().registerMissingProviders(map);
}
/**
* Tests whether missing providers can be copied from a parameters object.
*/
@Test
public void testRegisterMissingProvidersParams()
{
final ConfigurationBuilderProvider provider1 =
EasyMock.createMock(ConfigurationBuilderProvider.class);
final ConfigurationBuilderProvider provider2 =
EasyMock.createMock(ConfigurationBuilderProvider.class);
final ConfigurationBuilderProvider provider3 =
EasyMock.createMock(ConfigurationBuilderProvider.class);
final String tagPrefix = "testTag";
final CombinedBuilderParametersImpl params =
new CombinedBuilderParametersImpl();
final CombinedBuilderParametersImpl params2 =
new CombinedBuilderParametersImpl();
params.registerProvider(tagPrefix, provider1);
params2.registerProvider(tagPrefix, provider2);
params2.registerProvider(tagPrefix + 1, provider3);
assertSame("Wrong result", params,
params.registerMissingProviders(params2));
assertEquals("Wrong number of providers", 2, params.getProviders()
.size());
assertSame("Wrong provider (1)", provider1,
params.providerForTag(tagPrefix));
assertSame("Wrong provider (2)", provider3,
params.providerForTag(tagPrefix + 1));
}
/**
* Tries to copy providers from a null parameters object.
*/
@Test(expected = IllegalArgumentException.class)
public void testRegisterMissingProvidersParamsNull()
{
new CombinedBuilderParametersImpl()
.registerMissingProviders((CombinedBuilderParametersImpl) null);
}
/**
* Tests the result for an unknown provider.
*/
@Test
public void testProviderForUnknown()
{
final CombinedBuilderParametersImpl params = new CombinedBuilderParametersImpl();
assertNull("Got a provider", params.providerForTag("someTag"));
}
/**
* Tests whether the base path can be set.
*/
@Test
public void testSetBasePath()
{
final CombinedBuilderParametersImpl params =
new CombinedBuilderParametersImpl();
final String basePath = ConfigurationAssert.OUT_DIR.getAbsolutePath();
assertSame("Wrong result", params, params.setBasePath(basePath));
assertEquals("Wrong base path", basePath, params.getBasePath());
}
/**
* Tests whether a parameters object for the definition builder can be set.
*/
@Test
public void testSetDefinitionBuilderParameters()
{
final BuilderParameters defparams =
EasyMock.createMock(BuilderParameters.class);
EasyMock.replay(defparams);
final CombinedBuilderParametersImpl params =
new CombinedBuilderParametersImpl();
assertSame("Wrong result", params,
params.setDefinitionBuilderParameters(defparams));
assertSame("Wrong parameters object", defparams,
params.getDefinitionBuilderParameters());
}
/**
* Tests whether properties can be set using BeanUtils.
*/
@Test
public void testSetBeanProperties() throws Exception
{
final BuilderParameters defparams =
EasyMock.createMock(BuilderParameters.class);
EasyMock.replay(defparams);
final CombinedBuilderParametersImpl params =
new CombinedBuilderParametersImpl();
BeanHelper.setProperty(params, "basePath", "testPath");
BeanHelper.setProperty(params, "definitionBuilderParameters",
defparams);
BeanHelper.setProperty(params, "inheritSettings", false);
assertEquals("Wrong path", "testPath", params.getBasePath());
assertSame("Wrong def parameters", defparams,
params.getDefinitionBuilderParameters());
assertFalse("Wrong inherit flag", params.isInheritSettings());
}
/**
* Tests whether cloning works as expected.
*/
@Test
public void testClone()
{
final CombinedBuilderParametersImpl params =
new CombinedBuilderParametersImpl();
params.setBasePath("some base path");
final XMLBuilderParametersImpl defParams = new XMLBuilderParametersImpl();
defParams.setSystemID("someSysID");
params.setDefinitionBuilderParameters(defParams);
final CombinedBuilderParametersImpl clone = params.clone();
assertEquals("Wrong field value", params.getBasePath(),
clone.getBasePath());
assertNotSame("Parameters object not cloned",
params.getDefinitionBuilderParameters(),
clone.getDefinitionBuilderParameters());
assertEquals(
"Wrong field value in parameters object",
params.getDefinitionBuilderParameters().getParameters()
.get("systemID"),
clone.getDefinitionBuilderParameters().getParameters()
.get("systemID"));
}
/**
* Tests whether a default parameters manager is dynamically created if it
* has not been set.
*/
@Test
public void testGetChildDefaultParametersManagerUndefined()
{
final CombinedBuilderParametersImpl params =
new CombinedBuilderParametersImpl();
assertNotNull("No default manager",
params.getChildDefaultParametersManager());
}
/**
* Tests whether a default parameters manager can be set and queried.
*/
@Test
public void testGetChildDefaultParametersManagerSpecific()
{
final DefaultParametersManager manager =
EasyMock.createMock(DefaultParametersManager.class);
EasyMock.replay(manager);
final CombinedBuilderParametersImpl params =
new CombinedBuilderParametersImpl();
assertSame("Wrong result", params,
params.setChildDefaultParametersManager(manager));
assertSame("Wrong manager", manager,
params.getChildDefaultParametersManager());
}
/**
* Creates a mock for a defaults handler.
*
* @return the handler mock
*/
private static DefaultParametersHandler<BuilderParameters> createDefaultsHandlerMock()
{
@SuppressWarnings("unchecked")
final
DefaultParametersHandler<BuilderParameters> mock =
EasyMock.createMock(DefaultParametersHandler.class);
return mock;
}
/**
* Tests whether a defaults handler for a child source can be registered.
*/
@Test
public void testRegisterChildDefaultsHandler()
{
final DefaultParametersManager manager =
EasyMock.createMock(DefaultParametersManager.class);
final DefaultParametersHandler<BuilderParameters> handler =
createDefaultsHandlerMock();
manager.registerDefaultsHandler(BuilderParameters.class, handler);
EasyMock.replay(manager, handler);
final CombinedBuilderParametersImpl params =
new CombinedBuilderParametersImpl();
params.setChildDefaultParametersManager(manager);
assertSame("Wrong result", params, params.registerChildDefaultsHandler(
BuilderParameters.class, handler));
EasyMock.verify(manager);
}
/**
* Tests whether a defaults handler for a child source with a class
* restriction can be registered.
*/
@Test
public void testRegisterChildDefaultsHandlerWithStartClass()
{
final DefaultParametersManager manager =
EasyMock.createMock(DefaultParametersManager.class);
final DefaultParametersHandler<BuilderParameters> handler =
createDefaultsHandlerMock();
manager.registerDefaultsHandler(BuilderParameters.class, handler,
FileBasedBuilderParameters.class);
EasyMock.replay(manager, handler);
final CombinedBuilderParametersImpl params =
new CombinedBuilderParametersImpl();
params.setChildDefaultParametersManager(manager);
assertSame("Wrong result", params,
params.registerChildDefaultsHandler(BuilderParameters.class,
handler, FileBasedBuilderParameters.class));
EasyMock.verify(manager);
}
/**
* Tests whether properties can be inherited.
*/
@Test
public void testInheritFrom()
{
final DefaultParametersManager manager =
EasyMock.createMock(DefaultParametersManager.class);
final CombinedBuilderParametersImpl params =
new CombinedBuilderParametersImpl().setInheritSettings(false)
.setChildDefaultParametersManager(manager);
params.setThrowExceptionOnMissing(true);
final CombinedBuilderParametersImpl params2 =
new CombinedBuilderParametersImpl();
params2.inheritFrom(params.getParameters());
final Map<String, Object> parameters = params2.getParameters();
assertEquals("Exception flag not set", Boolean.TRUE,
parameters.get("throwExceptionOnMissing"));
assertEquals("Default manager not set", manager,
params2.getChildDefaultParametersManager());
assertFalse("Inherit flag not set", params2.isInheritSettings());
}
/**
* Tests that inheritFrom() can handle a map which does not contain a
* parameters object.
*/
@Test
public void testInheritFromNoParametersInMap()
{
final BasicBuilderParameters params =
new BasicBuilderParameters().setThrowExceptionOnMissing(true);
final CombinedBuilderParametersImpl params2 =
new CombinedBuilderParametersImpl();
params2.inheritFrom(params.getParameters());
final Map<String, Object> parameters = params2.getParameters();
assertEquals("Exception flag not set", Boolean.TRUE,
parameters.get("throwExceptionOnMissing"));
}
}