org.apache.ignite.internal.client.impl.ClientPropertiesConfigurationSelfTest.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.ignite.internal.client.impl.ClientPropertiesConfigurationSelfTest.java

Source

/*
 * 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
 *
 *      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 org.apache.ignite.internal.client.impl;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Map;
import java.util.Properties;
import java.util.UUID;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.io.LineIterator;
import org.apache.ignite.internal.client.GridClientConfiguration;
import org.apache.ignite.internal.client.GridClientDataConfiguration;
import org.apache.ignite.internal.client.GridClientPartitionAffinity;
import org.apache.ignite.internal.client.GridClientProtocol;
import org.apache.ignite.internal.client.balancer.GridClientRandomBalancer;
import org.apache.ignite.internal.client.balancer.GridClientRoundRobinBalancer;
import org.apache.ignite.internal.util.IgniteUtils;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
import org.springframework.context.support.FileSystemXmlApplicationContext;

import static org.apache.ignite.internal.client.GridClientConfiguration.DFLT_MAX_CONN_IDLE_TIME;
import static org.apache.ignite.internal.client.GridClientConfiguration.DFLT_TOP_REFRESH_FREQ;

/**
 * Properties-based configuration self test.
 */
public class ClientPropertiesConfigurationSelfTest extends GridCommonAbstractTest {
    /**
     * Grid client spring configuration.
     */
    private static final URL GRID_CLIENT_SPRING_CONFIG;

    /**
     * Grid client properties-based configuration.
     */
    private static final URL GRID_CLIENT_CONFIG;

    /**
     *
     */
    static {
        GRID_CLIENT_SPRING_CONFIG = U.resolveIgniteUrl("/modules/clients/config/grid-client-spring-config.xml");

        GRID_CLIENT_CONFIG = U.resolveIgniteUrl("/modules/clients/config/grid-client-config.properties");
    }

    /**
     * Test client configuration loaded from the properties.
     *
     * @throws Exception In case of exception.
     */
    public void testCreation() throws Exception {
        // Validate default configuration.
        GridClientConfiguration cfg = new GridClientConfiguration();

        cfg.setServers(Arrays.asList("localhost:11211"));

        validateConfig(0, cfg);

        // Validate default properties-based configuration.
        cfg = new GridClientConfiguration();

        cfg.setServers(Arrays.asList("localhost:11211"));

        validateConfig(0, cfg);

        // Validate loaded configuration.
        Properties props = loadProperties(1, GRID_CLIENT_CONFIG);
        validateConfig(0, new GridClientConfiguration(props));

        // Validate loaded configuration with changed key prefixes.
        Properties props2 = new Properties();

        for (Map.Entry<Object, Object> e : props.entrySet())
            props2.put("new." + e.getKey(), e.getValue());

        validateConfig(0, new GridClientConfiguration("new.ignite.client", props2));
        validateConfig(0, new GridClientConfiguration("new.ignite.client.", props2));

        // Validate loaded test configuration.
        File tmp = uncommentProperties(GRID_CLIENT_CONFIG);

        props = loadProperties(25, tmp.toURI().toURL());
        validateConfig(2, new GridClientConfiguration(props));

        // Validate loaded test configuration with changed key prefixes.
        props2 = new Properties();

        for (Map.Entry<Object, Object> e : props.entrySet())
            props2.put("new." + e.getKey(), e.getValue());

        validateConfig(2, new GridClientConfiguration("new.ignite.client", props2));
        validateConfig(2, new GridClientConfiguration("new.ignite.client.", props2));

        // Validate loaded test configuration with empty key prefixes.
        props2 = new Properties();

        for (Map.Entry<Object, Object> e : props.entrySet())
            props2.put(e.getKey().toString().replace("ignite.client.", ""), e.getValue());

        validateConfig(2, new GridClientConfiguration("", props2));
        validateConfig(2, new GridClientConfiguration(".", props2));
    }

