[tor-commits] [metrics-lib/master] Parse "package" lines in consensuses and votes.

karsten at torproject.org karsten at torproject.org
Tue Jun 14 08:12:01 UTC 2016


commit 4d79f79a78af5f1dee293b29c1758f8864d3f6b7
Author: Karsten Loesing <karsten.loesing at gmx.net>
Date:   Sun Jun 12 17:00:48 2016 +0200

    Parse "package" lines in consensuses and votes.
    
    Implements #19285.
---
 CHANGELOG.md                                       |  6 +++
 .../descriptor/RelayNetworkStatusConsensus.java    | 11 +++++
 .../descriptor/RelayNetworkStatusVote.java         | 10 +++++
 .../impl/RelayNetworkStatusConsensusImpl.java      | 21 ++++++++++
 .../impl/RelayNetworkStatusVoteImpl.java           | 21 ++++++++++
 .../descriptor/impl/ConsensusBuilder.java          | 11 +++++
 .../impl/RelayNetworkStatusConsensusImplTest.java  | 37 +++++++++++++++++
 .../impl/RelayNetworkStatusVoteImplTest.java       | 47 ++++++++++++++++++++++
 8 files changed, 164 insertions(+)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index ecb1523..3c243d8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,9 @@
+# Changes in version 1.3.0 - 2016-0x-xx
+
+ * Medium changes
+   - Parse "package" lines in consensuses and votes.
+
+
 # Changes in version 1.2.0 - 2016-05-31
 
  * Medium changes
