package net.floodlightcontroller.topology; import net.floodlightcontroller.core.IFloodlightProviderService; import net.floodlightcontroller.core.IFloodlightProviderService.Role; import net.floodlightcontroller.core.module.FloodlightModuleContext; import net.floodlightcontroller.core.test.MockThreadPoolService; import net.floodlightcontroller.linkdiscovery.ILinkDiscovery; import net.floodlightcontroller.test.FloodlightTestCase; import net.floodlightcontroller.threadpool.IThreadPoolService; import net.floodlightcontroller.topology.TopologyManager; import org.junit.Before; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class TopologyManagerTest extends FloodlightTestCase { protected static Logger log = LoggerFactory.getLogger(TopologyManagerTest.class); TopologyManager tm; FloodlightModuleContext fmc; @Before public void setUp() throws Exception { super.setUp(); fmc = new FloodlightModuleContext(); fmc.addService(IFloodlightProviderService.class, getMockFloodlightProvider()); MockThreadPoolService tp = new MockThreadPoolService(); fmc.addService(IThreadPoolService.class, tp); tm = new TopologyManager(); tp.init(fmc); tm.init(fmc); tp.startUp(fmc); } @Test public void testBasic1() throws Exception { tm.addOrUpdateLink((long)1, (short)1, (long)2, (short)1, ILinkDiscovery.LinkType.DIRECT_LINK); assertTrue(tm.getSwitchPorts().size() == 2); // for two nodes. assertTrue(tm.getSwitchPorts().get((long)1).size()==1); assertTrue(tm.getSwitchPorts().get((long)2).size()==1); assertTrue(tm.getSwitchPortLinks().size()==2); assertTrue(tm.getPortBroadcastDomainLinks().size()==0); assertTrue(tm.getTunnelPorts().size()==0); tm.addOrUpdateLink((long)1, (short)2, (long)2, (short)2, ILinkDiscovery.LinkType.MULTIHOP_LINK); assertTrue(tm.getSwitchPorts().size() == 2); // for two nodes. assertTrue(tm.getSwitchPorts().get((long)1).size()==2); assertTrue(tm.getSwitchPorts().get((long)2).size()==2); assertTrue(tm.getSwitchPortLinks().size()==4); assertTrue(tm.getPortBroadcastDomainLinks().size()==2); assertTrue(tm.getTunnelPorts().size()==0); tm.addOrUpdateLink((long)1, (short)3, (long)2, (short)3, ILinkDiscovery.LinkType.TUNNEL); assertTrue(tm.getSwitchPorts().size() == 2); // for two nodes. assertTrue(tm.getSwitchPorts().get((long)1).size()==3); assertTrue(tm.getSwitchPorts().get((long)2).size()==3); assertTrue(tm.getSwitchPortLinks().size()==6); assertTrue(tm.getPortBroadcastDomainLinks().size()==2); assertTrue(tm.getTunnelPorts().size()==2); tm.removeLink((long)1, (short)2, (long)2, (short)2); log.info("# of switchports. {}", tm.getSwitchPorts().get((long)1).size()); assertTrue(tm.getSwitchPorts().get((long)1).size()==2); assertTrue(tm.getSwitchPorts().get((long)2).size()==2); assertTrue(tm.getSwitchPorts().size() == 2); // for two nodes. assertTrue(tm.getSwitchPortLinks().size()==4); assertTrue(tm.getPortBroadcastDomainLinks().size()==0); assertTrue(tm.getTunnelPorts().size()==2); tm.removeLink((long)1, (short)1, (long)2, (short)1); assertTrue(tm.getSwitchPorts().size() == 2); // for two nodes. assertTrue(tm.getSwitchPorts().get((long)1).size()==1); assertTrue(tm.getSwitchPorts().get((long)2).size()==1); assertTrue(tm.getSwitchPortLinks().size()==2); assertTrue(tm.getPortBroadcastDomainLinks().size()==0); assertTrue(tm.getTunnelPorts().size()==2); tm.removeLink((long)1, (short)3, (long)2, (short)3); assertTrue(tm.getSwitchPorts().size() == 0); assertTrue(tm.getSwitchPortLinks().size()==0); assertTrue(tm.getPortBroadcastDomainLinks().size()==0); assertTrue(tm.getTunnelPorts().size()==0); } @Test public void testBasic2() throws Exception { tm.addOrUpdateLink((long)1, (short)1, (long)2, (short)1, ILinkDiscovery.LinkType.DIRECT_LINK); tm.addOrUpdateLink((long)2, (short)2, (long)3, (short)1, ILinkDiscovery.LinkType.MULTIHOP_LINK); tm.addOrUpdateLink((long)3, (short)2, (long)1, (short)2, ILinkDiscovery.LinkType.TUNNEL); assertTrue(tm.getSwitchPorts().size() == 3); // for two nodes. assertTrue(tm.getSwitchPorts().get((long)1).size()==2); assertTrue(tm.getSwitchPorts().get((long)2).size()==2); assertTrue(tm.getSwitchPorts().get((long)3).size()==2); assertTrue(tm.getSwitchPortLinks().size()==6); assertTrue(tm.getPortBroadcastDomainLinks().size()==2); assertTrue(tm.getTunnelPorts().size()==2); tm.removeLink((long)1, (short)1, (long)2, (short)1); assertTrue(tm.getSwitchPorts().size() == 3); // for two nodes. assertTrue(tm.getSwitchPorts().get((long)1).size()==1); assertTrue(tm.getSwitchPorts().get((long)2).size()==1); assertTrue(tm.getSwitchPorts().get((long)3).size()==2); assertTrue(tm.getSwitchPortLinks().size()==4); assertTrue(tm.getPortBroadcastDomainLinks().size()==2); assertTrue(tm.getTunnelPorts().size()==2); // nonexistent link // no null pointer exceptions. tm.removeLink((long)3, (short)1, (long)2, (short)2); assertTrue(tm.getSwitchPorts().size() == 3); // for two nodes. assertTrue(tm.getSwitchPorts().get((long)1).size()==1); assertTrue(tm.getSwitchPorts().get((long)2).size()==1); assertTrue(tm.getSwitchPorts().get((long)3).size()==2); assertTrue(tm.getSwitchPortLinks().size()==4); assertTrue(tm.getPortBroadcastDomainLinks().size()==2); assertTrue(tm.getTunnelPorts().size()==2); tm.removeLink((long)3, (short)2, (long)1, (short)2); assertTrue(tm.getSwitchPorts().size() == 2); // for two nodes. assertTrue(tm.getSwitchPorts().get((long)1)==null); assertTrue(tm.getSwitchPorts().get((long)2).size()==1); assertTrue(tm.getSwitchPorts().get((long)3).size()==1); assertTrue(tm.getSwitchPortLinks().size()==2); assertTrue(tm.getPortBroadcastDomainLinks().size()==2); assertTrue(tm.getTunnelPorts().size()==0); tm.removeLink((long)2, (short)2, (long)3, (short)1); assertTrue(tm.getSwitchPorts().size() == 0); // for two nodes. assertTrue(tm.getSwitchPortLinks().size()==0); assertTrue(tm.getPortBroadcastDomainLinks().size()==0); assertTrue(tm.getTunnelPorts().size()==0); } @Test public void testHARoleChange() throws Exception { testBasic2(); getMockFloodlightProvider().dispatchRoleChanged(null, Role.SLAVE); assert(tm.switchPorts.isEmpty()); assert(tm.switchPortLinks.isEmpty()); assert(tm.portBroadcastDomainLinks.isEmpty()); assert(tm.tunnelLinks.isEmpty()); } }