package org.peerbox.app.config; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.io.IOException; import java.net.URL; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import org.apache.commons.io.FileUtils; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.peerbox.BaseJUnitTest; public class BootstrappingNodesFactoryTest extends BaseJUnitTest { private BootstrappingNodes nodes; private BootstrappingNodesFactory factory; private Path basePath; private URL defaultNodes; private Path nodesFile; private Path lastNodeFile; @Before public void beforeTest() throws IOException { factory = new BootstrappingNodesFactory(); basePath = Paths.get(FileUtils.getTempDirectoryPath(), "PeerWasp_BootstrappingNodesTest"); if (!Files.exists(basePath)) { Files.createDirectories(basePath); } defaultNodes = createDefaultNodesFile(); nodesFile = createNodesFile(); lastNodeFile = createLastNodeFile(); } @After public void afterTest() throws IOException { nodes = null; factory = null; FileUtils.deleteDirectory(basePath.toFile()); } @Test public void testCreate() throws IOException { nodes = factory.create(); assertNotNull(nodes); assertFalse(nodes.hasLastNode()); assertFalse(nodes.hasBootstrappingNodes()); factory.load(); assertFalse(nodes.hasLastNode()); assertFalse(nodes.hasBootstrappingNodes()); } @Test public void testCreate_Default() throws IOException { factory.setNodesDefaultUrl(defaultNodes); nodes = factory.create(); factory.load(); assertTrue(nodes.hasBootstrappingNodes()); assertEquals(nodes.getBootstrappingNodes().size(), 2); assertTrue(nodes.getBootstrappingNodes().contains("localhost")); assertTrue(nodes.getBootstrappingNodes().contains("127.0.0.1")); } @Test public void testCreate_Nodes() throws IOException { factory.setNodesFile(nodesFile); nodes = factory.create(); factory.load(); assertTrue(nodes.hasBootstrappingNodes()); assertEquals(nodes.getBootstrappingNodes().size(), 3); assertTrue(nodes.getBootstrappingNodes().contains("localhost")); assertTrue(nodes.getBootstrappingNodes().contains("example.org")); assertTrue(nodes.getBootstrappingNodes().contains("192.168.1.100")); } @Test public void testCreate_LastNode() throws IOException { factory.setLastNodeFile(lastNodeFile); nodes = factory.create(); factory.load(); assertTrue(nodes.hasLastNode()); assertEquals(nodes.getLastNode(), "mynode"); } @Test public void testLoadAndSave() throws IOException { factory.setLastNodeFile(lastNodeFile); factory.setNodesFile(nodesFile); factory.setNodesDefaultUrl(defaultNodes); nodes = factory.create(); factory.load(); assertEquals(nodes.getBootstrappingNodes().size(), 4); nodes.addNode("testnode"); factory.save(); factory.load(); assertEquals(nodes.getBootstrappingNodes().size(), 5); assertTrue(nodes.getBootstrappingNodes().contains("testnode")); // removing default node has no effect nodes.removeNode("localhost"); factory.save(); factory.load(); assertEquals(nodes.getBootstrappingNodes().size(), 5); assertTrue(nodes.getBootstrappingNodes().contains("localhost")); // removing non-default node nodes.removeNode("example.org"); factory.save(); factory.load(); assertEquals(nodes.getBootstrappingNodes().size(), 4); assertFalse(nodes.getBootstrappingNodes().contains("example.org")); // last node nodes.setLastNode("lastnode"); factory.save(); factory.load(); assertEquals(nodes.getLastNode(), "lastnode"); } private URL createDefaultNodesFile() throws IOException { Path f = basePath.resolve("default_nodes"); String n = "localhost\n" + "127.0.0.1\n"; Files.write(f, n.getBytes()); return f.toUri().toURL(); } private Path createNodesFile() throws IOException { Path f = basePath.resolve("nodes"); String n = "localhost\n" + "example.org\n" + "192.168.1.100\n"; Files.write(f, n.getBytes()); return f; } private Path createLastNodeFile() throws IOException { Path f = basePath.resolve("lastnode"); String n = "mynode"; Files.write(f, n.getBytes()); return f; } }