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()); } }