blob: 770b2c9b7372a5878fcfee86627f6c8aa9cb4df7 [file] [log] [blame]
/**
* Copyright 2016-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.tetopology.management;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.onosproject.net.NetTestTools.injectEventDispatcher;
import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NETWORK_ADDED;
import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NETWORK_REMOVED;
import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_TOPOLOGY_ADDED;
import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_TOPOLOGY_REMOVED;
import java.util.List;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.onosproject.common.event.impl.TestEventDispatcher;
import org.onosproject.event.Event;
import org.onosproject.net.provider.AbstractProvider;
import org.onosproject.net.provider.ProviderId;
import org.onosproject.tetopology.management.api.Network;
import org.onosproject.tetopology.management.api.TeTopology;
import org.onosproject.tetopology.management.api.TeTopologyEvent;
import org.onosproject.tetopology.management.api.TeTopologyListener;
import org.onosproject.tetopology.management.api.TeTopologyProvider;
import org.onosproject.tetopology.management.api.TeTopologyProviderRegistry;
import org.onosproject.tetopology.management.api.TeTopologyProviderService;
import org.onosproject.tetopology.management.api.TeTopologyService;
import org.onosproject.tetopology.management.api.link.TeLink;
import org.onosproject.tetopology.management.api.link.TeLinkTpGlobalKey;
import org.onosproject.tetopology.management.api.node.TeNode;
import org.onosproject.tetopology.management.api.node.TeNodeKey;
import org.onosproject.tetopology.management.impl.TeMgrUtil;
import org.onosproject.tetopology.management.impl.TeTopologyManager;
import com.google.common.collect.Lists;
/**
* Test TeTopology service and TeTopologyProvider service.
*/
public class TeTopologyManagerTest {
private static final ProviderId PID = new ProviderId("test", "TeTopologyManagerTest");
private TeTopologyManager mgr;
protected TeTopologyService service;
protected TeTopologyProviderRegistry registry;
protected TeTopologyProviderService providerService;
protected TestProvider provider;
protected TestListener listener = new TestListener();
@Before
public void setUp() {
mgr = new TeTopologyManager();
service = mgr;
registry = mgr;
mgr.store = new SimpleTeTopologyStore();
injectEventDispatcher(mgr, new TestEventDispatcher());
mgr.activateBasics();
service.addListener(listener);
provider = new TestProvider();
providerService = registry.register(provider);
assertTrue("providerService should not be null", providerService != null);
assertTrue("Provider should be registered",
registry.getProviders().contains(provider.id()));
}
@After
public void tearDown() {
registry.unregister(provider);
assertFalse("provider should not be registered",
registry.getProviders().contains(provider.id()));
service.removeListener(listener);
mgr.deactivateBasics();
}
private void createNetwork() {
Network originNetwork = DefaultBuilder.buildSampleAbstractNetwork();
providerService.networkUpdated(originNetwork);
Network network = service
.network(TeMgrUtil.toNetworkId(DefaultBuilder.teTopologyKey()));
assertNotNull("Network should be found", network);
}
/**
* Checks the right events are received when a network with TE topology is
* added.
*/
@Test
public void networkAdded() {
createNetwork();
validateEvents(TE_TOPOLOGY_ADDED, NETWORK_ADDED);
}
/**
* Checks the TE topology components are set properly in Manager and Store
* when a network is added.
*/
@Test
public void teTopologyVerify() {
createNetwork();
TeTopology teTopology = service
.teTopology(DefaultBuilder.teTopologyKey());
assertNotNull("TeTopology should be found", teTopology);
assertTrue("Number of TE nodes should be 1",
teTopology.teNodes().size() == 1);
assertTrue("Number of TE links should be 1",
teTopology.teLinks().size() == 1);
TeNode teNode = service
.teNode(new TeNodeKey(DefaultBuilder.teTopologyKey(),
DefaultBuilder.teNode().teNodeId()));
assertNotNull("TeNode should be found", teNode);
assertTrue("TE node should be identical", teNode.equals(DefaultBuilder.teNode()));
assertTrue("Number of TTPs should be 1",
teNode.tunnelTerminationPoints().size() == 1);
TeLink teLink = service
.teLink(new TeLinkTpGlobalKey(DefaultBuilder
.teTopologyKey(), DefaultBuilder.teLink().teLinkKey()));
assertNotNull("TeLink should be found", teLink);
}
/**
* Checks the right events are received when a network with TE topology is
* added and then removed.
*/
@Test
public void networkRemoved() {
createNetwork();
providerService.networkRemoved(TeMgrUtil
.toNetworkId(DefaultBuilder.teTopologyKey()));
validateEvents(TE_TOPOLOGY_ADDED, NETWORK_ADDED, NETWORK_REMOVED,
TE_TOPOLOGY_REMOVED);
}
/**
* Validates whether the manager receives the right events.
*
* @param types a set of types of control message event
*/
protected void validateEvents(Enum... types) {
int i = 0;
assertEquals("wrong events received", types.length, listener.events.size());
for (Event event : listener.events) {
assertEquals("incorrect event type", types[i], event.type());
i++;
}
listener.events.clear();
}
private class TestProvider extends AbstractProvider implements TeTopologyProvider {
protected TestProvider() {
super(PID);
}
}
private static class TestListener implements TeTopologyListener {
final List<TeTopologyEvent> events = Lists.newArrayList();
@Override
public void event(TeTopologyEvent event) {
events.add(event);
}
}
}