blob: 86968178916279e6e40e558821e99eb073ee7e2a [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
*
* https://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;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNotSame;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertSame;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.Mockito.mock;
import java.io.File;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.configuration2.ConfigurationAssert;
import org.apache.commons.configuration2.beanutils.BeanHelper;
import org.apache.commons.configuration2.io.FileBased;
import org.apache.commons.configuration2.io.FileHandler;
import org.apache.commons.configuration2.io.FileLocationStrategy;
import org.apache.commons.configuration2.io.FileSystem;
import org.junit.jupiter.api.Test;
/**
* Test class for {@code FileBasedBuilderParametersImpl}.
*/
public class TestFileBasedBuilderParameters {
/**
* Tests whether reflection-based property access through BeanUtils is possible.
*/
@Test
void testBeanPropertiesAccess() throws Exception {
final FileBasedBuilderParametersImpl params = new FileBasedBuilderParametersImpl();
BeanHelper.setProperty(params, "throwExceptionOnMissing", Boolean.TRUE);
BeanHelper.setProperty(params, "fileName", "test.xml");
assertEquals("test.xml", params.getFileHandler().getFileName());
final Map<String, Object> map = params.getParameters();
assertEquals(Boolean.TRUE, map.get("throwExceptionOnMissing"));
}
/**
* Tests a clone operation.
*/
@Test
void testClone() {
final FileBased content = mock(FileBased.class);
final FileHandler fh = new FileHandler(content);
final FileBasedBuilderParametersImpl params = new FileBasedBuilderParametersImpl(fh);
params.setThrowExceptionOnMissing(true);
params.setFileName("test.xml");
final FileBasedBuilderParametersImpl clone = params.clone();
assertEquals(Boolean.TRUE, clone.getParameters().get("throwExceptionOnMissing"));
assertEquals("test.xml", clone.getFileHandler().getFileName());
assertSame(content, clone.getFileHandler().getContent());
assertNotSame(params.getFileHandler(), clone.getFileHandler());
}
/**
* Tests whether an instance can be created from a map.
*/
@Test
void testFromMap() {
final ReloadingDetectorFactory factory = mock(ReloadingDetectorFactory.class);
final Map<String, Object> map = new HashMap<>();
final String fileName = "someFileName";
final String basePath = "someBasePath";
final Long refreshDelay = 20140628222302L;
map.put("basePath", basePath);
map.put("fileName", fileName);
map.put("reloadingDetectorFactory", factory);
map.put("reloadingRefreshDelay", refreshDelay);
final FileBasedBuilderParametersImpl params = FileBasedBuilderParametersImpl.fromMap(map);
assertEquals(basePath, params.getFileHandler().getBasePath());
assertEquals(fileName, params.getFileHandler().getFileName());
assertEquals(factory, params.getReloadingDetectorFactory());
assertEquals(refreshDelay, params.getReloadingRefreshDelay());
}
/**
* Tests fromMap() for null input.
*/
@Test
void testFromMapNull() {
final FileBasedBuilderParametersImpl params = FileBasedBuilderParametersImpl.fromMap(null);
assertNull(params.getReloadingRefreshDelay());
assertNull(params.getFileHandler().getFileName());
}
/**
* Tests whether fromParameters() can return a default instance if the map does not contain an instance.
*/
@Test
void testFromParametersDefaultInstance() {
final FileBasedBuilderParametersImpl params = FileBasedBuilderParametersImpl.fromParameters(new HashMap<>(), true);
assertFalse(params.getFileHandler().isLocationDefined());
}
/**
* Tests whether an instance can be extracted from a parameters map.
*/
@Test
void testFromParametersExtract() {
final FileBasedBuilderParametersImpl params = new FileBasedBuilderParametersImpl();
final Map<String, Object> map = params.getParameters();
assertSame(params, FileBasedBuilderParametersImpl.fromParameters(map));
}
/**
* Tests fromParameters() if the map does not contain an instance.
*/
@Test
void testFromParametersNotFound() {
assertNull(FileBasedBuilderParametersImpl.fromParameters(new HashMap<>()));
}
/**
* Tries to obtain an instance from a null parameters map.
*/
@Test
void testFromParametersNull() {
assertThrows(IllegalArgumentException.class, () -> FileBasedBuilderParametersImpl.fromParameters(null));
}
/**
* Tests whether a map with parameters can be queried.
*/
@Test
void testGetParameters() {
final FileBasedBuilderParametersImpl params = new FileBasedBuilderParametersImpl().setReloadingRefreshDelay(1000L);
params.setThrowExceptionOnMissing(true);
final Map<String, Object> map = params.getParameters();
assertTrue(map.containsValue(params));
assertEquals(Boolean.TRUE, params.getParameters().get("throwExceptionOnMissing"));
}
/**
* Tests whether properties can be inherited from another object.
*/
@Test
void testInheritFrom() {
final FileBasedBuilderParametersImpl params = new FileBasedBuilderParametersImpl();
params.setEncoding("ISO-8856-1");
params.setPath("A path");
params.setReloadingDetectorFactory(mock(ReloadingDetectorFactory.class));
params.setFileSystem(mock(FileSystem.class));
params.setLocationStrategy(mock(FileLocationStrategy.class));
params.setReloadingRefreshDelay(20160213171737L);
params.setThrowExceptionOnMissing(true);
final FileBasedBuilderParametersImpl params2 = new FileBasedBuilderParametersImpl();
params2.inheritFrom(params.getParameters());
assertEquals(params.getFileHandler().getEncoding(), params2.getFileHandler().getEncoding());
assertEquals(params.getFileHandler().getFileSystem(), params2.getFileHandler().getFileSystem());
assertEquals(params.getFileHandler().getLocationStrategy(), params2.getFileHandler().getLocationStrategy());
assertEquals(params.getReloadingDetectorFactory(), params2.getReloadingDetectorFactory());
assertEquals(params.getReloadingRefreshDelay(), params2.getReloadingRefreshDelay());
assertNull(params2.getFileHandler().getPath());
assertEquals(Boolean.TRUE, params2.getParameters().get("throwExceptionOnMissing"));
}
/**
* Tests inheritFrom() if no parameters object can be found in the map.
*/
@Test
void testInheritFromNoParametersObject() {
final FileBasedBuilderParametersImpl params = new FileBasedBuilderParametersImpl().setReloadingRefreshDelay(20160213211429L);
params.inheritFrom(new HashMap<>());
assertNotNull(params.getReloadingRefreshDelay());
}
/**
* Tests that missing properties in the passed in map are skipped by inheritFrom().
*/
@Test
void testInheritFromSkipMissingProperties() {
final String encoding = StandardCharsets.UTF_16.name();
final ReloadingDetectorFactory factory = mock(ReloadingDetectorFactory.class);
final Long refreshDelay = 20160213172611L;
final FileBasedBuilderParametersImpl params = new FileBasedBuilderParametersImpl().setEncoding(encoding).setReloadingDetectorFactory(factory)
.setReloadingRefreshDelay(refreshDelay);
params.inheritFrom(new FileBasedBuilderParametersImpl().getParameters());
assertEquals(encoding, params.getFileHandler().getEncoding());
assertEquals(factory, params.getReloadingDetectorFactory());
assertEquals(refreshDelay, params.getReloadingRefreshDelay());
}
/**
* Tests the standard constructor.
*/
@Test
void testInitDefaults() {
final FileBasedBuilderParametersImpl params = new FileBasedBuilderParametersImpl();
assertFalse(params.getFileHandler().isLocationDefined());
assertNull(params.getReloadingRefreshDelay());
}
/**
* Tests whether a file handler is accepted by the constructor.
*/
@Test
void testInitFileHandler() {
final FileHandler handler = new FileHandler();
final FileBasedBuilderParametersImpl params = new FileBasedBuilderParametersImpl(handler);
assertSame(handler, params.getFileHandler());
}
/**
* Tests whether a base path can be set.
*/
@Test
void testSetBasePath() {
final String path = ConfigurationAssert.getTestFile("test.properties").getParentFile().getAbsolutePath();
final FileBasedBuilderParametersImpl params = new FileBasedBuilderParametersImpl();
assertSame(params, params.setBasePath(path));
assertEquals(path, params.getFileHandler().getBasePath());
}
/**
* Tests whether an encoding can be set.
*/
@Test
void testSetEncoding() {
final String enc = StandardCharsets.ISO_8859_1.name();
final FileBasedBuilderParametersImpl params = new FileBasedBuilderParametersImpl();
assertSame(params, params.setEncoding(enc));
assertSame(enc, params.getFileHandler().getEncoding());
}
/**
* Tests whether a file can be set.
*/
@Test
void testSetFile() {
final File file = ConfigurationAssert.getTestFile("test.properties").getAbsoluteFile();
final FileBasedBuilderParametersImpl params = new FileBasedBuilderParametersImpl();
assertSame(params, params.setFile(file));
assertEquals(file, params.getFileHandler().getFile());
}
/**
* Tests whether a file name can be set.
*/
@Test
void testSetFileName() {
final String name = "testConfig.xml";
final FileBasedBuilderParametersImpl params = new FileBasedBuilderParametersImpl();
assertSame(params, params.setFileName(name));
assertEquals(name, params.getFileHandler().getFileName());
}
/**
* Tests whether a file system can be set.
*/
@Test
void testSetFileSystem() {
final FileSystem fs = mock(FileSystem.class);
final FileBasedBuilderParametersImpl params = new FileBasedBuilderParametersImpl();
assertSame(params, params.setFileSystem(fs));
assertSame(fs, params.getFileHandler().getFileSystem());
}
/**
* Tests whether a location strategy can be set.
*/
@Test
void testSetLocationStrategy() {
final FileLocationStrategy strat = mock(FileLocationStrategy.class);
final FileBasedBuilderParametersImpl params = new FileBasedBuilderParametersImpl();
assertSame(params, params.setLocationStrategy(strat));
assertSame(strat, params.getFileHandler().getLocationStrategy());
}
/**
* Tests whether a path can be set.
*/
@Test
void testSetPath() {
final String path = ConfigurationAssert.getTestFile("test.properties").getAbsolutePath();
final FileBasedBuilderParametersImpl params = new FileBasedBuilderParametersImpl();
assertSame(params, params.setPath(path));
assertEquals(path, params.getFileHandler().getPath());
}
/**
* Tests whether a factory for reloading detectors can be set.
*/
@Test
void testSetReloadingDetectorFactory() {
final ReloadingDetectorFactory factory = mock(ReloadingDetectorFactory.class);
final FileBasedBuilderParametersImpl params = new FileBasedBuilderParametersImpl();
assertNull(params.getReloadingDetectorFactory());
assertSame(params, params.setReloadingDetectorFactory(factory));
assertSame(factory, params.getReloadingDetectorFactory());
}
/**
* Tests whether the refresh delay can be set.
*/
@Test
void testSetReloadingRefreshDelay() {
final FileBasedBuilderParametersImpl params = new FileBasedBuilderParametersImpl();
final Long delay = 10000L;
assertSame(params, params.setReloadingRefreshDelay(delay));
assertEquals(delay, params.getReloadingRefreshDelay());
}
/**
* Tests whether a URL can be set.
*/
@Test
void testSetURL() {
final URL url = ConfigurationAssert.getTestURL("test.properties");
final FileBasedBuilderParametersImpl params = new FileBasedBuilderParametersImpl();
assertSame(params, params.setURL(url));
assertEquals(url.toExternalForm(), params.getFileHandler().getURL().toExternalForm());
}
}