commit 1cfbf760352d73ef9c558ac1c25954067897fd19 Author: Karsten Loesing karsten.loesing@gmx.net Date: Wed Nov 27 16:19:49 2013 +0100
Write our own dummy DocumentStore for testing.
Previously, we wrote out/summary and out/update files to a temp directory. Avoiding this step makes tests faster and prepares for more sophisticated tests. --- src/org/torproject/onionoo/ResourceServlet.java | 11 +-- .../org/torproject/onionoo/DummyDocumentStore.java | 77 ++++++++++++++++++++ .../torproject/onionoo/ResourceServletTest.java | 46 ++++-------- 3 files changed, 98 insertions(+), 36 deletions(-)
diff --git a/src/org/torproject/onionoo/ResourceServlet.java b/src/org/torproject/onionoo/ResourceServlet.java index 2869d5e..165bc01 100644 --- a/src/org/torproject/onionoo/ResourceServlet.java +++ b/src/org/torproject/onionoo/ResourceServlet.java @@ -31,17 +31,18 @@ public class ResourceServlet extends HttpServlet { config.getInitParameter("maintenance") != null && config.getInitParameter("maintenance").equals("1"); File outDir = new File(config.getInitParameter("outDir")); - this.init(maintenanceMode, outDir, new Time()); + Time time = new Time(); + DocumentStore documentStore = new DocumentStore(outDir, time); + this.init(maintenanceMode, documentStore, time); }
/* Called (indirectly) by servlet container and (directly) by test * class. */ - protected void init(boolean maintenanceMode, File outDir, - Time time) { + protected void init(boolean maintenanceMode, + DocumentStore documentStore, Time time) { this.maintenanceMode = maintenanceMode; if (!maintenanceMode) { - ResponseBuilder.initialize(new DocumentStore(outDir, time), - time); + ResponseBuilder.initialize(documentStore, time); } }
diff --git a/test/org/torproject/onionoo/DummyDocumentStore.java b/test/org/torproject/onionoo/DummyDocumentStore.java new file mode 100644 index 0000000..0fce5d9 --- /dev/null +++ b/test/org/torproject/onionoo/DummyDocumentStore.java @@ -0,0 +1,77 @@ +package org.torproject.onionoo; + +import java.io.File; +import java.util.SortedMap; +import java.util.SortedSet; +import java.util.TreeMap; +import java.util.TreeSet; + +public class DummyDocumentStore extends DocumentStore { + + private long lastModified; + + public DummyDocumentStore(long lastModified, Time time) { + super((File) null, time); + this.lastModified = lastModified; + } + + private SortedMap<String, NodeStatus> nodeStatuses = + new TreeMap<String, NodeStatus>(); + void addNodeStatus(String nodeStatusString) { + NodeStatus nodeStatus = NodeStatus.fromString(nodeStatusString); + this.nodeStatuses.put(nodeStatus.getFingerprint(), nodeStatus); + } + + public void flushDocumentCache() { + throw new RuntimeException("Not implemented."); + } + + public String getStatsString() { + throw new RuntimeException("Not implemented."); + } + + public <T extends Document> SortedSet<String> list( + Class<T> documentType, boolean includeArchive) { + if (documentType.equals(NodeStatus.class)) { + return new TreeSet<String>(this.nodeStatuses.keySet()); + } + throw new RuntimeException("Not implemented."); + } + + public <T extends Document> boolean remove(Class<T> documentType) { + throw new RuntimeException("Not implemented."); + } + + public <T extends Document> boolean remove(Class<T> documentType, + String fingerprint) { + throw new RuntimeException("Not implemented."); + } + + public <T extends Document> T retrieve(Class<T> documentType, + boolean parse) { + if (documentType.equals(UpdateStatus.class)) { + UpdateStatus updateStatus = new UpdateStatus(); + updateStatus.documentString = String.valueOf(this.lastModified); + return documentType.cast(updateStatus); + } + throw new RuntimeException("Not implemented."); + } + + public <T extends Document> T retrieve(Class<T> documentType, + boolean parse, String fingerprint) { + if (documentType.equals(NodeStatus.class)) { + return documentType.cast(this.nodeStatuses.get(fingerprint)); + } + throw new RuntimeException("Not implemented."); + } + + public <T extends Document> boolean store(T document) { + throw new RuntimeException("Not implemented."); + } + + public <T extends Document> boolean store(T document, + String fingerprint) { + throw new RuntimeException("Not implemented."); + } +} + diff --git a/test/org/torproject/onionoo/ResourceServletTest.java b/test/org/torproject/onionoo/ResourceServletTest.java index ca7cd69..55cf53c 100644 --- a/test/org/torproject/onionoo/ResourceServletTest.java +++ b/test/org/torproject/onionoo/ResourceServletTest.java @@ -8,9 +8,6 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue;
-import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; @@ -22,9 +19,7 @@ import java.util.SortedMap; import java.util.TreeMap;
import org.junit.Before; -import org.junit.Rule; import org.junit.Test; -import org.junit.rules.TemporaryFolder; import org.torproject.onionoo.ResourceServlet.HttpServletRequestWrapper; import org.torproject.onionoo.ResourceServlet.HttpServletResponseWrapper;
@@ -34,6 +29,8 @@ public class ResourceServletTest {
private SortedMap<String, String> relays, bridges;
+ private DummyDocumentStore documentStore; + // 2013-04-24 12:22:22 private static long lastModified = 1366806142000L;
@@ -155,7 +152,7 @@ public class ResourceServletTest { private void runTest(String requestURI, Map<String, String[]> parameterMap) { try { - this.writeSummaryFile(); + this.createDummyDocumentStore(); this.makeRequest(requestURI, parameterMap); this.parseResponse(); } catch (IOException e) { @@ -163,28 +160,25 @@ public class ResourceServletTest { } }
- /* TODO Instead of writing out/summary and out/update to a temp - * directory, we could also write our own DocumentStore instance. */ - private void writeSummaryFile() throws IOException { - File summaryFile = new File(this.tempOutDir, "summary"); - BufferedWriter bw = new BufferedWriter(new FileWriter(summaryFile)); - for (String relay : this.relays.values()) { - bw.write(relay + "\n"); + private void createDummyDocumentStore() { + /* TODO Incrementing static lastModified is necessary for + * ResponseBuilder to read state from the newly created DocumentStore. + * Otherwise, ResponseBuilder would use data from the previous test + * run. This is bad design and should be fixed. */ + this.documentStore = new DummyDocumentStore(lastModified++, + this.testingTime); + for (String relay : relays.values()) { + documentStore.addNodeStatus(relay); } - for (String bridge : this.bridges.values()) { - bw.write(bridge + "\n"); + for (String bridge : bridges.values()) { + documentStore.addNodeStatus(bridge); } - bw.close(); - File updateFile = new File(this.tempOutDir, "update"); - bw = new BufferedWriter(new FileWriter(updateFile)); - bw.write(String.valueOf(lastModified++)); - bw.close(); }
private void makeRequest(String requestURI, Map<String, String[]> parameterMap) throws IOException { ResourceServlet rs = new ResourceServlet(); - rs.init(maintenanceMode, this.tempOutDir, this.testingTime); + rs.init(maintenanceMode, this.documentStore, this.testingTime); this.request = new TestingHttpServletRequestWrapper(requestURI, parameterMap); this.response = new TestingHttpServletResponseWrapper(); @@ -261,16 +255,6 @@ public class ResourceServletTest { return parameters; }
- @Rule - public TemporaryFolder tempFolder = new TemporaryFolder(); - - private File tempOutDir; - - @Before - public void createTempOutDir() throws IOException { - this.tempOutDir = this.tempFolder.newFolder("out"); - } - private static class SummaryDocument { private String relays_published; private RelaySummary[] relays;