org.sonar.api.config.internal.MapSettingsTest.java Source code

Java tutorial

Introduction

Here is the source code for org.sonar.api.config.internal.MapSettingsTest.java

Source

/*
 * SonarQube
 * Copyright (C) 2009-2018 SonarSource SA
 * mailto:info AT sonarsource DOT com
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */
package org.sonar.api.config.internal;

import com.tngtech.java.junit.dataprovider.DataProvider;
import com.tngtech.java.junit.dataprovider.DataProviderRunner;
import com.tngtech.java.junit.dataprovider.UseDataProvider;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Random;
import java.util.function.BiConsumer;
import java.util.stream.IntStream;
import org.assertj.core.data.Offset;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.sonar.api.Properties;
import org.sonar.api.Property;
import org.sonar.api.PropertyType;
import org.sonar.api.config.PropertyDefinition;
import org.sonar.api.config.PropertyDefinitions;
import org.sonar.api.config.Settings;
import org.sonar.api.utils.DateUtils;

import static java.util.Collections.singletonList;
import static org.apache.commons.lang.RandomStringUtils.randomAlphanumeric;
import static org.assertj.core.api.Assertions.assertThat;

@RunWith(DataProviderRunner.class)
public class MapSettingsTest {
    @Rule
    public ExpectedException expectedException = ExpectedException.none();

    private PropertyDefinitions definitions;

    @Properties({ @Property(key = "hello", name = "Hello", defaultValue = "world"),
            @Property(key = "date", name = "Date", defaultValue = "2010-05-18"),
            @Property(key = "datetime", name = "DateTime", defaultValue = "2010-05-18T15:50:45+0100"),
            @Property(key = "boolean", name = "Boolean", defaultValue = "true"),
            @Property(key = "falseboolean", name = "False Boolean", defaultValue = "false"),
            @Property(key = "integer", name = "Integer", defaultValue = "12345"),
            @Property(key = "array", name = "Array", defaultValue = "one,two,three"),
            @Property(key = "multi_values", name = "Array", defaultValue = "1,2,3", multiValues = true),
            @Property(key = "sonar.jira", name = "Jira Server", type = PropertyType.PROPERTY_SET, propertySetKey = "jira"),
            @Property(key = "newKey", name = "New key", deprecatedKey = "oldKey"),
            @Property(key = "newKeyWithDefaultValue", name = "New key with default value", deprecatedKey = "oldKeyWithDefaultValue", defaultValue = "default_value"),
            @Property(key = "new_multi_values", name = "New multi values", defaultValue = "1,2,3", multiValues = true, deprecatedKey = "old_multi_values") })
    private static class Init {
    }

    @Rule
    public ExpectedException thrown = ExpectedException.none();

    @Before
    public void init_definitions() {
        definitions = new PropertyDefinitions();
        definitions.addComponent(Init.class);
    }

    @Test
    public void set_throws_NPE_if_key_is_null() {
        MapSettings underTest = new MapSettings();

        expectKeyNullNPE();

        underTest.set(null, randomAlphanumeric(3));
    }

    @Test
    public void set_throws_NPE_if_value_is_null() {
        MapSettings underTest = new MapSettings();

        expectedException.expect(NullPointerException.class);
        expectedException.expectMessage("value can't be null");

        underTest.set(randomAlphanumeric(3), null);
    }

    @Test
    public void set_accepts_empty_value_and_trims_it() {
        MapSettings underTest = new MapSettings();
        Random random = new Random();
        String key = randomAlphanumeric(3);

        underTest.set(key, blank(random));

        assertThat(underTest.getString(key)).isEmpty();
    }

    @Test
    public void default_values_should_be_loaded_from_definitions() {
        Settings settings = new MapSettings(definitions);
        assertThat(settings.getDefaultValue("hello")).isEqualTo("world");
    }

    @Test
    @UseDataProvider("setPropertyCalls")
    public void all_setProperty_methods_throws_NPE_if_key_is_null(BiConsumer<Settings, String> setPropertyCaller) {
        Settings settings = new MapSettings();

        expectKeyNullNPE();

        setPropertyCaller.accept(settings, null);
    }

