blob: 209bdd0bb3f267a0983d7ec82cf920e8224925de [file] [log] [blame]
tombe988312014-09-19 18:38:47 -07001package org.onlab.onos.net.device.impl;
tome5ec3fd2014-09-04 15:18:06 -07002
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;
tom8bf2e6b2014-09-10 20:53:54 -070025import org.onlab.onos.event.impl.TestEventDispatcher;
tom202175a2014-09-19 19:00:11 -070026import org.onlab.onos.net.trivial.impl.SimpleDeviceStore;
tome5ec3fd2014-09-04 15:18:06 -070027
28import java.util.ArrayList;
29import java.util.Iterator;
30import java.util.List;
31
32import static org.junit.Assert.*;
33import static org.onlab.onos.net.Device.Type.SWITCH;
34import static org.onlab.onos.net.DeviceId.deviceId;
35import static org.onlab.onos.net.device.DeviceEvent.Type.*;
36
37/**
38 * Test codifying the device service & device provider service contracts.
39 */
tom41a2c5f2014-09-19 09:20:35 -070040public class DeviceManagerTest {
tome5ec3fd2014-09-04 15:18:06 -070041
tom7e02cda2014-09-18 12:05:46 -070042 private static final ProviderId PID = new ProviderId("of", "foo");
tome5ec3fd2014-09-04 15:18:06 -070043 private static final DeviceId DID1 = deviceId("of:foo");
44 private static final DeviceId DID2 = deviceId("of:bar");
45 private static final String MFR = "whitebox";
46 private static final String HW = "1.1.x";
47 private static final String SW1 = "3.8.1";
48 private static final String SW2 = "3.9.5";
49 private static final String SN = "43311-12345";
50
tom24c55cd2014-09-06 10:47:25 -070051 private static final PortNumber P1 = PortNumber.portNumber(1);
52 private static final PortNumber P2 = PortNumber.portNumber(2);
53 private static final PortNumber P3 = PortNumber.portNumber(3);
54
tom41a2c5f2014-09-19 09:20:35 -070055 private DeviceManager mgr;
tome5ec3fd2014-09-04 15:18:06 -070056
57 protected DeviceService service;
58 protected DeviceAdminService admin;
59 protected DeviceProviderRegistry registry;
60 protected DeviceProviderService providerService;
61 protected TestProvider provider;
62 protected TestListener listener = new TestListener();
63
64 @Before
65 public void setUp() {
tom41a2c5f2014-09-19 09:20:35 -070066 mgr = new DeviceManager();
tome5ec3fd2014-09-04 15:18:06 -070067 service = mgr;
68 admin = mgr;
69 registry = mgr;
tom41a2c5f2014-09-19 09:20:35 -070070 mgr.store = new SimpleDeviceStore();
tome5ec3fd2014-09-04 15:18:06 -070071 mgr.eventDispatcher = new TestEventDispatcher();
72 mgr.activate();
73
74 service.addListener(listener);
75
76 provider = new TestProvider();
77 providerService = registry.register(provider);
78 assertTrue("provider should be registered",
79 registry.getProviders().contains(provider.id()));
80 }
81
82 @After
83 public void tearDown() {
84 registry.unregister(provider);
85 assertFalse("provider should not be registered",
86 registry.getProviders().contains(provider.id()));
87 service.removeListener(listener);
88 mgr.deactivate();
89 }
90
91 private void connectDevice(DeviceId deviceId, String swVersion) {
92 DeviceDescription description =
93 new DefaultDeviceDescription(deviceId.uri(), SWITCH, MFR,
94 HW, swVersion, SN);
95 providerService.deviceConnected(deviceId, description);
96 assertNotNull("device should be found", service.getDevice(DID1));
97 }
98
99 @Test
100 public void deviceConnected() {
101 assertNull("device should not be found", service.getDevice(DID1));
102 connectDevice(DID1, SW1);
103 validateEvents(DEVICE_ADDED);
104
105 Iterator<Device> it = service.getDevices().iterator();
106 assertNotNull("one device expected", it.next());
107 assertFalse("only one device expected", it.hasNext());
tomad2d2092014-09-06 23:24:20 -0700108 assertEquals("incorrect device count", 1, service.getDeviceCount());
tomff7eb7c2014-09-08 12:49:03 -0700109 assertTrue("device should be available", service.isAvailable(DID1));
tome5ec3fd2014-09-04 15:18:06 -0700110 }
111
112 @Test
113 public void deviceDisconnected() {
114 connectDevice(DID1, SW1);
115 connectDevice(DID2, SW1);
116 validateEvents(DEVICE_ADDED, DEVICE_ADDED);
tomff7eb7c2014-09-08 12:49:03 -0700117 assertTrue("device should be available", service.isAvailable(DID1));
tome5ec3fd2014-09-04 15:18:06 -0700118
119 // Disconnect
120 providerService.deviceDisconnected(DID1);
121 assertNotNull("device should not be found", service.getDevice(DID1));
tomff7eb7c2014-09-08 12:49:03 -0700122 assertFalse("device should not be available", service.isAvailable(DID1));
tome5ec3fd2014-09-04 15:18:06 -0700123 validateEvents(DEVICE_AVAILABILITY_CHANGED);
124
125 // Reconnect
126 connectDevice(DID1, SW1);
127 validateEvents(DEVICE_AVAILABILITY_CHANGED);
tomad2d2092014-09-06 23:24:20 -0700128
129 assertEquals("incorrect device count", 2, service.getDeviceCount());
tome5ec3fd2014-09-04 15:18:06 -0700130 }
131
132 @Test
133 public void deviceUpdated() {
134 connectDevice(DID1, SW1);
135 validateEvents(DEVICE_ADDED);
136
137 connectDevice(DID1, SW2);
138 validateEvents(DEVICE_UPDATED);
139 }
140
141 @Test
142 public void getRole() {
143 connectDevice(DID1, SW1);
tom80c0e5e2014-09-08 18:08:58 -0700144 assertEquals("incorrect role", MastershipRole.MASTER, service.getRole(DID1));
tome5ec3fd2014-09-04 15:18:06 -0700145 }
146
147 @Test
tom5f35f7c2014-09-08 18:38:19 -0700148 public void setRole() throws InterruptedException {
tome5ec3fd2014-09-04 15:18:06 -0700149 connectDevice(DID1, SW1);
tom80c0e5e2014-09-08 18:08:58 -0700150 admin.setRole(DID1, MastershipRole.STANDBY);
tome5ec3fd2014-09-04 15:18:06 -0700151 validateEvents(DEVICE_ADDED, DEVICE_MASTERSHIP_CHANGED);
tom80c0e5e2014-09-08 18:08:58 -0700152 assertEquals("incorrect role", MastershipRole.STANDBY, service.getRole(DID1));
tome5ec3fd2014-09-04 15:18:06 -0700153 assertEquals("incorrect device", DID1, provider.deviceReceived.id());
tom80c0e5e2014-09-08 18:08:58 -0700154 assertEquals("incorrect role", MastershipRole.STANDBY, provider.roleReceived);
tome5ec3fd2014-09-04 15:18:06 -0700155 }
156
tom24c55cd2014-09-06 10:47:25 -0700157 @Test
158 public void updatePorts() {
159 connectDevice(DID1, SW1);
160 List<PortDescription> pds = new ArrayList<>();
161 pds.add(new DefaultPortDescription(P1, true));
162 pds.add(new DefaultPortDescription(P2, true));
163 pds.add(new DefaultPortDescription(P3, true));
164 providerService.updatePorts(DID1, pds);
165 validateEvents(DEVICE_ADDED, PORT_ADDED, PORT_ADDED, PORT_ADDED);
166 pds.clear();
tome5ec3fd2014-09-04 15:18:06 -0700167
tom24c55cd2014-09-06 10:47:25 -0700168 pds.add(new DefaultPortDescription(P1, false));
169 pds.add(new DefaultPortDescription(P3, true));
170 providerService.updatePorts(DID1, pds);
171 validateEvents(PORT_UPDATED, PORT_REMOVED);
172 }
173
174 @Test
175 public void updatePortStatus() {
176 connectDevice(DID1, SW1);
177 List<PortDescription> pds = new ArrayList<>();
178 pds.add(new DefaultPortDescription(P1, true));
179 pds.add(new DefaultPortDescription(P2, true));
180 providerService.updatePorts(DID1, pds);
181 validateEvents(DEVICE_ADDED, PORT_ADDED, PORT_ADDED);
182
183 providerService.portStatusChanged(DID1, new DefaultPortDescription(P1, false));
184 validateEvents(PORT_UPDATED);
185 providerService.portStatusChanged(DID1, new DefaultPortDescription(P1, false));
186 assertTrue("no events expected", listener.events.isEmpty());
187 }
188
189 @Test
190 public void getPorts() {
191 connectDevice(DID1, SW1);
192 List<PortDescription> pds = new ArrayList<>();
193 pds.add(new DefaultPortDescription(P1, true));
194 pds.add(new DefaultPortDescription(P2, true));
195 providerService.updatePorts(DID1, pds);
196 validateEvents(DEVICE_ADDED, PORT_ADDED, PORT_ADDED);
197 assertEquals("wrong port count", 2, service.getPorts(DID1).size());
198
199 Port port = service.getPort(DID1, P1);
200 assertEquals("incorrect port", P1, service.getPort(DID1, P1).number());
201 assertEquals("incorrect state", true, service.getPort(DID1, P1).isEnabled());
202 }
203
204 @Test
205 public void removeDevice() {
206 connectDevice(DID1, SW1);
207 connectDevice(DID2, SW2);
tomad2d2092014-09-06 23:24:20 -0700208 assertEquals("incorrect device count", 2, service.getDeviceCount());
tom24c55cd2014-09-06 10:47:25 -0700209 admin.removeDevice(DID1);
210 assertNull("device should not be found", service.getDevice(DID1));
211 assertNotNull("device should be found", service.getDevice(DID2));
tomad2d2092014-09-06 23:24:20 -0700212 assertEquals("incorrect device count", 1, service.getDeviceCount());
213
tom24c55cd2014-09-06 10:47:25 -0700214 }
tome5ec3fd2014-09-04 15:18:06 -0700215
216 protected void validateEvents(Enum... types) {
217 int i = 0;
218 assertEquals("wrong events received", types.length, listener.events.size());
219 for (Event event : listener.events) {
220 assertEquals("incorrect event type", types[i], event.type());
221 i++;
222 }
223 listener.events.clear();
224 }
225
226
227 private class TestProvider extends AbstractProvider implements DeviceProvider {
228 private Device deviceReceived;
229 private MastershipRole roleReceived;
230
231 public TestProvider() {
232 super(PID);
233 }
234
235 @Override
236 public void triggerProbe(Device device) {
237 }
238
239 @Override
240 public void roleChanged(Device device, MastershipRole newRole) {
241 deviceReceived = device;
242 roleReceived = newRole;
243 }
244 }
245
246 private static class TestListener implements DeviceListener {
247 final List<DeviceEvent> events = new ArrayList<>();
248
249 @Override
250 public void event(DeviceEvent event) {
251 events.add(event);
252 }
253 }
254
255}