    /**
     * Validate spring client configuration.
     *
     * @throws Exception In case of any exception.
     */
    public void testSpringConfig() throws Exception {
        GridClientConfiguration cfg = new FileSystemXmlApplicationContext(GRID_CLIENT_SPRING_CONFIG.toString())
                .getBean(GridClientConfiguration.class);

        assertEquals(Arrays.asList("127.0.0.1:11211"), new ArrayList<>(cfg.getServers()));
        assertNull(cfg.getSecurityCredentialsProvider());

        Collection<GridClientDataConfiguration> dataCfgs = cfg.getDataConfigurations();

        assertEquals(1, dataCfgs.size());

        GridClientDataConfiguration dataCfg = dataCfgs.iterator().next();

        assertEquals("partitioned", dataCfg.getName());

        assertNotNull(dataCfg.getPinnedBalancer());
        assertEquals(GridClientRandomBalancer.class, dataCfg.getPinnedBalancer().getClass());

        assertNotNull(dataCfg.getAffinity());
        assertEquals(GridClientPartitionAffinity.class, dataCfg.getAffinity().getClass());
    }

    /**
     * Uncomment properties.
     *
     * @param url Source to uncomment client properties for.
     * @return Temporary file with uncommented client properties.
     * @throws IOException In case of IO exception.
     */
    private File uncommentProperties(URL url) throws IOException {
        InputStream in = url.openStream();

        assertNotNull(in);

        LineIterator it = IOUtils.lineIterator(in, "UTF-8");
        Collection<String> lines = new ArrayList<>();

        while (it.hasNext())
            lines.add(it.nextLine().replace("#ignite.client.", "ignite.client."));

        IgniteUtils.closeQuiet(in);

        File tmp = File.createTempFile(UUID.randomUUID().toString(), "properties");

        tmp.deleteOnExit();

        FileUtils.writeLines(tmp, lines);

        return tmp;
    }

    /**
     * Load properties from the url.
     *
     * @param expLoaded Expected number of loaded properties.
     * @param url URL to load properties from.
     * @return Loaded properties.
     * @throws IOException In case of IO exception.
     */
    private Properties loadProperties(int expLoaded, URL url) throws IOException {
        InputStream in = url.openStream();

        Properties props = new Properties();

        assertEquals(0, props.size());

        props.load(in);

        assertEquals(expLoaded, props.size());

        IgniteUtils.closeQuiet(in);

        return props;
    }

    /**
     * Validate loaded configuration.
     *
     * @param expDataCfgs Expected data configurations count.
     * @param cfg Client configuration to validate.
     */
    private void validateConfig(int expDataCfgs, GridClientConfiguration cfg) {
        assertEquals(GridClientRandomBalancer.class, cfg.getBalancer().getClass());
        assertEquals(10000, cfg.getConnectTimeout());
        assertEquals(null, cfg.getSecurityCredentialsProvider());

        assertEquals(expDataCfgs, cfg.getDataConfigurations().size());

        if (expDataCfgs == 2) {
            GridClientDataConfiguration nullCfg = cfg.getDataConfiguration(null);

            assertEquals(null, nullCfg.getName());
            assertEquals(null, nullCfg.getAffinity());
            assertEquals(GridClientRandomBalancer.class, nullCfg.getPinnedBalancer().getClass());

            GridClientDataConfiguration partCfg = cfg.getDataConfiguration("partitioned");

            assertEquals("partitioned", partCfg.getName());
            assertEquals(GridClientPartitionAffinity.class, partCfg.getAffinity().getClass());
            assertEquals(GridClientRoundRobinBalancer.class, partCfg.getPinnedBalancer().getClass());
        }

        assertEquals(DFLT_MAX_CONN_IDLE_TIME, cfg.getMaxConnectionIdleTime());
        assertEquals(GridClientProtocol.TCP, cfg.getProtocol());
        assertEquals(Arrays.asList("localhost:11211"), new ArrayList<>(cfg.getServers()));
        assertEquals(true, cfg.isEnableAttributesCache());
        assertEquals(true, cfg.isEnableMetricsCache());
        assertEquals(true, cfg.isTcpNoDelay());
        assertEquals(null, cfg.getSslContextFactory(), null);
        assertEquals(DFLT_TOP_REFRESH_FREQ, cfg.getTopologyRefreshFrequency());
    }
}