package neo4j.tests; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.util.Locale; import java.util.Map; import org.neo4j.graphdb.Direction; import org.neo4j.graphdb.GraphDatabaseService; import org.neo4j.graphdb.factory.GraphDatabaseFactory; public class TestManager { public static boolean removeDirectory(File directory) { // System.out.println("removeDirectory " + directory); if (directory == null) return false; if (!directory.exists()) return true; if (!directory.isDirectory()) return false; String[] list = directory.list(); // Some JVMs return null for File.list() when the // directory is empty. if (list != null) { for (int i = 0; i < list.length; i++) { File entry = new File(directory, list[i]); // System.out.println("\tremoving entry " + entry); if (entry.isDirectory()) { if (!removeDirectory(entry)) return false; } else { if (!entry.delete()) return false; } } } return directory.delete(); } private GraphTestCase graphTestCase; public TestManager (GraphTestCase testCase) { this.graphTestCase = testCase; } private void writeStatistics(BufferedWriter writer, Map<StatisticalIndicators, Double> statistics ) throws IOException { DecimalFormat df = new DecimalFormat("##############.##", new DecimalFormatSymbols(Locale.US)); writer.write("Statistical indicators of processing times"); writer.newLine(); writer.write("Minimum: " + df.format(statistics.get(StatisticalIndicators.MIN))); writer.newLine(); writer.write("Maximum: " + df.format(statistics.get(StatisticalIndicators.MAX))); writer.newLine(); writer.write("Median: " + df.format(statistics.get(StatisticalIndicators.MEDIAN))); writer.newLine(); writer.write("Mean: " + df.format(statistics.get(StatisticalIndicators.MEAN))); writer.newLine(); writer.write("Dev. standard: " + df.format(statistics.get(StatisticalIndicators.DEV_STD))); writer.newLine(); } public void execute() throws IOException { BufferedWriter writer = null; GraphDatabaseService graph = null; try { writer = new BufferedWriter(new FileWriter(new File( graphTestCase.getWorkDirectory() + "results.txt"), false)); writer.write("RESULTS FOR FILE: " + graphTestCase.getGraphFileName()); writer.newLine(); Map<StatisticalIndicators, Double> statistics; //Config cluster //Load file /* File directory = new File(graphTestCase.getStorageDirectory()); if (!removeDirectory(directory)) throw new RuntimeException("The directory " + graphTestCase.getStorageDirectory() + " was not completely deleted"); TestTools.loadGraphV2(graphTestCase.getGraphFileName(), graphTestCase.getStorageDirectory(), graphTestCase.getLoadFileType()); */ graph = new GraphDatabaseFactory().newEmbeddedDatabase(graphTestCase.getStorageDirectory()); writer.newLine(); writer.write("TRAVERSAL RESULTS (expressed in milliseconds)"); writer.newLine(); Direction direction = (graphTestCase.isDirected())?Direction.OUTGOING:Direction.BOTH; writer.newLine(); writer.write("Test file containing 200 random queries that can have or not a path"); writer.newLine(); writer.write("Max hops: 3 - Edge type: " + (graphTestCase.isDirected()?"OUT":"UNDIRECTED") + " - Delay: " + graphTestCase.getDelay()); writer.newLine(); statistics = TestTools.testTraversalFromFile(graph, direction, graphTestCase.getTestFileName(), 3, graphTestCase.getWorkDirectory() + "logTraversal-3.txt", graphTestCase.getDelay()); writeStatistics(writer, statistics); writer.newLine(); writer.write("Test file containing 200 random queries that can have or not a path"); writer.newLine(); writer.write("Max hops: 4 - Edge type: " + (graphTestCase.isDirected()?"OUT":"UNDIRECTED")); writer.newLine(); statistics = TestTools.testTraversalFromFile(graph, direction, graphTestCase.getTestFileName(), 4, graphTestCase.getWorkDirectory() + "logTraversal-4.txt", graphTestCase.getDelay()); writeStatistics(writer, statistics); writer.newLine(); writer.write("Test file containing 200 random queries that have a path"); writer.newLine(); writer.write("Max hops: 3 - Edge type: " + (graphTestCase.isDirected()?"OUT":"UNDIRECTED")); writer.newLine(); statistics = TestTools.testTraversalFromFile(graph, direction, graphTestCase.getTest3HFileName(), 3, graphTestCase.getWorkDirectory() + "logTraversal_3H.txt", graphTestCase.getDelay()); writeStatistics(writer, statistics); writer.newLine(); writer.write("Test file containing 200 random queries that have a path"); writer.newLine(); writer.write("Max hops: 4 - Edge type: " + (graphTestCase.isDirected()?"OUT":"UNDIRECTED")); writer.newLine(); statistics = TestTools.testTraversalFromFile(graph, direction, graphTestCase.getTest4HFileName(), 4, graphTestCase.getWorkDirectory() + "logTraversal_4H.txt", graphTestCase.getDelay()); writeStatistics(writer, statistics); //Read & write tests System.out.println("Processing read tests (expressed in nanoseconds)"); statistics = TestTools.testReads(graph, graphTestCase.getTestFileName(), graphTestCase.getWorkDirectory() + "logReads.txt"); writer.newLine(); writer.write("READ RESULTS (400 reads)"); writer.newLine(); writeStatistics(writer, statistics); System.out.println("Processing write tests (expressed in nanoseconds)"); statistics = TestTools.testWrites(graph, graphTestCase.getTestFileName(), graphTestCase.getWorkDirectory() + "logWrites.txt"); writer.newLine(); writer.write("WRITE RESULTS (200 writes)"); writer.newLine(); writeStatistics(writer, statistics); writer.flush(); } catch (Exception e) { e.printStackTrace(); } finally { if (writer != null) { writer.flush(); writer.close(); } } } public static void main(String[] args) throws FileNotFoundException, IOException { if (args[0].equals("CONSOLE")) { TestTools.runConsole(); } else if (args[0].equals("TEST_CASE")) { GraphTestCase graphTestCase = new GraphTestCase(args[1]); TestManager testManager = new TestManager(graphTestCase); System.out.println("Starting tests..."); testManager.execute(); System.out.println("The tests were finished"); } } }