    @Test
    public void set_property_string_throws_NPE_if_key_is_null() {
        String key = randomAlphanumeric(3);

        Settings underTest = new MapSettings(
                new PropertyDefinitions(singletonList(PropertyDefinition.builder(key).multiValues(true).build())));

        expectKeyNullNPE();

        underTest.setProperty(null, new String[] { "1", "2" });
    }

    private void expectKeyNullNPE() {
        expectedException.expect(NullPointerException.class);
        expectedException.expectMessage("key can't be null");
    }

    @Test
    @UseDataProvider("setPropertyCalls")
    public void all_set_property_methods_trims_key(BiConsumer<Settings, String> setPropertyCaller) {
        Settings underTest = new MapSettings();

        Random random = new Random();
        String blankBefore = blank(random);
        String blankAfter = blank(random);
        String key = randomAlphanumeric(3);

        setPropertyCaller.accept(underTest, blankBefore + key + blankAfter);

        assertThat(underTest.hasKey(key)).isTrue();
    }

    @Test
    public void set_property_string_array_trims_key() {
        String key = randomAlphanumeric(3);

        Settings underTest = new MapSettings(
                new PropertyDefinitions(singletonList(PropertyDefinition.builder(key).multiValues(true).build())));

        Random random = new Random();
        String blankBefore = blank(random);
        String blankAfter = blank(random);

        underTest.setProperty(blankBefore + key + blankAfter, new String[] { "1", "2" });

        assertThat(underTest.hasKey(key)).isTrue();
    }

    private static String blank(Random random) {
        StringBuilder b = new StringBuilder();
        IntStream.range(0, random.nextInt(3)).mapToObj(s -> " ").forEach(b::append);
        return b.toString();
    }

    @DataProvider
    public static Object[][] setPropertyCalls() {
        List<BiConsumer<Settings, String>> callers = Arrays.asList(
                (settings, key) -> settings.setProperty(key, 123),
                (settings, key) -> settings.setProperty(key, 123L),
                (settings, key) -> settings.setProperty(key, 123.2F),
                (settings, key) -> settings.setProperty(key, 123.2D),
                (settings, key) -> settings.setProperty(key, false),
                (settings, key) -> settings.setProperty(key, new Date()),
                (settings, key) -> settings.setProperty(key, new Date(), true));

        return callers.stream().map(t -> new Object[] { t }).toArray(Object[][]::new);
    }

    @Test
    public void setProperty_methods_trims_value() {
        Settings underTest = new MapSettings();

        Random random = new Random();
        String blankBefore = blank(random);
        String blankAfter = blank(random);
        String key = randomAlphanumeric(3);
        String value = randomAlphanumeric(3);

        underTest.setProperty(key, blankBefore + value + blankAfter);

        assertThat(underTest.getString(key)).isEqualTo(value);
    }

    @Test
    public void set_property_int() {
        Settings settings = new MapSettings();
        settings.setProperty("foo", 123);
        assertThat(settings.getInt("foo")).isEqualTo(123);
        assertThat(settings.getString("foo")).isEqualTo("123");
        assertThat(settings.getBoolean("foo")).isFalse();
    }

    @Test
    public void default_number_values_are_zero() {
        Settings settings = new MapSettings();
        assertThat(settings.getInt("foo")).isEqualTo(0);
        assertThat(settings.getLong("foo")).isEqualTo(0L);
    }

    @Test
    public void getInt_value_must_be_valid() {
        thrown.expect(NumberFormatException.class);

        Settings settings = new MapSettings();
        settings.setProperty("foo", "not a number");
        settings.getInt("foo");
    }

    @Test
    public void all_values_should_be_trimmed_set_property() {
        Settings settings = new MapSettings();
        settings.setProperty("foo", "   FOO ");
        assertThat(settings.getString("foo")).isEqualTo("FOO");
    }

    @Test
    public void test_get_default_value() {
        Settings settings = new MapSettings(definitions);
        assertThat(settings.getDefaultValue("unknown")).isNull();
    }

