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