Fix checkstyle whitespace issues - WHITESPACE ONLY
Change-Id: Ic205c1afd639c6008d61d9de95cb764eeb6238ca
diff --git a/src/test/java/net/onrc/onos/core/registry/ZookeeperRegistryTest.java b/src/test/java/net/onrc/onos/core/registry/ZookeeperRegistryTest.java
index 45562e9..8275a84 100644
--- a/src/test/java/net/onrc/onos/core/registry/ZookeeperRegistryTest.java
+++ b/src/test/java/net/onrc/onos/core/registry/ZookeeperRegistryTest.java
@@ -42,555 +42,573 @@
/**
* Unit test for {@link ZookeeperRegistry}.
* NOTE: {@link FloodlightTestCase} conflicts with PowerMock. If FloodLight-related methods need to be tested,
- * implement another test class to test them.
- * @author Naoki Shiota
+ * implement another test class to test them.
*
+ * @author Naoki Shiota
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest({ZookeeperRegistry.class, CuratorFramework.class, CuratorFrameworkFactory.class,
- ServiceDiscoveryBuilder.class, ServiceDiscovery.class, ServiceCache.class, PathChildrenCache.class,
- ZookeeperRegistry.SwitchPathCacheListener.class})
+ ServiceDiscoveryBuilder.class, ServiceDiscovery.class, ServiceCache.class, PathChildrenCache.class,
+ ZookeeperRegistry.SwitchPathCacheListener.class})
public class ZookeeperRegistryTest extends FloodlightTestCase {
- private final static Long ID_BLOCK_SIZE = 0x100000000L;
-
- protected ZookeeperRegistry registry;
- protected CuratorFramework client;
-
- protected PathChildrenCacheListener pathChildrenCacheListener;
- protected final String CONTROLLER_ID = "controller2013";
+ private final static Long ID_BLOCK_SIZE = 0x100000000L;
- /**
- * Initialize {@link ZookeeperRegistry} Object and inject initial value with {@link ZookeeperRegistry#init(FloodlightModuleContext)} method.
- * This setup code also tests {@link ZookeeperRegistry#init(FloodlightModuleContext)} method itself.
- */
- @Before
- public void setUp() throws Exception {
- super.setUp();
-
- pathChildrenCacheListener = null;
-
- // Mock of CuratorFramework
- client = createCuratorFrameworkMock();
-
- // Mock of CuratorFrameworkFactory
- PowerMock.mockStatic(CuratorFrameworkFactory.class);
- EasyMock.expect(CuratorFrameworkFactory.newClient((String)EasyMock.anyObject(),
- EasyMock.anyInt(), EasyMock.anyInt(), (RetryPolicy)EasyMock.anyObject())).andReturn(client);
- PowerMock.replay(CuratorFrameworkFactory.class);
+ protected ZookeeperRegistry registry;
+ protected CuratorFramework client;
- FloodlightModuleContext fmc = new FloodlightModuleContext();
- registry = new ZookeeperRegistry();
- fmc.addService(ZookeeperRegistry.class, registry);
-
- registry.init(fmc);
-
- PowerMock.verify(client, CuratorFrameworkFactory.class);
- }
+ protected PathChildrenCacheListener pathChildrenCacheListener;
+ protected final String CONTROLLER_ID = "controller2013";
- /**
- * Clean up member variables (empty for now).
- */
- @After
- public void tearDown() throws Exception {
- super.tearDown();
- }
+ /**
+ * Initialize {@link ZookeeperRegistry} Object and inject initial value with {@link ZookeeperRegistry#init(FloodlightModuleContext)} method.
+ * This setup code also tests {@link ZookeeperRegistry#init(FloodlightModuleContext)} method itself.
+ */
+ @Before
+ public void setUp() throws Exception {
+ super.setUp();
- /**
- * Test if {@link ZookeeperRegistry#registerController(String)} method can go through without exception.
- * (Exceptions are usually out of test target, but {@link ZookeeperRegistry#registerController(String)} throws an exception in case of invalid registration.)
- */
- @Test
- public void testRegisterController() {
- String controllerIdToRegister = "controller2013";
-
- try {
- registry.registerController(controllerIdToRegister);
- } catch (RegistryException e) {
- e.printStackTrace();
- fail(e.getMessage());
- }
- }
+ pathChildrenCacheListener = null;
- /**
- * Test if {@link ZookeeperRegistry#getControllerId()} correctly returns registered ID.
- * @throws Exception
- */
- @Test
- public void testGetControllerId() throws Exception {
- String controllerIdToRegister = "controller1";
-
- // try before controller is registered
- String controllerId = registry.getControllerId();
- assertNull(controllerId);
-
- // register
- registry.registerController(controllerIdToRegister);
-
- // call getControllerId and verify
- controllerId = registry.getControllerId();
- assertNotNull(controllerId);
- assertEquals(controllerIdToRegister, controllerId);
- }
+ // Mock of CuratorFramework
+ client = createCuratorFrameworkMock();
- /**
- * Test if {@link ZookeeperRegistry#getAllControllers()} returns all controllers.
- * Controllers to be returned are injected while setup. See {@link ZookeeperRegistryTest#createCuratorFrameworkMock()}
- * to what controllers are injected using mock {@link ServiceCache}.
- * @throws Exception
- */
- @Test
- public void testGetAllControllers() throws Exception {
- String controllerIdRegistered = "controller1";
- String controllerIdNotRegistered = "controller2013";
+ // Mock of CuratorFrameworkFactory
+ PowerMock.mockStatic(CuratorFrameworkFactory.class);
+ EasyMock.expect(CuratorFrameworkFactory.newClient((String) EasyMock.anyObject(),
+ EasyMock.anyInt(), EasyMock.anyInt(), (RetryPolicy) EasyMock.anyObject())).andReturn(client);
+ PowerMock.replay(CuratorFrameworkFactory.class);
- try {
- Collection<String> ctrls = registry.getAllControllers();
- assertTrue(ctrls.contains(controllerIdRegistered));
- assertFalse(ctrls.contains(controllerIdNotRegistered));
- } catch (RegistryException e) {
- e.printStackTrace();
- fail(e.getMessage());
- }
- }
+ FloodlightModuleContext fmc = new FloodlightModuleContext();
+ registry = new ZookeeperRegistry();
+ fmc.addService(ZookeeperRegistry.class, registry);
- /**
- * Test if {@link ZookeeperRegistry#requestControl(long, net.onrc.onos.core.registry.IControllerRegistryService.ControlChangeCallback)}
- * correctly take control of specific switch. Because {@link ZookeeperRegistry#requestControl(long, net.onrc.onos.core.registry.IControllerRegistryService.ControlChangeCallback)}
- * doesn't return values, inject mock {@link LeaderLatch} object and verify latch is correctly set up.
- * @throws Exception
- */
- @Test
- public void testRequestControl() throws Exception {
- // Mock LeaderLatch
- LeaderLatch latch = EasyMock.createMock(LeaderLatch.class);
- latch.addListener(EasyMock.anyObject(SwitchLeaderListener.class));
- EasyMock.expectLastCall().once();
- latch.start();
- EasyMock.expectLastCall().once();
- EasyMock.replay(latch);
-
- PowerMock.expectNew(LeaderLatch.class,
- EasyMock.anyObject(CuratorFramework.class), EasyMock.anyObject(String.class), EasyMock.anyObject(String.class))
- .andReturn(latch).once();
- PowerMock.replay(LeaderLatch.class);
-
- String controllerId = "controller2013";
- registry.registerController(controllerId);
+ registry.init(fmc);
- LoggingCallback callback = new LoggingCallback(1);
- long dpidToRequest = 2000L;
+ PowerMock.verify(client, CuratorFrameworkFactory.class);
+ }
- try {
- registry.requestControl(dpidToRequest, callback);
- } catch (RegistryException e) {
- e.printStackTrace();
- fail(e.getMessage());
- }
-
- EasyMock.verify(latch);
- }
+ /**
+ * Clean up member variables (empty for now).
+ */
+ @After
+ public void tearDown() throws Exception {
+ super.tearDown();
+ }
- /**
- * Test if {@link ZookeeperRegistry#releaseControl(long)} correctly release control of specific switch.
- * Because {@link ZookeeperRegistry#releaseControl(long)} doesn't return values, inject mock
- * {@link LeaderLatch} object and verify latch is correctly set up.
- * @throws Exception
- */
- @Test
- public void testReleaseControl() throws Exception {
- // Mock of LeaderLatch
- LeaderLatch latch = EasyMock.createMock(LeaderLatch.class);
- latch.addListener(EasyMock.anyObject(SwitchLeaderListener.class));
- EasyMock.expectLastCall().once();
- latch.start();
- EasyMock.expectLastCall().once();
- latch.removeListener(EasyMock.anyObject(SwitchLeaderListener.class));
- EasyMock.expectLastCall().once();
- latch.close();
- EasyMock.expectLastCall().once();
- EasyMock.replay(latch);
-
- PowerMock.expectNew(LeaderLatch.class,
- EasyMock.anyObject(CuratorFramework.class), EasyMock.anyObject(String.class), EasyMock.anyObject(String.class))
- .andReturn(latch).once();
- PowerMock.replay(LeaderLatch.class);
-
- String controllerId = "controller2013";
- registry.registerController(controllerId);
-
- long dpidToRequest = 2000L;
- LoggingCallback callback = new LoggingCallback(1);
-
- registry.requestControl(dpidToRequest, callback);
- registry.releaseControl(dpidToRequest);
-
- EasyMock.verify(latch);
- }
+ /**
+ * Test if {@link ZookeeperRegistry#registerController(String)} method can go through without exception.
+ * (Exceptions are usually out of test target, but {@link ZookeeperRegistry#registerController(String)} throws an exception in case of invalid registration.)
+ */
+ @Test
+ public void testRegisterController() {
+ String controllerIdToRegister = "controller2013";
- /**
- * Test if {@link ZookeeperRegistry#hasControl(long)} returns correct status whether controller has control of specific switch.
- * @throws Exception
- */
- @Test
- public void testHasControl() throws Exception {
- // Mock of LeaderLatch
- LeaderLatch latch = EasyMock.createMock(LeaderLatch.class);
- latch.addListener(EasyMock.anyObject(SwitchLeaderListener.class));
- EasyMock.expectLastCall().once();
- latch.start();
- EasyMock.expectLastCall().once();
- EasyMock.expect(latch.hasLeadership()).andReturn(true).anyTimes();
- latch.removeListener(EasyMock.anyObject(SwitchLeaderListener.class));
- EasyMock.expectLastCall().once();
- latch.close();
- EasyMock.expectLastCall().once();
- EasyMock.replay(latch);
-
- PowerMock.expectNew(LeaderLatch.class,
- EasyMock.anyObject(CuratorFramework.class), EasyMock.anyObject(String.class), EasyMock.anyObject(String.class))
- .andReturn(latch);
- PowerMock.replay(LeaderLatch.class);
-
- String controllerId = "controller2013";
- registry.registerController(controllerId);
-
- long dpidToRequest = 2000L;
- LoggingCallback callback = new LoggingCallback(2);
-
- // Test before request control
- assertFalse(registry.hasControl(dpidToRequest));
+ try {
+ registry.registerController(controllerIdToRegister);
+ } catch (RegistryException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
- registry.requestControl(dpidToRequest, callback);
-
- // Test after request control
- assertTrue(registry.hasControl(dpidToRequest));
-
- registry.releaseControl(dpidToRequest);
-
- // Test after release control
- assertFalse(registry.hasControl(dpidToRequest));
-
- EasyMock.verify(latch);
- }
+ /**
+ * Test if {@link ZookeeperRegistry#getControllerId()} correctly returns registered ID.
+ *
+ * @throws Exception
+ */
+ @Test
+ public void testGetControllerId() throws Exception {
+ String controllerIdToRegister = "controller1";
- /**
- * Test if {@link ZookeeperRegistry#getControllerForSwitch(long)} correctly returns controller ID of specific switch.
- * Relation between controllers and switches are defined by {@link ZookeeperRegistryTest#setPathChildrenCache()} function.
- * @throws Throwable
- */
- @Test
- public void testGetControllerForSwitch() throws Throwable {
- long dpidRegistered = 1000L;
- long dpidNotRegistered = 2000L;
-
- setPathChildrenCache();
-
- String controllerForSw = registry.getControllerForSwitch(dpidRegistered);
- assertEquals("controller1",controllerForSw);
+ // try before controller is registered
+ String controllerId = registry.getControllerId();
+ assertNull(controllerId);
- controllerForSw = registry.getControllerForSwitch(dpidNotRegistered);
- assertEquals(null, controllerForSw);
- }
+ // register
+ registry.registerController(controllerIdToRegister);
- /**
- * Test if {@link ZookeeperRegistry#getSwitchesControlledByController(String)} returns correct list of
- * switches controlled by a controller.
- * @throws Exception
- */
- // TODO: Test after getSwitchesControlledByController() is implemented.
- @Ignore @Test
- public void testGetSwitchesControlledByController() throws Exception {
- String controllerIdRegistered = "controller1";
- String dpidRegistered = HexString.toHexString(1000L);
- String controllerIdNotRegistered = CONTROLLER_ID;
-
- Collection<Long> switches = registry.getSwitchesControlledByController(controllerIdRegistered);
- assertNotNull(switches);
- assertTrue(switches.contains(dpidRegistered));
+ // call getControllerId and verify
+ controllerId = registry.getControllerId();
+ assertNotNull(controllerId);
+ assertEquals(controllerIdToRegister, controllerId);
+ }
- switches = registry.getSwitchesControlledByController(controllerIdNotRegistered);
- assertNotNull(switches);
- assertEquals(0, switches.size());
- }
+ /**
+ * Test if {@link ZookeeperRegistry#getAllControllers()} returns all controllers.
+ * Controllers to be returned are injected while setup. See {@link ZookeeperRegistryTest#createCuratorFrameworkMock()}
+ * to what controllers are injected using mock {@link ServiceCache}.
+ *
+ * @throws Exception
+ */
+ @Test
+ public void testGetAllControllers() throws Exception {
+ String controllerIdRegistered = "controller1";
+ String controllerIdNotRegistered = "controller2013";
- /**
- * Test if {@link ZookeeperRegistry#getAllSwitches()} returns correct list of all switches.
- * Switches are injected in {@link ZookeeperRegistryTest#setPathChildrenCache()} function.
- * @throws Exception
- */
- @Test
- public void testGetAllSwitches() throws Exception {
- String [] dpids = {
- HexString.toHexString(1000L),
- HexString.toHexString(1001L),
- HexString.toHexString(1002L),
- };
-
- setPathChildrenCache();
+ try {
+ Collection<String> ctrls = registry.getAllControllers();
+ assertTrue(ctrls.contains(controllerIdRegistered));
+ assertFalse(ctrls.contains(controllerIdNotRegistered));
+ } catch (RegistryException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
- Map<String, List<ControllerRegistryEntry>> switches = registry.getAllSwitches();
- assertNotNull(switches);
- assertEquals(dpids.length, switches.size());
- for(String dpid : dpids) {
- assertTrue(switches.keySet().contains(dpid));
- }
- }
+ /**
+ * Test if {@link ZookeeperRegistry#requestControl(long, net.onrc.onos.core.registry.IControllerRegistryService.ControlChangeCallback)}
+ * correctly take control of specific switch. Because {@link ZookeeperRegistry#requestControl(long, net.onrc.onos.core.registry.IControllerRegistryService.ControlChangeCallback)}
+ * doesn't return values, inject mock {@link LeaderLatch} object and verify latch is correctly set up.
+ *
+ * @throws Exception
+ */
+ @Test
+ public void testRequestControl() throws Exception {
+ // Mock LeaderLatch
+ LeaderLatch latch = EasyMock.createMock(LeaderLatch.class);
+ latch.addListener(EasyMock.anyObject(SwitchLeaderListener.class));
+ EasyMock.expectLastCall().once();
+ latch.start();
+ EasyMock.expectLastCall().once();
+ EasyMock.replay(latch);
- /**
- * Test if {@link ZookeeperRegistry#allocateUniqueIdBlock()} can assign IdBlock without duplication.
- */
- @Test
- public void testAllocateUniqueIdBlock() {
- // Number of blocks to be verified that any of them has unique block
- final int NUM_BLOCKS = 100;
- ArrayList<IdBlock> blocks = new ArrayList<IdBlock>(NUM_BLOCKS);
-
- for(int i = 0; i < NUM_BLOCKS; ++i) {
- IdBlock block = registry.allocateUniqueIdBlock();
- assertNotNull(block);
- blocks.add(block);
- }
-
- for(int i = 0; i < NUM_BLOCKS; ++i) {
- IdBlock block1 = blocks.get(i);
- for(int j = i + 1; j < NUM_BLOCKS; ++j) {
- IdBlock block2 = blocks.get(j);
- IdBlock lower,higher;
-
- if(block1.getStart() < block2.getStart()) {
- lower = block1;
- higher = block2;
- } else {
- lower = block2;
- higher = block1;
- }
-
- assertTrue(lower.getSize() > 0L);
- assertTrue(higher.getSize() > 0L);
- assertTrue(lower.getEnd() <= higher.getStart());
- }
- }
- }
-
-
- //-------------------------- Creation of mock objects --------------------------
- /**
- * Create mock {@link CuratorFramework} object with initial value below.<br>
- * [Ctrl ID] : [DPID]<br>
- * controller1 : 1000<br>
- * controller2 : 1001<br>
- * controller2 : 1002<br>
- * controller2013 : nothing
- * @return Created mock object
- * @throws Exception
- */
- @SuppressWarnings({ "serial", "unchecked" })
- private CuratorFramework createCuratorFrameworkMock() throws Exception {
- // Mock of AtomicValue
- AtomicValue<Long> atomicValue = EasyMock.createMock(AtomicValue.class);
- EasyMock.expect(atomicValue.succeeded()).andReturn(true).anyTimes();
- EasyMock.expect(atomicValue.preValue()).andAnswer(new IAnswer<Long>() {
- private long value = 0;
- @Override
- public Long answer() throws Throwable {
- value += ID_BLOCK_SIZE;
- return value;
- }
- }).anyTimes();
- EasyMock.expect(atomicValue.postValue()).andAnswer(new IAnswer<Long>() {
- private long value = ID_BLOCK_SIZE;
- @Override
- public Long answer() throws Throwable {
- value += ID_BLOCK_SIZE;
- return value;
- }
- }).anyTimes();
- EasyMock.replay(atomicValue);
-
- // Mock DistributedAtomicLong
- DistributedAtomicLong daLong = EasyMock.createMock(DistributedAtomicLong.class);
- EasyMock.expect(daLong.add(EasyMock.anyLong())).andReturn(atomicValue).anyTimes();
- EasyMock.replay(daLong);
- PowerMock.expectNew(DistributedAtomicLong.class,
- new Class<?> [] {CuratorFramework.class, String.class, RetryPolicy.class},
- EasyMock.anyObject(CuratorFramework.class), EasyMock.anyObject(String.class), EasyMock.anyObject(RetryPolicy.class)).
- andReturn(daLong).anyTimes();
- PowerMock.replay(DistributedAtomicLong.class);
-
- // Mock ListenerContainer
- ListenerContainer<PathChildrenCacheListener> listenerContainer = EasyMock.createMock(ListenerContainer.class);
- listenerContainer.addListener(EasyMock.anyObject(PathChildrenCacheListener.class));
- EasyMock.expectLastCall().andAnswer(new IAnswer<Object>() {
- @Override
- public Object answer() throws Throwable {
- pathChildrenCacheListener = (PathChildrenCacheListener)EasyMock.getCurrentArguments()[0];
- return null;
- }
- }).once();
- EasyMock.replay(listenerContainer);
+ PowerMock.expectNew(LeaderLatch.class,
+ EasyMock.anyObject(CuratorFramework.class), EasyMock.anyObject(String.class), EasyMock.anyObject(String.class))
+ .andReturn(latch).once();
+ PowerMock.replay(LeaderLatch.class);
- // Mock PathChildrenCache
- PathChildrenCache pathChildrenCacheMain = createPathChildrenCacheMock(CONTROLLER_ID, new String[] {"/switches"}, listenerContainer);
- PathChildrenCache pathChildrenCache1 = createPathChildrenCacheMock("controller1", new String[] {HexString.toHexString(1000L)}, listenerContainer);
- PathChildrenCache pathChildrenCache2 = createPathChildrenCacheMock("controller2", new String[] {
- HexString.toHexString(1001L), HexString.toHexString(1002L) },listenerContainer);
-
- // Mock PathChildrenCache constructor
- PowerMock.expectNew(PathChildrenCache.class,
- EasyMock.anyObject(CuratorFramework.class), EasyMock.anyObject(String.class), EasyMock.anyBoolean()).
- andReturn(pathChildrenCacheMain).once();
- PowerMock.expectNew(PathChildrenCache.class,
- EasyMock.anyObject(CuratorFramework.class), EasyMock.anyObject(String.class), EasyMock.anyBoolean()).
- andReturn(pathChildrenCache1).once();
- PowerMock.expectNew(PathChildrenCache.class,
- EasyMock.anyObject(CuratorFramework.class), EasyMock.anyObject(String.class), EasyMock.anyBoolean()).
- andReturn(pathChildrenCache2).anyTimes();
- PowerMock.replay(PathChildrenCache.class);
-
- // Mock ServiceCache
- ServiceCache<ControllerService> serviceCache = EasyMock.createMock(ServiceCache.class);
- serviceCache.start();
- EasyMock.expectLastCall().once();
- EasyMock.expect(serviceCache.getInstances()).andReturn(new ArrayList<ServiceInstance<ControllerService> > () {{
- add(createServiceInstanceMock("controller1"));
- add(createServiceInstanceMock("controller2"));
- }}).anyTimes();
- EasyMock.replay(serviceCache);
-
- // Mock ServiceCacheBuilder
- ServiceCacheBuilder<ControllerService> serviceCacheBuilder = EasyMock.createMock(ServiceCacheBuilder.class);
- EasyMock.expect(serviceCacheBuilder.name(EasyMock.anyObject(String.class))).andReturn(serviceCacheBuilder).once();
- EasyMock.expect(serviceCacheBuilder.build()).andReturn(serviceCache).once();
- EasyMock.replay(serviceCacheBuilder);
+ String controllerId = "controller2013";
+ registry.registerController(controllerId);
- // Mock ServiceDiscovery
- ServiceDiscovery<ControllerService> serviceDiscovery = EasyMock.createMock(ServiceDiscovery.class);
- serviceDiscovery.start();
- EasyMock.expectLastCall().once();
- EasyMock.expect(serviceDiscovery.serviceCacheBuilder()).andReturn(serviceCacheBuilder).once();
- serviceDiscovery.registerService(EasyMock.anyObject(ServiceInstance.class));
- EasyMock.expectLastCall().once();
- EasyMock.replay(serviceDiscovery);
-
- // Mock CuratorFramework
- CuratorFramework client = EasyMock.createMock(CuratorFramework.class);
- client.start();
- EasyMock.expectLastCall().once();
- EasyMock.expect(client.usingNamespace(EasyMock.anyObject(String.class))).andReturn(client);
- EasyMock.replay(client);
+ LoggingCallback callback = new LoggingCallback(1);
+ long dpidToRequest = 2000L;
- // Mock ServiceDiscoveryBuilder
- ServiceDiscoveryBuilder<ControllerService> builder = EasyMock.createMock(ServiceDiscoveryBuilder.class);
- EasyMock.expect(builder.client(client)).andReturn(builder).once();
- EasyMock.expect(builder.basePath(EasyMock.anyObject(String.class))).andReturn(builder);
- EasyMock.expect(builder.build()).andReturn(serviceDiscovery);
- EasyMock.replay(builder);
-
- PowerMock.mockStatic(ServiceDiscoveryBuilder.class);
- EasyMock.expect(ServiceDiscoveryBuilder.builder(ControllerService.class)).andReturn(builder).once();
- PowerMock.replay(ServiceDiscoveryBuilder.class);
+ try {
+ registry.requestControl(dpidToRequest, callback);
+ } catch (RegistryException e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
- return client;
- }
-
- /**
- * Create mock {@link ServiceInstance} object using given controller ID.
- * @param controllerId Controller ID to represent instance's payload (ControllerService).
- * @return Mock ServiceInstance object
- */
- private ServiceInstance<ControllerService> createServiceInstanceMock(String controllerId) {
- ControllerService controllerService = EasyMock.createMock(ControllerService.class);
- EasyMock.expect(controllerService.getControllerId()).andReturn(controllerId).anyTimes();
- EasyMock.replay(controllerService);
-
- @SuppressWarnings("unchecked")
- ServiceInstance<ControllerService> serviceInstance = EasyMock.createMock(ServiceInstance.class);
- EasyMock.expect(serviceInstance.getPayload()).andReturn(controllerService).anyTimes();
- EasyMock.replay(serviceInstance);
+ EasyMock.verify(latch);
+ }
- return serviceInstance;
- }
-
- /**
- * Create mock {@link PathChildrenCache} using given controller ID and DPIDs.
- * @param controllerId Controller ID to represent current data.
- * @param paths List of HexString indicating switch's DPID.
- * @param listener Callback object to be set as Listenable.
- * @return Mock PathChildrenCache object
- * @throws Exception
- */
- private PathChildrenCache createPathChildrenCacheMock(final String controllerId, final String [] paths,
- ListenerContainer<PathChildrenCacheListener> listener) throws Exception {
- PathChildrenCache pathChildrenCache = EasyMock.createMock(PathChildrenCache.class);
-
- EasyMock.expect(pathChildrenCache.getListenable()).andReturn(listener).anyTimes();
-
- pathChildrenCache.start(EasyMock.anyObject(StartMode.class));
- EasyMock.expectLastCall().anyTimes();
-
- List<ChildData> childs = new ArrayList<ChildData>();
- for(String path : paths) {
- childs.add(createChildDataMockForCurrentData(controllerId,path));
- }
- EasyMock.expect(pathChildrenCache.getCurrentData()).andReturn(childs).anyTimes();
-
- pathChildrenCache.rebuild();
- EasyMock.expectLastCall().anyTimes();
-
- EasyMock.replay(pathChildrenCache);
+ /**
+ * Test if {@link ZookeeperRegistry#releaseControl(long)} correctly release control of specific switch.
+ * Because {@link ZookeeperRegistry#releaseControl(long)} doesn't return values, inject mock
+ * {@link LeaderLatch} object and verify latch is correctly set up.
+ *
+ * @throws Exception
+ */
+ @Test
+ public void testReleaseControl() throws Exception {
+ // Mock of LeaderLatch
+ LeaderLatch latch = EasyMock.createMock(LeaderLatch.class);
+ latch.addListener(EasyMock.anyObject(SwitchLeaderListener.class));
+ EasyMock.expectLastCall().once();
+ latch.start();
+ EasyMock.expectLastCall().once();
+ latch.removeListener(EasyMock.anyObject(SwitchLeaderListener.class));
+ EasyMock.expectLastCall().once();
+ latch.close();
+ EasyMock.expectLastCall().once();
+ EasyMock.replay(latch);
- return pathChildrenCache;
- }
-
- /**
- * Create mock {@link ChildData} for {@link PathChildrenCache#getCurrentData()} return value.
- * This object need to include 'sequence number' in tail of path string. ("-0" means 0th sequence)
- * @param controllerId Controller ID
- * @param path HexString indicating switch's DPID
- * @return Mock ChildData object
- */
- private ChildData createChildDataMockForCurrentData(String controllerId, String path) {
- ChildData data = EasyMock.createMock(ChildData.class);
- EasyMock.expect(data.getPath()).andReturn(path + "-0").anyTimes();
- EasyMock.expect(data.getData()).andReturn(controllerId.getBytes()).anyTimes();
- EasyMock.replay(data);
-
- return data;
- }
+ PowerMock.expectNew(LeaderLatch.class,
+ EasyMock.anyObject(CuratorFramework.class), EasyMock.anyObject(String.class), EasyMock.anyObject(String.class))
+ .andReturn(latch).once();
+ PowerMock.replay(LeaderLatch.class);
- /**
- * Inject relations between controllers and switches using callback object.
- * @throws Exception
- */
- private void setPathChildrenCache() throws Exception {
- pathChildrenCacheListener.childEvent(client,
- createChildrenCacheEventMock("controller1", HexString.toHexString(1000L), PathChildrenCacheEvent.Type.CHILD_ADDED));
- pathChildrenCacheListener.childEvent(client,
- createChildrenCacheEventMock("controller2", HexString.toHexString(1001L), PathChildrenCacheEvent.Type.CHILD_ADDED));
- pathChildrenCacheListener.childEvent(client,
- createChildrenCacheEventMock("controller2", HexString.toHexString(1002L), PathChildrenCacheEvent.Type.CHILD_ADDED));
- }
+ String controllerId = "controller2013";
+ registry.registerController(controllerId);
- /**
- * Create mock {@link PathChildrenCacheEvent} object using given controller ID and DPID.
- * @param controllerId Controller ID.
- * @param path HexString of DPID.
- * @param type Event type to be set to mock object.
- * @return Mock PathChildrenCacheEvent object
- */
- private PathChildrenCacheEvent createChildrenCacheEventMock(String controllerId, String path,
- PathChildrenCacheEvent.Type type) {
- PathChildrenCacheEvent event = EasyMock.createMock(PathChildrenCacheEvent.class);
- ChildData data = EasyMock.createMock(ChildData.class);
-
- EasyMock.expect(data.getPath()).andReturn(path).anyTimes();
- EasyMock.expect(data.getData()).andReturn(controllerId.getBytes()).anyTimes();
- EasyMock.replay(data);
-
- EasyMock.expect(event.getType()).andReturn(type).anyTimes();
- EasyMock.expect(event.getData()).andReturn(data).anyTimes();
- EasyMock.replay(event);
-
- return event;
- }
+ long dpidToRequest = 2000L;
+ LoggingCallback callback = new LoggingCallback(1);
+
+ registry.requestControl(dpidToRequest, callback);
+ registry.releaseControl(dpidToRequest);
+
+ EasyMock.verify(latch);
+ }
+
+ /**
+ * Test if {@link ZookeeperRegistry#hasControl(long)} returns correct status whether controller has control of specific switch.
+ *
+ * @throws Exception
+ */
+ @Test
+ public void testHasControl() throws Exception {
+ // Mock of LeaderLatch
+ LeaderLatch latch = EasyMock.createMock(LeaderLatch.class);
+ latch.addListener(EasyMock.anyObject(SwitchLeaderListener.class));
+ EasyMock.expectLastCall().once();
+ latch.start();
+ EasyMock.expectLastCall().once();
+ EasyMock.expect(latch.hasLeadership()).andReturn(true).anyTimes();
+ latch.removeListener(EasyMock.anyObject(SwitchLeaderListener.class));
+ EasyMock.expectLastCall().once();
+ latch.close();
+ EasyMock.expectLastCall().once();
+ EasyMock.replay(latch);
+
+ PowerMock.expectNew(LeaderLatch.class,
+ EasyMock.anyObject(CuratorFramework.class), EasyMock.anyObject(String.class), EasyMock.anyObject(String.class))
+ .andReturn(latch);
+ PowerMock.replay(LeaderLatch.class);
+
+ String controllerId = "controller2013";
+ registry.registerController(controllerId);
+
+ long dpidToRequest = 2000L;
+ LoggingCallback callback = new LoggingCallback(2);
+
+ // Test before request control
+ assertFalse(registry.hasControl(dpidToRequest));
+
+ registry.requestControl(dpidToRequest, callback);
+
+ // Test after request control
+ assertTrue(registry.hasControl(dpidToRequest));
+
+ registry.releaseControl(dpidToRequest);
+
+ // Test after release control
+ assertFalse(registry.hasControl(dpidToRequest));
+
+ EasyMock.verify(latch);
+ }
+
+ /**
+ * Test if {@link ZookeeperRegistry#getControllerForSwitch(long)} correctly returns controller ID of specific switch.
+ * Relation between controllers and switches are defined by {@link ZookeeperRegistryTest#setPathChildrenCache()} function.
+ *
+ * @throws Throwable
+ */
+ @Test
+ public void testGetControllerForSwitch() throws Throwable {
+ long dpidRegistered = 1000L;
+ long dpidNotRegistered = 2000L;
+
+ setPathChildrenCache();
+
+ String controllerForSw = registry.getControllerForSwitch(dpidRegistered);
+ assertEquals("controller1", controllerForSw);
+
+ controllerForSw = registry.getControllerForSwitch(dpidNotRegistered);
+ assertEquals(null, controllerForSw);
+ }
+
+ /**
+ * Test if {@link ZookeeperRegistry#getSwitchesControlledByController(String)} returns correct list of
+ * switches controlled by a controller.
+ *
+ * @throws Exception
+ */
+ // TODO: Test after getSwitchesControlledByController() is implemented.
+ @Ignore
+ @Test
+ public void testGetSwitchesControlledByController() throws Exception {
+ String controllerIdRegistered = "controller1";
+ String dpidRegistered = HexString.toHexString(1000L);
+ String controllerIdNotRegistered = CONTROLLER_ID;
+
+ Collection<Long> switches = registry.getSwitchesControlledByController(controllerIdRegistered);
+ assertNotNull(switches);
+ assertTrue(switches.contains(dpidRegistered));
+
+ switches = registry.getSwitchesControlledByController(controllerIdNotRegistered);
+ assertNotNull(switches);
+ assertEquals(0, switches.size());
+ }
+
+ /**
+ * Test if {@link ZookeeperRegistry#getAllSwitches()} returns correct list of all switches.
+ * Switches are injected in {@link ZookeeperRegistryTest#setPathChildrenCache()} function.
+ *
+ * @throws Exception
+ */
+ @Test
+ public void testGetAllSwitches() throws Exception {
+ String[] dpids = {
+ HexString.toHexString(1000L),
+ HexString.toHexString(1001L),
+ HexString.toHexString(1002L),
+ };
+
+ setPathChildrenCache();
+
+ Map<String, List<ControllerRegistryEntry>> switches = registry.getAllSwitches();
+ assertNotNull(switches);
+ assertEquals(dpids.length, switches.size());
+ for (String dpid : dpids) {
+ assertTrue(switches.keySet().contains(dpid));
+ }
+ }
+
+ /**
+ * Test if {@link ZookeeperRegistry#allocateUniqueIdBlock()} can assign IdBlock without duplication.
+ */
+ @Test
+ public void testAllocateUniqueIdBlock() {
+ // Number of blocks to be verified that any of them has unique block
+ final int NUM_BLOCKS = 100;
+ ArrayList<IdBlock> blocks = new ArrayList<IdBlock>(NUM_BLOCKS);
+
+ for (int i = 0; i < NUM_BLOCKS; ++i) {
+ IdBlock block = registry.allocateUniqueIdBlock();
+ assertNotNull(block);
+ blocks.add(block);
+ }
+
+ for (int i = 0; i < NUM_BLOCKS; ++i) {
+ IdBlock block1 = blocks.get(i);
+ for (int j = i + 1; j < NUM_BLOCKS; ++j) {
+ IdBlock block2 = blocks.get(j);
+ IdBlock lower, higher;
+
+ if (block1.getStart() < block2.getStart()) {
+ lower = block1;
+ higher = block2;
+ } else {
+ lower = block2;
+ higher = block1;
+ }
+
+ assertTrue(lower.getSize() > 0L);
+ assertTrue(higher.getSize() > 0L);
+ assertTrue(lower.getEnd() <= higher.getStart());
+ }
+ }
+ }
+
+
+ //-------------------------- Creation of mock objects --------------------------
+
+ /**
+ * Create mock {@link CuratorFramework} object with initial value below.<br>
+ * [Ctrl ID] : [DPID]<br>
+ * controller1 : 1000<br>
+ * controller2 : 1001<br>
+ * controller2 : 1002<br>
+ * controller2013 : nothing
+ *
+ * @return Created mock object
+ * @throws Exception
+ */
+ @SuppressWarnings({"serial", "unchecked"})
+ private CuratorFramework createCuratorFrameworkMock() throws Exception {
+ // Mock of AtomicValue
+ AtomicValue<Long> atomicValue = EasyMock.createMock(AtomicValue.class);
+ EasyMock.expect(atomicValue.succeeded()).andReturn(true).anyTimes();
+ EasyMock.expect(atomicValue.preValue()).andAnswer(new IAnswer<Long>() {
+ private long value = 0;
+
+ @Override
+ public Long answer() throws Throwable {
+ value += ID_BLOCK_SIZE;
+ return value;
+ }
+ }).anyTimes();
+ EasyMock.expect(atomicValue.postValue()).andAnswer(new IAnswer<Long>() {
+ private long value = ID_BLOCK_SIZE;
+
+ @Override
+ public Long answer() throws Throwable {
+ value += ID_BLOCK_SIZE;
+ return value;
+ }
+ }).anyTimes();
+ EasyMock.replay(atomicValue);
+
+ // Mock DistributedAtomicLong
+ DistributedAtomicLong daLong = EasyMock.createMock(DistributedAtomicLong.class);
+ EasyMock.expect(daLong.add(EasyMock.anyLong())).andReturn(atomicValue).anyTimes();
+ EasyMock.replay(daLong);
+ PowerMock.expectNew(DistributedAtomicLong.class,
+ new Class<?>[]{CuratorFramework.class, String.class, RetryPolicy.class},
+ EasyMock.anyObject(CuratorFramework.class), EasyMock.anyObject(String.class), EasyMock.anyObject(RetryPolicy.class)).
+ andReturn(daLong).anyTimes();
+ PowerMock.replay(DistributedAtomicLong.class);
+
+ // Mock ListenerContainer
+ ListenerContainer<PathChildrenCacheListener> listenerContainer = EasyMock.createMock(ListenerContainer.class);
+ listenerContainer.addListener(EasyMock.anyObject(PathChildrenCacheListener.class));
+ EasyMock.expectLastCall().andAnswer(new IAnswer<Object>() {
+ @Override
+ public Object answer() throws Throwable {
+ pathChildrenCacheListener = (PathChildrenCacheListener) EasyMock.getCurrentArguments()[0];
+ return null;
+ }
+ }).once();
+ EasyMock.replay(listenerContainer);
+
+ // Mock PathChildrenCache
+ PathChildrenCache pathChildrenCacheMain = createPathChildrenCacheMock(CONTROLLER_ID, new String[]{"/switches"}, listenerContainer);
+ PathChildrenCache pathChildrenCache1 = createPathChildrenCacheMock("controller1", new String[]{HexString.toHexString(1000L)}, listenerContainer);
+ PathChildrenCache pathChildrenCache2 = createPathChildrenCacheMock("controller2", new String[]{
+ HexString.toHexString(1001L), HexString.toHexString(1002L)}, listenerContainer);
+
+ // Mock PathChildrenCache constructor
+ PowerMock.expectNew(PathChildrenCache.class,
+ EasyMock.anyObject(CuratorFramework.class), EasyMock.anyObject(String.class), EasyMock.anyBoolean()).
+ andReturn(pathChildrenCacheMain).once();
+ PowerMock.expectNew(PathChildrenCache.class,
+ EasyMock.anyObject(CuratorFramework.class), EasyMock.anyObject(String.class), EasyMock.anyBoolean()).
+ andReturn(pathChildrenCache1).once();
+ PowerMock.expectNew(PathChildrenCache.class,
+ EasyMock.anyObject(CuratorFramework.class), EasyMock.anyObject(String.class), EasyMock.anyBoolean()).
+ andReturn(pathChildrenCache2).anyTimes();
+ PowerMock.replay(PathChildrenCache.class);
+
+ // Mock ServiceCache
+ ServiceCache<ControllerService> serviceCache = EasyMock.createMock(ServiceCache.class);
+ serviceCache.start();
+ EasyMock.expectLastCall().once();
+ EasyMock.expect(serviceCache.getInstances()).andReturn(new ArrayList<ServiceInstance<ControllerService>>() {{
+ add(createServiceInstanceMock("controller1"));
+ add(createServiceInstanceMock("controller2"));
+ }}).anyTimes();
+ EasyMock.replay(serviceCache);
+
+ // Mock ServiceCacheBuilder
+ ServiceCacheBuilder<ControllerService> serviceCacheBuilder = EasyMock.createMock(ServiceCacheBuilder.class);
+ EasyMock.expect(serviceCacheBuilder.name(EasyMock.anyObject(String.class))).andReturn(serviceCacheBuilder).once();
+ EasyMock.expect(serviceCacheBuilder.build()).andReturn(serviceCache).once();
+ EasyMock.replay(serviceCacheBuilder);
+
+ // Mock ServiceDiscovery
+ ServiceDiscovery<ControllerService> serviceDiscovery = EasyMock.createMock(ServiceDiscovery.class);
+ serviceDiscovery.start();
+ EasyMock.expectLastCall().once();
+ EasyMock.expect(serviceDiscovery.serviceCacheBuilder()).andReturn(serviceCacheBuilder).once();
+ serviceDiscovery.registerService(EasyMock.anyObject(ServiceInstance.class));
+ EasyMock.expectLastCall().once();
+ EasyMock.replay(serviceDiscovery);
+
+ // Mock CuratorFramework
+ CuratorFramework client = EasyMock.createMock(CuratorFramework.class);
+ client.start();
+ EasyMock.expectLastCall().once();
+ EasyMock.expect(client.usingNamespace(EasyMock.anyObject(String.class))).andReturn(client);
+ EasyMock.replay(client);
+
+ // Mock ServiceDiscoveryBuilder
+ ServiceDiscoveryBuilder<ControllerService> builder = EasyMock.createMock(ServiceDiscoveryBuilder.class);
+ EasyMock.expect(builder.client(client)).andReturn(builder).once();
+ EasyMock.expect(builder.basePath(EasyMock.anyObject(String.class))).andReturn(builder);
+ EasyMock.expect(builder.build()).andReturn(serviceDiscovery);
+ EasyMock.replay(builder);
+
+ PowerMock.mockStatic(ServiceDiscoveryBuilder.class);
+ EasyMock.expect(ServiceDiscoveryBuilder.builder(ControllerService.class)).andReturn(builder).once();
+ PowerMock.replay(ServiceDiscoveryBuilder.class);
+
+ return client;
+ }
+
+ /**
+ * Create mock {@link ServiceInstance} object using given controller ID.
+ *
+ * @param controllerId Controller ID to represent instance's payload (ControllerService).
+ * @return Mock ServiceInstance object
+ */
+ private ServiceInstance<ControllerService> createServiceInstanceMock(String controllerId) {
+ ControllerService controllerService = EasyMock.createMock(ControllerService.class);
+ EasyMock.expect(controllerService.getControllerId()).andReturn(controllerId).anyTimes();
+ EasyMock.replay(controllerService);
+
+ @SuppressWarnings("unchecked")
+ ServiceInstance<ControllerService> serviceInstance = EasyMock.createMock(ServiceInstance.class);
+ EasyMock.expect(serviceInstance.getPayload()).andReturn(controllerService).anyTimes();
+ EasyMock.replay(serviceInstance);
+
+ return serviceInstance;
+ }
+
+ /**
+ * Create mock {@link PathChildrenCache} using given controller ID and DPIDs.
+ *
+ * @param controllerId Controller ID to represent current data.
+ * @param paths List of HexString indicating switch's DPID.
+ * @param listener Callback object to be set as Listenable.
+ * @return Mock PathChildrenCache object
+ * @throws Exception
+ */
+ private PathChildrenCache createPathChildrenCacheMock(final String controllerId, final String[] paths,
+ ListenerContainer<PathChildrenCacheListener> listener) throws Exception {
+ PathChildrenCache pathChildrenCache = EasyMock.createMock(PathChildrenCache.class);
+
+ EasyMock.expect(pathChildrenCache.getListenable()).andReturn(listener).anyTimes();
+
+ pathChildrenCache.start(EasyMock.anyObject(StartMode.class));
+ EasyMock.expectLastCall().anyTimes();
+
+ List<ChildData> childs = new ArrayList<ChildData>();
+ for (String path : paths) {
+ childs.add(createChildDataMockForCurrentData(controllerId, path));
+ }
+ EasyMock.expect(pathChildrenCache.getCurrentData()).andReturn(childs).anyTimes();
+
+ pathChildrenCache.rebuild();
+ EasyMock.expectLastCall().anyTimes();
+
+ EasyMock.replay(pathChildrenCache);
+
+ return pathChildrenCache;
+ }
+
+ /**
+ * Create mock {@link ChildData} for {@link PathChildrenCache#getCurrentData()} return value.
+ * This object need to include 'sequence number' in tail of path string. ("-0" means 0th sequence)
+ *
+ * @param controllerId Controller ID
+ * @param path HexString indicating switch's DPID
+ * @return Mock ChildData object
+ */
+ private ChildData createChildDataMockForCurrentData(String controllerId, String path) {
+ ChildData data = EasyMock.createMock(ChildData.class);
+ EasyMock.expect(data.getPath()).andReturn(path + "-0").anyTimes();
+ EasyMock.expect(data.getData()).andReturn(controllerId.getBytes()).anyTimes();
+ EasyMock.replay(data);
+
+ return data;
+ }
+
+ /**
+ * Inject relations between controllers and switches using callback object.
+ *
+ * @throws Exception
+ */
+ private void setPathChildrenCache() throws Exception {
+ pathChildrenCacheListener.childEvent(client,
+ createChildrenCacheEventMock("controller1", HexString.toHexString(1000L), PathChildrenCacheEvent.Type.CHILD_ADDED));
+ pathChildrenCacheListener.childEvent(client,
+ createChildrenCacheEventMock("controller2", HexString.toHexString(1001L), PathChildrenCacheEvent.Type.CHILD_ADDED));
+ pathChildrenCacheListener.childEvent(client,
+ createChildrenCacheEventMock("controller2", HexString.toHexString(1002L), PathChildrenCacheEvent.Type.CHILD_ADDED));
+ }
+
+ /**
+ * Create mock {@link PathChildrenCacheEvent} object using given controller ID and DPID.
+ *
+ * @param controllerId Controller ID.
+ * @param path HexString of DPID.
+ * @param type Event type to be set to mock object.
+ * @return Mock PathChildrenCacheEvent object
+ */
+ private PathChildrenCacheEvent createChildrenCacheEventMock(String controllerId, String path,
+ PathChildrenCacheEvent.Type type) {
+ PathChildrenCacheEvent event = EasyMock.createMock(PathChildrenCacheEvent.class);
+ ChildData data = EasyMock.createMock(ChildData.class);
+
+ EasyMock.expect(data.getPath()).andReturn(path).anyTimes();
+ EasyMock.expect(data.getData()).andReturn(controllerId.getBytes()).anyTimes();
+ EasyMock.replay(data);
+
+ EasyMock.expect(event.getType()).andReturn(type).anyTimes();
+ EasyMock.expect(event.getData()).andReturn(data).anyTimes();
+ EasyMock.replay(event);
+
+ return event;
+ }
}