/*
* #%L
* Wisdom-Framework
* %%
* Copyright (C) 2013 - 2014 Wisdom Framework
* %%
* Licensed 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.
* #L%
*/
package org.wisdom.maven.utils;
import com.google.common.collect.Iterators;
import com.typesafe.config.Config;
import com.typesafe.config.ConfigFactory;
import org.apache.commons.compress.utils.IOUtils;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.junit.Test;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.Properties;
import java.util.concurrent.TimeUnit;
import static org.assertj.core.api.Assertions.assertThat;
public class Properties2HoconConverterTest {
private File root = new File("target/test-classes/properties");
@Test(expected = IllegalArgumentException.class)
public void testMissingFile() throws IOException {
File props = new File(root, "missing.properties");
Properties2HoconConverter.convert(props, true);
}
@Test(expected = IllegalArgumentException.class)
public void testEmptyFile() throws IOException {
File props = new File(root, "empty.properties");
Properties2HoconConverter.convert(props, true);
}
@Test
public void testOnWikipediaSample() throws IOException {
File props = new File(root, "/wiki.properties");
File hocon = Properties2HoconConverter.convert(props, true);
PropertiesConfiguration properties = loadPropertiesWithApacheConfiguration(props);
assertThat(properties).isNotNull();
Config config = load(hocon);
assertThat(properties.isEmpty()).isFalse();
assertThat(config.isEmpty()).isFalse();
Iterator<String> iterator = properties.getKeys();
String[] names = Iterators.toArray(iterator, String.class);
for (String name : names) {
if (!name.isEmpty()) {
// 'cheeses' is not supported by commons-config.
String o = properties.getString(name);
String v = config.getString(name);
assertThat(o).isEqualTo(v);
}
}
assertThat(config.getString("cheeses")).isEmpty();
}
@Test
public void testOnWikipediaSampleUsingRawProperties() throws IOException {
File props = new File(root, "/wiki.properties");
File hocon = Properties2HoconConverter.convert(props, true);
Properties properties = loadProperties(props);
Config config = load(hocon);
assertThat(properties.isEmpty()).isFalse();
assertThat(config.isEmpty()).isFalse();
for (String name : properties.stringPropertyNames()) {
// Ignored properties are they are not supported in the 'regular' raw format.
if (name.equalsIgnoreCase("targetCities") || name.equalsIgnoreCase("Los")) {
continue;
}
String o = (String) properties.get(name);
String v = config.getString(name);
assertThat(o).isEqualTo(v);
}
}
@Test
public void testTypes() throws IOException {
File props = new File(root, "/types.properties");
File hocon = Properties2HoconConverter.convert(props, true);
PropertiesConfiguration properties = loadPropertiesWithApacheConfiguration(props);
Config config = load(hocon);
assertThat(properties).isNotNull();
assertThat(properties.isEmpty()).isFalse();
assertThat(config.isEmpty()).isFalse();
assertThat(config.getString("conf.string")).isEqualTo("foo");
assertThat(config.getString("conf.int")).isEqualTo("1");
assertThat(config.getInt("conf.int")).isEqualTo(1);
assertThat(config.getNumber("conf.int")).isEqualTo(1);
assertThat(config.getString("conf.float")).isEqualTo("1.1");
assertThat(config.getNumber("conf.float")).isEqualTo(1.1);
assertThat(config.getNumber("conf.float")).isEqualTo(1.1d);
assertThat(config.getDouble("conf.float")).isEqualTo(1.1d);
assertThat(config.getBoolean("conf.boolean.true")).isTrue();
assertThat(config.getBoolean("conf.boolean.false")).isFalse();
assertThat(config.getBoolean("conf.boolean.yes")).isTrue();
assertThat(config.getBoolean("conf.boolean.no")).isFalse();
assertThat(config.getBoolean("conf.boolean.on")).isTrue();
assertThat(config.getBoolean("conf.boolean.off")).isFalse();
assertThat(config.getDuration("conf.unit.time", TimeUnit.MILLISECONDS)).isEqualTo(10l);
assertThat(config.getDuration("conf.unit.time", TimeUnit.MICROSECONDS)).isEqualTo(10000l);
assertThat(config.getBytes("conf.unit.size")).isEqualTo(512*1024);
assertThat(config.getBytes("conf.unit.size2")).isEqualTo(10);
assertThat(config.getIntList("conf.list.int")).containsExactly(1, 2, 3);
assertThat(config.getStringList("conf.list.string")).containsExactly("a", "b", "c");
assertThat(config.hasPath("conf.missing")).isFalse();
assertThat(config.getString("conf.quotes")).isEqualTo("http://example.com");
}
@Test
public void testMonitor() throws IOException {
File props = new File(root, "/monitor.properties");
File hocon = Properties2HoconConverter.convert(props, true);
Config config = load(hocon);
assertThat(config.isEmpty()).isFalse();
assertThat(config.getString("application.secret")).isEqualTo("I;" +
">qOs/VgFe?l@>Kn/RGa0p9b1ji?Kg7uhjAPHdIO8>@<em_AFs[BAMUQ0D]eOLV");
assertThat(config.getBoolean("monitor.http.enabled")).isTrue();
assertThat(config.getBoolean("monitor.jmx.enabled")).isTrue();
assertThat(config.getBoolean("monitor.auth.enabled")).isTrue();
assertThat(config.getString("monitor.auth.username")).isEqualTo("admin");
assertThat(config.getString("monitor.auth.password")).isEqualTo("admin");
}
@Test
public void testOpenJPASample() throws IOException {
File props = new File(root, "/openjpa-sample.properties");
File hocon = Properties2HoconConverter.convert(props, true);
Config config = load(hocon);
assertThat(config.isEmpty()).isFalse();
assertThat(config.getString("application.secret")).isEqualTo
("8pHS=Y/GI>fmUU=LVPKfrgilk^hBk?aOB0a4CFLCg@JX=JHwTvsc7g;QQWl?;IDO");
assertThat(config.getBoolean("monitor.http.enabled")).isTrue();
assertThat(config.getBoolean("monitor.jmx.enabled")).isTrue();
assertThat(config.getBoolean("monitor.auth.enabled")).isTrue();
assertThat(config.getString("monitor.auth.username")).isEqualTo("admin");
assertThat(config.getString("monitor.auth.password")).isEqualTo("admin");
assertThat(config.getBoolean("documentation.standalone")).isFalse();
assertThat(config.getString("db.todo.driver")).isEqualTo("org.h2.Driver");
assertThat(config.getString("db.todo.url")).isEqualTo("jdbc:h2:database/todo.db");
}
@Test
public void testCornerCases() throws IOException {
File props = new File(root, "/corner-cases.properties");
File hocon = Properties2HoconConverter.convert(props, true);
Config config = load(hocon);
assertThat(config.isEmpty()).isFalse();
// 1 - weird keys
// Must use quotes
assertThat(config.getString("\":=\"")).isEqualTo("weird");
assertThat(config.getString("with spaces")).isEqualTo("spaces");
assertThat(config.getString("3")).isEqualTo("number");
// 2 - Multi lines
assertThat(config.getString("multilines")).contains("foo,").contains("bar,").contains("baz");
assertThat(config.getString("multilines_with_empty_blank_line")).isEqualTo("foo, bar, baz");
// 3 - The different syntax
assertThat(config.getString("truth.1")).isEqualTo("Beauty");
assertThat(config.getString("truth.2")).isEqualTo("Beauty");
assertThat(config.getString("truth.3")).isEqualTo("Beauty");
// 4 - The key only
assertThat(config.getString("cheeses")).isEqualTo("");
// 5 - Interpolation
assertThat(config.getString("foo.interpolated")).isEqualTo("baz - hello");
}
private Config load(File hocon) {
return ConfigFactory.parseFile(hocon).resolve();
}
public final PropertiesConfiguration loadPropertiesWithApacheConfiguration(File file) {
PropertiesConfiguration propertiesConfiguration = new PropertiesConfiguration();
propertiesConfiguration.setEncoding("utf-8");
propertiesConfiguration.setDelimiterParsingDisabled(true);
propertiesConfiguration.setFile(file);
propertiesConfiguration.setListDelimiter(',');
propertiesConfiguration.getLayout().setSingleLine("application.secret", true);
try {
propertiesConfiguration.load(file);
} catch (ConfigurationException e) {
return null;
}
return propertiesConfiguration;
}
public final Properties loadProperties(File props) throws IOException {
Properties properties = new Properties();
FileInputStream fis = null;
try {
fis = new FileInputStream(props);
properties.load(fis);
return properties;
} finally {
IOUtils.closeQuietly(fis);
}
}
}