blob: f7aeb0893f9fb14f2a74e1967bb26245175bc1f7 [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;
tom41a2c5f2014-09-19 09:20:35 -070025import org.onlab.onos.net.trivial.device.impl.DeviceManager;
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 */
tom35c0dc32014-09-19 10:00:58 -070041public class LinkManagerTest {
tom0d395262014-09-07 16:53:40 -070042
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
tom35c0dc32014-09-19 10:00:58 -070053 private LinkManager mgr;
tom0d395262014-09-07 16:53:40 -070054
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() {
tom35c0dc32014-09-19 10:00:58 -070064 mgr = new LinkManager();
tom0d395262014-09-07 16:53:40 -070065 service = mgr;
66 admin = mgr;
67 registry = mgr;
tom35c0dc32014-09-19 10:00:58 -070068 mgr.store = new SimpleLinkStore();
tom0d395262014-09-07 16:53:40 -070069 mgr.eventDispatcher = new TestEventDispatcher();
tom41a2c5f2014-09-19 09:20:35 -070070 mgr.deviceService = new DeviceManager();
tom0d395262014-09-07 16:53:40 -070071 mgr.activate();
72
73 service.addListener(listener);
74
75 provider = new TestProvider();
76 providerService = registry.register(provider);
77 assertTrue("provider should be registered",
78 registry.getProviders().contains(provider.id()));
79 }
80
81 @After
82 public void tearDown() {
83 registry.unregister(provider);
84 assertFalse("provider should not be registered",
85 registry.getProviders().contains(provider.id()));
86 service.removeListener(listener);
87 mgr.deactivate();
88 }
89
tombb58c202014-09-07 22:51:50 -070090 @Test
91 public void createLink() {
tomd176fc42014-09-08 00:12:30 -070092 addLink(DID1, P1, DID2, P2, DIRECT);
93 addLink(DID2, P2, DID1, P1, DIRECT);
94 assertEquals("incorrect link count", 2, service.getLinkCount());
95
96 Iterator<Link> it = service.getLinks().iterator();
97 it.next();
98 it.next();
99 assertFalse("incorrect link count", it.hasNext());
100 }
101
102 @Test
103 public void updateLink() {
104 addLink(DID1, P1, DID2, P2, DIRECT);
105 addLink(DID2, P2, DID1, P1, INDIRECT);
106 assertEquals("incorrect link count", 2, service.getLinkCount());
107
108 providerService.linkDetected(new DefaultLinkDescription(cp(DID2, P2), cp(DID1, P1), DIRECT));
109 validateEvents(LINK_UPDATED);
110 assertEquals("incorrect link count", 2, service.getLinkCount());
111
112 providerService.linkDetected(new DefaultLinkDescription(cp(DID2, P2), cp(DID1, P1), INDIRECT));
113 providerService.linkDetected(new DefaultLinkDescription(cp(DID2, P2), cp(DID1, P1), DIRECT));
114 assertEquals("no events expected", 0, listener.events.size());
115 }
116
117 @Test
118 public void removeLink() {
119 addLink(DID1, P1, DID2, P2, DIRECT);
120 addLink(DID2, P2, DID1, P1, DIRECT);
121 assertEquals("incorrect link count", 2, service.getLinkCount());
122
123 providerService.linkVanished(new DefaultLinkDescription(cp(DID1, P1), cp(DID2, P2), DIRECT));
124 validateEvents(LINK_REMOVED);
125 assertEquals("incorrect link count", 1, service.getLinkCount());
126 assertNull("link should not be found", service.getLink(cp(DID1, P1), cp(DID2, P2)));
127 assertNotNull("link should be found", service.getLink(cp(DID2, P2), cp(DID1, P1)));
128
129 providerService.linkVanished(new DefaultLinkDescription(cp(DID1, P1), cp(DID2, P2), DIRECT));
130 assertEquals("no events expected", 0, listener.events.size());
131 }
132
133 @Test
134 public void removeLinksByConnectionPoint() {
135 Link l1 = addLink(DID1, P1, DID2, P2, DIRECT);
136 Link l2 = addLink(DID2, P2, DID1, P1, DIRECT);
137 addLink(DID3, P3, DID2, P1, DIRECT);
138 addLink(DID2, P1, DID3, P3, DIRECT);
139 assertEquals("incorrect link count", 4, service.getLinkCount());
140
141 providerService.linksVanished(cp(DID1, P1));
142 assertEquals("incorrect link count", 2, service.getLinkCount());
143 assertNull("link should be gone", service.getLink(l1.src(), l1.dst()));
144 assertNull("link should be gone", service.getLink(l2.src(), l2.dst()));
145 }
146
147 @Test
148 public void removeLinksByDevice() {
149 addLink(DID1, P1, DID2, P2, DIRECT);
150 addLink(DID2, P2, DID1, P1, DIRECT);
151 addLink(DID3, P3, DID2, P1, DIRECT);
152 addLink(DID2, P1, DID3, P3, DIRECT);
153 Link l5 = addLink(DID3, P1, DID1, P2, DIRECT);
154 Link l6 = addLink(DID1, P2, DID3, P1, DIRECT);
155 assertEquals("incorrect link count", 6, service.getLinkCount());
156
157 providerService.linksVanished(DID2);
158 assertEquals("incorrect link count", 2, service.getLinkCount());
159 assertNotNull("link should not be gone", service.getLink(l5.src(), l5.dst()));
160 assertNotNull("link should not be gone", service.getLink(l6.src(), l6.dst()));
161 }
162
163 @Test
164 public void removeLinksAsAdminByConnectionPoint() {
165 Link l1 = addLink(DID1, P1, DID2, P2, DIRECT);
166 Link l2 = addLink(DID2, P2, DID1, P1, DIRECT);
167 addLink(DID3, P3, DID2, P1, DIRECT);
168 addLink(DID2, P1, DID3, P3, DIRECT);
169 assertEquals("incorrect link count", 4, service.getLinkCount());
170
171 admin.removeLinks(cp(DID1, P1));
172 assertEquals("incorrect link count", 2, service.getLinkCount());
173 assertNull("link should be gone", service.getLink(l1.src(), l1.dst()));
174 assertNull("link should be gone", service.getLink(l2.src(), l2.dst()));
175 }
176
177 @Test
178 public void removeLinksAsAdminByDevice() {
179 addLink(DID1, P1, DID2, P2, DIRECT);
180 addLink(DID2, P2, DID1, P1, DIRECT);
181 addLink(DID3, P3, DID2, P1, DIRECT);
182 addLink(DID2, P1, DID3, P3, DIRECT);
183 Link l5 = addLink(DID3, P1, DID1, P2, DIRECT);
184 Link l6 = addLink(DID1, P2, DID3, P1, DIRECT);
185 assertEquals("incorrect link count", 6, service.getLinkCount());
186
187 admin.removeLinks(DID2);
188 assertEquals("incorrect link count", 2, service.getLinkCount());
189 assertNotNull("link should not be gone", service.getLink(l5.src(), l5.dst()));
190 assertNotNull("link should not be gone", service.getLink(l6.src(), l6.dst()));
191 }
192
193 @Test
194 public void getLinks() {
195 Link l1 = addLink(DID1, P1, DID2, P2, DIRECT);
196 Link l2 = addLink(DID2, P2, DID1, P1, DIRECT);
197 Link l3 = addLink(DID3, P3, DID2, P1, DIRECT);
198 Link l4 = addLink(DID2, P1, DID3, P3, DIRECT);
199 assertEquals("incorrect link count", 4, service.getLinkCount());
200
201 Set<Link> links = service.getLinks(cp(DID1, P1));
202 assertEquals("incorrect links", ImmutableSet.of(l1, l2), links);
203 links = service.getEgressLinks(cp(DID1, P1));
204 assertEquals("incorrect links", ImmutableSet.of(l1), links);
205 links = service.getIngressLinks(cp(DID1, P1));
206 assertEquals("incorrect links", ImmutableSet.of(l2), links);
207
208 links = service.getDeviceLinks(DID2);
209 assertEquals("incorrect links", ImmutableSet.of(l1, l2, l3, l4), links);
210 links = service.getDeviceLinks(DID3);
211 assertEquals("incorrect links", ImmutableSet.of(l3, l4), links);
212
213 links = service.getDeviceEgressLinks(DID2);
214 assertEquals("incorrect links", ImmutableSet.of(l2, l4), links);
215 links = service.getDeviceIngressLinks(DID2);
216 assertEquals("incorrect links", ImmutableSet.of(l1, l3), links);
217 }
218
219
220 private Link addLink(DeviceId sd, PortNumber sp, DeviceId dd, PortNumber dp,
221 Link.Type type) {
222 providerService.linkDetected(new DefaultLinkDescription(cp(sd, sp), cp(dd, dp), type));
223 Link link = listener.events.get(0).subject();
224 validateEvents(LINK_ADDED);
225 return link;
226 }
227
228 private ConnectPoint cp(DeviceId id, PortNumber portNumber) {
229 return new ConnectPoint(id, portNumber);
tombb58c202014-09-07 22:51:50 -0700230 }
231
tom0d395262014-09-07 16:53:40 -0700232 protected void validateEvents(Enum... types) {
233 int i = 0;
234 assertEquals("wrong events received", types.length, listener.events.size());
235 for (Event event : listener.events) {
236 assertEquals("incorrect event type", types[i], event.type());
237 i++;
238 }
239 listener.events.clear();
240 }
241
242
243 private class TestProvider extends AbstractProvider implements LinkProvider {
244 private Device deviceReceived;
245 private MastershipRole roleReceived;
246
247 public TestProvider() {
248 super(PID);
249 }
250 }
251
252 private static class TestListener implements LinkListener {
253 final List<LinkEvent> events = new ArrayList<>();
254
255 @Override
256 public void event(LinkEvent event) {
257 events.add(event);
258 }
259 }
260
261}