org.wisdom.maven.utils.Properties2HoconConverterTest.java Source code

Java tutorial

Introduction

Here is the source code for org.wisdom.maven.utils.Properties2HoconConverterTest.java

Source

/*
 * #%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);
        }
    }

}