blob: 93610b5590ba26022ec2fd5765f9fdb0eafa77ab [file] [log] [blame]
tom8bf2e6b2014-09-10 20:53:54 -07001package org.onlab.onos.net.trivial.link.impl;
tom0d395262014-09-07 16:53:40 -07002
tomd176fc42014-09-08 00:12:30 -07003import com.google.common.collect.ImmutableSet;
tom0d395262014-09-07 16:53:40 -07004import org.junit.After;
5import org.junit.Before;
6import org.junit.Test;
7import org.onlab.onos.event.Event;
tombb58c202014-09-07 22:51:50 -07008import org.onlab.onos.net.ConnectPoint;
tom0d395262014-09-07 16:53:40 -07009import org.onlab.onos.net.Device;
10import org.onlab.onos.net.DeviceId;
tombb58c202014-09-07 22:51:50 -070011import org.onlab.onos.net.Link;
tom0d395262014-09-07 16:53:40 -070012import org.onlab.onos.net.MastershipRole;
tom0d395262014-09-07 16:53:40 -070013import org.onlab.onos.net.PortNumber;
tombb58c202014-09-07 22:51:50 -070014import org.onlab.onos.net.link.DefaultLinkDescription;
tom0d395262014-09-07 16:53:40 -070015import org.onlab.onos.net.link.LinkAdminService;
16import org.onlab.onos.net.link.LinkEvent;
17import org.onlab.onos.net.link.LinkListener;
18import org.onlab.onos.net.link.LinkProvider;
19import org.onlab.onos.net.link.LinkProviderRegistry;
20import org.onlab.onos.net.link.LinkProviderService;
21import org.onlab.onos.net.link.LinkService;
22import org.onlab.onos.net.provider.AbstractProvider;
23import org.onlab.onos.net.provider.ProviderId;
tom8bf2e6b2014-09-10 20:53:54 -070024import org.onlab.onos.event.impl.TestEventDispatcher;
tom89b63c52014-09-16 09:19:51 -070025import org.onlab.onos.net.trivial.device.impl.SimpleDeviceManager;
tom0d395262014-09-07 16:53:40 -070026
27import java.util.ArrayList;
tomd176fc42014-09-08 00:12:30 -070028import java.util.Iterator;
tom0d395262014-09-07 16:53:40 -070029import java.util.List;
tomd176fc42014-09-08 00:12:30 -070030import java.util.Set;
tom0d395262014-09-07 16:53:40 -070031
32import static org.junit.Assert.*;
tom0d395262014-09-07 16:53:40 -070033import static org.onlab.onos.net.DeviceId.deviceId;
tomd176fc42014-09-08 00:12:30 -070034import static org.onlab.onos.net.Link.Type.DIRECT;
35import static org.onlab.onos.net.Link.Type.INDIRECT;
36import static org.onlab.onos.net.link.LinkEvent.Type.*;
tom0d395262014-09-07 16:53:40 -070037
38/**
39 * Test codifying the link service & link provider service contracts.
40 */
41public class SimpleLinkManagerTest {
42
tom7e02cda2014-09-18 12:05:46 -070043 private static final ProviderId PID = new ProviderId("of", "foo");
tom0d395262014-09-07 16:53:40 -070044 private static final DeviceId DID1 = deviceId("of:foo");
45 private static final DeviceId DID2 = deviceId("of:bar");
tomd176fc42014-09-08 00:12:30 -070046 private static final DeviceId DID3 = deviceId("of:goo");
tom0d395262014-09-07 16:53:40 -070047
48 private static final PortNumber P1 = PortNumber.portNumber(1);
49 private static final PortNumber P2 = PortNumber.portNumber(2);
50 private static final PortNumber P3 = PortNumber.portNumber(3);
51
52
53 private SimpleLinkManager mgr;
54
55 protected LinkService service;
56 protected LinkAdminService admin;
57 protected LinkProviderRegistry registry;
58 protected LinkProviderService providerService;
59 protected TestProvider provider;
60 protected TestListener listener = new TestListener();
61
62 @Before
63 public void setUp() {
64 mgr = new SimpleLinkManager();
65 service = mgr;
66 admin = mgr;
67 registry = mgr;
68 mgr.eventDispatcher = new TestEventDispatcher();
tom89b63c52014-09-16 09:19:51 -070069 mgr.deviceService = new SimpleDeviceManager();
tom0d395262014-09-07 16:53:40 -070070 mgr.activate();
71
72 service.addListener(listener);
73
74 provider = new TestProvider();
75 providerService = registry.register(provider);
76 assertTrue("provider should be registered",
77 registry.getProviders().contains(provider.id()));
78 }
79
80 @After
81 public void tearDown() {
82 registry.unregister(provider);
83 assertFalse("provider should not be registered",
84 registry.getProviders().contains(provider.id()));
85 service.removeListener(listener);
86 mgr.deactivate();
87 }
88
tombb58c202014-09-07 22:51:50 -070089 @Test
90 public void createLink() {
tomd176fc42014-09-08 00:12:30 -070091 addLink(DID1, P1, DID2, P2, DIRECT);
92 addLink(DID2, P2, DID1, P1, DIRECT);
93 assertEquals("incorrect link count", 2, service.getLinkCount());
94
95 Iterator<Link> it = service.getLinks().iterator();
96 it.next();
97 it.next();
98 assertFalse("incorrect link count", it.hasNext());
99 }
100
101 @Test
102 public void updateLink() {
103 addLink(DID1, P1, DID2, P2, DIRECT);
104 addLink(DID2, P2, DID1, P1, INDIRECT);
105 assertEquals("incorrect link count", 2, service.getLinkCount());
106
107 providerService.linkDetected(new DefaultLinkDescription(cp(DID2, P2), cp(DID1, P1), DIRECT));
108 validateEvents(LINK_UPDATED);
109 assertEquals("incorrect link count", 2, service.getLinkCount());
110
111 providerService.linkDetected(new DefaultLinkDescription(cp(DID2, P2), cp(DID1, P1), INDIRECT));
112 providerService.linkDetected(new DefaultLinkDescription(cp(DID2, P2), cp(DID1, P1), DIRECT));
113 assertEquals("no events expected", 0, listener.events.size());
114 }
115
116 @Test
117 public void removeLink() {
118 addLink(DID1, P1, DID2, P2, DIRECT);
119 addLink(DID2, P2, DID1, P1, DIRECT);
120 assertEquals("incorrect link count", 2, service.getLinkCount());
121
122 providerService.linkVanished(new DefaultLinkDescription(cp(DID1, P1), cp(DID2, P2), DIRECT));
123 validateEvents(LINK_REMOVED);
124 assertEquals("incorrect link count", 1, service.getLinkCount());
125 assertNull("link should not be found", service.getLink(cp(DID1, P1), cp(DID2, P2)));
126 assertNotNull("link should be found", service.getLink(cp(DID2, P2), cp(DID1, P1)));
127
128 providerService.linkVanished(new DefaultLinkDescription(cp(DID1, P1), cp(DID2, P2), DIRECT));
129 assertEquals("no events expected", 0, listener.events.size());
130 }
131
132 @Test
133 public void removeLinksByConnectionPoint() {
134 Link l1 = addLink(DID1, P1, DID2, P2, DIRECT);
135 Link l2 = addLink(DID2, P2, DID1, P1, DIRECT);
136 addLink(DID3, P3, DID2, P1, DIRECT);
137 addLink(DID2, P1, DID3, P3, DIRECT);
138 assertEquals("incorrect link count", 4, service.getLinkCount());
139
140 providerService.linksVanished(cp(DID1, P1));
141 assertEquals("incorrect link count", 2, service.getLinkCount());
142 assertNull("link should be gone", service.getLink(l1.src(), l1.dst()));
143 assertNull("link should be gone", service.getLink(l2.src(), l2.dst()));
144 }
145
146 @Test
147 public void removeLinksByDevice() {
148 addLink(DID1, P1, DID2, P2, DIRECT);
149 addLink(DID2, P2, DID1, P1, DIRECT);
150 addLink(DID3, P3, DID2, P1, DIRECT);
151 addLink(DID2, P1, DID3, P3, DIRECT);
152 Link l5 = addLink(DID3, P1, DID1, P2, DIRECT);
153 Link l6 = addLink(DID1, P2, DID3, P1, DIRECT);
154 assertEquals("incorrect link count", 6, service.getLinkCount());
155
156 providerService.linksVanished(DID2);
157 assertEquals("incorrect link count", 2, service.getLinkCount());
158 assertNotNull("link should not be gone", service.getLink(l5.src(), l5.dst()));
159 assertNotNull("link should not be gone", service.getLink(l6.src(), l6.dst()));
160 }
161
162 @Test
163 public void removeLinksAsAdminByConnectionPoint() {
164 Link l1 = addLink(DID1, P1, DID2, P2, DIRECT);
165 Link l2 = addLink(DID2, P2, DID1, P1, DIRECT);
166 addLink(DID3, P3, DID2, P1, DIRECT);
167 addLink(DID2, P1, DID3, P3, DIRECT);
168 assertEquals("incorrect link count", 4, service.getLinkCount());
169
170 admin.removeLinks(cp(DID1, P1));
171 assertEquals("incorrect link count", 2, service.getLinkCount());
172 assertNull("link should be gone", service.getLink(l1.src(), l1.dst()));
173 assertNull("link should be gone", service.getLink(l2.src(), l2.dst()));
174 }
175
176 @Test
177 public void removeLinksAsAdminByDevice() {
178 addLink(DID1, P1, DID2, P2, DIRECT);
179 addLink(DID2, P2, DID1, P1, DIRECT);
180 addLink(DID3, P3, DID2, P1, DIRECT);
181 addLink(DID2, P1, DID3, P3, DIRECT);
182 Link l5 = addLink(DID3, P1, DID1, P2, DIRECT);
183 Link l6 = addLink(DID1, P2, DID3, P1, DIRECT);
184 assertEquals("incorrect link count", 6, service.getLinkCount());
185
186 admin.removeLinks(DID2);
187 assertEquals("incorrect link count", 2, service.getLinkCount());
188 assertNotNull("link should not be gone", service.getLink(l5.src(), l5.dst()));
189 assertNotNull("link should not be gone", service.getLink(l6.src(), l6.dst()));
190 }
191
192 @Test
193 public void getLinks() {
194 Link l1 = addLink(DID1, P1, DID2, P2, DIRECT);
195 Link l2 = addLink(DID2, P2, DID1, P1, DIRECT);
196 Link l3 = addLink(DID3, P3, DID2, P1, DIRECT);
197 Link l4 = addLink(DID2, P1, DID3, P3, DIRECT);
198 assertEquals("incorrect link count", 4, service.getLinkCount());
199
200 Set<Link> links = service.getLinks(cp(DID1, P1));
201 assertEquals("incorrect links", ImmutableSet.of(l1, l2), links);
202 links = service.getEgressLinks(cp(DID1, P1));
203 assertEquals("incorrect links", ImmutableSet.of(l1), links);
204 links = service.getIngressLinks(cp(DID1, P1));
205 assertEquals("incorrect links", ImmutableSet.of(l2), links);
206
207 links = service.getDeviceLinks(DID2);
208 assertEquals("incorrect links", ImmutableSet.of(l1, l2, l3, l4), links);
209 links = service.getDeviceLinks(DID3);
210 assertEquals("incorrect links", ImmutableSet.of(l3, l4), links);
211
212 links = service.getDeviceEgressLinks(DID2);
213 assertEquals("incorrect links", ImmutableSet.of(l2, l4), links);
214 links = service.getDeviceIngressLinks(DID2);
215 assertEquals("incorrect links", ImmutableSet.of(l1, l3), links);
216 }
217
218
219 private Link addLink(DeviceId sd, PortNumber sp, DeviceId dd, PortNumber dp,
220 Link.Type type) {
221 providerService.linkDetected(new DefaultLinkDescription(cp(sd, sp), cp(dd, dp), type));
222 Link link = listener.events.get(0).subject();
223 validateEvents(LINK_ADDED);
224 return link;
225 }
226
227 private ConnectPoint cp(DeviceId id, PortNumber portNumber) {
228 return new ConnectPoint(id, portNumber);
tombb58c202014-09-07 22:51:50 -0700229 }
230
tom0d395262014-09-07 16:53:40 -0700231 protected void validateEvents(Enum... types) {
232 int i = 0;
233 assertEquals("wrong events received", types.length, listener.events.size());
234 for (Event event : listener.events) {
235 assertEquals("incorrect event type", types[i], event.type());
236 i++;
237 }
238 listener.events.clear();
239 }
240
241
242 private class TestProvider extends AbstractProvider implements LinkProvider {
243 private Device deviceReceived;
244 private MastershipRole roleReceived;
245
246 public TestProvider() {
247 super(PID);
248 }
249 }
250
251 private static class TestListener implements LinkListener {
252 final List<LinkEvent> events = new ArrayList<>();
253
254 @Override
255 public void event(LinkEvent event) {
256 events.add(event);
257 }
258 }
259
260}