diff --git a/src/org/torproject/descriptor/RelayNetworkStatusConsensus.java b/src/org/torproject/descriptor/RelayNetworkStatusConsensus.java
index 624f1cc..90f96d7 100644
--- a/src/org/torproject/descriptor/RelayNetworkStatusConsensus.java
+++ b/src/org/torproject/descriptor/RelayNetworkStatusConsensus.java
@@ -113,6 +113,17 @@ public interface RelayNetworkStatusConsensus extends Descriptor {
   public List<String> getRecommendedClientVersions();
 
   /**
+   * Return a list of software packages and their versions together with a
+   * URL and one or more digests in the format <code>PackageName Version
+   * URL DIGESTS</code> that are known by at least three directory
+   * authorities and agreed upon by the majority of directory authorities,
+   * or null if the consensus does not contain package information.
+   *
+   * @since 1.3.0
+   */
+  public List<String> getPackageLines();
+
+  /**
    * Return known relay flags in this descriptor that were contained in
    * enough votes for this consensus to be an authoritative opinion for
    * these relay flags.
diff --git a/src/org/torproject/descriptor/RelayNetworkStatusVote.java b/src/org/torproject/descriptor/RelayNetworkStatusVote.java
index 5e0c7cd..6e7e1b7 100644
--- a/src/org/torproject/descriptor/RelayNetworkStatusVote.java
+++ b/src/org/torproject/descriptor/RelayNetworkStatusVote.java
@@ -105,6 +105,16 @@ public interface RelayNetworkStatusVote extends Descriptor {
   public List<String> getRecommendedClientVersions();
 
   /**
+   * Return a list of software packages and their versions together with a
+   * URL and one or more digests in the format <code>PackageName Version
+   * URL DIGESTS</code> that are known by this directory authority, or
+   * null if this descriptor does not contain package information.
+   *
+   * @since 1.3.0
+   */
+  public List<String> getPackageLines();
+
+  /**
    * Return known relay flags by this authority.
    *
    * @since 1.0.0
diff --git a/src/org/torproject/descriptor/impl/RelayNetworkStatusConsensusImpl.java b/src/org/torproject/descriptor/impl/RelayNetworkStatusConsensusImpl.java
index 13b9142..091ba09 100644
--- a/src/org/torproject/descriptor/impl/RelayNetworkStatusConsensusImpl.java
+++ b/src/org/torproject/descriptor/impl/RelayNetworkStatusConsensusImpl.java
@@ -123,6 +123,9 @@ public class RelayNetworkStatusConsensusImpl extends NetworkStatusImpl
       case "server-versions":
         this.parseServerVersionsLine(line, parts);
         break;
+      case "package":
+        this.parsePackageLine(line, parts);
+        break;
       case "known-flags":
         this.parseKnownFlagsLine(line, parts);
         break;
@@ -276,6 +279,18 @@ public class RelayNetworkStatusConsensusImpl extends NetworkStatusImpl
         line, parts);
   }
 
+  private void parsePackageLine(String line, String[] parts)
+      throws DescriptorParseException {
+    if (parts.length < 5) {
+      throw new DescriptorParseException("Wrong number of values in line "
+          + "'" + line + "'.");
+    }
+    if (this.packageLines == null) {
+      this.packageLines = new ArrayList<>();
+    }
+    this.packageLines.add(line.substring("package ".length()));
+  }
+
   private void parseKnownFlagsLine(String line, String[] parts)
       throws DescriptorParseException {
     if (parts.length < 2) {
@@ -358,6 +373,12 @@ public class RelayNetworkStatusConsensusImpl extends NetworkStatusImpl
         Arrays.asList(this.recommendedServerVersions);
   }
 
+  private List<String> packageLines;
+  public List<String> getPackageLines() {
+    return this.packageLines == null ? null
+        : new ArrayList<>(this.packageLines);
+  }
+
   private String[] knownFlags;
   public SortedSet<String> getKnownFlags() {
     return new TreeSet<>(Arrays.asList(this.knownFlags));
diff --git a/src/org/torproject/descriptor/impl/RelayNetworkStatusVoteImpl.java b/src/org/torproject/descriptor/impl/RelayNetworkStatusVoteImpl.java
index 8d18919..f378a79 100644
--- a/src/org/torproject/descriptor/impl/RelayNetworkStatusVoteImpl.java
+++ b/src/org/torproject/descriptor/impl/RelayNetworkStatusVoteImpl.java
@@ -113,6 +113,9 @@ public class RelayNetworkStatusVoteImpl extends NetworkStatusImpl
       case "server-versions":
         this.parseServerVersionsLine(line, parts);
         break;
+      case "package":
+        this.parsePackageLine(line, parts);
+        break;
       case "known-flags":
         this.parseKnownFlagsLine(line, parts);
         break;
@@ -298,6 +301,18 @@ public class RelayNetworkStatusVoteImpl extends NetworkStatusImpl
         line, parts);
   }
 
+  private void parsePackageLine(String line, String[] parts)
+      throws DescriptorParseException {
+    if (parts.length < 5) {
+      throw new DescriptorParseException("Wrong number of values in line "
+          + "'" + line + "'.");
+    }
+    if (this.packageLines == null) {
+      this.packageLines = new ArrayList<>();
+    }
+    this.packageLines.add(line.substring("package ".length()));
+  }
+
   private void parseKnownFlagsLine(String line, String[] parts)
       throws DescriptorParseException {
     if (parts.length < 2) {
@@ -634,6 +649,12 @@ public class RelayNetworkStatusVoteImpl extends NetworkStatusImpl
         Arrays.asList(this.recommendedServerVersions);
   }
 
+  private List<String> packageLines;
+  public List<String> getPackageLines() {
+    return this.packageLines == null ? null
+        : new ArrayList<>(this.packageLines);
+  }
+
   private String[] knownFlags;
   public SortedSet<String> getKnownFlags() {
     return new TreeSet<>(Arrays.asList(this.knownFlags));
diff --git a/test/org/torproject/descriptor/impl/ConsensusBuilder.java b/test/org/torproject/descriptor/impl/ConsensusBuilder.java
index b9638fb..29a2d47 100644
--- a/test/org/torproject/descriptor/impl/ConsensusBuilder.java
+++ b/test/org/torproject/descriptor/impl/ConsensusBuilder.java
@@ -85,6 +85,14 @@ public class ConsensusBuilder {
     cb.serverVersionsLine = line;
     return new RelayNetworkStatusConsensusImpl(cb.buildConsensus(), true);
   }
+  private String packageLines = null;
+  protected static RelayNetworkStatusConsensus
+      createWithPackageLines(String lines)
+      throws DescriptorParseException {
+    ConsensusBuilder cb = new ConsensusBuilder();
+    cb.packageLines = lines;
+    return new RelayNetworkStatusConsensusImpl(cb.buildConsensus(), true);
+  }
   private String knownFlagsLine = "known-flags Authority BadExit Exit "
       + "Fast Guard HSDir Named Running Stable Unnamed V2Dir Valid";
   protected static RelayNetworkStatusConsensus
@@ -261,6 +269,9 @@ public class ConsensusBuilder {
     if (this.serverVersionsLine != null) {
       sb.append(this.serverVersionsLine).append("\n");
     }
+    if (this.packageLines != null) {
+      sb.append(this.packageLines).append("\n");
+    }
     if (this.knownFlagsLine != null) {
       sb.append(this.knownFlagsLine).append("\n");
     }
diff --git a/test/org/torproject/descriptor/impl/RelayNetworkStatusConsensusImplTest.java b/test/org/torproject/descriptor/impl/RelayNetworkStatusConsensusImplTest.java
index dbe6cd3..86e4e78 100644
--- a/test/org/torproject/descriptor/impl/RelayNetworkStatusConsensusImplTest.java
+++ b/test/org/torproject/descriptor/impl/RelayNetworkStatusConsensusImplTest.java
@@ -10,6 +10,7 @@ import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 
@@ -607,6 +608,42 @@ public class RelayNetworkStatusConsensusImplTest {
         "client-versions ,0.2.2.34");
   }
 
+  @Test()
+  public void testPackageNone() throws DescriptorParseException {
+    RelayNetworkStatusConsensus consensus =
+        ConsensusBuilder.createWithPackageLines(null);
+    assertNull(consensus.getPackageLines());
+  }
+
+  @Test()
+  public void testPackageOne() throws DescriptorParseException {
+    String packageLine = "package shouldbesecond 0 http digest=digest";
+    RelayNetworkStatusConsensus consensus =
+        ConsensusBuilder.createWithPackageLines(packageLine);
+    assertEquals(packageLine.substring("package ".length()),
+        consensus.getPackageLines().get(0));
+  }
+
+  @Test()
+  public void testPackageTwo() throws DescriptorParseException {
+    List<String> packageLines = Arrays.asList(
+        "package shouldbesecond 0 http digest=digest",
+        "package outoforder 0 http digest=digest");
+    RelayNetworkStatusConsensus consensus =
+        ConsensusBuilder.createWithPackageLines(packageLines.get(0)
+        + "\n" + packageLines.get(1));
+    for (int i = 0; i < packageLines.size(); i++) {
+      assertEquals(packageLines.get(i).substring("package ".length()),
+          consensus.getPackageLines().get(i));
+    }
+  }
+
+  @Test(expected = DescriptorParseException.class)
+  public void testPackageIncomplete() throws DescriptorParseException {
+    String packageLine = "package shouldbesecond 0 http";
+    ConsensusBuilder.createWithPackageLines(packageLine);
+  }
+
   @Test(expected = DescriptorParseException.class)
   public void testKnownFlagsNoLine() throws DescriptorParseException {
     ConsensusBuilder.createWithKnownFlagsLine(null);
diff --git a/test/org/torproject/descriptor/impl/RelayNetworkStatusVoteImplTest.java b/test/org/torproject/descriptor/impl/RelayNetworkStatusVoteImplTest.java
index 261abd4..f7ddd8c 100644
--- a/test/org/torproject/descriptor/impl/RelayNetworkStatusVoteImplTest.java
+++ b/test/org/torproject/descriptor/impl/RelayNetworkStatusVoteImplTest.java
@@ -108,6 +108,14 @@ public class RelayNetworkStatusVoteImplTest {
       vb.serverVersionsLine = line;
       return new RelayNetworkStatusVoteImpl(vb.buildVote(), true);
     }
+    private String packageLines = null;
+    protected static RelayNetworkStatusVote
+        createWithPackageLines(String lines)
+        throws DescriptorParseException {
+      VoteBuilder vb = new VoteBuilder();
+      vb.packageLines = lines;
+      return new RelayNetworkStatusVoteImpl(vb.buildVote(), true);
+    }
     private String knownFlagsLine = "known-flags Authority BadExit Exit "
         + "Fast Guard HSDir Named Running Stable Unnamed V2Dir Valid";
     private static RelayNetworkStatusVote
@@ -408,6 +416,9 @@ public class RelayNetworkStatusVoteImplTest {
       if (this.serverVersionsLine != null) {
         sb.append(this.serverVersionsLine).append("\n");
       }
+      if (this.packageLines != null) {
+        sb.append(this.packageLines).append("\n");
+      }
       if (this.knownFlagsLine != null) {
         sb.append(this.knownFlagsLine).append("\n");
       }
@@ -777,6 +788,42 @@ public class RelayNetworkStatusVoteImplTest {
         "client-versions ,0.2.2.34");
   }
 
+  @Test()
+  public void testPackageNone() throws DescriptorParseException {
+    RelayNetworkStatusVote vote =
+        VoteBuilder.createWithPackageLines(null);
+    assertNull(vote.getPackageLines());
+  }
+
+  @Test()
+  public void testPackageOne() throws DescriptorParseException {
+    String packageLine = "package shouldbesecond 0 http digest=digest";
+    RelayNetworkStatusVote vote =
+        VoteBuilder.createWithPackageLines(packageLine);
+    assertEquals(packageLine.substring("package ".length()),
+        vote.getPackageLines().get(0));
+  }
+
+  @Test()
+  public void testPackageTwo() throws DescriptorParseException {
+    List<String> packageLines = Arrays.asList(
+        "package shouldbesecond 0 http digest=digest",
+        "package outoforder 0 http digest=digest");
+    RelayNetworkStatusVote vote =
+        VoteBuilder.createWithPackageLines(packageLines.get(0)
+        + "\n" + packageLines.get(1));
+    for (int i = 0; i < packageLines.size(); i++) {
+      assertEquals(packageLines.get(i).substring("package ".length()),
+          vote.getPackageLines().get(i));
+    }
+  }
+
+   @Test(expected = DescriptorParseException.class)
+   public void testPackageIncomplete() throws DescriptorParseException {
+     String packageLine = "package shouldbesecond 0 http";
+     ConsensusBuilder.createWithPackageLines(packageLine);
+   }
+
   @Test(expected = DescriptorParseException.class)
   public void testKnownFlagsNoLine() throws DescriptorParseException {
     VoteBuilder.createWithKnownFlagsLine(null);





More information about the tor-commits mailing list