blob: e5224dbfc7b57c296202eecda20f6784f21a9215 [file] [log] [blame]
tome5ec3fd2014-09-04 15:18:06 -07001package org.onlab.onos.net.trivial.impl;
2
3import org.junit.After;
4import org.junit.Before;
5import org.junit.Test;
6import org.onlab.onos.event.Event;
7import org.onlab.onos.net.Device;
8import org.onlab.onos.net.DeviceId;
9import org.onlab.onos.net.MastershipRole;
tom24c55cd2014-09-06 10:47:25 -070010import org.onlab.onos.net.Port;
11import org.onlab.onos.net.PortNumber;
tome5ec3fd2014-09-04 15:18:06 -070012import org.onlab.onos.net.device.DefaultDeviceDescription;
tom24c55cd2014-09-06 10:47:25 -070013import org.onlab.onos.net.device.DefaultPortDescription;
tome5ec3fd2014-09-04 15:18:06 -070014import org.onlab.onos.net.device.DeviceAdminService;
15import org.onlab.onos.net.device.DeviceDescription;
16import org.onlab.onos.net.device.DeviceEvent;
17import org.onlab.onos.net.device.DeviceListener;
18import org.onlab.onos.net.device.DeviceProvider;
19import org.onlab.onos.net.device.DeviceProviderRegistry;
20import org.onlab.onos.net.device.DeviceProviderService;
21import org.onlab.onos.net.device.DeviceService;
tom24c55cd2014-09-06 10:47:25 -070022import org.onlab.onos.net.device.PortDescription;
tome5ec3fd2014-09-04 15:18:06 -070023import org.onlab.onos.net.provider.AbstractProvider;
24import org.onlab.onos.net.provider.ProviderId;
25
26import java.util.ArrayList;
27import java.util.Iterator;
28import java.util.List;
29
30import static org.junit.Assert.*;
31import static org.onlab.onos.net.Device.Type.SWITCH;
32import static org.onlab.onos.net.DeviceId.deviceId;
33import static org.onlab.onos.net.device.DeviceEvent.Type.*;
34
35/**
36 * Test codifying the device service & device provider service contracts.
37 */
38public class SimpleDeviceManagerTest {
39
40 private static final ProviderId PID = new ProviderId("foo");
41 private static final DeviceId DID1 = deviceId("of:foo");
42 private static final DeviceId DID2 = deviceId("of:bar");
43 private static final String MFR = "whitebox";
44 private static final String HW = "1.1.x";
45 private static final String SW1 = "3.8.1";
46 private static final String SW2 = "3.9.5";
47 private static final String SN = "43311-12345";
48
tom24c55cd2014-09-06 10:47:25 -070049 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
tome5ec3fd2014-09-04 15:18:06 -070053
54 private SimpleDeviceManager mgr;
55
56 protected DeviceService service;
57 protected DeviceAdminService admin;
58 protected DeviceProviderRegistry registry;
59 protected DeviceProviderService providerService;
60 protected TestProvider provider;
61 protected TestListener listener = new TestListener();
62
63 @Before
64 public void setUp() {
65 mgr = new SimpleDeviceManager();
66 service = mgr;
67 admin = mgr;
68 registry = mgr;
69 mgr.eventDispatcher = new TestEventDispatcher();
70 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
89 private void connectDevice(DeviceId deviceId, String swVersion) {
90 DeviceDescription description =
91 new DefaultDeviceDescription(deviceId.uri(), SWITCH, MFR,
92 HW, swVersion, SN);
93 providerService.deviceConnected(deviceId, description);
94 assertNotNull("device should be found", service.getDevice(DID1));
95 }
96
97 @Test
98 public void deviceConnected() {
99 assertNull("device should not be found", service.getDevice(DID1));
100 connectDevice(DID1, SW1);
101 validateEvents(DEVICE_ADDED);
102
103 Iterator<Device> it = service.getDevices().iterator();
104 assertNotNull("one device expected", it.next());
105 assertFalse("only one device expected", it.hasNext());
tomad2d2092014-09-06 23:24:20 -0700106 assertEquals("incorrect device count", 1, service.getDeviceCount());
tomff7eb7c2014-09-08 12:49:03 -0700107 assertTrue("device should be available", service.isAvailable(DID1));
tome5ec3fd2014-09-04 15:18:06 -0700108 }
109
110 @Test
111 public void deviceDisconnected() {
112 connectDevice(DID1, SW1);
113 connectDevice(DID2, SW1);
114 validateEvents(DEVICE_ADDED, DEVICE_ADDED);
tomff7eb7c2014-09-08 12:49:03 -0700115 assertTrue("device should be available", service.isAvailable(DID1));
tome5ec3fd2014-09-04 15:18:06 -0700116
117 // Disconnect
118 providerService.deviceDisconnected(DID1);
119 assertNotNull("device should not be found", service.getDevice(DID1));
tomff7eb7c2014-09-08 12:49:03 -0700120 assertFalse("device should not be available", service.isAvailable(DID1));
tome5ec3fd2014-09-04 15:18:06 -0700121 validateEvents(DEVICE_AVAILABILITY_CHANGED);
122
123 // Reconnect
124 connectDevice(DID1, SW1);
125 validateEvents(DEVICE_AVAILABILITY_CHANGED);
tomad2d2092014-09-06 23:24:20 -0700126
127 assertEquals("incorrect device count", 2, service.getDeviceCount());
tome5ec3fd2014-09-04 15:18:06 -0700128 }
129
130 @Test
131 public void deviceUpdated() {
132 connectDevice(DID1, SW1);
133 validateEvents(DEVICE_ADDED);
134
135 connectDevice(DID1, SW2);
136 validateEvents(DEVICE_UPDATED);
137 }
138
139 @Test
140 public void getRole() {
141 connectDevice(DID1, SW1);
142 assertEquals("incorrect role", MastershipRole.NONE, service.getRole(DID1));
143 }
144
145 @Test
146 public void setRole() {
147 connectDevice(DID1, SW1);
148 admin.setRole(DID1, MastershipRole.MASTER);
149 validateEvents(DEVICE_ADDED, DEVICE_MASTERSHIP_CHANGED);
150 assertEquals("incorrect role", MastershipRole.MASTER, service.getRole(DID1));
151 assertEquals("incorrect device", DID1, provider.deviceReceived.id());
152 assertEquals("incorrect role", MastershipRole.MASTER, provider.roleReceived);
153 }
154
tom24c55cd2014-09-06 10:47:25 -0700155 @Test
156 public void updatePorts() {
157 connectDevice(DID1, SW1);
158 List<PortDescription> pds = new ArrayList<>();
159 pds.add(new DefaultPortDescription(P1, true));
160 pds.add(new DefaultPortDescription(P2, true));
161 pds.add(new DefaultPortDescription(P3, true));
162 providerService.updatePorts(DID1, pds);
163 validateEvents(DEVICE_ADDED, PORT_ADDED, PORT_ADDED, PORT_ADDED);
164 pds.clear();
tome5ec3fd2014-09-04 15:18:06 -0700165
tom24c55cd2014-09-06 10:47:25 -0700166 pds.add(new DefaultPortDescription(P1, false));
167 pds.add(new DefaultPortDescription(P3, true));
168 providerService.updatePorts(DID1, pds);
169 validateEvents(PORT_UPDATED, PORT_REMOVED);
170 }
171
172 @Test
173 public void updatePortStatus() {
174 connectDevice(DID1, SW1);
175 List<PortDescription> pds = new ArrayList<>();
176 pds.add(new DefaultPortDescription(P1, true));
177 pds.add(new DefaultPortDescription(P2, true));
178 providerService.updatePorts(DID1, pds);
179 validateEvents(DEVICE_ADDED, PORT_ADDED, PORT_ADDED);
180
181 providerService.portStatusChanged(DID1, new DefaultPortDescription(P1, false));
182 validateEvents(PORT_UPDATED);
183 providerService.portStatusChanged(DID1, new DefaultPortDescription(P1, false));
184 assertTrue("no events expected", listener.events.isEmpty());
185 }
186
187 @Test
188 public void getPorts() {
189 connectDevice(DID1, SW1);
190 List<PortDescription> pds = new ArrayList<>();
191 pds.add(new DefaultPortDescription(P1, true));
192 pds.add(new DefaultPortDescription(P2, true));
193 providerService.updatePorts(DID1, pds);
194 validateEvents(DEVICE_ADDED, PORT_ADDED, PORT_ADDED);
195 assertEquals("wrong port count", 2, service.getPorts(DID1).size());
196
197 Port port = service.getPort(DID1, P1);
198 assertEquals("incorrect port", P1, service.getPort(DID1, P1).number());
199 assertEquals("incorrect state", true, service.getPort(DID1, P1).isEnabled());
200 }
201
202 @Test
203 public void removeDevice() {
204 connectDevice(DID1, SW1);
205 connectDevice(DID2, SW2);
tomad2d2092014-09-06 23:24:20 -0700206 assertEquals("incorrect device count", 2, service.getDeviceCount());
tom24c55cd2014-09-06 10:47:25 -0700207 admin.removeDevice(DID1);
208 assertNull("device should not be found", service.getDevice(DID1));
209 assertNotNull("device should be found", service.getDevice(DID2));
tomad2d2092014-09-06 23:24:20 -0700210 assertEquals("incorrect device count", 1, service.getDeviceCount());
211
tom24c55cd2014-09-06 10:47:25 -0700212 }
tome5ec3fd2014-09-04 15:18:06 -0700213
214 protected void validateEvents(Enum... types) {
215 int i = 0;
216 assertEquals("wrong events received", types.length, listener.events.size());
217 for (Event event : listener.events) {
218 assertEquals("incorrect event type", types[i], event.type());
219 i++;
220 }
221 listener.events.clear();
222 }
223
224
225 private class TestProvider extends AbstractProvider implements DeviceProvider {
226 private Device deviceReceived;
227 private MastershipRole roleReceived;
228
229 public TestProvider() {
230 super(PID);
231 }
232
233 @Override
234 public void triggerProbe(Device device) {
235 }
236
237 @Override
238 public void roleChanged(Device device, MastershipRole newRole) {
239 deviceReceived = device;
240 roleReceived = newRole;
241 }
242 }
243
244 private static class TestListener implements DeviceListener {
245 final List<DeviceEvent> events = new ArrayList<>();
246
247 @Override
248 public void event(DeviceEvent event) {
249 events.add(event);
250 }
251 }
252
253}