io.servicecomb.config.TestConfigUtil.java Source code

Java tutorial

Introduction

Here is the source code for io.servicecomb.config.TestConfigUtil.java

Source

/*
 * Copyright 2017 Huawei Technologies Co., Ltd
 *
 * 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.
 */

package io.servicecomb.config;

import static com.seanyinx.github.unit.scaffolding.Randomness.uniquify;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.junit.Assert.assertThat;

import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;

import org.apache.commons.configuration.AbstractConfiguration;
import org.apache.commons.configuration.Configuration;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;

import com.netflix.config.ConcurrentCompositeConfiguration;
import com.netflix.config.DynamicConfiguration;
import com.netflix.config.DynamicPropertyFactory;
import com.netflix.config.DynamicWatchedConfiguration;

import io.servicecomb.config.archaius.sources.ConfigModel;
import io.servicecomb.config.archaius.sources.MicroserviceConfigLoader;
import io.servicecomb.config.spi.ConfigCenterConfigurationSource;
import io.servicecomb.foundation.common.utils.SPIServiceUtils;
import io.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
import mockit.Deencapsulation;
import mockit.Expectations;
import mockit.Mocked;

public class TestConfigUtil {

    private static final String systemPropertyName = "servicecomb.cse.servicecomb.system.setting";

    private static final String systemExpected = uniquify("ran");

    private static final String environmentPropertyName = "servicecomb.cse.servicecomb.environment.setting";

    private static final String environmentExpected = uniquify("ran");

    private final MapBasedConfigurationSource configurationSource = new MapBasedConfigurationSource();

    @BeforeClass
    public static void beforeTest() {
        ArchaiusUtils.resetConfig();

        System.setProperty(systemPropertyName, systemExpected);
        try {
            setEnv(environmentPropertyName, environmentExpected);
        } catch (Exception e) {
            throw new IllegalStateException(e);
        }

        ConfigUtil.installDynamicConfig();
    }

    @AfterClass
    public static void tearDown() throws Exception {
        ArchaiusUtils.resetConfig();
    }

    @Test
    public void testCreateConfigFromConfigCenterNoUrl(@Mocked Configuration localConfiguration) {
        AbstractConfiguration configFromConfigCenter = ConfigUtil.createConfigFromConfigCenter(localConfiguration);
        Assert.assertNull(configFromConfigCenter);
    }

    @Test
    public void testCreateDynamicConfigNoConfigCenterSPI() {
        new Expectations(SPIServiceUtils.class) {
            {
                SPIServiceUtils.getTargetService(ConfigCenterConfigurationSource.class);
                result = null;
            }
        };

        AbstractConfiguration dynamicConfig = ConfigUtil.createDynamicConfig();
        MicroserviceConfigLoader loader = ConfigUtil.getMicroserviceConfigLoader(dynamicConfig);
        List<ConfigModel> list = loader.getConfigModels();
        Assert.assertEquals(loader, ConfigUtil.getMicroserviceConfigLoader(dynamicConfig));
        Assert.assertEquals(1, list.size());
        Assert.assertNotEquals(DynamicWatchedConfiguration.class,
                ((ConcurrentCompositeConfiguration) dynamicConfig).getConfiguration(0).getClass());
    }

    @Test
    public void testCreateDynamicConfigHasConfigCenter(
            @Mocked ConfigCenterConfigurationSource configCenterConfigurationSource) {
        AbstractConfiguration dynamicConfig = ConfigUtil.createDynamicConfig();
        Assert.assertEquals(DynamicWatchedConfiguration.class,
                ((ConcurrentCompositeConfiguration) dynamicConfig).getConfiguration(0).getClass());
    }

    @Test
    public void testGetPropertyInvalidConfig() {
        Assert.assertNull(ConfigUtil.getProperty(null, "any"));
        Assert.assertNull(ConfigUtil.getProperty(new Object(), "any"));
    }

    @Test
    public void propertiesFromFileIsDuplicatedToCse() throws Exception {
        String expected = "value";

        assertThat(DynamicPropertyFactory.getInstance().getStringProperty("servicecomb.cse.servicecomb.file", null)
                .get(), equalTo(expected));

        assertThat(DynamicPropertyFactory.getInstance().getStringProperty("cse.cse.servicecomb.file", null).get(),
                equalTo(expected));
    }

    @Test
    public void propertiesFromSystemIsDuplicatedToCse() throws Exception {
        assertThat(DynamicPropertyFactory.getInstance().getStringProperty(systemPropertyName, null).get(),
                equalTo(systemExpected));

        assertThat(
                DynamicPropertyFactory.getInstance()
                        .getStringProperty("servicecomb.cse.servicecomb.system.setting", null).get(),
                equalTo(systemExpected));
    }

    @Test
    public void propertiesFromEnvironmentIsDuplicatedToCse() throws Exception {
        assertThat(DynamicPropertyFactory.getInstance().getStringProperty(environmentPropertyName, null).get(),
                equalTo(environmentExpected));

        assertThat(
                DynamicPropertyFactory.getInstance()
                        .getStringProperty("servicecomb.cse.servicecomb.environment.setting", null).get(),
                equalTo(environmentExpected));
    }

    @Test
    public void duplicateServiceCombConfigToCseListValue() throws Exception {
        List<String> list = Arrays.asList("a", "b");

        AbstractConfiguration config = new DynamicConfiguration();
        config.addProperty("servicecomb.list", list);
        Deencapsulation.invoke(ConfigUtil.class, "duplicateServiceCombConfigToCse", config);

        Object result = config.getProperty("cse.list");
        assertThat(result, instanceOf(List.class));
        assertThat(result, equalTo(list));
    }

