diff options
author | Ashlee Young <ashlee@onosfw.com> | 2015-09-09 22:15:21 -0700 |
---|---|---|
committer | Ashlee Young <ashlee@onosfw.com> | 2015-09-09 22:15:21 -0700 |
commit | 13d05bc8458758ee39cb829098241e89616717ee (patch) | |
tree | 22a4d1ce65f15952f07a3df5af4b462b4697cb3a /framework/src/onos/core/net/src/test/java/org/onosproject/net/link/impl/LinkManagerTest.java | |
parent | 6139282e1e93c2322076de4b91b1c85d0bc4a8b3 (diff) |
ONOS checkin based on commit tag e796610b1f721d02f9b0e213cf6f7790c10ecd60
Change-Id: Ife8810491034fe7becdba75dda20de4267bd15cd
Diffstat (limited to 'framework/src/onos/core/net/src/test/java/org/onosproject/net/link/impl/LinkManagerTest.java')
-rw-r--r-- | framework/src/onos/core/net/src/test/java/org/onosproject/net/link/impl/LinkManagerTest.java | 311 |
1 files changed, 311 insertions, 0 deletions
diff --git a/framework/src/onos/core/net/src/test/java/org/onosproject/net/link/impl/LinkManagerTest.java b/framework/src/onos/core/net/src/test/java/org/onosproject/net/link/impl/LinkManagerTest.java new file mode 100644 index 00000000..dad5429e --- /dev/null +++ b/framework/src/onos/core/net/src/test/java/org/onosproject/net/link/impl/LinkManagerTest.java @@ -0,0 +1,311 @@ +/* + * Copyright 2014 Open Networking Laboratory + * + * 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.net.link.impl; + +import com.google.common.collect.ImmutableSet; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.onosproject.event.Event; +import org.onosproject.net.config.NetworkConfigServiceAdapter; +import org.onosproject.net.ConnectPoint; +import org.onosproject.net.DefaultDevice; +import org.onosproject.net.Device; +import org.onosproject.net.DeviceId; +import org.onosproject.net.Link; +import org.onosproject.net.MastershipRole; +import org.onosproject.net.PortNumber; +import org.onosproject.net.link.DefaultLinkDescription; +import org.onosproject.net.link.LinkAdminService; +import org.onosproject.net.link.LinkEvent; +import org.onosproject.net.link.LinkListener; +import org.onosproject.net.link.LinkProvider; +import org.onosproject.net.link.LinkProviderRegistry; +import org.onosproject.net.link.LinkProviderService; +import org.onosproject.net.link.LinkService; +import org.onosproject.net.provider.AbstractProvider; +import org.onosproject.net.provider.ProviderId; +import org.onosproject.common.event.impl.TestEventDispatcher; +import org.onosproject.net.device.impl.DeviceManager; +import org.onosproject.store.trivial.SimpleLinkStore; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import static org.junit.Assert.*; +import static org.onosproject.net.DeviceId.deviceId; +import static org.onosproject.net.Link.Type.DIRECT; +import static org.onosproject.net.Link.Type.INDIRECT; +import static org.onosproject.net.NetTestTools.injectEventDispatcher; +import static org.onosproject.net.link.LinkEvent.Type.*; + +/** + * Test codifying the link service & link provider service contracts. + */ +public class LinkManagerTest { + + private static final ProviderId PID = new ProviderId("of", "foo"); + private static final DeviceId DID1 = deviceId("of:foo"); + private static final DeviceId DID2 = deviceId("of:bar"); + private static final DeviceId DID3 = deviceId("of:goo"); + private static final Device DEV1 = new DefaultDevice( + PID, DID1, Device.Type.SWITCH, "", "", "", "", null); + private static final Device DEV2 = new DefaultDevice( + PID, DID2, Device.Type.SWITCH, "", "", "", "", null); + private static final Device DEV3 = new DefaultDevice( + PID, DID2, Device.Type.SWITCH, "", "", "", "", null); + + private static final PortNumber P1 = PortNumber.portNumber(1); + private static final PortNumber P2 = PortNumber.portNumber(2); + private static final PortNumber P3 = PortNumber.portNumber(3); + private static final Map<DeviceId, Device> DEVICEIDMAP = new HashMap<>(); + + private LinkManager mgr; + + protected LinkService service; + protected LinkAdminService admin; + protected LinkProviderRegistry registry; + protected LinkProviderService providerService; + protected TestProvider provider; + protected TestListener listener = new TestListener(); + protected DeviceManager devmgr = new TestDeviceManager(); + + + + @Before + public void setUp() { + mgr = new LinkManager(); + service = mgr; + admin = mgr; + registry = mgr; + mgr.store = new SimpleLinkStore(); + injectEventDispatcher(mgr, new TestEventDispatcher()); + mgr.deviceService = devmgr; + mgr.networkConfigService = new TestNetworkConfigService(); + mgr.activate(); + + DEVICEIDMAP.put(DID1, DEV1); + DEVICEIDMAP.put(DID2, DEV2); + DEVICEIDMAP.put(DID3, DEV3); + + service.addListener(listener); + + provider = new TestProvider(); + providerService = registry.register(provider); + 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.deactivate(); + } + + @Test + public void createLink() { + addLink(DID1, P1, DID2, P2, DIRECT); + addLink(DID2, P2, DID1, P1, DIRECT); + assertEquals("incorrect link count", 2, service.getLinkCount()); + + Iterator<Link> it = service.getLinks().iterator(); + it.next(); + it.next(); + assertFalse("incorrect link count", it.hasNext()); + } + + @Test + public void updateLink() { + addLink(DID1, P1, DID2, P2, DIRECT); + addLink(DID2, P2, DID1, P1, INDIRECT); + assertEquals("incorrect link count", 2, service.getLinkCount()); + + providerService.linkDetected(new DefaultLinkDescription(cp(DID2, P2), cp(DID1, P1), DIRECT)); + validateEvents(LINK_UPDATED); + assertEquals("incorrect link count", 2, service.getLinkCount()); + + providerService.linkDetected(new DefaultLinkDescription(cp(DID2, P2), cp(DID1, P1), INDIRECT)); + providerService.linkDetected(new DefaultLinkDescription(cp(DID2, P2), cp(DID1, P1), DIRECT)); + assertEquals("no events expected", 0, listener.events.size()); + } + + @Test + public void removeLink() { + addLink(DID1, P1, DID2, P2, DIRECT); + addLink(DID2, P2, DID1, P1, DIRECT); + assertEquals("incorrect link count", 2, service.getLinkCount()); + + providerService.linkVanished(new DefaultLinkDescription(cp(DID1, P1), cp(DID2, P2), DIRECT)); + validateEvents(LINK_REMOVED); + assertEquals("incorrect link count", 1, service.getLinkCount()); + assertNull("link should not be found", service.getLink(cp(DID1, P1), cp(DID2, P2))); + assertNotNull("link should be found", service.getLink(cp(DID2, P2), cp(DID1, P1))); + + providerService.linkVanished(new DefaultLinkDescription(cp(DID1, P1), cp(DID2, P2), DIRECT)); + assertEquals("no events expected", 0, listener.events.size()); + } + + @Test + public void removeLinksByConnectionPoint() { + Link l1 = addLink(DID1, P1, DID2, P2, DIRECT); + Link l2 = addLink(DID2, P2, DID1, P1, DIRECT); + addLink(DID3, P3, DID2, P1, DIRECT); + addLink(DID2, P1, DID3, P3, DIRECT); + assertEquals("incorrect link count", 4, service.getLinkCount()); + + providerService.linksVanished(cp(DID1, P1)); + assertEquals("incorrect link count", 2, service.getLinkCount()); + assertNull("link should be gone", service.getLink(l1.src(), l1.dst())); + assertNull("link should be gone", service.getLink(l2.src(), l2.dst())); + } + + @Test + public void removeLinksByDevice() { + addLink(DID1, P1, DID2, P2, DIRECT); + addLink(DID2, P2, DID1, P1, DIRECT); + addLink(DID3, P3, DID2, P1, DIRECT); + addLink(DID2, P1, DID3, P3, DIRECT); + Link l5 = addLink(DID3, P1, DID1, P2, DIRECT); + Link l6 = addLink(DID1, P2, DID3, P1, DIRECT); + assertEquals("incorrect link count", 6, service.getLinkCount()); + + providerService.linksVanished(DID2); + assertEquals("incorrect link count", 2, service.getLinkCount()); + assertNotNull("link should not be gone", service.getLink(l5.src(), l5.dst())); + assertNotNull("link should not be gone", service.getLink(l6.src(), l6.dst())); + } + + @Test + public void removeLinksAsAdminByConnectionPoint() { + Link l1 = addLink(DID1, P1, DID2, P2, DIRECT); + Link l2 = addLink(DID2, P2, DID1, P1, DIRECT); + addLink(DID3, P3, DID2, P1, DIRECT); + addLink(DID2, P1, DID3, P3, DIRECT); + assertEquals("incorrect link count", 4, service.getLinkCount()); + + admin.removeLinks(cp(DID1, P1)); + assertEquals("incorrect link count", 2, service.getLinkCount()); + assertNull("link should be gone", service.getLink(l1.src(), l1.dst())); + assertNull("link should be gone", service.getLink(l2.src(), l2.dst())); + } + + @Test + public void removeLinksAsAdminByDevice() { + addLink(DID1, P1, DID2, P2, DIRECT); + addLink(DID2, P2, DID1, P1, DIRECT); + addLink(DID3, P3, DID2, P1, DIRECT); + addLink(DID2, P1, DID3, P3, DIRECT); + Link l5 = addLink(DID3, P1, DID1, P2, DIRECT); + Link l6 = addLink(DID1, P2, DID3, P1, DIRECT); + assertEquals("incorrect link count", 6, service.getLinkCount()); + + admin.removeLinks(DID2); + assertEquals("incorrect link count", 2, service.getLinkCount()); + assertNotNull("link should not be gone", service.getLink(l5.src(), l5.dst())); + assertNotNull("link should not be gone", service.getLink(l6.src(), l6.dst())); + } + + @Test + public void getLinks() { + Link l1 = addLink(DID1, P1, DID2, P2, DIRECT); + Link l2 = addLink(DID2, P2, DID1, P1, DIRECT); + Link l3 = addLink(DID3, P3, DID2, P1, DIRECT); + Link l4 = addLink(DID2, P1, DID3, P3, DIRECT); + assertEquals("incorrect link count", 4, service.getLinkCount()); + + Set<Link> links = service.getLinks(cp(DID1, P1)); + assertEquals("incorrect links", ImmutableSet.of(l1, l2), links); + links = service.getEgressLinks(cp(DID1, P1)); + assertEquals("incorrect links", ImmutableSet.of(l1), links); + links = service.getIngressLinks(cp(DID1, P1)); + assertEquals("incorrect links", ImmutableSet.of(l2), links); + + links = service.getDeviceLinks(DID2); + assertEquals("incorrect links", ImmutableSet.of(l1, l2, l3, l4), links); + links = service.getDeviceLinks(DID3); + assertEquals("incorrect links", ImmutableSet.of(l3, l4), links); + + links = service.getDeviceEgressLinks(DID2); + assertEquals("incorrect links", ImmutableSet.of(l2, l4), links); + links = service.getDeviceIngressLinks(DID2); + assertEquals("incorrect links", ImmutableSet.of(l1, l3), links); + } + + + private Link addLink(DeviceId sd, PortNumber sp, DeviceId dd, PortNumber dp, + Link.Type type) { + providerService.linkDetected(new DefaultLinkDescription(cp(sd, sp), cp(dd, dp), type)); + Link link = listener.events.get(0).subject(); + validateEvents(LINK_ADDED); + return link; + } + + private ConnectPoint cp(DeviceId id, PortNumber portNumber) { + return new ConnectPoint(id, portNumber); + } + + 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 LinkProvider { + private Device deviceReceived; + private MastershipRole roleReceived; + + public TestProvider() { + super(PID); + } + } + + private static class TestListener implements LinkListener { + final List<LinkEvent> events = new ArrayList<>(); + + @Override + public void event(LinkEvent event) { + events.add(event); + } + } + + private static class TestDeviceManager extends DeviceManager { + + @Override + public MastershipRole getRole(DeviceId deviceId) { + return MastershipRole.MASTER; + } + + @Override + public Device getDevice(DeviceId deviceId) { + return DEVICEIDMAP.get(deviceId); + } + + } + private class TestNetworkConfigService extends NetworkConfigServiceAdapter { + } +} |