    @Test
    public void test_get_string() {
        Settings settings = new MapSettings(definitions);
        settings.setProperty("hello", "Russia");
        assertThat(settings.getString("hello")).isEqualTo("Russia");
    }

    @Test
    public void setProperty_date() {
        Settings settings = new MapSettings();
        Date date = DateUtils.parseDateTime("2010-05-18T15:50:45+0100");
        settings.setProperty("aDate", date);
        settings.setProperty("aDateTime", date, true);

        assertThat(settings.getString("aDate")).isEqualTo("2010-05-18");
        assertThat(settings.getString("aDateTime")).startsWith("2010-05-18T");
    }

    @Test
    public void test_get_date() {
        Settings settings = new MapSettings(definitions);
        assertThat(settings.getDate("unknown")).isNull();
        assertThat(settings.getDate("date").getDate()).isEqualTo(18);
        assertThat(settings.getDate("date").getMonth()).isEqualTo(4);
    }

    @Test
    public void test_get_date_not_found() {
        Settings settings = new MapSettings(definitions);
        assertThat(settings.getDate("unknown")).isNull();
    }

    @Test
    public void test_get_datetime() {
        Settings settings = new MapSettings(definitions);
        assertThat(settings.getDateTime("unknown")).isNull();
        assertThat(settings.getDateTime("datetime").getDate()).isEqualTo(18);
        assertThat(settings.getDateTime("datetime").getMonth()).isEqualTo(4);
        assertThat(settings.getDateTime("datetime").getMinutes()).isEqualTo(50);
    }

    @Test
    public void test_get_double() {
        Settings settings = new MapSettings();
        settings.setProperty("from_double", 3.14159);
        settings.setProperty("from_string", "3.14159");
        assertThat(settings.getDouble("from_double")).isEqualTo(3.14159, Offset.offset(0.00001));
        assertThat(settings.getDouble("from_string")).isEqualTo(3.14159, Offset.offset(0.00001));
        assertThat(settings.getDouble("unknown")).isNull();
    }

    @Test
    public void test_get_float() {
        Settings settings = new MapSettings();
        settings.setProperty("from_float", 3.14159f);
        settings.setProperty("from_string", "3.14159");
        assertThat(settings.getDouble("from_float")).isEqualTo(3.14159f, Offset.offset(0.00001));
        assertThat(settings.getDouble("from_string")).isEqualTo(3.14159f, Offset.offset(0.00001));
        assertThat(settings.getDouble("unknown")).isNull();
    }

    @Test
    public void test_get_bad_float() {
        Settings settings = new MapSettings();
        settings.setProperty("foo", "bar");

        thrown.expect(IllegalStateException.class);
        thrown.expectMessage("The property 'foo' is not a float value");
        settings.getFloat("foo");
    }

    @Test
    public void test_get_bad_double() {
        Settings settings = new MapSettings();
        settings.setProperty("foo", "bar");

        thrown.expect(IllegalStateException.class);
        thrown.expectMessage("The property 'foo' is not a double value");
        settings.getDouble("foo");
    }

    @Test
    public void testSetNullFloat() {
        Settings settings = new MapSettings();
        settings.setProperty("foo", (Float) null);
        assertThat(settings.getFloat("foo")).isNull();
    }

    @Test
    public void testSetNullDouble() {
        Settings settings = new MapSettings();
        settings.setProperty("foo", (Double) null);
        assertThat(settings.getDouble("foo")).isNull();
    }

    @Test
    public void getStringArray() {
        Settings settings = new MapSettings(definitions);
        String[] array = settings.getStringArray("array");
        assertThat(array).isEqualTo(new String[] { "one", "two", "three" });
    }

    @Test
    public void setStringArray() {
        Settings settings = new MapSettings(definitions);
        settings.setProperty("multi_values", new String[] { "A", "B" });
        String[] array = settings.getStringArray("multi_values");
        assertThat(array).isEqualTo(new String[] { "A", "B" });
    }