    @Test
    public void propertiesAddFromDynamicConfigSourceIsDuplicated() throws Exception {
        String expected = uniquify("ran");
        String someProperty = "servicecomb.cse.servicecomb.add";
        String injectProperty = "cse.cse.servicecomb.add";

        configurationSource.addProperty(someProperty, expected);

        assertThat(DynamicPropertyFactory.getInstance().getStringProperty(someProperty, null).get(),
                equalTo(expected));
        assertThat(DynamicPropertyFactory.getInstance().getStringProperty(injectProperty, null).get(),
                equalTo(expected));

        String changed = uniquify("changed");
        configurationSource.addProperty(someProperty, changed);

        assertThat(DynamicPropertyFactory.getInstance().getStringProperty(someProperty, null).get(),
                equalTo(changed));
        assertThat(DynamicPropertyFactory.getInstance().getStringProperty(injectProperty, null).get(),
                equalTo(changed));

        expected = uniquify("ran");
        someProperty = "servicecomb.servicecomb.cse.add";
        injectProperty = "cse.servicecomb.cse.add";

        configurationSource.addProperty(someProperty, expected);

        assertThat(DynamicPropertyFactory.getInstance().getStringProperty(someProperty, null).get(),
                equalTo(expected));
        assertThat(DynamicPropertyFactory.getInstance().getStringProperty(injectProperty, null).get(),
                equalTo(expected));

        changed = uniquify("changed");
        configurationSource.addProperty(someProperty, changed);

        assertThat(DynamicPropertyFactory.getInstance().getStringProperty(someProperty, null).get(),
                equalTo(changed));
        assertThat(DynamicPropertyFactory.getInstance().getStringProperty(injectProperty, null).get(),
                equalTo(changed));
    }

    @Test
    public void propertiesChangeFromDynamicConfigSourceIsDuplicated() throws Exception {
        String expected = uniquify("ran");
        String someProperty = "servicecomb.cse.servicecomb.change";
        String injectProperty = "cse.cse.servicecomb.change";
        configurationSource.addProperty(someProperty, expected);

        assertThat(DynamicPropertyFactory.getInstance().getStringProperty(someProperty, null).get(),
                equalTo(expected));
        assertThat(DynamicPropertyFactory.getInstance().getStringProperty(injectProperty, null).get(),
                equalTo(expected));

        String changed = uniquify("changed");
        configurationSource.setProperty(someProperty, changed);

        assertThat(DynamicPropertyFactory.getInstance().getStringProperty(someProperty, null).get(),
                equalTo(changed));
        assertThat(DynamicPropertyFactory.getInstance().getStringProperty(injectProperty, null).get(),
                equalTo(changed));

        expected = uniquify("ran");
        someProperty = "servicecomb.servicecomb.cse.change";
        injectProperty = "cse.servicecomb.cse.change";
        configurationSource.addProperty(someProperty, expected);
        assertThat(DynamicPropertyFactory.getInstance().getStringProperty(someProperty, null).get(),
                equalTo(expected));
        assertThat(DynamicPropertyFactory.getInstance().getStringProperty(injectProperty, null).get(),
                equalTo(expected));

        changed = uniquify("changed");
        configurationSource.setProperty(someProperty, changed);

        assertThat(DynamicPropertyFactory.getInstance().getStringProperty(someProperty, null).get(),
                equalTo(changed));
        assertThat(DynamicPropertyFactory.getInstance().getStringProperty(injectProperty, null).get(),
                equalTo(changed));
    }

    @Test
    public void propertiesDeleteFromDynamicConfigSourceIsDuplicated() throws Exception {
        String expected = uniquify("ran");
        String someProperty = "servicecomb.cse.servicecomb.delete";
        String injectProperty = "cse.cse.servicecomb.delete";
        configurationSource.addProperty(someProperty, expected);

        assertThat(DynamicPropertyFactory.getInstance().getStringProperty(someProperty, null).get(),
                equalTo(expected));
        assertThat(DynamicPropertyFactory.getInstance().getStringProperty(injectProperty, null).get(),
                equalTo(expected));

        configurationSource.deleteProperty(someProperty);

        assertThat(DynamicPropertyFactory.getInstance().getStringProperty(someProperty, null).get(), equalTo(null));
        assertThat(DynamicPropertyFactory.getInstance().getStringProperty(injectProperty, null).get(),
                equalTo(null));

        expected = uniquify("ran");
        someProperty = "servicecomb.servicecomb.cse.delete";
        injectProperty = "cse.servicecomb.cse.delete";
        configurationSource.addProperty(someProperty, expected);

        assertThat(DynamicPropertyFactory.getInstance().getStringProperty(someProperty, null).get(),
                equalTo(expected));
        assertThat(DynamicPropertyFactory.getInstance().getStringProperty(injectProperty, null).get(),
                equalTo(expected));

        configurationSource.deleteProperty(someProperty);

        assertThat(DynamicPropertyFactory.getInstance().getStringProperty(someProperty, null).get(), equalTo(null));
        assertThat(DynamicPropertyFactory.getInstance().getStringProperty(injectProperty, null).get(),
                equalTo(null));
    }

    @SuppressWarnings("unchecked")
    private static void setEnv(String key, String value) throws IllegalAccessException, NoSuchFieldException {
        Class<?>[] classes = Collections.class.getDeclaredClasses();
        Map<String, String> env = System.getenv();
        for (Class<?> cl : classes) {
            if ("java.util.Collections$UnmodifiableMap".equals(cl.getName())) {
                Field field = cl.getDeclaredField("m");
                field.setAccessible(true);
                Object obj = field.get(env);
                Map<String, String> map = (Map<String, String>) obj;
                map.put(key, value);
            }
        }
    }
}