blob: d3458a50ca1d4344363feea4df4e002bcf593f12 [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;
10import org.onlab.onos.net.device.DefaultDeviceDescription;
11import org.onlab.onos.net.device.DeviceAdminService;
12import org.onlab.onos.net.device.DeviceDescription;
13import org.onlab.onos.net.device.DeviceEvent;
14import org.onlab.onos.net.device.DeviceListener;
15import org.onlab.onos.net.device.DeviceProvider;
16import org.onlab.onos.net.device.DeviceProviderRegistry;
17import org.onlab.onos.net.device.DeviceProviderService;
18import org.onlab.onos.net.device.DeviceService;
19import org.onlab.onos.net.provider.AbstractProvider;
20import org.onlab.onos.net.provider.ProviderId;
21
22import java.util.ArrayList;
23import java.util.Iterator;
24import java.util.List;
25
26import static org.junit.Assert.*;
27import static org.onlab.onos.net.Device.Type.SWITCH;
28import static org.onlab.onos.net.DeviceId.deviceId;
29import static org.onlab.onos.net.device.DeviceEvent.Type.*;
30
31/**
32 * Test codifying the device service & device provider service contracts.
33 */
34public class SimpleDeviceManagerTest {
35
36 private static final ProviderId PID = new ProviderId("foo");
37 private static final DeviceId DID1 = deviceId("of:foo");
38 private static final DeviceId DID2 = deviceId("of:bar");
39 private static final String MFR = "whitebox";
40 private static final String HW = "1.1.x";
41 private static final String SW1 = "3.8.1";
42 private static final String SW2 = "3.9.5";
43 private static final String SN = "43311-12345";
44
45
46 private SimpleDeviceManager mgr;
47
48 protected DeviceService service;
49 protected DeviceAdminService admin;
50 protected DeviceProviderRegistry registry;
51 protected DeviceProviderService providerService;
52 protected TestProvider provider;
53 protected TestListener listener = new TestListener();
54
55 @Before
56 public void setUp() {
57 mgr = new SimpleDeviceManager();
58 service = mgr;
59 admin = mgr;
60 registry = mgr;
61 mgr.eventDispatcher = new TestEventDispatcher();
62 mgr.activate();
63
64 service.addListener(listener);
65
66 provider = new TestProvider();
67 providerService = registry.register(provider);
68 assertTrue("provider should be registered",
69 registry.getProviders().contains(provider.id()));
70 }
71
72 @After
73 public void tearDown() {
74 registry.unregister(provider);
75 assertFalse("provider should not be registered",
76 registry.getProviders().contains(provider.id()));
77 service.removeListener(listener);
78 mgr.deactivate();
79 }
80
81 private void connectDevice(DeviceId deviceId, String swVersion) {
82 DeviceDescription description =
83 new DefaultDeviceDescription(deviceId.uri(), SWITCH, MFR,
84 HW, swVersion, SN);
85 providerService.deviceConnected(deviceId, description);
86 assertNotNull("device should be found", service.getDevice(DID1));
87 }
88
89 @Test
90 public void deviceConnected() {
91 assertNull("device should not be found", service.getDevice(DID1));
92 connectDevice(DID1, SW1);
93 validateEvents(DEVICE_ADDED);
94
95 Iterator<Device> it = service.getDevices().iterator();
96 assertNotNull("one device expected", it.next());
97 assertFalse("only one device expected", it.hasNext());
98 }
99
100 @Test
101 public void deviceDisconnected() {
102 connectDevice(DID1, SW1);
103 connectDevice(DID2, SW1);
104 validateEvents(DEVICE_ADDED, DEVICE_ADDED);
105
106 // Disconnect
107 providerService.deviceDisconnected(DID1);
108 assertNotNull("device should not be found", service.getDevice(DID1));
109 validateEvents(DEVICE_AVAILABILITY_CHANGED);
110
111 // Reconnect
112 connectDevice(DID1, SW1);
113 validateEvents(DEVICE_AVAILABILITY_CHANGED);
114 }
115
116 @Test
117 public void deviceUpdated() {
118 connectDevice(DID1, SW1);
119 validateEvents(DEVICE_ADDED);
120
121 connectDevice(DID1, SW2);
122 validateEvents(DEVICE_UPDATED);
123 }
124
125 @Test
126 public void getRole() {
127 connectDevice(DID1, SW1);
128 assertEquals("incorrect role", MastershipRole.NONE, service.getRole(DID1));
129 }
130
131 @Test
132 public void setRole() {
133 connectDevice(DID1, SW1);
134 admin.setRole(DID1, MastershipRole.MASTER);
135 validateEvents(DEVICE_ADDED, DEVICE_MASTERSHIP_CHANGED);
136 assertEquals("incorrect role", MastershipRole.MASTER, service.getRole(DID1));
137 assertEquals("incorrect device", DID1, provider.deviceReceived.id());
138 assertEquals("incorrect role", MastershipRole.MASTER, provider.roleReceived);
139 }
140
141
142
143 protected void validateEvents(Enum... types) {
144 int i = 0;
145 assertEquals("wrong events received", types.length, listener.events.size());
146 for (Event event : listener.events) {
147 assertEquals("incorrect event type", types[i], event.type());
148 i++;
149 }
150 listener.events.clear();
151 }
152
153
154 private class TestProvider extends AbstractProvider implements DeviceProvider {
155 private Device deviceReceived;
156 private MastershipRole roleReceived;
157
158 public TestProvider() {
159 super(PID);
160 }
161
162 @Override
163 public void triggerProbe(Device device) {
164 }
165
166 @Override
167 public void roleChanged(Device device, MastershipRole newRole) {
168 deviceReceived = device;
169 roleReceived = newRole;
170 }
171 }
172
173 private static class TestListener implements DeviceListener {
174 final List<DeviceEvent> events = new ArrayList<>();
175
176 @Override
177 public void event(DeviceEvent event) {
178 events.add(event);
179 }
180 }
181
182}