blob: 9a1656245b6215afef85774b9dd486842f1e384b [file] [log] [blame]
tombe988312014-09-19 18:38:47 -07001package org.onlab.onos.net.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;
tombe988312014-09-19 18:38:47 -070025import org.onlab.onos.net.device.impl.DeviceManager;
tomea961ff2014-10-01 12:45:15 -070026import org.onlab.onos.store.trivial.impl.SimpleLinkStore;
tom0d395262014-09-07 16:53:40 -070027
28import java.util.ArrayList;
tomd176fc42014-09-08 00:12:30 -070029import java.util.Iterator;
tom0d395262014-09-07 16:53:40 -070030import java.util.List;
tomd176fc42014-09-08 00:12:30 -070031import java.util.Set;
tom0d395262014-09-07 16:53:40 -070032
33import static org.junit.Assert.*;
tom0d395262014-09-07 16:53:40 -070034import static org.onlab.onos.net.DeviceId.deviceId;
tomd176fc42014-09-08 00:12:30 -070035import static org.onlab.onos.net.Link.Type.DIRECT;
36import static org.onlab.onos.net.Link.Type.INDIRECT;
37import static org.onlab.onos.net.link.LinkEvent.Type.*;
tom0d395262014-09-07 16:53:40 -070038
39/**
40 * Test codifying the link service & link provider service contracts.
41 */
tom35c0dc32014-09-19 10:00:58 -070042public class LinkManagerTest {
tom0d395262014-09-07 16:53:40 -070043
tom7e02cda2014-09-18 12:05:46 -070044 private static final ProviderId PID = new ProviderId("of", "foo");
tom0d395262014-09-07 16:53:40 -070045 private static final DeviceId DID1 = deviceId("of:foo");
46 private static final DeviceId DID2 = deviceId("of:bar");
tomd176fc42014-09-08 00:12:30 -070047 private static final DeviceId DID3 = deviceId("of:goo");
tom0d395262014-09-07 16:53:40 -070048
49 private static final PortNumber P1 = PortNumber.portNumber(1);
50 private static final PortNumber P2 = PortNumber.portNumber(2);
51 private static final PortNumber P3 = PortNumber.portNumber(3);
52
53
tom35c0dc32014-09-19 10:00:58 -070054 private LinkManager mgr;
tom0d395262014-09-07 16:53:40 -070055
56 protected LinkService service;
57 protected LinkAdminService admin;
58 protected LinkProviderRegistry registry;
59 protected LinkProviderService providerService;
60 protected TestProvider provider;
61 protected TestListener listener = new TestListener();
Ayaka Koshibeb5c63a02014-10-18 18:42:27 -070062 protected DeviceManager devmgr = new TestDeviceManager();
tom0d395262014-09-07 16:53:40 -070063
64 @Before
65 public void setUp() {
tom35c0dc32014-09-19 10:00:58 -070066 mgr = new LinkManager();
tom0d395262014-09-07 16:53:40 -070067 service = mgr;
68 admin = mgr;
69 registry = mgr;
tom35c0dc32014-09-19 10:00:58 -070070 mgr.store = new SimpleLinkStore();
tom0d395262014-09-07 16:53:40 -070071 mgr.eventDispatcher = new TestEventDispatcher();
Ayaka Koshibeb5c63a02014-10-18 18:42:27 -070072 mgr.deviceService = devmgr;
tom0d395262014-09-07 16:53:40 -070073 mgr.activate();
74
75 service.addListener(listener);
76
77 provider = new TestProvider();
78 providerService = registry.register(provider);
79 assertTrue("provider should be registered",
80 registry.getProviders().contains(provider.id()));
81 }
82
83 @After
84 public void tearDown() {
85 registry.unregister(provider);
86 assertFalse("provider should not be registered",
87 registry.getProviders().contains(provider.id()));
88 service.removeListener(listener);
89 mgr.deactivate();
90 }
91
tombb58c202014-09-07 22:51:50 -070092 @Test
93 public void createLink() {
tomd176fc42014-09-08 00:12:30 -070094 addLink(DID1, P1, DID2, P2, DIRECT);
95 addLink(DID2, P2, DID1, P1, DIRECT);
96 assertEquals("incorrect link count", 2, service.getLinkCount());
97
98 Iterator<Link> it = service.getLinks().iterator();
99 it.next();
100 it.next();
101 assertFalse("incorrect link count", it.hasNext());
102 }
103
104 @Test
105 public void updateLink() {
106 addLink(DID1, P1, DID2, P2, DIRECT);
107 addLink(DID2, P2, DID1, P1, INDIRECT);
108 assertEquals("incorrect link count", 2, service.getLinkCount());
109
110 providerService.linkDetected(new DefaultLinkDescription(cp(DID2, P2), cp(DID1, P1), DIRECT));
111 validateEvents(LINK_UPDATED);
112 assertEquals("incorrect link count", 2, service.getLinkCount());
113
114 providerService.linkDetected(new DefaultLinkDescription(cp(DID2, P2), cp(DID1, P1), INDIRECT));
115 providerService.linkDetected(new DefaultLinkDescription(cp(DID2, P2), cp(DID1, P1), DIRECT));
116 assertEquals("no events expected", 0, listener.events.size());
117 }
118
119 @Test
120 public void removeLink() {
121 addLink(DID1, P1, DID2, P2, DIRECT);
122 addLink(DID2, P2, DID1, P1, DIRECT);
123 assertEquals("incorrect link count", 2, service.getLinkCount());
124
125 providerService.linkVanished(new DefaultLinkDescription(cp(DID1, P1), cp(DID2, P2), DIRECT));
126 validateEvents(LINK_REMOVED);
127 assertEquals("incorrect link count", 1, service.getLinkCount());
128 assertNull("link should not be found", service.getLink(cp(DID1, P1), cp(DID2, P2)));
129 assertNotNull("link should be found", service.getLink(cp(DID2, P2), cp(DID1, P1)));
130
131 providerService.linkVanished(new DefaultLinkDescription(cp(DID1, P1), cp(DID2, P2), DIRECT));
132 assertEquals("no events expected", 0, listener.events.size());
133 }
134
135 @Test
136 public void removeLinksByConnectionPoint() {
137 Link l1 = addLink(DID1, P1, DID2, P2, DIRECT);
138 Link l2 = addLink(DID2, P2, DID1, P1, DIRECT);
139 addLink(DID3, P3, DID2, P1, DIRECT);
140 addLink(DID2, P1, DID3, P3, DIRECT);
141 assertEquals("incorrect link count", 4, service.getLinkCount());
142
143 providerService.linksVanished(cp(DID1, P1));
144 assertEquals("incorrect link count", 2, service.getLinkCount());
145 assertNull("link should be gone", service.getLink(l1.src(), l1.dst()));
146 assertNull("link should be gone", service.getLink(l2.src(), l2.dst()));
147 }
148
149 @Test
150 public void removeLinksByDevice() {
151 addLink(DID1, P1, DID2, P2, DIRECT);
152 addLink(DID2, P2, DID1, P1, DIRECT);
153 addLink(DID3, P3, DID2, P1, DIRECT);
154 addLink(DID2, P1, DID3, P3, DIRECT);
155 Link l5 = addLink(DID3, P1, DID1, P2, DIRECT);
156 Link l6 = addLink(DID1, P2, DID3, P1, DIRECT);
157 assertEquals("incorrect link count", 6, service.getLinkCount());
158
159 providerService.linksVanished(DID2);
160 assertEquals("incorrect link count", 2, service.getLinkCount());
161 assertNotNull("link should not be gone", service.getLink(l5.src(), l5.dst()));
162 assertNotNull("link should not be gone", service.getLink(l6.src(), l6.dst()));
163 }
164
165 @Test
166 public void removeLinksAsAdminByConnectionPoint() {
167 Link l1 = addLink(DID1, P1, DID2, P2, DIRECT);
168 Link l2 = addLink(DID2, P2, DID1, P1, DIRECT);
169 addLink(DID3, P3, DID2, P1, DIRECT);
170 addLink(DID2, P1, DID3, P3, DIRECT);
171 assertEquals("incorrect link count", 4, service.getLinkCount());
172
173 admin.removeLinks(cp(DID1, P1));
174 assertEquals("incorrect link count", 2, service.getLinkCount());
175 assertNull("link should be gone", service.getLink(l1.src(), l1.dst()));
176 assertNull("link should be gone", service.getLink(l2.src(), l2.dst()));
177 }
178
179 @Test
180 public void removeLinksAsAdminByDevice() {
181 addLink(DID1, P1, DID2, P2, DIRECT);
182 addLink(DID2, P2, DID1, P1, DIRECT);
183 addLink(DID3, P3, DID2, P1, DIRECT);
184 addLink(DID2, P1, DID3, P3, DIRECT);
185 Link l5 = addLink(DID3, P1, DID1, P2, DIRECT);
186 Link l6 = addLink(DID1, P2, DID3, P1, DIRECT);
187 assertEquals("incorrect link count", 6, service.getLinkCount());
188
189 admin.removeLinks(DID2);
190 assertEquals("incorrect link count", 2, service.getLinkCount());
191 assertNotNull("link should not be gone", service.getLink(l5.src(), l5.dst()));
192 assertNotNull("link should not be gone", service.getLink(l6.src(), l6.dst()));
193 }
194
195 @Test
196 public void getLinks() {
197 Link l1 = addLink(DID1, P1, DID2, P2, DIRECT);
198 Link l2 = addLink(DID2, P2, DID1, P1, DIRECT);
199 Link l3 = addLink(DID3, P3, DID2, P1, DIRECT);
200 Link l4 = addLink(DID2, P1, DID3, P3, DIRECT);
201 assertEquals("incorrect link count", 4, service.getLinkCount());
202
203 Set<Link> links = service.getLinks(cp(DID1, P1));
204 assertEquals("incorrect links", ImmutableSet.of(l1, l2), links);
205 links = service.getEgressLinks(cp(DID1, P1));
206 assertEquals("incorrect links", ImmutableSet.of(l1), links);
207 links = service.getIngressLinks(cp(DID1, P1));
208 assertEquals("incorrect links", ImmutableSet.of(l2), links);
209
210 links = service.getDeviceLinks(DID2);
211 assertEquals("incorrect links", ImmutableSet.of(l1, l2, l3, l4), links);
212 links = service.getDeviceLinks(DID3);
213 assertEquals("incorrect links", ImmutableSet.of(l3, l4), links);
214
215 links = service.getDeviceEgressLinks(DID2);
216 assertEquals("incorrect links", ImmutableSet.of(l2, l4), links);
217 links = service.getDeviceIngressLinks(DID2);
218 assertEquals("incorrect links", ImmutableSet.of(l1, l3), links);
219 }
220
221
222 private Link addLink(DeviceId sd, PortNumber sp, DeviceId dd, PortNumber dp,
223 Link.Type type) {
224 providerService.linkDetected(new DefaultLinkDescription(cp(sd, sp), cp(dd, dp), type));
225 Link link = listener.events.get(0).subject();
226 validateEvents(LINK_ADDED);
227 return link;
228 }
229
230 private ConnectPoint cp(DeviceId id, PortNumber portNumber) {
231 return new ConnectPoint(id, portNumber);
tombb58c202014-09-07 22:51:50 -0700232 }
233
tom0d395262014-09-07 16:53:40 -0700234 protected void validateEvents(Enum... types) {
235 int i = 0;
236 assertEquals("wrong events received", types.length, listener.events.size());
237 for (Event event : listener.events) {
238 assertEquals("incorrect event type", types[i], event.type());
239 i++;
240 }
241 listener.events.clear();
242 }
243
244
245 private class TestProvider extends AbstractProvider implements LinkProvider {
246 private Device deviceReceived;
247 private MastershipRole roleReceived;
248
249 public TestProvider() {
250 super(PID);
251 }
252 }
253
254 private static class TestListener implements LinkListener {
255 final List<LinkEvent> events = new ArrayList<>();
256
257 @Override
258 public void event(LinkEvent event) {
259 events.add(event);
260 }
261 }
262
Ayaka Koshibeb5c63a02014-10-18 18:42:27 -0700263 private static class TestDeviceManager extends DeviceManager {
264 @Override
265 public MastershipRole getRole(DeviceId deviceId) {
266 return MastershipRole.MASTER;
267 }
268 }
269
tom0d395262014-09-07 16:53:40 -0700270}