package org.peerbox.app.manager.node; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Mockito; import org.peerbox.BaseJUnitTest; import org.peerbox.app.manager.node.INodeManager; import org.peerbox.app.manager.node.NodeConnectMessage; import org.peerbox.app.manager.node.NodeDisconnectMessage; import org.peerbox.app.manager.node.NodeManager; import org.peerbox.events.MessageBus; public class NodeManagerTest extends BaseJUnitTest { private INodeManager nodeManager; private MessageBus messageBus; // used if node joins to a network private INodeManager initialNodeManager; @Before public void initialize() { messageBus = Mockito.mock(MessageBus.class); nodeManager = new NodeManager(messageBus); } @After public void cleanup() { if (initialNodeManager != null) { initialNodeManager.leaveNetwork(); initialNodeManager = null; } if (nodeManager != null && nodeManager.isConnected()) { nodeManager.leaveNetwork(); nodeManager = null; } } @Test public void testGetNode_Initial() { assertNull(nodeManager.getNode()); // create boolean ret = nodeManager.createNetwork(); assertTrue(ret); assertNotNull(nodeManager.getNode()); // leave ret = nodeManager.leaveNetwork(); assertTrue(ret); assertNull(nodeManager.getNode()); } @Test public void testGetNode_Join() throws UnknownHostException { initialNodeManager = createInitialNode(); // join assertNull(nodeManager.getNode()); boolean ret = nodeManager.joinNetwork("localhost"); assertTrue(ret); assertNotNull(nodeManager.getNode()); // leave ret = nodeManager.leaveNetwork(); assertTrue(ret); assertNull(nodeManager.getNode()); } @Test public void testCreateNetwork() { boolean ret = nodeManager.createNetwork(); assertTrue(ret); assertTrue(nodeManager.getNetworkConfiguration().isInitial()); // got event? ArgumentCaptor<NodeConnectMessage> event = ArgumentCaptor.forClass(NodeConnectMessage.class); // 1. NodeConnect Mockito.verify(messageBus, Mockito.times(1)).publish(event.capture()); assertNotNull(event.getValue()); assertTrue(event.getValue() instanceof NodeConnectMessage); assertEquals(event.getValue().getNodeAddress(), "localhost"); } @Test public void testJoinNetwork_Node() throws UnknownHostException { initialNodeManager = createInitialNode(); boolean ret = nodeManager.joinNetwork("127.0.0.1"); assertTrue(ret); assertFalse(nodeManager.getNetworkConfiguration().isInitial()); assertEquals(nodeManager.getNetworkConfiguration().getBootstrapAddress().getHostAddress(), "127.0.0.1"); // got event? ArgumentCaptor<NodeConnectMessage> event = ArgumentCaptor.forClass(NodeConnectMessage.class); // 1. NodeConnect Mockito.verify(messageBus, Mockito.times(1)).publish(event.capture()); assertNotNull(event.getValue()); assertTrue(event.getValue() instanceof NodeConnectMessage); assertEquals(event.getValue().getNodeAddress(), "127.0.0.1"); } @Test public void testJoinNetwork_Node_WrongAddress() throws UnknownHostException { initialNodeManager = createInitialNode(); boolean ret = nodeManager.joinNetwork("1.2.3.4"); assertFalse(ret); // got NO event Mockito.verify(messageBus, Mockito.never()).publish(Mockito.anyObject()); } @Test public void testJoinNetwork_Node_UnknownHost() { initialNodeManager = createInitialNode(); try { nodeManager.joinNetwork("unknownHost"); fail("Exception was not thrown, but was expected!"); } catch(UnknownHostException uhe) { // ignore -- exception is expected } // got NO event Mockito.verify(messageBus, Mockito.never()).publish(Mockito.anyObject()); } @Test public void testJoinNetwork_NodeList() { List<String> addresses = new ArrayList<>(); addresses.add("1.2.3.4"); // should fail addresses.add("unknownHost"); // should fail addresses.add("127.0.0.1"); // should succeed initialNodeManager = createInitialNode(); // should connect to last host and other two should not lead to an exception boolean ret = nodeManager.joinNetwork(addresses); assertTrue(ret); assertFalse(nodeManager.getNetworkConfiguration().isInitial()); assertEquals(nodeManager.getNetworkConfiguration().getBootstrapAddress().getHostAddress(), "127.0.0.1"); // got event? ArgumentCaptor<NodeConnectMessage> event = ArgumentCaptor.forClass(NodeConnectMessage.class); // 1. NodeConnect Mockito.verify(messageBus, Mockito.times(1)).publish(event.capture()); assertNotNull(event.getValue()); assertTrue(event.getValue() instanceof NodeConnectMessage); assertEquals(event.getValue().getNodeAddress(), "127.0.0.1"); } @Test(expected = UnknownHostException.class) public void testJoinNetwork_UnknownHost() throws UnknownHostException { nodeManager.joinNetwork("unknownhost"); } @Test public void testJoinNetwork_WrongAddress() throws UnknownHostException{ assertFalse(nodeManager.joinNetwork("1.2.3.4")); } @Test public void testJoinNetwork_CorrectAddress() throws UnknownHostException { assertTrue(nodeManager.joinNetwork("localhost")); } @Test public void testLeaveNetwork_Join() throws UnknownHostException { initialNodeManager = createInitialNode(); boolean ret = nodeManager.joinNetwork("localhost"); assertTrue(ret); nodeManager.leaveNetwork(); // got event? ArgumentCaptor<NodeDisconnectMessage> event = ArgumentCaptor.forClass(NodeDisconnectMessage.class); // 1. NodeConnect, 2. NodeDisconnect Mockito.verify(messageBus, Mockito.times(2)).publish(event.capture()); assertNotNull(event.getValue()); assertTrue(event.getValue() instanceof NodeDisconnectMessage); } @Test public void testLeaveNetwork_Initial() throws UnknownHostException { boolean ret = nodeManager.createNetwork(); assertTrue(ret); nodeManager.leaveNetwork(); // got event? ArgumentCaptor<NodeDisconnectMessage> event = ArgumentCaptor.forClass(NodeDisconnectMessage.class); // 1. NodeConnect, 2. NodeDisconnect Mockito.verify(messageBus, Mockito.times(2)).publish(event.capture()); assertNotNull(event.getValue()); assertTrue(event.getValue() instanceof NodeDisconnectMessage); } @Test public void testLeaveNetwork_NotConnected() { boolean ret = nodeManager.leaveNetwork(); assertTrue(ret); // got NO event? Mockito.verify(messageBus, Mockito.never()).publish(Mockito.anyObject()); } @Test public void testIsConnected_Initial() { assertFalse(nodeManager.isConnected()); boolean ret = nodeManager.createNetwork(); assertTrue(ret); assertTrue(nodeManager.isConnected()); ret = nodeManager.leaveNetwork(); assertTrue(ret); assertFalse(nodeManager.isConnected()); } @Test public void testIsConnected_Join() throws UnknownHostException { initialNodeManager = createInitialNode(); assertFalse(nodeManager.isConnected()); boolean ret = nodeManager.joinNetwork("localhost"); assertTrue(ret); assertTrue(nodeManager.isConnected()); ret = nodeManager.leaveNetwork(); assertTrue(ret); assertFalse(nodeManager.isConnected()); } @Test public void testInetAddressIfNotInitialPeer() throws UnknownHostException { String bootstrapAddress = "1.2.3.4"; nodeManager.joinNetwork(bootstrapAddress); String address = nodeManager.getNetworkConfiguration().getBootstrapAddress().toString(); assertEquals(address, InetAddress.getByName(bootstrapAddress).toString()); } @Test public void testGetNetworkConfiguration_Initial() { assertNull(nodeManager.getNetworkConfiguration()); boolean ret = nodeManager.createNetwork(); assertTrue(ret); assertNotNull(nodeManager.getNetworkConfiguration()); } @Test public void testGetNetworkConfiguration_Join() throws UnknownHostException { initialNodeManager = createInitialNode(); assertNull(nodeManager.getNetworkConfiguration()); boolean ret = nodeManager.joinNetwork("127.0.0.1"); assertTrue(ret); assertNotNull(nodeManager.getNetworkConfiguration()); } @Test public void testGetFileConfiguration_Initial() { assertNull(nodeManager.getFileConfiguration()); boolean ret = nodeManager.createNetwork(); assertTrue(ret); assertNotNull(nodeManager.getFileConfiguration()); } @Test public void testGetFileConfiguration_Join() throws UnknownHostException { initialNodeManager = createInitialNode(); assertNull(nodeManager.getFileConfiguration()); boolean ret = nodeManager.joinNetwork("127.0.0.1"); assertTrue(ret); assertNotNull(nodeManager.getFileConfiguration()); } private INodeManager createInitialNode() { INodeManager init = new NodeManager(Mockito.mock(MessageBus.class)); assertNotNull(init); boolean ret = init.createNetwork(); assertTrue(ret); return init; } }