    @Test
    public void setStringArrayTrimValues() {
        Settings settings = new MapSettings(definitions);
        settings.setProperty("multi_values", new String[] { " A ", " B " });
        String[] array = settings.getStringArray("multi_values");
        assertThat(array).isEqualTo(new String[] { "A", "B" });
    }

    @Test
    public void setStringArrayEscapeCommas() {
        Settings settings = new MapSettings(definitions);
        settings.setProperty("multi_values", new String[] { "A,B", "C,D" });
        String[] array = settings.getStringArray("multi_values");
        assertThat(array).isEqualTo(new String[] { "A,B", "C,D" });
    }

    @Test
    public void setStringArrayWithEmptyValues() {
        Settings settings = new MapSettings(definitions);
        settings.setProperty("multi_values", new String[] { "A,B", "", "C,D" });
        String[] array = settings.getStringArray("multi_values");
        assertThat(array).isEqualTo(new String[] { "A,B", "", "C,D" });
    }

    @Test
    public void setStringArrayWithNullValues() {
        Settings settings = new MapSettings(definitions);
        settings.setProperty("multi_values", new String[] { "A,B", null, "C,D" });
        String[] array = settings.getStringArray("multi_values");
        assertThat(array).isEqualTo(new String[] { "A,B", "", "C,D" });
    }

    @Test(expected = IllegalStateException.class)
    public void shouldFailToSetArrayValueOnSingleValueProperty() {
        Settings settings = new MapSettings(definitions);
        settings.setProperty("array", new String[] { "A", "B", "C" });
    }

    @Test
    public void getStringArray_no_value() {
        Settings settings = new MapSettings();
        String[] array = settings.getStringArray("array");
        assertThat(array).isEmpty();
    }

    @Test
    public void shouldTrimArray() {
        Settings settings = new MapSettings();
        settings.setProperty("foo", "  one,  two, three  ");
        String[] array = settings.getStringArray("foo");
        assertThat(array).isEqualTo(new String[] { "one", "two", "three" });
    }

    @Test
    public void shouldKeepEmptyValuesWhenSplitting() {
        Settings settings = new MapSettings();
        settings.setProperty("foo", "  one,  , two");
        String[] array = settings.getStringArray("foo");
        assertThat(array).isEqualTo(new String[] { "one", "", "two" });
    }

    @Test
    public void testDefaultValueOfGetString() {
        Settings settings = new MapSettings(definitions);
        assertThat(settings.getString("hello")).isEqualTo("world");
    }

    @Test
    public void set_property_boolean() {
        Settings settings = new MapSettings();
        settings.setProperty("foo", true);
        settings.setProperty("bar", false);
        assertThat(settings.getBoolean("foo")).isTrue();
        assertThat(settings.getBoolean("bar")).isFalse();
        assertThat(settings.getString("foo")).isEqualTo("true");
        assertThat(settings.getString("bar")).isEqualTo("false");
    }

    @Test
    public void ignore_case_of_boolean_values() {
        Settings settings = new MapSettings();
        settings.setProperty("foo", "true");
        settings.setProperty("bar", "TRUE");
        // labels in UI
        settings.setProperty("baz", "True");

        assertThat(settings.getBoolean("foo")).isTrue();
        assertThat(settings.getBoolean("bar")).isTrue();
        assertThat(settings.getBoolean("baz")).isTrue();
    }

    @Test
    public void get_boolean() {
        Settings settings = new MapSettings(definitions);
        assertThat(settings.getBoolean("boolean")).isTrue();
        assertThat(settings.getBoolean("falseboolean")).isFalse();
        assertThat(settings.getBoolean("unknown")).isFalse();
        assertThat(settings.getBoolean("hello")).isFalse();
    }

    @Test
    public void shouldCreateByIntrospectingComponent() {
        Settings settings = new MapSettings();
        settings.getDefinitions().addComponent(MyComponent.class);

        // property definition has been loaded, ie for default value
        assertThat(settings.getDefaultValue("foo")).isEqualTo("bar");
    }

