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