commit 18ad99171f4fc51112b7e64aab8c503f6393ca94
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Thu Apr 26 11:28:31 2012 +0200
Add unit tests for all stats in extra-info descriptors.
---
.../impl/ExtraInfoDescriptorImplTest.java | 460 +++++++++++++++++++-
1 files changed, 438 insertions(+), 22 deletions(-)
diff --git a/test/org/torproject/descriptor/impl/ExtraInfoDescriptorImplTest.java b/test/org/torproject/descriptor/impl/ExtraInfoDescriptorImplTest.java
index ae1b87a..c21a4ec 100644
--- a/test/org/torproject/descriptor/impl/ExtraInfoDescriptorImplTest.java
+++ b/test/org/torproject/descriptor/impl/ExtraInfoDescriptorImplTest.java
@@ -3,11 +3,14 @@
package org.torproject.descriptor.impl;
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.util.ArrayList;
import java.util.List;
import java.util.Map;
+import java.util.SortedMap;
import org.junit.Test;
import org.torproject.descriptor.ExtraInfoDescriptor;
@@ -743,6 +746,66 @@ public class ExtraInfoDescriptorImplTest {
assertEquals(1328951316000L, descriptor.getPublishedMillis());
}
+ /* TODO This test should fail, even though dir-spec.txt doesn't
+ * explicitly say that reported bytes must be non-negative. */
+ @Test()
+ public void testWriteHistoryNegativeBytes()
+ throws DescriptorParseException {
+ DescriptorBuilder.createWithWriteHistoryLine("write-history "
+ + "2012-02-11 09:03:39 (900 s) "
+ + "-4713350144,-4723824640,-4710717440,-4572675072");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testReadHistoryTabInterval()
+ throws DescriptorParseException {
+ DescriptorBuilder.createWithReadHistoryLine("read-history "
+ + "2012-02-11 09:03:39 (900\ts) "
+ + "4707695616,4699666432,4650004480,4489718784");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testReadHistoryTabIntervalBytes()
+ throws DescriptorParseException {
+ DescriptorBuilder.createWithReadHistoryLine("read-history "
+ + "2012-02-11 09:03:39 (900 s)\t"
+ + "4707695616,4699666432,4650004480,4489718784");
+ }
+
+ /* TODO This test should fail, even though dir-spec.txt doesn't
+ * explicitly say that the interval must be positive. */
+ @Test()
+ public void testReadHistoryNegativeInterval()
+ throws DescriptorParseException {
+ DescriptorBuilder.createWithReadHistoryLine("read-history "
+ + "2012-02-11 09:03:39 (-900 s) "
+ + "4707695616,4699666432,4650004480,4489718784");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testDirreqWriteHistoryMissingBytesBegin()
+ throws DescriptorParseException {
+ DescriptorBuilder.createWithDirreqWriteHistoryLine(
+ "dirreq-write-history 2012-02-11 09:03:39 (900 s) "
+ + ",64996352,60625920,67922944");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testDirreqWriteHistoryMissingBytesMiddle()
+ throws DescriptorParseException {
+ DescriptorBuilder.createWithDirreqWriteHistoryLine(
+ "dirreq-write-history 2012-02-11 09:03:39 (900 s) "
+ + "81281024,,60625920,67922944");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testDirreqReadHistoryMissingBytesEnd()
+ throws DescriptorParseException {
+ DescriptorBuilder.createWithDirreqReadHistoryLine(
+ "dirreq-read-history 2012-02-11 09:03:39 (900 s) "
+ + "17074176,16235520,16005120,");
+ }
+
@Test()
public void testGeoipDbDigestValid() throws DescriptorParseException {
ExtraInfoDescriptor descriptor = DescriptorBuilder.
@@ -752,49 +815,356 @@ public class ExtraInfoDescriptorImplTest {
descriptor.getGeoipDbDigest());
}
- /* TODO Add tests for invalid geoip-db-digest lines. */
+ @Test(expected = DescriptorParseException.class)
+ public void testGeoipDbDigestTooShort()
+ throws DescriptorParseException {
+ DescriptorBuilder.createWithGeoipDbDigestLine("geoip-db-digest "
+ + "916A3CA8B7DF61473D5AE5B21711F35F301C");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testGeoipDbDigestIllegalChars()
+ throws DescriptorParseException {
+ DescriptorBuilder.createWithGeoipDbDigestLine("geoip-db-digest "
+ + "&%6A3CA8B7DF61473D5AE5B21711F35F301CE9E8");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testGeoipDbDigestMissing()
+ throws DescriptorParseException {
+ DescriptorBuilder.createWithGeoipDbDigestLine("geoip-db-digest");
+ }
@Test()
public void testGeoipStatsValid() throws DescriptorParseException {
- GeoipStatsBuilder.createWithDefaultLines();
- /* TODO Check stats parts. */
+ ExtraInfoDescriptor descriptor = GeoipStatsBuilder.
+ createWithDefaultLines();
+ assertEquals(1328898771000L, descriptor.getGeoipStartTimeMillis());
+ SortedMap<String, Integer> ips = descriptor.getGeoipClientOrigins();
+ assertNotNull(ips);
+ assertEquals(1152, ips.get("de").intValue());
+ assertEquals(896, ips.get("cn").intValue());
+ assertFalse(ips.containsKey("pl"));
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testGeoipStartTimeDateOnly()
+ throws DescriptorParseException {
+ GeoipStatsBuilder.createWithGeoipStartTimeLine("geoip-start-time "
+ + "2012-02-10");
}
- /* TODO Add tests for invalid geoip stats. */
+ @Test(expected = DescriptorParseException.class)
+ public void testGeoipClientOriginsDash()
+ throws DescriptorParseException {
+ GeoipStatsBuilder.createWithGeoipClientOriginsLine(
+ "geoip-client-origins de-1152,cn=896,us=712,it=504,ru=352,fr=208,"
+ + "gb=208,ir=200");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testGeoipClientOriginsZero()
+ throws DescriptorParseException {
+ GeoipStatsBuilder.createWithGeoipClientOriginsLine(
+ "geoip-client-origins de=zero,cn=896,us=712,it=504,ru=352,fr=208,"
+ + "gb=208,ir=200");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testGeoipClientOriginsNone()
+ throws DescriptorParseException {
+ GeoipStatsBuilder.createWithGeoipClientOriginsLine(
+ "geoip-client-origins de=none,cn=896,us=712,it=504,ru=352,fr=208,"
+ + "gb=208,ir=200");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testGeoipClientOriginsOther()
+ throws DescriptorParseException {
+ GeoipStatsBuilder.createWithGeoipClientOriginsLine(
+ "geoip-client-origins de=1152,cn=896,us=712,it=504,ru=352,fr=208,"
+ + "gb=208,other=200");
+ }
+
+ @Test()
+ public void testGeoipClientOriginsQuestionMarks()
+ throws DescriptorParseException {
+ GeoipStatsBuilder.createWithGeoipClientOriginsLine(
+ "geoip-client-origins de=1152,cn=896,us=712,it=504,ru=352,fr=208,"
+ + "gb=208,??=200");
+ }
+
+ @Test()
+ public void testGeoipClientOriginsCapital()
+ throws DescriptorParseException {
+ GeoipStatsBuilder.createWithGeoipClientOriginsLine(
+ "geoip-client-origins DE=1152,CN=896,US=712,IT=504,RU=352,FR=208,"
+ + "GB=208,IR=200");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testGeoipClientOriginsMissingBegin()
+ throws DescriptorParseException {
+ GeoipStatsBuilder.createWithGeoipClientOriginsLine(
+ "geoip-client-origins ,cn=896,us=712,it=504,ru=352,fr=208,gb=208,"
+ + "ir=200");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testGeoipClientOriginsMissingMiddle()
+ throws DescriptorParseException {
+ GeoipStatsBuilder.createWithGeoipClientOriginsLine(
+ "geoip-client-origins de=1152,,us=712,it=504,ru=352,fr=208,"
+ + "gb=208,ir=200");
+ }
+
+ /* TODO Lines shouldn't be allowed to end with a comma. This also
+ * applies to all other key-value pair lines. */
+ @Test()
+ public void testGeoipClientOriginsMissingEnd()
+ throws DescriptorParseException {
+ GeoipStatsBuilder.createWithGeoipClientOriginsLine(
+ "geoip-client-origins de=1152,cn=896,us=712,it=504,ru=352,fr=208,"
+ + "gb=208,");
+ }
+
+ @Test()
+ public void testGeoipClientOriginsDuplicate()
+ throws DescriptorParseException {
+ /* dir-spec.txt doesn't say anything about duplicate country codes, so
+ * this line is valid, even though it leads to a somewhat undefined
+ * parse result. */
+ GeoipStatsBuilder.createWithGeoipClientOriginsLine(
+ "geoip-client-origins de=1152,de=952,cn=896,us=712,it=504,"
+ + "ru=352,fr=208,gb=208,ir=200");
+ }
@Test()
public void testDirreqStatsValid() throws DescriptorParseException {
- DirreqStatsBuilder.createWithDefaultLines();
- /* TODO Check stats parts. */
+ ExtraInfoDescriptor descriptor = DirreqStatsBuilder.
+ createWithDefaultLines();
+ assertEquals(1328921993000L, descriptor.getDirreqStatsEndMillis());
+ assertEquals(86400L, descriptor.getDirreqStatsIntervalLength());
+ SortedMap<String, Integer> ips = descriptor.getDirreqV3Ips();
+ assertNotNull(ips);
+ assertEquals(1544, ips.get("us").intValue());
+ assertFalse(ips.containsKey("no"));
+ assertTrue(descriptor.getDirreqV2Ips().isEmpty());
+ SortedMap<String, Integer> reqs = descriptor.getDirreqV3Reqs();
+ assertEquals(832, reqs.get("fr").intValue());
+ assertTrue(descriptor.getDirreqV2Reqs().isEmpty());
+ SortedMap<String, Integer> resp = descriptor.getDirreqV3Resp();
+ assertEquals(10848, resp.get("ok").intValue());
+ assertEquals(8, resp.get("not-enough-sigs").intValue());
+ resp = descriptor.getDirreqV2Resp();
+ assertEquals(1576, resp.get("not-found").intValue());
+ assertEquals(0.37, descriptor.getDirreqV2Share(), 0.0001);
+ assertEquals(0.37, descriptor.getDirreqV3Share(), 0.0001);
+ SortedMap<String, Integer> dl = descriptor.getDirreqV3DirectDl();
+ assertEquals(36, dl.get("complete").intValue());
+ dl = descriptor.getDirreqV2DirectDl();
+ assertEquals(0, dl.get("timeout").intValue());
+ dl = descriptor.getDirreqV3TunneledDl();
+ assertEquals(10608, dl.get("complete").intValue());
+ dl = descriptor.getDirreqV2TunneledDl();
+ assertEquals(0, dl.get("complete").intValue());
+ }
+
+ @Test()
+ public void testDirreqStatsIntervalTwoDays()
+ throws DescriptorParseException {
+ DirreqStatsBuilder.createWithDirreqStatsEndLine("dirreq-stats-end "
+ + "2012-02-11 00:59:53 (172800 s)");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testDirreqV3IpsThreeLetterCountry()
+ throws DescriptorParseException {
+ DirreqStatsBuilder.createWithDirreqV3IpsLine("dirreq-v3-ips "
+ + "usa=1544");
+ }
+
+ @Test()
+ public void testDirreqV2IpsDigitCountry()
+ throws DescriptorParseException {
+ DirreqStatsBuilder.createWithDirreqV2IpsLine("dirreq-v2-ips 00=8");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testDirreqV3ReqsOneLetterCountry()
+ throws DescriptorParseException {
+ DirreqStatsBuilder.createWithDirreqV3ReqsLine("dirreq-v3-reqs "
+ + "u=1744");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testDirreqV2ReqsNoNumber()
+ throws DescriptorParseException {
+ DirreqStatsBuilder.createWithDirreqV2ReqsLine("dirreq-v2-reqs us=");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testDirreqV3RespTwoEqualSigns()
+ throws DescriptorParseException {
+ DirreqStatsBuilder.createWithDirreqV3RespLine("dirreq-v3-resp "
+ + "ok==10848");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testDirreqV2RespNull()
+ throws DescriptorParseException {
+ DirreqStatsBuilder.createWithDirreqV2RespLine("dirreq-v2-resp "
+ + "ok=null");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testDirreqV2ShareComma()
+ throws DescriptorParseException {
+ DirreqStatsBuilder.createWithDirreqV2ShareLine("dirreq-v2-share "
+ + "0,37%");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testDirreqV3ShareNoPercent()
+ throws DescriptorParseException {
+ DirreqStatsBuilder.createWithDirreqV3ShareLine("dirreq-v3-share "
+ + "0.37");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testDirreqV3DirectDlSpace()
+ throws DescriptorParseException {
+ DirreqStatsBuilder.createWithDirreqV3DirectDlLine(
+ "dirreq-v3-direct-dl complete 36");
+ }
+
+ @Test()
+ public void testDirreqV2DirectDlNegative()
+ throws DescriptorParseException {
+ DirreqStatsBuilder.createWithDirreqV2DirectDlLine(
+ "dirreq-v2-direct-dl complete=-8");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testDirreqV3TunneledDlTooLarge()
+ throws DescriptorParseException {
+ DirreqStatsBuilder.createWithDirreqV3TunneledDlLine(
+ "dirreq-v3-tunneled-dl complete=2147483648");
}
- /* TODO Add tests for invalid dirreq stats. */
+ @Test(expected = DescriptorParseException.class)
+ public void testDirreqV3TunneledDlDouble()
+ throws DescriptorParseException {
+ DirreqStatsBuilder.createWithDirreqV2TunneledDlLine(
+ "dirreq-v2-tunneled-dl complete=0.001");
+ }
@Test()
public void testEntryStatsValid() throws DescriptorParseException {
- EntryStatsBuilder.createWithDefaultLines();
- /* TODO Check stats parts. */
+ ExtraInfoDescriptor descriptor = EntryStatsBuilder.
+ createWithDefaultLines();
+ assertEquals(1328925579000L, descriptor.getEntryStatsEndMillis());
+ assertEquals(86400L, descriptor.getEntryStatsIntervalLength());
+ SortedMap<String, Integer> ips = descriptor.getEntryIps();
+ assertNotNull(ips);
+ assertEquals(25368, ips.get("ir").intValue());
+ assertFalse(ips.containsKey("no"));
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testEntryStatsEndNoDate() throws DescriptorParseException {
+ EntryStatsBuilder.createWithEntryStatsEndLine("entry-stats-end "
+ + "01:59:39 (86400 s)");
}
- /* TODO Add tests for invalid entry stats. */
+ @Test(expected = DescriptorParseException.class)
+ public void testEntryStatsIpsSemicolon()
+ throws DescriptorParseException {
+ EntryStatsBuilder.createWithEntryIpsLine("entry-ips "
+ + "ir=25368;us=15744");
+ }
@Test()
public void testCellStatsValid() throws DescriptorParseException {
- CellStatsBuilder.createWithDefaultLines();
- /* TODO Check stats parts. */
+ ExtraInfoDescriptor descriptor = CellStatsBuilder.
+ createWithDefaultLines();
+ assertEquals(1328925579000L, descriptor.getCellStatsEndMillis());
+ assertEquals(86400L, descriptor.getCellStatsIntervalLength());
+ List<Integer> processedCells = descriptor.getCellProcessedCells();
+ assertEquals(10, processedCells.size());
+ assertEquals(1441, processedCells.get(0).intValue());
+ assertEquals(11, processedCells.get(1).intValue());
+ List<Double> queuedCells = descriptor.getCellQueuedCells();
+ assertEquals(10, queuedCells.size());
+ assertEquals(3.29, queuedCells.get(0), 0.001);
+ assertEquals(0.00, queuedCells.get(1), 0.001);
+ List<Integer> timeInQueue = descriptor.getCellTimeInQueue();
+ assertEquals(10, timeInQueue.size());
+ assertEquals(524, timeInQueue.get(0).intValue());
+ assertEquals(1, timeInQueue.get(1).intValue());
+ assertEquals(866, descriptor.getCellCircuitsPerDecile());
}
- /* TODO Add tests for invalid cell stats. */
+ @Test(expected = DescriptorParseException.class)
+ public void testCellStatsEndNoSeconds()
+ throws DescriptorParseException {
+ CellStatsBuilder.createWithCellStatsEndLine("cell-stats-end "
+ + "2012-02-11 01:59:39 (86400)");
+ }
+
+ /* TODO Lines shouldn't be allowed to end with a comma. This also
+ * applies to all other comma-separated value lines. */
+ @Test()
+ public void testCellProcessedCellsNineComma()
+ throws DescriptorParseException {
+ CellStatsBuilder.createWithCellProcessedCellsLine(
+ "cell-processed-cells 1441,11,6,4,2,1,1,1,1,");
+ }
+
+ /* TODO We should check that there are really ten values, not more or
+ * less. Applies to most cell-stats lines. */
+ @Test()
+ public void testCellProcessedCellsEleven()
+ throws DescriptorParseException {
+ CellStatsBuilder.createWithCellQueuedCellsLine("cell-queued-cells "
+ + "3.29,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testCellTimeInQueueDouble()
+ throws DescriptorParseException {
+ CellStatsBuilder.createWithCellTimeInQueueLine("cell-time-in-queue "
+ + "524.0,1.0,1.0,0.0,0.0,25.0,0.0,0.0,0.0,0.0");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testCellCircuitsPerDecileNegative()
+ throws DescriptorParseException {
+ CellStatsBuilder.createWithCellCircuitsPerDecileLine(
+ "cell-circuits-per-decile -866");
+ }
@Test()
public void testConnBiDirectValid()
throws DescriptorParseException {
- DescriptorBuilder.createWithConnBiDirectLine("conn-bi-direct "
- + "2012-02-11 01:59:39 (86400 s) 42173,1591,1310,1744");
- /* TODO Check stats parts. */
+ ExtraInfoDescriptor descriptor = DescriptorBuilder.
+ createWithConnBiDirectLine("conn-bi-direct 2012-02-11 01:59:39 "
+ + "(86400 s) 42173,1591,1310,1744");
+ assertEquals(1328925579000L,
+ descriptor.getConnBiDirectStatsEndMillis());
+ assertEquals(86400L, descriptor.getConnBiDirectStatsIntervalLength());
+ assertEquals(42173, descriptor.getConnBiDirectBelow());
+ assertEquals(1591, descriptor.getConnBiDirectRead());
+ assertEquals(1310, descriptor.getConnBiDirectWrite());
+ assertEquals(1744, descriptor.getConnBiDirectBoth());
}
- /* TODO Add tests for invalid conn-bi-direct stats. */
+ @Test(expected = DescriptorParseException.class)
+ public void testConnBiDirectStatsFive()
+ throws DescriptorParseException {
+ DescriptorBuilder.createWithConnBiDirectLine("conn-bi-direct "
+ + "2012-02-11 01:59:39 (86400 s) 42173,1591,1310,1744,42");
+ }
@Test()
public void testExitStatsValid() throws DescriptorParseException {
@@ -805,7 +1175,7 @@ public class ExtraInfoDescriptorImplTest {
String[] ports = new String[] { "25", "80", "443", "49755",
"52563", "52596", "57528", "60912", "61351", "64811", "other" };
int[] writtenValues = new int[] { 74647, 31370, 20577, 23, 12, 1111,
- 4, 11, 6, 3365, 2592};
+ 4, 11, 6, 3365, 2592 };
int i = 0;
for (Map.Entry<String, Integer> e :
descriptor.getExitKibibytesWritten().entrySet()) {
@@ -830,16 +1200,62 @@ public class ExtraInfoDescriptorImplTest {
}
}
- /* TODO Add tests for invalid exit stats. */
+ @Test(expected = DescriptorParseException.class)
+ public void testExitStatsEndNoSeconds()
+ throws DescriptorParseException {
+ ExitStatsBuilder.createWithExitStatsEndLine("exit-stats-end "
+ + "2012-02-11 01:59 (86400 s)");
+ }
+
+ /* TODO Negative ports should not be allowed. */
+ @Test()
+ public void testExitStatsWrittenNegativePort()
+ throws DescriptorParseException {
+ ExitStatsBuilder.createWithExitKibibytesWrittenLine(
+ "exit-kibibytes-written -25=74647");
+ }
+
+ /* TODO Negative bytes should not be allowed. */
+ @Test()
+ public void testExitStatsReadNegativeBytes()
+ throws DescriptorParseException {
+ ExitStatsBuilder.createWithExitKibibytesReadLine(
+ "exit-kibibytes-read 25=-35562");
+ }
+
+ @Test(expected = DescriptorParseException.class)
+ public void testExitStatsStreamsTooLarge()
+ throws DescriptorParseException {
+ ExitStatsBuilder.createWithExitStreamsOpenedLine(
+ "exit-streams-opened 25=2147483648");
+ }
@Test()
public void testBridgeStatsValid() throws DescriptorParseException {
- BridgeStatsBuilder.createWithDefaultLines();
- /* TODO Check stats parts. */
+ ExtraInfoDescriptor descriptor = BridgeStatsBuilder.
+ createWithDefaultLines();
+ assertEquals(1328925579000L, descriptor.getBridgeStatsEndMillis());
+ assertEquals(86400L, descriptor.getBridgeStatsIntervalLength());
+ SortedMap<String, Integer> ips = descriptor.getBridgeIps();
+ assertNotNull(ips);
+ assertEquals(24, ips.get("ir").intValue());
+ assertEquals(16, ips.get("sy").intValue());
+ assertFalse(ips.containsKey("no"));
}
- /* TODO Add tests for invalid bridge stats. */
+ /* TODO Only positive intervals should be allowed, for all stats. */
+ @Test()
+ public void testBridgeStatsEndIntervalZero()
+ throws DescriptorParseException {
+ BridgeStatsBuilder.createWithBridgeStatsEndLine("bridge-stats-end "
+ + "2012-02-11 01:59:39 (0 s)");
+ }
+ @Test(expected = DescriptorParseException.class)
+ public void testBridgeIpsDouble()
+ throws DescriptorParseException {
+ BridgeStatsBuilder.createWithBridgeIpsLine("bridge-ips ir=24.5");
+ }
@Test()
public void testRouterSignatureOpt()
throws DescriptorParseException {