    @Property(key = "foo", name = "Foo", defaultValue = "bar")
    public static class MyComponent {

    }

    @Test
    public void getStringLines_no_value() {
        assertThat(new MapSettings().getStringLines("foo")).hasSize(0);
    }

    @Test
    public void getStringLines_single_line() {
        Settings settings = new MapSettings();
        settings.setProperty("foo", "the line");
        assertThat(settings.getStringLines("foo")).isEqualTo(new String[] { "the line" });
    }

    @Test
    public void getStringLines_linux() {
        Settings settings = new MapSettings();
        settings.setProperty("foo", "one\ntwo");
        assertThat(settings.getStringLines("foo")).isEqualTo(new String[] { "one", "two" });

        settings.setProperty("foo", "one\ntwo\n");
        assertThat(settings.getStringLines("foo")).isEqualTo(new String[] { "one", "two" });
    }

    @Test
    public void getStringLines_windows() {
        Settings settings = new MapSettings();
        settings.setProperty("foo", "one\r\ntwo");
        assertThat(settings.getStringLines("foo")).isEqualTo(new String[] { "one", "two" });

        settings.setProperty("foo", "one\r\ntwo\r\n");
        assertThat(settings.getStringLines("foo")).isEqualTo(new String[] { "one", "two" });
    }

    @Test
    public void getStringLines_mix() {
        Settings settings = new MapSettings();
        settings.setProperty("foo", "one\r\ntwo\nthree");
        assertThat(settings.getStringLines("foo")).isEqualTo(new String[] { "one", "two", "three" });
    }

    @Test
    public void getKeysStartingWith() {
        Settings settings = new MapSettings();
        settings.setProperty("sonar.jdbc.url", "foo");
        settings.setProperty("sonar.jdbc.username", "bar");
        settings.setProperty("sonar.security", "admin");

        assertThat(settings.getKeysStartingWith("sonar")).containsOnly("sonar.jdbc.url", "sonar.jdbc.username",
                "sonar.security");
        assertThat(settings.getKeysStartingWith("sonar.jdbc")).containsOnly("sonar.jdbc.url",
                "sonar.jdbc.username");
        assertThat(settings.getKeysStartingWith("other")).hasSize(0);
    }

    @Test
    public void should_fallback_deprecated_key_to_default_value_of_new_key() {
        Settings settings = new MapSettings(definitions);

        assertThat(settings.getString("newKeyWithDefaultValue")).isEqualTo("default_value");
        assertThat(settings.getString("oldKeyWithDefaultValue")).isEqualTo("default_value");
    }

    @Test
    public void should_fallback_deprecated_key_to_new_key() {
        Settings settings = new MapSettings(definitions);
        settings.setProperty("newKey", "value of newKey");

        assertThat(settings.getString("newKey")).isEqualTo("value of newKey");
        assertThat(settings.getString("oldKey")).isEqualTo("value of newKey");
    }

    @Test
    public void should_load_value_of_deprecated_key() {
        // it's used for example when deprecated settings are set through command-line
        Settings settings = new MapSettings(definitions);
        settings.setProperty("oldKey", "value of oldKey");

        assertThat(settings.getString("newKey")).isEqualTo("value of oldKey");
        assertThat(settings.getString("oldKey")).isEqualTo("value of oldKey");
    }

    @Test
    public void should_load_values_of_deprecated_key() {
        Settings settings = new MapSettings(definitions);
        settings.setProperty("oldKey", "a,b");

        assertThat(settings.getStringArray("newKey")).containsOnly("a", "b");
        assertThat(settings.getStringArray("oldKey")).containsOnly("a", "b");
    }

    @Test
    public void should_support_deprecated_props_with_multi_values() {
        Settings settings = new MapSettings(definitions);
        settings.setProperty("new_multi_values", new String[] { " A ", " B " });
        assertThat(settings.getStringArray("new_multi_values")).isEqualTo(new String[] { "A", "B" });
        assertThat(settings.getStringArray("old_multi_values")).isEqualTo(new String[] { "A", "B" });
    }
}