blob: 2c45c5e381d520b81b2c9540da79752e87a3881e [file] [log] [blame]
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -07001package org.onlab.onos.provider.of.device.impl;
2
3import static org.junit.Assert.assertEquals;
4import static org.junit.Assert.assertNotNull;
5import static org.junit.Assert.assertNull;
6import static org.junit.Assert.assertTrue;
7import static org.onlab.onos.net.Device.Type.*;
8import static org.onlab.onos.net.MastershipRole.*;
9
10import java.util.ArrayList;
11import java.util.HashMap;
12import java.util.HashSet;
13import java.util.List;
14import java.util.Map;
15import java.util.Set;
16
17import org.junit.After;
18import org.junit.Before;
19import org.junit.Test;
20import org.onlab.onos.net.DefaultDevice;
21import org.onlab.onos.net.Device;
22import org.onlab.onos.net.DeviceId;
tom3f2bbd72014-09-24 12:07:58 -070023import org.onlab.onos.net.MastershipRole;
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -070024import org.onlab.onos.net.device.DeviceDescription;
25import org.onlab.onos.net.device.DeviceProvider;
26import org.onlab.onos.net.device.DeviceProviderRegistry;
27import org.onlab.onos.net.device.DeviceProviderService;
28import org.onlab.onos.net.device.PortDescription;
29import org.onlab.onos.net.provider.ProviderId;
30import org.onlab.onos.openflow.controller.Dpid;
31import org.onlab.onos.openflow.controller.OpenFlowController;
32import org.onlab.onos.openflow.controller.OpenFlowEventListener;
33import org.onlab.onos.openflow.controller.OpenFlowSwitch;
34import org.onlab.onos.openflow.controller.OpenFlowSwitchListener;
35import org.onlab.onos.openflow.controller.PacketListener;
36import org.onlab.onos.openflow.controller.RoleState;
37import org.projectfloodlight.openflow.protocol.OFFactory;
38import org.projectfloodlight.openflow.protocol.OFMessage;
39import org.projectfloodlight.openflow.protocol.OFPortDesc;
40import org.projectfloodlight.openflow.protocol.OFPortReason;
41import org.projectfloodlight.openflow.protocol.OFPortStatus;
42import org.projectfloodlight.openflow.protocol.ver10.OFFactoryVer10;
43import org.projectfloodlight.openflow.types.OFPort;
44
45import com.google.common.collect.HashMultimap;
46import com.google.common.collect.Lists;
47import com.google.common.collect.Multimap;
48
49public class OpenFlowDeviceProviderTest {
50
51 private static final ProviderId PID = new ProviderId("of", "test");
52 private static final DeviceId DID1 = DeviceId.deviceId("of:0000000000000001");
53 private static final Dpid DPID1 = Dpid.dpid(DID1.uri());
54
55 private static final OFPortDesc PD1 = portDesc(1);
56 private static final OFPortDesc PD2 = portDesc(2);
57 private static final OFPortDesc PD3 = portDesc(3);
58
59 private static final List<OFPortDesc> PLIST = Lists.newArrayList(PD1, PD2);
60
61 private static final Device DEV1 =
alshabib7911a052014-10-16 17:49:37 -070062 new DefaultDevice(PID, DID1, SWITCH, "", "", "", "", null);
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -070063
64 private static final TestOpenFlowSwitch SW1 = new TestOpenFlowSwitch();
65
66 private final OpenFlowDeviceProvider provider = new OpenFlowDeviceProvider();
67 private final TestDeviceRegistry registry = new TestDeviceRegistry();
68 private final TestController controller = new TestController();
69
70 @Before
71 public void startUp() {
72 provider.providerRegistry = registry;
73 provider.controller = controller;
74 controller.switchMap.put(DPID1, SW1);
75 provider.activate();
76 assertNotNull("provider should be registered", registry.provider);
77 assertNotNull("listener should be registered", controller.listener);
78 assertEquals("devices not added", 1, registry.connected.size());
79 assertEquals("ports not added", 2, registry.ports.get(DID1).size());
80 }
81
82 @After
83 public void tearDown() {
84 provider.deactivate();
85 assertTrue("devices should be removed", registry.connected.isEmpty());
86 assertNull("listener should be removed", controller.listener);
87 provider.controller = null;
88 provider.providerRegistry = null;
89 }
90
91 @Test
92 public void roleChanged() {
93 provider.roleChanged(DEV1, MASTER);
94 assertEquals("Should be MASTER", RoleState.MASTER, controller.roleMap.get(DPID1));
95 provider.roleChanged(DEV1, STANDBY);
96 assertEquals("Should be EQUAL", RoleState.EQUAL, controller.roleMap.get(DPID1));
97 provider.roleChanged(DEV1, NONE);
98 assertEquals("Should be SLAVE", RoleState.SLAVE, controller.roleMap.get(DPID1));
99 }
100
101 @Test
102 public void triggerProbe() {
103 // TODO
104 }
105
106 @Test
107 public void switchRemoved() {
108 controller.listener.switchRemoved(DPID1);
109 assertTrue("device not removed", registry.connected.isEmpty());
110 }
111
112 @Test
113 public void portChanged() {
114 OFPortStatus stat = SW1.factory().buildPortStatus()
115 .setReason(OFPortReason.ADD)
116 .setDesc(PD3)
117 .build();
118 controller.listener.portChanged(DPID1, stat);
Ayaka Koshibe39a04802014-09-22 10:23:54 -0700119 assertNotNull("never went throught the provider service", registry.descr);
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700120 assertEquals("port status unhandled", 3, registry.ports.get(DID1).size());
121 }
122
Ayaka Koshibe32402f32014-09-25 11:08:54 -0700123 @Test
124 public void roleAssertFailed() {
125 controller.listener.roleAssertFailed(DPID1, RoleState.MASTER);
126 assertEquals("wrong role reported", DPID1, registry.roles.get(MASTER));
127 controller.listener.roleAssertFailed(DPID1, RoleState.EQUAL);
128 assertEquals("wrong role reported", DPID1, registry.roles.get(STANDBY));
129 controller.listener.roleAssertFailed(DPID1, RoleState.SLAVE);
130 assertEquals("wrong role reported", DPID1, registry.roles.get(NONE));
131 }
132
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700133 private static OFPortDesc portDesc(int port) {
134 OFPortDesc.Builder builder = OFFactoryVer10.INSTANCE.buildPortDesc();
135 builder.setPortNo(OFPort.of(port));
136
137 return builder.build();
138 }
139
140 private class TestDeviceRegistry implements DeviceProviderRegistry {
141 DeviceProvider provider;
Ayaka Koshibe32402f32014-09-25 11:08:54 -0700142
143 Set<DeviceId> connected = new HashSet<>();
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700144 Multimap<DeviceId, PortDescription> ports = HashMultimap.create();
Ayaka Koshibe39a04802014-09-22 10:23:54 -0700145 PortDescription descr = null;
Ayaka Koshibe32402f32014-09-25 11:08:54 -0700146 Map<MastershipRole, Dpid> roles = new HashMap<>();
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700147
148 @Override
149 public DeviceProviderService register(DeviceProvider provider) {
150 this.provider = provider;
151 return new TestProviderService();
152 }
153
154 @Override
155 public void unregister(DeviceProvider provider) {
156 }
157
158 @Override
159 public Set<ProviderId> getProviders() {
160 return null;
161 }
162
163 private class TestProviderService implements DeviceProviderService {
164
165 @Override
166 public DeviceProvider provider() {
167 return null;
168 }
169
170 @Override
171 public void deviceConnected(DeviceId deviceId,
172 DeviceDescription deviceDescription) {
173 connected.add(deviceId);
174 }
175
176 @Override
177 public void deviceDisconnected(DeviceId deviceId) {
178 connected.remove(deviceId);
179 ports.removeAll(deviceId);
180 }
181
182 @Override
183 public void updatePorts(DeviceId deviceId,
184 List<PortDescription> portDescriptions) {
185 for (PortDescription p : portDescriptions) {
186 ports.put(deviceId, p);
187 }
188 }
189
190 @Override
191 public void portStatusChanged(DeviceId deviceId,
192 PortDescription portDescription) {
Ayaka Koshibe39a04802014-09-22 10:23:54 -0700193 ports.put(deviceId, portDescription);
194 descr = portDescription;
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700195 }
196
tom3f2bbd72014-09-24 12:07:58 -0700197 @Override
198 public void unableToAssertRole(DeviceId deviceId, MastershipRole role) {
Ayaka Koshibe32402f32014-09-25 11:08:54 -0700199 roles.put(role, Dpid.dpid(deviceId.uri()));
tom3f2bbd72014-09-24 12:07:58 -0700200 }
201
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700202 }
203 }
204
205 private class TestController implements OpenFlowController {
206 OpenFlowSwitchListener listener = null;
207 Map<Dpid, RoleState> roleMap = new HashMap<Dpid, RoleState>();
208 Map<Dpid, OpenFlowSwitch> switchMap = new HashMap<Dpid, OpenFlowSwitch>();
209
210 @Override
211 public Iterable<OpenFlowSwitch> getSwitches() {
212 return switchMap.values();
213 }
214
215 @Override
216 public Iterable<OpenFlowSwitch> getMasterSwitches() {
217 return null;
218 }
219
220 @Override
221 public Iterable<OpenFlowSwitch> getEqualSwitches() {
222 return null;
223 }
224
225 @Override
226 public OpenFlowSwitch getSwitch(Dpid dpid) {
227 return switchMap.get(dpid);
228 }
229
230 @Override
231 public OpenFlowSwitch getMasterSwitch(Dpid dpid) {
232 return null;
233 }
234
235 @Override
236 public OpenFlowSwitch getEqualSwitch(Dpid dpid) {
237
238 return null;
239 }
240
241 @Override
242 public void addListener(OpenFlowSwitchListener listener) {
243 this.listener = listener;
244 }
245
246 @Override
247 public void removeListener(OpenFlowSwitchListener listener) {
248 this.listener = null;
249 }
250
251 @Override
252 public void addPacketListener(int priority, PacketListener listener) {
253 }
254
255 @Override
256 public void removePacketListener(PacketListener listener) {
257 }
258
259 @Override
260 public void addEventListener(OpenFlowEventListener listener) {
261 }
262
263 @Override
264 public void removeEventListener(OpenFlowEventListener listener) {
265 }
266
267 @Override
268 public void write(Dpid dpid, OFMessage msg) {
269 }
270
271 @Override
272 public void processPacket(Dpid dpid, OFMessage msg) {
273 }
274
275 @Override
276 public void setRole(Dpid dpid, RoleState role) {
277 roleMap.put(dpid, role);
278 }
279 }
280
281 private static class TestOpenFlowSwitch implements OpenFlowSwitch {
282
283 RoleState state;
284 List<OFMessage> sent = new ArrayList<OFMessage>();
285 OFFactory factory = OFFactoryVer10.INSTANCE;
286
287 @Override
288 public void sendMsg(OFMessage msg) {
289 sent.add(msg);
290 }
291
292 @Override
293 public void sendMsg(List<OFMessage> msgs) {
294 }
295
296 @Override
297 public void handleMessage(OFMessage fromSwitch) {
298 }
299
300 @Override
301 public void setRole(RoleState role) {
302 state = role;
303 }
304
305 @Override
306 public RoleState getRole() {
307 return state;
308 }
309
310 @Override
311 public List<OFPortDesc> getPorts() {
312 return PLIST;
313 }
314
315 @Override
316 public OFFactory factory() {
317 return factory;
318 }
319
320 @Override
321 public String getStringId() {
322 return null;
323 }
324
325 @Override
326 public long getId() {
327 return DPID1.value();
328 }
329
330 @Override
331 public String manfacturerDescription() {
332 return null;
333 }
334
335 @Override
336 public String datapathDescription() {
337 return null;
338 }
339
340 @Override
341 public String hardwareDescription() {
342 return null;
343 }
344
345 @Override
346 public String softwareDescription() {
347 return null;
348 }
349
350 @Override
351 public String serialNumber() {
352 return null;
353 }
354
355 @Override
356 public void disconnectSwitch() {
357 }
358
Ayaka Koshibeab91cc42014-09-25 10:20:52 -0700359 @Override
360 public void returnRoleAssertFailure(RoleState role) {
361 }
362
Ayaka Koshibe0380d4c2014-09-19 16:03:07 -0700363 }
364
365}