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

karsten at torproject.org karsten at torproject.org
Sat Apr 20 05:26:45 UTC 2013


commit b58211e577fa1d685f4f3c802fcd30e2c21700f8
Author: Karsten Loesing <karsten.loesing at 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 {



More information about the tor-commits mailing list