diff --git a/src/test/java/net/floodlightcontroller/core/internal/OFSwitchImplTest.java b/src/test/java/net/floodlightcontroller/core/internal/OFSwitchImplTest.java new file mode 100644 index 0000000000000000000000000000000000000000..758cd0563588e7fa759c99ccaec95d2217fe3f21 --- /dev/null +++ b/src/test/java/net/floodlightcontroller/core/internal/OFSwitchImplTest.java @@ -0,0 +1,236 @@ +package net.floodlightcontroller.core.internal; + +import static org.easymock.EasyMock.*; +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.util.List; + +import net.floodlightcontroller.core.IFloodlightProviderService.Role; +import net.floodlightcontroller.core.IOFSwitch; +import net.floodlightcontroller.core.internal.OFSwitchImpl.PendingRoleRequestEntry; +import net.floodlightcontroller.core.test.MockFloodlightProvider; +import net.floodlightcontroller.test.FloodlightTestCase; + +import org.easymock.Capture; +import org.jboss.netty.channel.Channel; +import org.junit.Before; +import org.junit.Test; +import org.openflow.protocol.OFMessage; +import org.openflow.protocol.OFType; +import org.openflow.protocol.OFVendor; +import org.openflow.protocol.vendor.OFVendorData; +import org.openflow.vendor.nicira.OFNiciraVendorData; +import org.openflow.vendor.nicira.OFRoleRequestVendorData; +import org.openflow.vendor.nicira.OFRoleVendorData; + +public class OFSwitchImplTest extends FloodlightTestCase { + protected OFSwitchImpl sw; + + + @Before + public void setUp() throws Exception { + sw = new OFSwitchImpl(); + Channel ch = createMock(Channel.class); + SocketAddress sa = new InetSocketAddress(42); + expect(ch.getRemoteAddress()).andReturn(sa).anyTimes(); + sw.setChannel(ch); + MockFloodlightProvider floodlightProvider = new MockFloodlightProvider(); + sw.setFloodlightProvider(floodlightProvider); + } + + + public void doSendNxRoleRequest(Role role, int nx_role) throws Exception { + long cookie = System.nanoTime(); + + // verify that the correct OFMessage is sent + Capture<List<OFMessage>> msgCapture = new Capture<List<OFMessage>>(); + expect(sw.channel.write(capture(msgCapture))).andReturn(null); + replay(sw.channel); + int xid = sw.sendNxRoleRequest(role, cookie); + verify(sw.channel); + List<OFMessage> msgList = msgCapture.getValue(); + assertEquals(1, msgList.size()); + OFMessage msg = msgList.get(0); + assertEquals("Transaction Ids must match", xid, msg.getXid()); + assertTrue("Message must be an OFVendor type", msg instanceof OFVendor); + assertEquals(OFType.VENDOR, msg.getType()); + OFVendor vendorMsg = (OFVendor)msg; + assertEquals("Vendor message must be vendor Nicira", + OFNiciraVendorData.NX_VENDOR_ID, vendorMsg.getVendor()); + OFVendorData vendorData = vendorMsg.getVendorData(); + assertTrue("Vendor Data must be an OFRoleRequestVendorData", + vendorData instanceof OFRoleRequestVendorData); + OFRoleRequestVendorData roleRequest = (OFRoleRequestVendorData)vendorData; + assertEquals(nx_role, roleRequest.getRole()); + + // Now verify that we've added the pending request correctly + // to the pending queue + assertEquals(1, sw.pendingRoleRequests.size()); + PendingRoleRequestEntry pendingRoleRequest = sw.pendingRoleRequests.poll(); + assertEquals(msg.getXid(), pendingRoleRequest.xid); + assertEquals(role, pendingRoleRequest.role); + assertEquals(cookie, pendingRoleRequest.cookie); + reset(sw.channel); + } + + @Test + public void testSendNxRoleRequest() throws Exception { + doSendNxRoleRequest(Role.MASTER, OFRoleVendorData.NX_ROLE_MASTER); + doSendNxRoleRequest(Role.SLAVE, OFRoleVendorData.NX_ROLE_SLAVE); + doSendNxRoleRequest(Role.EQUAL, OFRoleVendorData.NX_ROLE_OTHER); + } + + + @Test + public void testDeliverRoleReplyOk() { + // test normal case + PendingRoleRequestEntry pending = new PendingRoleRequestEntry( + (int)System.currentTimeMillis(), // arbitrary xid + Role.MASTER, + System.nanoTime() // arbitrary cookie + ); + sw.pendingRoleRequests.add(pending); + replay(sw.channel); + sw.deliverRoleReply(pending.xid, pending.role); + verify(sw.channel); + assertEquals(true, sw.getAttribute(IOFSwitch.SWITCH_SUPPORTS_NX_ROLE)); + assertEquals(pending.role, sw.role); + assertEquals(0, sw.pendingRoleRequests.size()); + } + + @Test + public void testDeliverRoleReplyOkRepeated() { + // test normal case. Not the first role reply + PendingRoleRequestEntry pending = new PendingRoleRequestEntry( + (int)System.currentTimeMillis(), // arbitrary xid + Role.MASTER, + System.nanoTime() // arbitrary cookie + ); + sw.setAttribute(IOFSwitch.SWITCH_SUPPORTS_NX_ROLE, true); + sw.pendingRoleRequests.add(pending); + replay(sw.channel); + sw.deliverRoleReply(pending.xid, pending.role); + verify(sw.channel); + assertEquals(true, sw.getAttribute(IOFSwitch.SWITCH_SUPPORTS_NX_ROLE)); + assertEquals(pending.role, sw.role); + assertEquals(0, sw.pendingRoleRequests.size()); + } + + @Test + public void testDeliverRoleReplyNonePending() { + // nothing pending + expect(sw.channel.close()).andReturn(null); + replay(sw.channel); + sw.deliverRoleReply(1, Role.MASTER); + verify(sw.channel); + assertEquals(0, sw.pendingRoleRequests.size()); + } + + @Test + public void testDeliverRoleReplyWrongXid() { + // wrong xid received + PendingRoleRequestEntry pending = new PendingRoleRequestEntry( + (int)System.currentTimeMillis(), // arbitrary xid + Role.MASTER, + System.nanoTime() // arbitrary cookie + ); + sw.pendingRoleRequests.add(pending); + expect(sw.channel.close()).andReturn(null); + replay(sw.channel); + sw.deliverRoleReply(pending.xid+1, pending.role); + verify(sw.channel); + assertEquals(null, sw.getAttribute(IOFSwitch.SWITCH_SUPPORTS_NX_ROLE)); + assertEquals(0, sw.pendingRoleRequests.size()); + } + + @Test + public void testDeliverRoleReplyWrongRole() { + // correct xid but incorrect role received + PendingRoleRequestEntry pending = new PendingRoleRequestEntry( + (int)System.currentTimeMillis(), // arbitrary xid + Role.MASTER, + System.nanoTime() // arbitrary cookie + ); + sw.pendingRoleRequests.add(pending); + expect(sw.channel.close()).andReturn(null); + replay(sw.channel); + sw.deliverRoleReply(pending.xid, Role.SLAVE); + verify(sw.channel); + assertEquals(null, sw.getAttribute(IOFSwitch.SWITCH_SUPPORTS_NX_ROLE)); + assertEquals(0, sw.pendingRoleRequests.size()); + } + + @Test + public void testCheckFirstPendingRoleRequestXid() { + PendingRoleRequestEntry pending = new PendingRoleRequestEntry( + 54321, Role.MASTER, 232323); + replay(sw.channel); // we don't expect any invocations + sw.pendingRoleRequests.add(pending); + assertEquals(true, sw.checkFirstPendingRoleRequestXid(54321)); + assertEquals(false, sw.checkFirstPendingRoleRequestXid(0)); + sw.pendingRoleRequests.clear(); + assertEquals(false, sw.checkFirstPendingRoleRequestXid(54321)); + verify(sw.channel); + } + + @Test + public void testCheckFirstPendingRoleRequestCookie() { + PendingRoleRequestEntry pending = new PendingRoleRequestEntry( + 54321, Role.MASTER, 232323); + replay(sw.channel); // we don't expect any invocations + sw.pendingRoleRequests.add(pending); + assertEquals(true, sw.checkFirstPendingRoleRequestCookie(232323)); + assertEquals(false, sw.checkFirstPendingRoleRequestCookie(0)); + sw.pendingRoleRequests.clear(); + assertEquals(false, sw.checkFirstPendingRoleRequestCookie(232323)); + verify(sw.channel); + } + + @Test + public void testDeliverRoleRequestNotSupported () { + // normal case. xid is pending + PendingRoleRequestEntry pending = new PendingRoleRequestEntry( + (int)System.currentTimeMillis(), // arbitrary xid + Role.MASTER, + System.nanoTime() // arbitrary cookie + ); + sw.role = Role.SLAVE; + sw.pendingRoleRequests.add(pending); + replay(sw.channel); + sw.deliverRoleRequestNotSupported(pending.xid); + verify(sw.channel); + assertEquals(false, sw.getAttribute(IOFSwitch.SWITCH_SUPPORTS_NX_ROLE)); + assertEquals(null, sw.role); + assertEquals(0, sw.pendingRoleRequests.size()); + } + + @Test + public void testDeliverRoleRequestNotSupportedNonePending() { + // nothing pending + sw.role = Role.SLAVE; + expect(sw.channel.close()).andReturn(null); + replay(sw.channel); + sw.deliverRoleRequestNotSupported(1); + verify(sw.channel); + assertEquals(null, sw.role); + assertEquals(0, sw.pendingRoleRequests.size()); + } + + @Test + public void testDeliverRoleRequestNotSupportedWrongXid() { + // wrong xid received + PendingRoleRequestEntry pending = new PendingRoleRequestEntry( + (int)System.currentTimeMillis(), // arbitrary xid + Role.MASTER, + System.nanoTime() // arbitrary cookie + ); + sw.role = Role.SLAVE; + sw.pendingRoleRequests.add(pending); + expect(sw.channel.close()).andReturn(null); + replay(sw.channel); + sw.deliverRoleRequestNotSupported(pending.xid+1); + verify(sw.channel); + assertEquals(null, sw.role); + assertEquals(0, sw.pendingRoleRequests.size()); + } +}