tests for OFDeviceProvider
Change-Id: If9f2c1f78a940a5485e5390d6d098d74eb00ddc2
diff --git a/providers/openflow/device/src/test/java/org/onlab/onos/provider/of/device/impl/OpenFlowDeviceProviderTest.java b/providers/openflow/device/src/test/java/org/onlab/onos/provider/of/device/impl/OpenFlowDeviceProviderTest.java
new file mode 100644
index 0000000..296ae2b
--- /dev/null
+++ b/providers/openflow/device/src/test/java/org/onlab/onos/provider/of/device/impl/OpenFlowDeviceProviderTest.java
@@ -0,0 +1,342 @@
+package org.onlab.onos.provider.of.device.impl;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.onlab.onos.net.Device.Type.*;
+import static org.onlab.onos.net.MastershipRole.*;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.onos.net.DefaultDevice;
+import org.onlab.onos.net.Device;
+import org.onlab.onos.net.DeviceId;
+import org.onlab.onos.net.device.DeviceDescription;
+import org.onlab.onos.net.device.DeviceProvider;
+import org.onlab.onos.net.device.DeviceProviderRegistry;
+import org.onlab.onos.net.device.DeviceProviderService;
+import org.onlab.onos.net.device.PortDescription;
+import org.onlab.onos.net.provider.ProviderId;
+import org.onlab.onos.openflow.controller.Dpid;
+import org.onlab.onos.openflow.controller.OpenFlowController;
+import org.onlab.onos.openflow.controller.OpenFlowEventListener;
+import org.onlab.onos.openflow.controller.OpenFlowSwitch;
+import org.onlab.onos.openflow.controller.OpenFlowSwitchListener;
+import org.onlab.onos.openflow.controller.PacketListener;
+import org.onlab.onos.openflow.controller.RoleState;
+import org.projectfloodlight.openflow.protocol.OFFactory;
+import org.projectfloodlight.openflow.protocol.OFMessage;
+import org.projectfloodlight.openflow.protocol.OFPortDesc;
+import org.projectfloodlight.openflow.protocol.OFPortReason;
+import org.projectfloodlight.openflow.protocol.OFPortStatus;
+import org.projectfloodlight.openflow.protocol.ver10.OFFactoryVer10;
+import org.projectfloodlight.openflow.types.OFPort;
+
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Multimap;
+
+public class OpenFlowDeviceProviderTest {
+
+ private static final ProviderId PID = new ProviderId("of", "test");
+ private static final DeviceId DID1 = DeviceId.deviceId("of:0000000000000001");
+ private static final Dpid DPID1 = Dpid.dpid(DID1.uri());
+
+ private static final OFPortDesc PD1 = portDesc(1);
+ private static final OFPortDesc PD2 = portDesc(2);
+ private static final OFPortDesc PD3 = portDesc(3);
+
+ private static final List<OFPortDesc> PLIST = Lists.newArrayList(PD1, PD2);
+
+ private static final Device DEV1 =
+ new DefaultDevice(PID, DID1, SWITCH, "", "", "", "");
+
+ private static final TestOpenFlowSwitch SW1 = new TestOpenFlowSwitch();
+
+ private final OpenFlowDeviceProvider provider = new OpenFlowDeviceProvider();
+ private final TestDeviceRegistry registry = new TestDeviceRegistry();
+ private final TestController controller = new TestController();
+
+ @Before
+ public void startUp() {
+ provider.providerRegistry = registry;
+ provider.controller = controller;
+ controller.switchMap.put(DPID1, SW1);
+ provider.activate();
+ assertNotNull("provider should be registered", registry.provider);
+ assertNotNull("listener should be registered", controller.listener);
+ assertEquals("devices not added", 1, registry.connected.size());
+ assertEquals("ports not added", 2, registry.ports.get(DID1).size());
+ }
+
+ @After
+ public void tearDown() {
+ provider.deactivate();
+ assertTrue("devices should be removed", registry.connected.isEmpty());
+ assertNull("listener should be removed", controller.listener);
+ provider.controller = null;
+ provider.providerRegistry = null;
+ }
+
+ @Test
+ public void roleChanged() {
+ provider.roleChanged(DEV1, MASTER);
+ assertEquals("Should be MASTER", RoleState.MASTER, controller.roleMap.get(DPID1));
+ provider.roleChanged(DEV1, STANDBY);
+ assertEquals("Should be EQUAL", RoleState.EQUAL, controller.roleMap.get(DPID1));
+ provider.roleChanged(DEV1, NONE);
+ assertEquals("Should be SLAVE", RoleState.SLAVE, controller.roleMap.get(DPID1));
+ }
+
+ @Test
+ public void triggerProbe() {
+ // TODO
+ }
+
+ @Test
+ public void switchRemoved() {
+ controller.listener.switchRemoved(DPID1);
+ assertTrue("device not removed", registry.connected.isEmpty());
+ }
+
+ @Test
+ public void portChanged() {
+ OFPortStatus stat = SW1.factory().buildPortStatus()
+ .setReason(OFPortReason.ADD)
+ .setDesc(PD3)
+ .build();
+ controller.listener.portChanged(DPID1, stat);
+ assertEquals("port status unhandled", 3, registry.ports.get(DID1).size());
+ }
+
+ private static OFPortDesc portDesc(int port) {
+ OFPortDesc.Builder builder = OFFactoryVer10.INSTANCE.buildPortDesc();
+ builder.setPortNo(OFPort.of(port));
+
+ return builder.build();
+ }
+
+ private class TestDeviceRegistry implements DeviceProviderRegistry {
+ DeviceProvider provider;
+ Set<DeviceId> connected = new HashSet<DeviceId>();
+ Multimap<DeviceId, PortDescription> ports = HashMultimap.create();
+
+ @Override
+ public DeviceProviderService register(DeviceProvider provider) {
+ this.provider = provider;
+ return new TestProviderService();
+ }
+
+ @Override
+ public void unregister(DeviceProvider provider) {
+ }
+
+ @Override
+ public Set<ProviderId> getProviders() {
+ return null;
+ }
+
+ private class TestProviderService implements DeviceProviderService {
+
+ @Override
+ public DeviceProvider provider() {
+ return null;
+ }
+
+ @Override
+ public void deviceConnected(DeviceId deviceId,
+ DeviceDescription deviceDescription) {
+ connected.add(deviceId);
+ }
+
+ @Override
+ public void deviceDisconnected(DeviceId deviceId) {
+ connected.remove(deviceId);
+ ports.removeAll(deviceId);
+ }
+
+ @Override
+ public void updatePorts(DeviceId deviceId,
+ List<PortDescription> portDescriptions) {
+ for (PortDescription p : portDescriptions) {
+ ports.put(deviceId, p);
+ }
+ }
+
+ @Override
+ public void portStatusChanged(DeviceId deviceId,
+ PortDescription portDescription) {
+ System.err.println(deviceId + ":" + portDescription.toString());
+
+ System.err.println(ports.put(deviceId, portDescription));
+ }
+
+ }
+ }
+
+ private class TestController implements OpenFlowController {
+ OpenFlowSwitchListener listener = null;
+ Map<Dpid, RoleState> roleMap = new HashMap<Dpid, RoleState>();
+ Map<Dpid, OpenFlowSwitch> switchMap = new HashMap<Dpid, OpenFlowSwitch>();
+
+ @Override
+ public Iterable<OpenFlowSwitch> getSwitches() {
+ return switchMap.values();
+ }
+
+ @Override
+ public Iterable<OpenFlowSwitch> getMasterSwitches() {
+ return null;
+ }
+
+ @Override
+ public Iterable<OpenFlowSwitch> getEqualSwitches() {
+ return null;
+ }
+
+ @Override
+ public OpenFlowSwitch getSwitch(Dpid dpid) {
+ return switchMap.get(dpid);
+ }
+
+ @Override
+ public OpenFlowSwitch getMasterSwitch(Dpid dpid) {
+ return null;
+ }
+
+ @Override
+ public OpenFlowSwitch getEqualSwitch(Dpid dpid) {
+
+ return null;
+ }
+
+ @Override
+ public void addListener(OpenFlowSwitchListener listener) {
+ this.listener = listener;
+ }
+
+ @Override
+ public void removeListener(OpenFlowSwitchListener listener) {
+ this.listener = null;
+ }
+
+ @Override
+ public void addPacketListener(int priority, PacketListener listener) {
+ }
+
+ @Override
+ public void removePacketListener(PacketListener listener) {
+ }
+
+ @Override
+ public void addEventListener(OpenFlowEventListener listener) {
+ }
+
+ @Override
+ public void removeEventListener(OpenFlowEventListener listener) {
+ }
+
+ @Override
+ public void write(Dpid dpid, OFMessage msg) {
+ }
+
+ @Override
+ public void processPacket(Dpid dpid, OFMessage msg) {
+ }
+
+ @Override
+ public void setRole(Dpid dpid, RoleState role) {
+ roleMap.put(dpid, role);
+ }
+ }
+
+ private static class TestOpenFlowSwitch implements OpenFlowSwitch {
+
+ RoleState state;
+ List<OFMessage> sent = new ArrayList<OFMessage>();
+ OFFactory factory = OFFactoryVer10.INSTANCE;
+
+ @Override
+ public void sendMsg(OFMessage msg) {
+ sent.add(msg);
+ }
+
+ @Override
+ public void sendMsg(List<OFMessage> msgs) {
+ }
+
+ @Override
+ public void handleMessage(OFMessage fromSwitch) {
+ }
+
+ @Override
+ public void setRole(RoleState role) {
+ state = role;
+ }
+
+ @Override
+ public RoleState getRole() {
+ return state;
+ }
+
+ @Override
+ public List<OFPortDesc> getPorts() {
+ return PLIST;
+ }
+
+ @Override
+ public OFFactory factory() {
+ return factory;
+ }
+
+ @Override
+ public String getStringId() {
+ return null;
+ }
+
+ @Override
+ public long getId() {
+ return DPID1.value();
+ }
+
+ @Override
+ public String manfacturerDescription() {
+ return null;
+ }
+
+ @Override
+ public String datapathDescription() {
+ return null;
+ }
+
+ @Override
+ public String hardwareDescription() {
+ return null;
+ }
+
+ @Override
+ public String softwareDescription() {
+ return null;
+ }
+
+ @Override
+ public String serialNumber() {
+ return null;
+ }
+
+ @Override
+ public void disconnectSwitch() {
+ }
+
+ }
+
+}
diff --git a/providers/openflow/packet/src/test/java/org/onlab/onos/provider/of/packet/impl/OpenFlowPacketProviderTest.java b/providers/openflow/packet/src/test/java/org/onlab/onos/provider/of/packet/impl/OpenFlowPacketProviderTest.java
index ceb59bf..eb87d2a 100644
--- a/providers/openflow/packet/src/test/java/org/onlab/onos/provider/of/packet/impl/OpenFlowPacketProviderTest.java
+++ b/providers/openflow/packet/src/test/java/org/onlab/onos/provider/of/packet/impl/OpenFlowPacketProviderTest.java
@@ -80,7 +80,7 @@
private final TestPacketRegistry registry = new TestPacketRegistry();
private final TestController controller = new TestController();
- private final TestOpenFlowSwitch sw = new TestOpenFlowSwitch(PLIST);
+ private final TestOpenFlowSwitch sw = new TestOpenFlowSwitch();
@Before
public void startUp() {
@@ -317,15 +317,10 @@
private class TestOpenFlowSwitch implements OpenFlowSwitch {
- List<OFPortDesc> ports;
RoleState state;
List<OFMessage> sent = new ArrayList<OFMessage>();
OFFactory factory = OFFactoryVer10.INSTANCE;
- TestOpenFlowSwitch(List<OFPortDesc> p) {
- ports = p;
- }
-
@Override
public void sendMsg(OFMessage msg) {
sent.add(msg);
@@ -351,7 +346,7 @@
@Override
public List<OFPortDesc> getPorts() {
- return ports;
+ return PLIST;
}
@Override