[metrics-lib/master] Support bridge-ip-transports lines in extra-infos.

commit b58211e577fa1d685f4f3c802fcd30e2c21700f8 Author: Karsten Loesing <karsten.loesing@gmx.net> Date: Fri Apr 19 20:57:31 2013 +0200 Support bridge-ip-transports lines in extra-infos. --- .../torproject/descriptor/ExtraInfoDescriptor.java | 8 +++++++ .../descriptor/impl/ExtraInfoDescriptorImpl.java | 18 +++++++++++++- .../impl/ExtraInfoDescriptorImplTest.java | 23 ++++++++++++++++++++ 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/src/org/torproject/descriptor/ExtraInfoDescriptor.java b/src/org/torproject/descriptor/ExtraInfoDescriptor.java index e57febe..1478a4a 100644 --- a/src/org/torproject/descriptor/ExtraInfoDescriptor.java +++ b/src/org/torproject/descriptor/ExtraInfoDescriptor.java @@ -248,6 +248,14 @@ public interface ExtraInfoDescriptor extends Descriptor { * bridge IP version statistics are included. */ public SortedMap<String, Integer> getBridgeIpVersions(); + /* Return statistics on client IP addresses with map keys being + * pluggable transport names, e.g., "obfs2" or "obfs3" for known + * transports, "<OR>" for no transport, or "<??>" for an unknown + * transport, and map values being the number of unique IP addresses + * rounded up to the nearest multiple of 8, or null if no bridge IP + * transport statistics are included. */ + public SortedMap<String, Integer> getBridgeIpTransports(); + /* Return the (possibly empty) list of transports supported by this * bridge. */ public List<String> getTransports(); diff --git a/src/org/torproject/descriptor/impl/ExtraInfoDescriptorImpl.java b/src/org/torproject/descriptor/impl/ExtraInfoDescriptorImpl.java index d7dfd79..9bd9a9b 100644 --- a/src/org/torproject/descriptor/impl/ExtraInfoDescriptorImpl.java +++ b/src/org/torproject/descriptor/impl/ExtraInfoDescriptorImpl.java @@ -170,6 +170,8 @@ public class ExtraInfoDescriptorImpl extends DescriptorImpl this.parseBridgeStatsIpsLine(line, lineNoOpt, partsNoOpt); } else if (keyword.equals("bridge-ip-versions")) { this.parseBridgeIpVersionsLine(line, lineNoOpt, partsNoOpt); + } else if (keyword.equals("bridge-ip-transports")) { + this.parseBridgeIpTransportsLine(line, lineNoOpt, partsNoOpt); } else if (keyword.equals("transport")) { this.parseTransportLine(line, lineNoOpt, partsNoOpt); } else if (keyword.equals("router-signature")) { @@ -585,8 +587,14 @@ public class ExtraInfoDescriptorImpl extends DescriptorImpl private void parseBridgeIpVersionsLine(String line, String lineNoOpt, String[] partsNoOpt) throws DescriptorParseException { - this.bridgeIpVersions = ParseHelper.parseCommaSeparatedKeyValueList(line, - partsNoOpt, 1, 2); + this.bridgeIpVersions = ParseHelper.parseCommaSeparatedKeyValueList( + line, partsNoOpt, 1, 2); + } + + private void parseBridgeIpTransportsLine(String line, String lineNoOpt, + String[] partsNoOpt) throws DescriptorParseException { + this.bridgeIpTransports = ParseHelper.parseCommaSeparatedKeyValueList( + line, partsNoOpt, 1, 0); } private void parseTransportLine(String line, String lineNoOpt, @@ -911,6 +919,12 @@ public class ExtraInfoDescriptorImpl extends DescriptorImpl new TreeMap<String, Integer>(this.bridgeIpVersions); } + private SortedMap<String, Integer> bridgeIpTransports; + public SortedMap<String, Integer> getBridgeIpTransports() { + return this.bridgeIpTransports == null ? null : + new TreeMap<String, Integer>(this.bridgeIpTransports); + } + private List<String> transports = new ArrayList<String>(); public List<String> getTransports() { return new ArrayList<String>(this.transports); diff --git a/test/org/torproject/descriptor/impl/ExtraInfoDescriptorImplTest.java b/test/org/torproject/descriptor/impl/ExtraInfoDescriptorImplTest.java index e1b19f8..569ce06 100644 --- a/test/org/torproject/descriptor/impl/ExtraInfoDescriptorImplTest.java +++ b/test/org/torproject/descriptor/impl/ExtraInfoDescriptorImplTest.java @@ -649,6 +649,15 @@ public class ExtraInfoDescriptorImplTest { return DescriptorBuilder.createWithBridgeStatsLines( bsb.buildBridgeStatsLines()); } + private String bridgeIpTransportsLine = "bridge-ip-transports " + + "<OR>=8,obfs2=792,obfs3=1728"; + private static ExtraInfoDescriptor createWithBridgeIpTransportsLine( + String line) throws DescriptorParseException { + BridgeStatsBuilder bsb = new BridgeStatsBuilder(); + bsb.bridgeIpTransportsLine = line; + return DescriptorBuilder.createWithBridgeStatsLines( + bsb.buildBridgeStatsLines()); + } private static ExtraInfoDescriptor createWithDefaultLines() throws DescriptorParseException { return DescriptorBuilder.createWithBridgeStatsLines( @@ -665,6 +674,9 @@ public class ExtraInfoDescriptorImplTest { if (this.bridgeIpVersionsLine != null) { sb.append(this.bridgeIpVersionsLine + "\n"); } + if (this.bridgeIpTransportsLine != null) { + sb.append(this.bridgeIpTransportsLine + "\n"); + } String lines = sb.toString(); if (lines.endsWith("\n")) { lines = lines.substring(0, lines.length() - 1); @@ -1271,6 +1283,11 @@ public class ExtraInfoDescriptorImplTest { assertEquals(8, ver.get("v4").intValue()); assertEquals(16, ver.get("v6").intValue()); assertFalse(ver.containsKey("v8")); + SortedMap<String, Integer> trans = descriptor.getBridgeIpTransports(); + assertNotNull(trans); + assertEquals(8, trans.get("<OR>").intValue()); + assertEquals(792, trans.get("obfs2").intValue()); + assertEquals(1728, trans.get("obfs3").intValue()); } @Test(expected = DescriptorParseException.class) @@ -1293,6 +1310,12 @@ public class ExtraInfoDescriptorImplTest { "bridge-ip-versions v4=24.5"); } + public void testBridgeIpTransportsDouble() + throws DescriptorParseException { + BridgeStatsBuilder.createWithBridgeIpTransportsLine( + "bridge-ip-transports obfs2=24.5"); + } + @Test() public void testRouterSignatureOpt() throws DescriptorParseException {
participants (1)
-
karsten@torproject.org