org.onosproject.cluster.impl.ClusterMetadataManagerTest.java Source code

Java tutorial

Introduction

Here is the source code for org.onosproject.cluster.impl.ClusterMetadataManagerTest.java

Source

/*
 * Copyright 2017-present Open Networking Foundation
 *
 * 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 org.onosproject.cluster.impl;

import com.google.common.collect.ImmutableSet;
import org.apache.commons.io.FileUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.onlab.junit.HttpResourceUrlInterceptor;
import org.onlab.junit.LoggerAdapter;
import org.onlab.junit.TestUtils;
import org.onosproject.cluster.ClusterMetadata;
import org.onosproject.cluster.ControllerNode;
import org.onosproject.cluster.Partition;
import org.onosproject.common.event.impl.TestEventDispatcher;
import org.onosproject.core.VersionServiceAdapter;
import org.slf4j.helpers.MessageFormatter;

import java.io.File;
import java.io.IOException;
import java.net.URL;

import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.Matchers.hasSize;
import static org.junit.Assert.assertThat;

/**
 * Unit tests for the cluster metadata manager.
 */

public class ClusterMetadataManagerTest {

    private static final String CLUSTER_NAME = "MyCluster";
    private static final String NODE_ID = "MyId";
    private static final String NODE_IP = "11.22.33.44";
    private static final int NODE_PORT = 4523;

    private static final String CLUSTER_METADATA_FORMAT = "{\"nodes\": ["
            + "   {\"ip\": \"{}\", \"id\": \"{}\", \"port\": {}}]," + "\"name\": \"{}\","
            + "\"partitions\": [{\"id\": 1, \"members\": [\"{}\"]}]}";

    private static final String CLUSTER_METADATA = format(CLUSTER_METADATA_FORMAT, NODE_IP, NODE_ID, NODE_PORT,
            CLUSTER_NAME, NODE_ID);

    private ClusterMetadataManager mgr;
    private ConfigFileBasedClusterMetadataProvider fileProvider;
    private DefaultClusterMetadataProvider defaultProvider;

    private static String format(String format, Object... params) {
        return MessageFormatter.arrayFormat(format, params).getMessage();
    }

    private class TrackingLogger extends LoggerAdapter {
        int errors = 0;
        StringBuilder messages = new StringBuilder();

        public final void error(String msg, Throwable t) {
            messages.append(msg);
            messages.append(t);
            errors++;
        }
    }

    @Before
    public void setUp() {
        System.clearProperty("onos.cluster.metadata.uri");
        mgr = new ClusterMetadataManager();
        TestUtils.setField(mgr, "eventDispatcher", new TestEventDispatcher());
        fileProvider = new ConfigFileBasedClusterMetadataProvider();
        fileProvider.providerRegistry = mgr;

        defaultProvider = new DefaultClusterMetadataProvider();
        defaultProvider.providerRegistry = mgr;
        defaultProvider.versionService = new VersionServiceAdapter();

        mgr.activate();
        defaultProvider.activate();

        pause(200);
    }

    @After
    public void tearDown() {
        defaultProvider.deactivate();
        fileProvider.deactivate();
        mgr.deactivate();
    }

    private void pause(long millis) {
        try {
            Thread.sleep(millis);
        } catch (InterruptedException ie) {
            throw new IllegalStateException(ie);
        }
    }

    /**
     * Tests that the file provider functions correctly when no metadata is present.
     */
    @Test
    public void testNoMetadata() {
        fileProvider.activate();
        TrackingLogger log = new TrackingLogger();
        TestUtils.setField(fileProvider, "log", log);

        assertThat(fileProvider.isAvailable(), is(false));

        boolean exceptionSeen;
        try {
            fileProvider.getClusterMetadata();
            exceptionSeen = false;
        } catch (Throwable t) {
            exceptionSeen = true;
        }
        assertThat(exceptionSeen, is(true));

        assertThat("Logger errors detected: " + log.messages.toString(), log.errors, is(0));
    }

    /**
     * Tests the default provider.
     */
    @Test
    public void testDefaultProvider() {
        fileProvider.activate();
        ClusterMetadata metadata = mgr.getClusterMetadata();

        assertThat(metadata, notNullValue());
        assertThat(metadata.getName(), is(defaultProvider.id().scheme()));
        assertThat(metadata.getNodes(), hasSize(1));
        assertThat(metadata.getPartitions(), hasSize(1));

        String localAddress = mgr.getLocalNode().ip().toString();

        ControllerNode node = metadata.getNodes().iterator().next();
        assertThat(node.ip().toString(), is(localAddress));
        assertThat(node.id().id(), is(localAddress));

        Partition partition = metadata.getPartitions().iterator().next();
        assertThat(partition.getId().asInt(), is(1));
        assertThat(partition.getMembers(), hasSize(1));
        assertThat(partition.getMembers().iterator().next().id(), is(localAddress));
    }

    /**
     * Tests the file based cluster metadata provider.
     */
    @Test
    public void testFileBasedProvider() {
        File jsonFile;

        try {
            jsonFile = File.createTempFile("cluster", "json");
            FileUtils.writeStringToFile(jsonFile, CLUSTER_METADATA);
        } catch (IOException ioe) {
            throw new IllegalStateException(ioe);
        }

        System.setProperty("onos.cluster.metadata.uri", "file://" + jsonFile.getAbsolutePath());
        fileProvider.activate();

        ClusterMetadata metadata = fileProvider.getClusterMetadata().value();
        assertThat(metadata, notNullValue());

        assertThat(metadata.getName(), is(CLUSTER_NAME));

        ControllerNode node = metadata.getNodes().iterator().next();
        assertThat(node.ip().toString(), is(NODE_IP));
        assertThat(node.id().id(), is(NODE_ID));

        Partition partition = metadata.getPartitions().iterator().next();
        assertThat(partition.getId().asInt(), is(1));
        assertThat(partition.getMembers(), hasSize(1));
        assertThat(partition.getMembers().iterator().next().id(), is(NODE_ID));

        ClusterMetadata newMetadata = new ClusterMetadata(metadata.providerId(), "NewMetadata",
                ImmutableSet.of(node), ImmutableSet.of(partition));
        mgr.setClusterMetadata(newMetadata);

        assertThat(fileProvider.getClusterMetadata().value(), equalTo(newMetadata));

        assertThat(jsonFile.delete(), is(true));
    }

    /**
     * Tests fetching metadata from an HTTP source.
     */
    @Test
    public void testUrlFetch() {
        URL.setURLStreamHandlerFactory(
                new HttpResourceUrlInterceptor.HttpResourceUrlInterceptorFactory("cluster-info.json"));
        System.setProperty("onos.cluster.metadata.uri", "http://opennetworking.org");

        fileProvider.activate();
        pause(400);

        ClusterMetadata metadata = fileProvider.getClusterMetadata().value();
        assertThat(metadata, notNullValue());

        assertThat(metadata.getName(), is(CLUSTER_NAME));
        assertThat(metadata.getNodes(), hasSize(1));
        assertThat(metadata.getPartitions(), hasSize(1));
    }
}