commit 33795e0603a00aa6c0cdf39c17c9800e455a9098 Author: Karsten Loesing karsten.loesing@gmx.net Date: Fri Feb 17 12:04:37 2012 -0800
Start a test class for extra-info descriptors.
The various statistics contained in extra-info descriptors need more testing. But now there's at least some testing infrastructure for extra-info descriptors. --- .../descriptor/impl/ExtraInfoDescriptorImpl.java | 1 - .../impl/ExtraInfoDescriptorImplTest.java | 857 ++++++++++++++++++++ 2 files changed, 857 insertions(+), 1 deletions(-)
diff --git a/src/org/torproject/descriptor/impl/ExtraInfoDescriptorImpl.java b/src/org/torproject/descriptor/impl/ExtraInfoDescriptorImpl.java index 5320563..7f2194e 100644 --- a/src/org/torproject/descriptor/impl/ExtraInfoDescriptorImpl.java +++ b/src/org/torproject/descriptor/impl/ExtraInfoDescriptorImpl.java @@ -16,7 +16,6 @@ import java.util.TreeMap; import org.torproject.descriptor.BandwidthHistory; import org.torproject.descriptor.ExtraInfoDescriptor;
-/* TODO Write a test class. */ public class ExtraInfoDescriptorImpl extends DescriptorImpl implements ExtraInfoDescriptor {
diff --git a/test/org/torproject/descriptor/impl/ExtraInfoDescriptorImplTest.java b/test/org/torproject/descriptor/impl/ExtraInfoDescriptorImplTest.java new file mode 100644 index 0000000..1eab3b9 --- /dev/null +++ b/test/org/torproject/descriptor/impl/ExtraInfoDescriptorImplTest.java @@ -0,0 +1,857 @@ +/* Copyright 2012 The Tor Project + * See LICENSE for licensing information */ +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.assertNull; +import static org.junit.Assert.assertTrue; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Test; +import org.torproject.descriptor.BandwidthHistory; +import org.torproject.descriptor.ExtraInfoDescriptor; + +/* Test parsing of extra-info descriptors. */ +public class ExtraInfoDescriptorImplTest { + + /* Helper class to build a descriptor based on default data and + * modifications requested by test methods. */ + private static class DescriptorBuilder { + private String extraInfoLine = "extra-info chaoscomputerclub5 " + + "A9C039A5FD02FCA06303DCFAABE25C5912C63B26"; + private static ExtraInfoDescriptor createWithExtraInfoLine( + String line) throws DescriptorParseException { + DescriptorBuilder db = new DescriptorBuilder(); + db.extraInfoLine = line; + return new ExtraInfoDescriptorImpl(db.buildDescriptor(), true); + } + private String publishedLine = "published 2012-02-11 09:08:36"; + private static ExtraInfoDescriptor createWithPublishedLine( + String line) throws DescriptorParseException { + DescriptorBuilder db = new DescriptorBuilder(); + db.publishedLine = line; + return new ExtraInfoDescriptorImpl(db.buildDescriptor(), true); + } + private String writeHistoryLine = "write-history 2012-02-11 09:03:39 " + + "(900 s) 4713350144,4723824640,4710717440,4572675072"; + private static ExtraInfoDescriptor createWithWriteHistoryLine( + String line) throws DescriptorParseException { + DescriptorBuilder db = new DescriptorBuilder(); + db.writeHistoryLine = line; + return new ExtraInfoDescriptorImpl(db.buildDescriptor(), true); + } + private String readHistoryLine = "read-history 2012-02-11 09:03:39 " + + "(900 s) 4707695616,4699666432,4650004480,4489718784"; + private static ExtraInfoDescriptor createWithReadHistoryLine( + String line) throws DescriptorParseException { + DescriptorBuilder db = new DescriptorBuilder(); + db.readHistoryLine = line; + return new ExtraInfoDescriptorImpl(db.buildDescriptor(), true); + } + private String dirreqWriteHistoryLine = "dirreq-write-history " + + "2012-02-11 09:03:39 (900 s) 81281024,64996352,60625920," + + "67922944"; + private static ExtraInfoDescriptor createWithDirreqWriteHistoryLine( + String line) throws DescriptorParseException { + DescriptorBuilder db = new DescriptorBuilder(); + db.dirreqWriteHistoryLine = line; + return new ExtraInfoDescriptorImpl(db.buildDescriptor(), true); + } + private String dirreqReadHistoryLine = "dirreq-read-history " + + "2012-02-11 09:03:39 (900 s) 17074176,16235520,16005120," + + "16209920"; + private static ExtraInfoDescriptor createWithDirreqReadHistoryLine( + String line) throws DescriptorParseException { + DescriptorBuilder db = new DescriptorBuilder(); + db.dirreqReadHistoryLine = line; + return new ExtraInfoDescriptorImpl(db.buildDescriptor(), true); + } + private String geoipDbDigestLine = null; + private static ExtraInfoDescriptor createWithGeoipDbDigestLine( + String line) throws DescriptorParseException { + DescriptorBuilder db = new DescriptorBuilder(); + db.geoipDbDigestLine = line; + return new ExtraInfoDescriptorImpl(db.buildDescriptor(), true); + } + private String geoipStatsLines = null; + private static ExtraInfoDescriptor createWithGeoipStatsLines( + String lines) throws DescriptorParseException { + DescriptorBuilder db = new DescriptorBuilder(); + db.geoipStatsLines = lines; + return new ExtraInfoDescriptorImpl(db.buildDescriptor(), true); + } + private String dirreqStatsLines = null; + private static ExtraInfoDescriptor createWithDirreqStatsLines( + String lines) throws DescriptorParseException { + DescriptorBuilder db = new DescriptorBuilder(); + db.dirreqStatsLines = lines; + return new ExtraInfoDescriptorImpl(db.buildDescriptor(), true); + } + private String entryStatsLines = null; + private static ExtraInfoDescriptor createWithEntryStatsLines( + String lines) throws DescriptorParseException { + DescriptorBuilder db = new DescriptorBuilder(); + db.entryStatsLines = lines; + return new ExtraInfoDescriptorImpl(db.buildDescriptor(), true); + } + private String cellStatsLines = null; + private static ExtraInfoDescriptor createWithCellStatsLines( + String lines) throws DescriptorParseException { + DescriptorBuilder db = new DescriptorBuilder(); + db.cellStatsLines = lines; + return new ExtraInfoDescriptorImpl(db.buildDescriptor(), true); + } + private String connBiDirectLine = null; + private static ExtraInfoDescriptor createWithConnBiDirectLine( + String line) throws DescriptorParseException { + DescriptorBuilder db = new DescriptorBuilder(); + db.connBiDirectLine = line; + return new ExtraInfoDescriptorImpl(db.buildDescriptor(), true); + } + private String exitStatsLines = null; + private static ExtraInfoDescriptor createWithExitStatsLines( + String lines) throws DescriptorParseException { + DescriptorBuilder db = new DescriptorBuilder(); + db.exitStatsLines = lines; + return new ExtraInfoDescriptorImpl(db.buildDescriptor(), true); + } + private String bridgeStatsLines = null; + private static ExtraInfoDescriptor createWithBridgeStatsLines( + String lines) throws DescriptorParseException { + DescriptorBuilder db = new DescriptorBuilder(); + db.bridgeStatsLines = lines; + return new ExtraInfoDescriptorImpl(db.buildDescriptor(), true); + } + private String unrecognizedLine = null; + private static ExtraInfoDescriptor createWithUnrecognizedLine( + String line, boolean failUnrecognizedDescriptorLines) + throws DescriptorParseException { + DescriptorBuilder db = new DescriptorBuilder(); + db.unrecognizedLine = line; + return new ExtraInfoDescriptorImpl(db.buildDescriptor(), + failUnrecognizedDescriptorLines); + } + private String routerSignatureLines = "router-signature\n" + + "-----BEGIN SIGNATURE-----\n" + + "o4j+kH8UQfjBwepUnr99v0ebN8RpzHJ/lqYsTojXHy9kMr1RNI9IDeSzA7PSqT" + + "uV\n4PL8QsGtlfwthtIoZpB2srZeyN/mcpA9fa1JXUrt/UN9K/+32Cyaad7h0n" + + "HE6Xfb\njqpXDpnBpvk4zjmzjjKYnIsUWTnADmu0fo3xTRqXi7g=\n" + + "-----END SIGNATURE-----"; + private static ExtraInfoDescriptor createWithRouterSignatureLines( + String line) throws DescriptorParseException { + DescriptorBuilder db = new DescriptorBuilder(); + db.routerSignatureLines = line; + return new ExtraInfoDescriptorImpl(db.buildDescriptor(), true); + } + private byte[] buildDescriptor() { + StringBuilder sb = new StringBuilder(); + if (this.extraInfoLine != null) { + sb.append(this.extraInfoLine + "\n"); + } + if (this.publishedLine != null) { + sb.append(this.publishedLine + "\n"); + } + if (this.writeHistoryLine != null) { + sb.append(this.writeHistoryLine + "\n"); + } + if (this.readHistoryLine != null) { + sb.append(this.readHistoryLine + "\n"); + } + if (this.dirreqWriteHistoryLine != null) { + sb.append(this.dirreqWriteHistoryLine + "\n"); + } + if (this.dirreqReadHistoryLine != null) { + sb.append(this.dirreqReadHistoryLine + "\n"); + } + if (this.geoipDbDigestLine != null) { + sb.append(this.geoipDbDigestLine + "\n"); + } + if (this.geoipStatsLines != null) { + sb.append(this.geoipStatsLines + "\n"); + } + if (this.dirreqStatsLines != null) { + sb.append(this.dirreqStatsLines + "\n"); + } + if (this.entryStatsLines != null) { + sb.append(this.entryStatsLines + "\n"); + } + if (this.cellStatsLines != null) { + sb.append(this.cellStatsLines + "\n"); + } + if (this.connBiDirectLine != null) { + sb.append(this.connBiDirectLine + "\n"); + } + if (this.exitStatsLines != null) { + sb.append(this.exitStatsLines + "\n"); + } + if (this.bridgeStatsLines != null) { + sb.append(this.bridgeStatsLines + "\n"); + } + if (this.unrecognizedLine != null) { + sb.append(this.unrecognizedLine + "\n"); + } + if (this.routerSignatureLines != null) { + sb.append(this.routerSignatureLines + "\n"); + } + return sb.toString().getBytes(); + } + } + + /* Helper class to build a set of geoip-stats lines based on default + * data and modifications requested by test methods. */ + private static class GeoipStatsBuilder { + private String geoipStartTimeLine = "geoip-start-time 2012-02-10 " + + "18:32:51"; + private static ExtraInfoDescriptor createWithGeoipStartTimeLine( + String line) throws DescriptorParseException { + GeoipStatsBuilder gsb = new GeoipStatsBuilder(); + gsb.geoipStartTimeLine = line; + return DescriptorBuilder.createWithGeoipStatsLines( + gsb.buildGeoipStatsLines()); + } + private String geoipClientOriginsLine = "geoip-client-origins " + + "de=1152,cn=896,us=712,it=504,ru=352,fr=208,gb=208,ir=200"; + private static ExtraInfoDescriptor createWithGeoipClientOriginsLine( + String line) throws DescriptorParseException { + GeoipStatsBuilder gsb = new GeoipStatsBuilder(); + gsb.geoipClientOriginsLine = line; + return DescriptorBuilder.createWithGeoipStatsLines( + gsb.buildGeoipStatsLines()); + } + private static ExtraInfoDescriptor createWithDefaultLines() + throws DescriptorParseException { + return DescriptorBuilder.createWithGeoipStatsLines( + new GeoipStatsBuilder().buildGeoipStatsLines()); + } + private String buildGeoipStatsLines() { + StringBuilder sb = new StringBuilder(); + if (this.geoipStartTimeLine != null) { + sb.append(this.geoipStartTimeLine + "\n"); + } + if (this.geoipClientOriginsLine != null) { + sb.append(this.geoipClientOriginsLine + "\n"); + } + String lines = sb.toString(); + if (lines.endsWith("\n")) { + lines = lines.substring(0, lines.length() - 1); + } + return lines; + } + } + + /* Helper class to build a set of dirreq-stats lines based on default + * data and modifications requested by test methods. */ + private static class DirreqStatsBuilder { + private String dirreqStatsEndLine = "dirreq-stats-end 2012-02-11 " + + "00:59:53 (86400 s)"; + private static ExtraInfoDescriptor createWithDirreqStatsEndLine( + String line) throws DescriptorParseException { + DirreqStatsBuilder dsb = new DirreqStatsBuilder(); + dsb.dirreqStatsEndLine = line; + return DescriptorBuilder.createWithDirreqStatsLines( + dsb.buildDirreqStatsLines()); + } + private String dirreqV3IpsLine = "dirreq-v3-ips us=1544,de=1056," + + "it=1032,fr=784,es=640,ru=440,br=312,gb=272,kr=224,sy=192"; + private static ExtraInfoDescriptor createWithDirreqV3IpsLine( + String line) throws DescriptorParseException { + DirreqStatsBuilder dsb = new DirreqStatsBuilder(); + dsb.dirreqV3IpsLine = line; + return DescriptorBuilder.createWithDirreqStatsLines( + dsb.buildDirreqStatsLines()); + } + private String dirreqV2IpsLine = "dirreq-v2-ips "; + private static ExtraInfoDescriptor createWithDirreqV2IpsLine( + String line) throws DescriptorParseException { + DirreqStatsBuilder dsb = new DirreqStatsBuilder(); + dsb.dirreqV2IpsLine = line; + return DescriptorBuilder.createWithDirreqStatsLines( + dsb.buildDirreqStatsLines()); + } + private String dirreqV3ReqsLine = "dirreq-v3-reqs us=1744,de=1224," + + "it=1080,fr=832,es=664,ru=536,br=344,gb=296,kr=272,in=216"; + private static ExtraInfoDescriptor createWithDirreqV3ReqsLine( + String line) throws DescriptorParseException { + DirreqStatsBuilder dsb = new DirreqStatsBuilder(); + dsb.dirreqV3ReqsLine = line; + return DescriptorBuilder.createWithDirreqStatsLines( + dsb.buildDirreqStatsLines()); + } + private String dirreqV2ReqsLine = "dirreq-v2-reqs "; + private static ExtraInfoDescriptor createWithDirreqV2ReqsLine( + String line) throws DescriptorParseException { + DirreqStatsBuilder dsb = new DirreqStatsBuilder(); + dsb.dirreqV2ReqsLine = line; + return DescriptorBuilder.createWithDirreqStatsLines( + dsb.buildDirreqStatsLines()); + } + private String dirreqV3RespLine = "dirreq-v3-resp ok=10848," + + "not-enough-sigs=8,unavailable=0,not-found=0,not-modified=0," + + "busy=80"; + private static ExtraInfoDescriptor createWithDirreqV3RespLine( + String line) throws DescriptorParseException { + DirreqStatsBuilder dsb = new DirreqStatsBuilder(); + dsb.dirreqV3RespLine = line; + return DescriptorBuilder.createWithDirreqStatsLines( + dsb.buildDirreqStatsLines()); + } + private String dirreqV2RespLine = "dirreq-v2-resp ok=0,unavailable=0," + + "not-found=1576,not-modified=0,busy=0"; + private static ExtraInfoDescriptor createWithDirreqV2RespLine( + String line) throws DescriptorParseException { + DirreqStatsBuilder dsb = new DirreqStatsBuilder(); + dsb.dirreqV2RespLine = line; + return DescriptorBuilder.createWithDirreqStatsLines( + dsb.buildDirreqStatsLines()); + } + private String dirreqV2ShareLine = "dirreq-v2-share 0.37%"; + private static ExtraInfoDescriptor createWithDirreqV2ShareLine( + String line) throws DescriptorParseException { + DirreqStatsBuilder dsb = new DirreqStatsBuilder(); + dsb.dirreqV2ShareLine = line; + return DescriptorBuilder.createWithDirreqStatsLines( + dsb.buildDirreqStatsLines()); + } + private String dirreqV3ShareLine = "dirreq-v3-share 0.37%"; + private static ExtraInfoDescriptor createWithDirreqV3ShareLine( + String line) throws DescriptorParseException { + DirreqStatsBuilder dsb = new DirreqStatsBuilder(); + dsb.dirreqV3ShareLine = line; + return DescriptorBuilder.createWithDirreqStatsLines( + dsb.buildDirreqStatsLines()); + } + private String dirreqV3DirectDlLine = "dirreq-v3-direct-dl " + + "complete=36,timeout=4,running=0,min=7538,d1=20224,d2=28950," + + "q1=40969,d3=55786,d4=145813,md=199164,d6=267230,d7=480900," + + "q3=481049,d8=531276,d9=778086,max=15079428"; + private static ExtraInfoDescriptor createWithDirreqV3DirectDlLine( + String line) throws DescriptorParseException { + DirreqStatsBuilder dsb = new DirreqStatsBuilder(); + dsb.dirreqV3DirectDlLine = line; + return DescriptorBuilder.createWithDirreqStatsLines( + dsb.buildDirreqStatsLines()); + } + private String dirreqV2DirectDlLine = "dirreq-v2-direct-dl " + + "complete=0,timeout=0,running=0"; + private static ExtraInfoDescriptor createWithDirreqV2DirectDlLine( + String line) throws DescriptorParseException { + DirreqStatsBuilder dsb = new DirreqStatsBuilder(); + dsb.dirreqV2DirectDlLine = line; + return DescriptorBuilder.createWithDirreqStatsLines( + dsb.buildDirreqStatsLines()); + } + private String dirreqV3TunneledDlLine = "dirreq-v3-tunneled-dl " + + "complete=10608,timeout=204,running=4,min=507,d1=20399," + + "d2=27588,q1=29292,d3=30889,d4=40624,md=59967,d6=103333," + + "d7=161170,q3=209415,d8=256711,d9=452503,max=23417777"; + private static ExtraInfoDescriptor createWithDirreqV3TunneledDlLine( + String line) throws DescriptorParseException { + DirreqStatsBuilder dsb = new DirreqStatsBuilder(); + dsb.dirreqV3TunneledDlLine = line; + return DescriptorBuilder.createWithDirreqStatsLines( + dsb.buildDirreqStatsLines()); + } + private String dirreqV2TunneledDlLine = "dirreq-v2-tunneled-dl " + + "complete=0,timeout=0,running=0"; + private static ExtraInfoDescriptor createWithDirreqV2TunneledDlLine( + String line) throws DescriptorParseException { + DirreqStatsBuilder dsb = new DirreqStatsBuilder(); + dsb.dirreqV2TunneledDlLine = line; + return DescriptorBuilder.createWithDirreqStatsLines( + dsb.buildDirreqStatsLines()); + } + private static ExtraInfoDescriptor createWithDefaultLines() + throws DescriptorParseException { + return DescriptorBuilder.createWithDirreqStatsLines( + new DirreqStatsBuilder().buildDirreqStatsLines()); + } + private String buildDirreqStatsLines() { + StringBuilder sb = new StringBuilder(); + if (this.dirreqStatsEndLine != null) { + sb.append(this.dirreqStatsEndLine + "\n"); + } + if (this.dirreqV3IpsLine != null) { + sb.append(this.dirreqV3IpsLine + "\n"); + } + if (this.dirreqV2IpsLine != null) { + sb.append(this.dirreqV2IpsLine + "\n"); + } + if (this.dirreqV3ReqsLine != null) { + sb.append(this.dirreqV3ReqsLine + "\n"); + } + if (this.dirreqV2ReqsLine != null) { + sb.append(this.dirreqV2ReqsLine + "\n"); + } + if (this.dirreqV3RespLine != null) { + sb.append(this.dirreqV3RespLine + "\n"); + } + if (this.dirreqV2RespLine != null) { + sb.append(this.dirreqV2RespLine + "\n"); + } + if (this.dirreqV2ShareLine != null) { + sb.append(this.dirreqV2ShareLine + "\n"); + } + if (this.dirreqV3ShareLine != null) { + sb.append(this.dirreqV3ShareLine + "\n"); + } + if (this.dirreqV3DirectDlLine != null) { + sb.append(this.dirreqV3DirectDlLine + "\n"); + } + if (this.dirreqV2DirectDlLine != null) { + sb.append(this.dirreqV2DirectDlLine + "\n"); + } + if (this.dirreqV3TunneledDlLine != null) { + sb.append(this.dirreqV3TunneledDlLine + "\n"); + } + if (this.dirreqV2TunneledDlLine != null) { + sb.append(this.dirreqV2TunneledDlLine + "\n"); + } + String lines = sb.toString(); + if (lines.endsWith("\n")) { + lines = lines.substring(0, lines.length() - 1); + } + return lines; + } + } + + /* Helper class to build a set of entry-stats lines based on default + * data and modifications requested by test methods. */ + private static class EntryStatsBuilder { + private String entryStatsEndLine = "entry-stats-end 2012-02-11 " + + "01:59:39 (86400 s)"; + private static ExtraInfoDescriptor createWithEntryStatsEndLine( + String line) throws DescriptorParseException { + EntryStatsBuilder esb = new EntryStatsBuilder(); + esb.entryStatsEndLine = line; + return DescriptorBuilder.createWithEntryStatsLines( + esb.buildEntryStatsLines()); + } + private String entryIpsLine = "entry-ips ir=25368,us=15744,it=14816," + + "de=13256,es=8280,fr=8120,br=5176,sy=4760,ru=4504,sa=4216," + + "gb=3152,pl=2928,nl=2208,kr=1856,ca=1792,ua=1272,in=1192"; + private static ExtraInfoDescriptor createWithEntryIpsLine( + String line) throws DescriptorParseException { + EntryStatsBuilder esb = new EntryStatsBuilder(); + esb.entryIpsLine = line; + return DescriptorBuilder.createWithEntryStatsLines( + esb.buildEntryStatsLines()); + } + private static ExtraInfoDescriptor createWithDefaultLines() + throws DescriptorParseException { + return DescriptorBuilder.createWithEntryStatsLines( + new EntryStatsBuilder().buildEntryStatsLines()); + } + private String buildEntryStatsLines() { + StringBuilder sb = new StringBuilder(); + if (this.entryStatsEndLine != null) { + sb.append(this.entryStatsEndLine + "\n"); + } + if (this.entryIpsLine != null) { + sb.append(this.entryIpsLine + "\n"); + } + String lines = sb.toString(); + if (lines.endsWith("\n")) { + lines = lines.substring(0, lines.length() - 1); + } + return lines; + } + } + + /* Helper class to build a set of cell-stats lines based on default + * data and modifications requested by test methods. */ + private static class CellStatsBuilder { + private String cellStatsEndLine = "cell-stats-end 2012-02-11 " + + "01:59:39 (86400 s)"; + private static ExtraInfoDescriptor createWithCellStatsEndLine( + String line) throws DescriptorParseException { + CellStatsBuilder csb = new CellStatsBuilder(); + csb.cellStatsEndLine = line; + return DescriptorBuilder.createWithCellStatsLines( + csb.buildCellStatsLines()); + } + private String cellProcessedCellsLine = "cell-processed-cells " + + "1441,11,6,4,2,1,1,1,1,1"; + private static ExtraInfoDescriptor createWithCellProcessedCellsLine( + String line) throws DescriptorParseException { + CellStatsBuilder csb = new CellStatsBuilder(); + csb.cellProcessedCellsLine = line; + return DescriptorBuilder.createWithCellStatsLines( + csb.buildCellStatsLines()); + } + private String cellQueuedCellsLine = "cell-queued-cells " + + "3.29,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00"; + private static ExtraInfoDescriptor createWithCellQueuedCellsLine( + String line) throws DescriptorParseException { + CellStatsBuilder csb = new CellStatsBuilder(); + csb.cellQueuedCellsLine = line; + return DescriptorBuilder.createWithCellStatsLines( + csb.buildCellStatsLines()); + } + private String cellTimeInQueueLine = "cell-time-in-queue " + + "524,1,1,0,0,25,0,0,0,0"; + private static ExtraInfoDescriptor createWithCellTimeInQueueLine( + String line) throws DescriptorParseException { + CellStatsBuilder csb = new CellStatsBuilder(); + csb.cellTimeInQueueLine = line; + return DescriptorBuilder.createWithCellStatsLines( + csb.buildCellStatsLines()); + } + private String cellCircuitsPerDecileLine = "cell-circuits-per-decile " + + "866"; + private static ExtraInfoDescriptor + createWithCellCircuitsPerDecileLine(String line) + throws DescriptorParseException { + CellStatsBuilder csb = new CellStatsBuilder(); + csb.cellCircuitsPerDecileLine = line; + return DescriptorBuilder.createWithCellStatsLines( + csb.buildCellStatsLines()); + } + private static ExtraInfoDescriptor createWithDefaultLines() + throws DescriptorParseException { + return DescriptorBuilder.createWithCellStatsLines( + new CellStatsBuilder().buildCellStatsLines()); + } + private String buildCellStatsLines() { + StringBuilder sb = new StringBuilder(); + if (this.cellStatsEndLine != null) { + sb.append(this.cellStatsEndLine + "\n"); + } + if (this.cellProcessedCellsLine != null) { + sb.append(this.cellProcessedCellsLine + "\n"); + } + if (this.cellQueuedCellsLine != null) { + sb.append(this.cellQueuedCellsLine + "\n"); + } + if (this.cellTimeInQueueLine != null) { + sb.append(this.cellTimeInQueueLine + "\n"); + } + if (this.cellCircuitsPerDecileLine != null) { + sb.append(this.cellCircuitsPerDecileLine + "\n"); + } + String lines = sb.toString(); + if (lines.endsWith("\n")) { + lines = lines.substring(0, lines.length() - 1); + } + return lines; + } + } + + /* Helper class to build a set of exit-stats lines based on default + * data and modifications requested by test methods. */ + private static class ExitStatsBuilder { + private String exitStatsEndLine = "exit-stats-end 2012-02-11 " + + "01:59:39 (86400 s)"; + private static ExtraInfoDescriptor createWithExitStatsEndLine( + String line) throws DescriptorParseException { + ExitStatsBuilder esb = new ExitStatsBuilder(); + esb.exitStatsEndLine = line; + return DescriptorBuilder.createWithExitStatsLines( + esb.buildExitStatsLines()); + } + private String exitKibibytesWrittenLine = "exit-kibibytes-written " + + "25=74647,80=31370,443=20577,49755=23,52563=12,52596=1111," + + "57528=4,60912=11,61351=6,64811=3365,other=2592"; + private static ExtraInfoDescriptor createWithExitKibibytesWrittenLine( + String line) throws DescriptorParseException { + ExitStatsBuilder esb = new ExitStatsBuilder(); + esb.exitKibibytesWrittenLine = line; + return DescriptorBuilder.createWithExitStatsLines( + esb.buildExitStatsLines()); + } + private String exitKibibytesReadLine = "exit-kibibytes-read " + + "25=35562,80=1254256,443=110279,49755=9396,52563=1911," + + "52596=648,57528=1188,60912=1427,61351=1824,64811=14," + + "other=3054"; + private static ExtraInfoDescriptor createWithExitKibibytesReadLine( + String line) throws DescriptorParseException { + ExitStatsBuilder esb = new ExitStatsBuilder(); + esb.exitKibibytesReadLine = line; + return DescriptorBuilder.createWithExitStatsLines( + esb.buildExitStatsLines()); + } + private String exitStreamsOpenedLine = "exit-streams-opened " + + "25=369748,80=64212,443=151660,49755=4,52563=4,52596=4,57528=4," + + "60912=4,61351=4,64811=4,other=1212"; + private static ExtraInfoDescriptor createWithExitStreamsOpenedLine( + String line) throws DescriptorParseException { + ExitStatsBuilder esb = new ExitStatsBuilder(); + esb.exitStreamsOpenedLine = line; + return DescriptorBuilder.createWithExitStatsLines( + esb.buildExitStatsLines()); + } + private static ExtraInfoDescriptor createWithDefaultLines() + throws DescriptorParseException { + return DescriptorBuilder.createWithExitStatsLines( + new ExitStatsBuilder().buildExitStatsLines()); + } + private String buildExitStatsLines() { + StringBuilder sb = new StringBuilder(); + if (this.exitStatsEndLine != null) { + sb.append(this.exitStatsEndLine + "\n"); + } + if (this.exitKibibytesWrittenLine != null) { + sb.append(this.exitKibibytesWrittenLine + "\n"); + } + if (this.exitKibibytesReadLine != null) { + sb.append(this.exitKibibytesReadLine + "\n"); + } + if (this.exitStreamsOpenedLine != null) { + sb.append(this.exitStreamsOpenedLine + "\n"); + } + String lines = sb.toString(); + if (lines.endsWith("\n")) { + lines = lines.substring(0, lines.length() - 1); + } + return lines; + } + } + + /* Helper class to build a set of bridge-stats lines based on default + * data and modifications requested by test methods. */ + private static class BridgeStatsBuilder { + private String bridgeStatsEndLine = "bridge-stats-end 2012-02-11 " + + "01:59:39 (86400 s)"; + private static ExtraInfoDescriptor createWithBridgeStatsEndLine( + String line) throws DescriptorParseException { + BridgeStatsBuilder bsb = new BridgeStatsBuilder(); + bsb.bridgeStatsEndLine = line; + return DescriptorBuilder.createWithBridgeStatsLines( + bsb.buildBridgeStatsLines()); + } + private String bridgeIpsLine = "bridge-ips ir=24,sy=16,??=8,cn=8," + + "de=8,es=8,fr=8,gb=8,in=8,jp=8,kz=8,nl=8,ua=8,us=8,vn=8,za=8"; + private static ExtraInfoDescriptor createWithBridgeIpsLine( + String line) throws DescriptorParseException { + BridgeStatsBuilder bsb = new BridgeStatsBuilder(); + bsb.bridgeIpsLine = line; + return DescriptorBuilder.createWithBridgeStatsLines( + bsb.buildBridgeStatsLines()); + } + private static ExtraInfoDescriptor createWithDefaultLines() + throws DescriptorParseException { + return DescriptorBuilder.createWithBridgeStatsLines( + new BridgeStatsBuilder().buildBridgeStatsLines()); + } + private String buildBridgeStatsLines() { + StringBuilder sb = new StringBuilder(); + if (this.bridgeStatsEndLine != null) { + sb.append(this.bridgeStatsEndLine + "\n"); + } + if (this.bridgeIpsLine != null) { + sb.append(this.bridgeIpsLine + "\n"); + } + String lines = sb.toString(); + if (lines.endsWith("\n")) { + lines = lines.substring(0, lines.length() - 1); + } + return lines; + } + } + + @Test() + public void testSampleDescriptor() throws DescriptorParseException { + DescriptorBuilder db = new DescriptorBuilder(); + ExtraInfoDescriptor descriptor = + new ExtraInfoDescriptorImpl(db.buildDescriptor(), true); + assertEquals("chaoscomputerclub5", descriptor.getNickname()); + assertEquals("A9C039A5FD02FCA06303DCFAABE25C5912C63B26", + descriptor.getFingerprint()); + assertEquals(1328951316000L, descriptor.getPublishedMillis()); + assertNotNull(descriptor.getWriteHistory()); + assertEquals(1328951019000L, descriptor.getWriteHistory(). + getHistoryEndMillis()); + assertEquals(900L, descriptor.getWriteHistory().getIntervalLength()); + assertEquals(4572675072L, (long) descriptor.getWriteHistory(). + getBandwidthValues().get(1328951019000L)); + assertNotNull(descriptor.getReadHistory()); + assertNotNull(descriptor.getDirreqWriteHistory()); + assertNotNull(descriptor.getDirreqReadHistory()); + } + + @Test(expected = DescriptorParseException.class) + public void testExtraInfoLineMissing() throws DescriptorParseException { + DescriptorBuilder.createWithExtraInfoLine(null); + } + + @Test() + public void testExtraInfoOpt() throws DescriptorParseException { + ExtraInfoDescriptor descriptor = DescriptorBuilder. + createWithExtraInfoLine("opt extra-info chaoscomputerclub5 " + + "A9C039A5FD02FCA06303DCFAABE25C5912C63B26"); + assertEquals("chaoscomputerclub5", descriptor.getNickname()); + assertEquals("A9C039A5FD02FCA06303DCFAABE25C5912C63B26", + descriptor.getFingerprint()); + } + + @Test(expected = DescriptorParseException.class) + public void testExtraInfoLineNotFirst() + throws DescriptorParseException { + DescriptorBuilder.createWithExtraInfoLine("geoip-db-digest " + + "916A3CA8B7DF61473D5AE5B21711F35F301CE9E8\n" + + "extra-info chaoscomputerclub5 " + + "A9C039A5FD02FCA06303DCFAABE25C5912C63B26"); + } + + @Test(expected = DescriptorParseException.class) + public void testNicknameMissing() throws DescriptorParseException { + DescriptorBuilder.createWithExtraInfoLine("extra-info " + + "A9C039A5FD02FCA06303DCFAABE25C5912C63B26"); + } + + @Test(expected = DescriptorParseException.class) + public void testNicknameInvalidChar() throws DescriptorParseException { + DescriptorBuilder.createWithExtraInfoLine("extra-info " + + "chaoscomputerclub% A9C039A5FD02FCA06303DCFAABE25C5912C63B26"); + } + + @Test(expected = DescriptorParseException.class) + public void testNicknameTooLong() throws DescriptorParseException { + DescriptorBuilder.createWithExtraInfoLine("extra-info " + + "chaoscomputerclub5ReallyLongNickname " + + "A9C039A5FD02FCA06303DCFAABE25C5912C63B26"); + } + + @Test(expected = DescriptorParseException.class) + public void testFingerprintG() throws DescriptorParseException { + DescriptorBuilder.createWithExtraInfoLine("extra-info " + + "chaoscomputerclub5 G9C039A5FD02FCA06303DCFAABE25C5912C63B26"); + } + + @Test(expected = DescriptorParseException.class) + public void testFingerprintTooShort() throws DescriptorParseException { + DescriptorBuilder.createWithExtraInfoLine("extra-info " + + "chaoscomputerclub5 A9C039A5FD02FCA06303DCFAABE25C5912C6"); + } + + @Test(expected = DescriptorParseException.class) + public void testFingerprintTooLong() throws DescriptorParseException { + DescriptorBuilder.createWithExtraInfoLine("extra-info " + + "chaoscomputerclub5 A9C039A5FD02FCA06303DCFAABE25C5912C63B26" + + "A9C0"); + } + + @Test(expected = DescriptorParseException.class) + public void testPublishedMissing() throws DescriptorParseException { + DescriptorBuilder.createWithPublishedLine(null); + } + + @Test() + public void testPublishedOpt() throws DescriptorParseException { + ExtraInfoDescriptor descriptor = DescriptorBuilder. + createWithPublishedLine("opt published 2012-02-11 09:08:36"); + assertEquals(1328951316000L, descriptor.getPublishedMillis()); + } + + @Test() + public void testGeoipDbDigestValid() throws DescriptorParseException { + ExtraInfoDescriptor descriptor = DescriptorBuilder. + createWithGeoipDbDigestLine("geoip-db-digest " + + "916A3CA8B7DF61473D5AE5B21711F35F301CE9E8"); + assertEquals("916A3CA8B7DF61473D5AE5B21711F35F301CE9E8", + descriptor.getGeoipDbDigest()); + } + + /* TODO Add tests for invalid geoip-db-digest lines. */ + + @Test() + public void testGeoipStatsValid() throws DescriptorParseException { + GeoipStatsBuilder.createWithDefaultLines(); + /* TODO Check stats parts. */ + } + + /* TODO Add tests for invalid geoip stats. */ + + @Test() + public void testDirreqStatsValid() throws DescriptorParseException { + DirreqStatsBuilder.createWithDefaultLines(); + /* TODO Check stats parts. */ + } + + /* TODO Add tests for invalid dirreq stats. */ + + @Test() + public void testEntryStatsValid() throws DescriptorParseException { + EntryStatsBuilder.createWithDefaultLines(); + /* TODO Check stats parts. */ + } + + /* TODO Add tests for invalid entry stats. */ + + @Test() + public void testCellStatsValid() throws DescriptorParseException { + CellStatsBuilder.createWithDefaultLines(); + /* TODO Check stats parts. */ + } + + /* TODO Add tests for invalid cell stats. */ + + @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. */ + } + + /* TODO Add tests for invalid conn-bi-direct stats. */ + + @Test() + public void testExitStatsValid() throws DescriptorParseException { + ExitStatsBuilder.createWithDefaultLines(); + /* TODO Check stats parts. */ + } + + /* TODO Add tests for invalid exit stats. */ + + @Test() + public void testBridgeStatsValid() throws DescriptorParseException { + BridgeStatsBuilder.createWithDefaultLines(); + /* TODO Check stats parts. */ + } + + /* TODO Add tests for invalid bridge stats. */ + + @Test() + public void testRouterSignatureOpt() + throws DescriptorParseException { + DescriptorBuilder.createWithRouterSignatureLines("opt " + + "router-signature\n" + + "-----BEGIN SIGNATURE-----\n" + + "crypto lines are ignored anyway\n" + + "-----END SIGNATURE-----"); + } + + @Test(expected = DescriptorParseException.class) + public void testRouterSignatureNotLastLine() + throws DescriptorParseException { + DescriptorBuilder.createWithRouterSignatureLines("router-signature\n" + + "-----BEGIN SIGNATURE-----\n" + + "o4j+kH8UQfjBwepUnr99v0ebN8RpzHJ/lqYsTojXHy9kMr1RNI9IDeSzA7PSqT" + + "uV\n4PL8QsGtlfwthtIoZpB2srZeyN/mcpA9fa1JXUrt/UN9K/+32Cyaad7h0n" + + "HE6Xfb\njqpXDpnBpvk4zjmzjjKYnIsUWTnADmu0fo3xTRqXi7g=\n" + + "-----END SIGNATURE-----\npublished 2012-02-11 09:08:36"); + } + + @Test(expected = DescriptorParseException.class) + public void testUnrecognizedLineFail() + throws DescriptorParseException { + String unrecognizedLine = "unrecognized-line 1"; + DescriptorBuilder.createWithUnrecognizedLine(unrecognizedLine, true); + } + + @Test() + public void testUnrecognizedLineIgnore() + throws DescriptorParseException { + String unrecognizedLine = "unrecognized-line 1"; + ExtraInfoDescriptor descriptor = DescriptorBuilder. + createWithUnrecognizedLine(unrecognizedLine, false); + List<String> unrecognizedLines = new ArrayList<String>(); + unrecognizedLines.add(unrecognizedLine); + assertEquals(unrecognizedLines, descriptor.getUnrecognizedLines()); + } +} +