[tor-commits] [metrics-lib/master] Improve vote parsing and unit tests.

karsten at torproject.org karsten at torproject.org
Fri Dec 16 11:58:22 UTC 2011


commit c2dac40a033f332078617ba6adb379f28efdbdbb
Author: Karsten Loesing <karsten.loesing at gmx.net>
Date:   Fri Dec 16 12:56:23 2011 +0100

    Improve vote parsing and unit tests.
---
 .../impl/RelayNetworkStatusVoteImpl.java           |   41 ++-
 .../impl/RelayNetworkStatusVoteImplTest.java       |  524 +++++++++++++++++---
 2 files changed, 481 insertions(+), 84 deletions(-)

diff --git a/src/org/torproject/descriptor/impl/RelayNetworkStatusVoteImpl.java b/src/org/torproject/descriptor/impl/RelayNetworkStatusVoteImpl.java
index fd17e7b..ab4da77 100644
--- a/src/org/torproject/descriptor/impl/RelayNetworkStatusVoteImpl.java
+++ b/src/org/torproject/descriptor/impl/RelayNetworkStatusVoteImpl.java
@@ -16,9 +16,6 @@ import java.util.TreeMap;
 import java.util.TreeSet;
 import org.torproject.descriptor.RelayNetworkStatusVote;
 
-/* TODO Find out if all keywords in the dir-source section are required.
- * They are not all mentioned in dir-spec.txt. */
-
 /* Contains a network status vote. */
 public class RelayNetworkStatusVoteImpl extends NetworkStatusImpl
     implements RelayNetworkStatusVote {
@@ -51,11 +48,13 @@ public class RelayNetworkStatusVoteImpl extends NetworkStatusImpl
         "vote-status,consensus-methods,published,valid-after,fresh-until,"
         + "valid-until,voting-delay,known-flags,dir-source,"
         + "dir-key-certificate-version,fingerprint,dir-key-published,"
-        + "dir-key-expires,directory-footer").split(",")));
+        + "dir-key-expires,dir-identity-key,dir-signing-key,"
+        + "dir-key-certification,directory-footer,directory-signature").
+        split(",")));
     this.checkExactlyOnceKeywords(exactlyOnceKeywords);
     Set<String> atMostOnceKeywords = new HashSet<String>(Arrays.asList((
-        "client-versions,server-versions,params,contact,legacy-key").
-        split(",")));
+        "client-versions,server-versions,params,contact,legacy-key,"
+        + "dir-key-crosscert,dir-address").split(",")));
     this.checkAtMostOnceKeywords(atMostOnceKeywords);
     this.checkFirstKeyword("network-status-version");
   }
@@ -252,9 +251,10 @@ public class RelayNetworkStatusVoteImpl extends NetworkStatusImpl
           this.parseContactLine(line, parts);
         } else if (keyword.equals("dir-key-certificate-version")) {
           this.parseDirKeyCertificateVersionLine(line, parts);
+        } else if (keyword.equals("dir-address")) {
+          this.parseDirAddressLine(line, parts);
         } else if (keyword.equals("fingerprint")) {
-          /* Nothing new to learn here.  We already know the fingerprint
-           * from the dir-source line. */
+          this.parseFingerprintLine(line, parts);
         } else if (keyword.equals("legacy-key")) {
           this.parseLegacyKeyLine(line, parts);
         } else if (keyword.equals("dir-key-published")) {
@@ -286,8 +286,16 @@ public class RelayNetworkStatusVoteImpl extends NetworkStatusImpl
 
   private void parseDirSourceLine(String line, String[] parts)
       throws DescriptorParseException {
+    if (parts.length != 7) {
+      throw new DescriptorParseException("Illegal line '" + line
+          + "' in vote.");
+    }
     this.nickname = ParseHelper.parseNickname(line, parts[1]);
     this.identity = ParseHelper.parseTwentyByteHexString(line, parts[2]);
+    if (parts[3].length() < 1) {
+      throw new DescriptorParseException("Illegal hostname in '" + line
+          + "'.");
+    }
     this.address = ParseHelper.parseIpv4Address(line, parts[4]);
     this.dirPort = ParseHelper.parsePort(line, parts[5]);
     this.orPort = ParseHelper.parsePort(line, parts[6]);
@@ -320,6 +328,23 @@ public class RelayNetworkStatusVoteImpl extends NetworkStatusImpl
     }
   }
 
+  private void parseDirAddressLine(String line, String[] parts) {
+    /* Nothing new to learn here.  Also, this line hasn't been observed
+     * "in the wild" yet.  Maybe it's just an urban legend. */
+  }
+
+  private void parseFingerprintLine(String line, String[] parts)
+      throws DescriptorParseException {
+    /* Nothing new to learn here.  We already know the fingerprint from
+     * the dir-source line.  But we should at least check that there's a
+     * valid fingerprint in this line. */
+    if (parts.length != 2) {
+      throw new DescriptorParseException("Illegal line '" + line
+          + "' in vote.");
+    }
+    ParseHelper.parseTwentyByteHexString(line, parts[1]);
+  }
+
   private void parseLegacyKeyLine(String line, String[] parts)
       throws DescriptorParseException {
     if (parts.length != 2) {
diff --git a/test/org/torproject/descriptor/impl/RelayNetworkStatusVoteImplTest.java b/test/org/torproject/descriptor/impl/RelayNetworkStatusVoteImplTest.java
index b34e143..cdf2a01 100644
--- a/test/org/torproject/descriptor/impl/RelayNetworkStatusVoteImplTest.java
+++ b/test/org/torproject/descriptor/impl/RelayNetworkStatusVoteImplTest.java
@@ -11,21 +11,6 @@ import org.junit.*;
 import org.junit.rules.*;
 import static org.junit.Assert.*;
 
-/* TODO Add tests (and possibly a DirSourceLineBuilder) to test the
- * following methods:
- * - String getNickname();
- * - String getIdentity();
- * - String getAddress();
- * - int getDirport();
- * - int getOrport();
- * - String getContactLine();
- * - int getDirKeyCertificateVersion();
- * - String getLegacyKey();
- * - long getDirKeyPublishedMillis();
- * - long getDirKeyExpiresMillis();
- * - String getSigningKeyDigest();
- */
-
 /* Test parsing of network status votes.  Some of the vote-parsing code is
  * already tested in the consensus-parsing tests.  The tests in this class
  * focus on the differences between votes and consensuses that are mostly
@@ -139,7 +124,126 @@ public class RelayNetworkStatusVoteImplTest {
       vb.paramsLine = line;
       return new RelayNetworkStatusVoteImpl(vb.buildVote());
     }
-    private List<String> dirSources = new ArrayList<String>();
+    private String dirSourceLine = "dir-source urras "
+        + "80550987E1D626E3EBA5E5E75A458DE0626D088C 208.83.223.34 "
+        + "208.83.223.34 443 80";
+    private static RelayNetworkStatusVote
+        createWithDirSourceLine(String line)
+        throws DescriptorParseException {
+      VoteBuilder vb = new VoteBuilder();
+      vb.dirSourceLine = line;
+      return new RelayNetworkStatusVoteImpl(vb.buildVote());
+    }
+    private String contactLine = "contact 4096R/E012B42D Jacob Appelbaum "
+        + "<jacob at appelbaum.net>";
+    private static RelayNetworkStatusVote
+        createWithContactLine(String line)
+        throws DescriptorParseException {
+      VoteBuilder vb = new VoteBuilder();
+      vb.contactLine = line;
+      return new RelayNetworkStatusVoteImpl(vb.buildVote());
+    }
+    private String dirKeyCertificateVersionLine =
+        "dir-key-certificate-version 3";
+    private static RelayNetworkStatusVote
+        createWithDirKeyCertificateVersionLine(String line)
+        throws DescriptorParseException {
+      VoteBuilder vb = new VoteBuilder();
+      vb.dirKeyCertificateVersionLine = line;
+      return new RelayNetworkStatusVoteImpl(vb.buildVote());
+    }
+    private String fingerprintLine = "fingerprint "
+        + "80550987E1D626E3EBA5E5E75A458DE0626D088C";
+    private static RelayNetworkStatusVote
+        createWithFingerprintLine(String line)
+        throws DescriptorParseException {
+      VoteBuilder vb = new VoteBuilder();
+      vb.fingerprintLine = line;
+      return new RelayNetworkStatusVoteImpl(vb.buildVote());
+    }
+    private String dirKeyPublishedLine = "dir-key-published 2011-04-27 "
+        + "05:34:37";
+    private static RelayNetworkStatusVote
+        createWithDirKeyPublishedLine(String line)
+        throws DescriptorParseException {
+      VoteBuilder vb = new VoteBuilder();
+      vb.dirKeyPublishedLine = line;
+      return new RelayNetworkStatusVoteImpl(vb.buildVote());
+    }
+    private String dirKeyExpiresLine = "dir-key-expires 2012-04-27 "
+        + "05:34:37";
+    private static RelayNetworkStatusVote
+        createWithDirKeyExpiresLine(String line)
+        throws DescriptorParseException {
+      VoteBuilder vb = new VoteBuilder();
+      vb.dirKeyExpiresLine = line;
+      return new RelayNetworkStatusVoteImpl(vb.buildVote());
+    }
+    private String dirIdentityKeyLines = "dir-identity-key\n"
+        + "-----BEGIN RSA PUBLIC KEY-----\n"
+        + "MIIBigKCAYEAtKpuLgVK25sfScjsxfVU1ljofrDygt9GP7bNJl/rghX42KUT97"
+        + "5W\nrGp/fbhF7p+FcKCzNOhJFINQbRf/5E3lN8mzoamIU43QqQ9RRVf94688Us"
+        + "azVsAN\nNVT0v9J0cr387WePjenRuIE1MmiP0nmw/XdvbPTayqax7VYlcUMXGH"
+        + "l8DnWix1EN\nRwmeig+JBte0JS12oo2HG9zcSfjLJVjY6ZmvRrVycXiRxGc/Jg"
+        + "NlSrV4cxUNykaB\nJ6pO6J499OZfQu7m1vAPTENrVJ4yEfRGRwFIY+d/s8BkKc"
+        + "aiWtXAfTe31uBI6GEH\nmS3HNu1JVSuoaUiQIvVYDLMfBvMcNyAx97UT1l6E0T"
+        + "n6a7pgChrquGwXai1xGzk8\n58aXwdSFoFBSTCkyemopq5H20p/nkPAO0pHL1k"
+        + "TvcaKz9CEj4XcKm+kOmzejYmIa\nkbWNcRpXPiUZ+xmwGtsq30xrzqiONmERkx"
+        + "qlmf7bVQPFvh3Kz6hGcmTBhTbHSe9h\nzDgmdaTNn3EHAgMBAAE=\n"
+        + "-----END RSA PUBLIC KEY-----";
+    private static RelayNetworkStatusVote
+        createWithDirIdentityKeyLines(String lines)
+        throws DescriptorParseException {
+      VoteBuilder vb = new VoteBuilder();
+      vb.dirIdentityKeyLines = lines;
+      return new RelayNetworkStatusVoteImpl(vb.buildVote());
+    }
+    private String dirSigningKeyLines = "dir-signing-key\n"
+        + "-----BEGIN RSA PUBLIC KEY-----\n"
+        + "MIGJAoGBAN05qyHFQlTqykMP8yLuD4G2UuYulD4Xs8iSX5uqF+WGsUA1E4zZh4"
+        + "8h\nDFj8+drFiCu3EqhMEmVG4ACtJK2uz6D1XohUsbPWTR6LSnWJ8q6/zfTSLu"
+        + "mBGsN7\nPUXyMNjwRKL6UvrcbYk1d2mRBLO7SAP/sFW5fHhIBVeLIWrzQ19rAg"
+        + "MBAAE=\n"
+        + "-----END RSA PUBLIC KEY-----";
+    private static RelayNetworkStatusVote
+        createWithDirSigningKeyLines(String lines)
+        throws DescriptorParseException {
+      VoteBuilder vb = new VoteBuilder();
+      vb.dirSigningKeyLines = lines;
+      return new RelayNetworkStatusVoteImpl(vb.buildVote());
+    }
+    private String dirKeyCrosscertLines = "dir-key-crosscert\n"
+        + "-----BEGIN ID SIGNATURE-----\n"
+        + "rPBFn6IJ6TvAHj4pSwlg+RTn1fP89JGSVa08wuyJr5dAvZsdakQXvRjamT9oJU"
+        + "aZ\nnY5Rl/tRlGuSQ0BglTPPKoXdKERK0FUr9f0EKrQy7NDUgE2j9losiRuyKz"
+        + "hA3neZ\nK4yF8bhqAwM51u7fzAhIjNeRif9c04rhFJJCseco84w=\n"
+        + "-----END ID SIGNATURE-----";
+    private static RelayNetworkStatusVote
+        createWithDirKeyCrosscertLines(String lines)
+        throws DescriptorParseException {
+      VoteBuilder vb = new VoteBuilder();
+      vb.dirKeyCrosscertLines = lines;
+      return new RelayNetworkStatusVoteImpl(vb.buildVote());
+    }
+    private String dirKeyCertificationLines = "dir-key-certification\n"
+        + "-----BEGIN SIGNATURE-----\n"
+        + "hPSh6FuohNF5ccjiMbkvr8cZJwGFuL11cNtwN9k0X3pUdFZVATIEkqBe7z+rE2"
+        + "PX\nPw+BGyC6wYAieoTVIhLpwKqd7DXLYjuhPZ28+7MQaDL01AqYeRp5PT01Px"
+        + "rFY0Um\nlVf95uqUitgvDT76Ne4ExWk6UvGlYB9OBgBySZz8VWe9znoMqb0uHn"
+        + "/p8IzqTApT\nAxRWXBHClntMeRqtGxaj8DcdJFn8yMxQiZG7MfDg2sq2ySPJyG"
+        + "lN+neoVDVhZiDI\n9LTNmw60gWlUp2erFeam8Mo1ZBC4DPNjQEm6QeHZFZMkhD"
+        + "uO6SwS/FL712A42+Co\nYtMaVot/p5FG2ZSBXbgl2XP5/z8ELnpmXqMbPAoWRo"
+        + "3BPNSJkIQQNog8Q5ZrK+av\nZDw5eGPltGKsXOkvuzIMM8nBeAnDPDgYvzrIFO"
+        + "bEGbvY/P8mzVAZxp3Yz+sRtNel\nC1SWz/Fx+Saex5oI7DJ3xtSD4XqKb/wYwZ"
+        + "FT8IxDYq1t2tFXdHxd4QPRVcvc0zYC\n"
+        + "-----END SIGNATURE-----";
+    private static RelayNetworkStatusVote
+        createWithDirKeyCertificationLines(String lines)
+        throws DescriptorParseException {
+      VoteBuilder vb = new VoteBuilder();
+      vb.dirKeyCertificationLines = lines;
+      return new RelayNetworkStatusVoteImpl(vb.buildVote());
+    }
     private List<String> statusEntries = new ArrayList<String>();
     private String directoryFooterLine = "directory-footer";
     private static RelayNetworkStatusVote
@@ -149,55 +253,22 @@ public class RelayNetworkStatusVoteImplTest {
       vb.directoryFooterLine = line;
       return new RelayNetworkStatusVoteImpl(vb.buildVote());
     }
-    private List<String> directorySignatures = new ArrayList<String>();
-    private VoteBuilder() {
-      this.dirSources.add("dir-source urras "
-          + "80550987E1D626E3EBA5E5E75A458DE0626D088C 208.83.223.34 "
-          + "208.83.223.34 443 80\n"
-          + "contact 4096R/E012B42D Jacob Appelbaum "
-          + "<jacob at appelbaum.net>\n"
-          + "dir-key-certificate-version 3\n"
-          + "fingerprint 80550987E1D626E3EBA5E5E75A458DE0626D088C\n"
-          + "dir-key-published 2011-04-27 05:34:37\n"
-          + "dir-key-expires 2012-04-27 05:34:37\n"
-          + "dir-identity-key\n"
-          + "-----BEGIN RSA PUBLIC KEY-----\n"
-          + "MIIBigKCAYEAtKpuLgVK25sfScjsxfVU1ljofrDygt9GP7bNJl/rghX42KUT"
-          + "975W\nrGp/fbhF7p+FcKCzNOhJFINQbRf/5E3lN8mzoamIU43QqQ9RRVf946"
-          + "88UsazVsAN\nNVT0v9J0cr387WePjenRuIE1MmiP0nmw/XdvbPTayqax7VYl"
-          + "cUMXGHl8DnWix1EN\nRwmeig+JBte0JS12oo2HG9zcSfjLJVjY6ZmvRrVycX"
-          + "iRxGc/JgNlSrV4cxUNykaB\nJ6pO6J499OZfQu7m1vAPTENrVJ4yEfRGRwFI"
-          + "Y+d/s8BkKcaiWtXAfTe31uBI6GEH\nmS3HNu1JVSuoaUiQIvVYDLMfBvMcNy"
-          + "Ax97UT1l6E0Tn6a7pgChrquGwXai1xGzk8\n58aXwdSFoFBSTCkyemopq5H2"
-          + "0p/nkPAO0pHL1kTvcaKz9CEj4XcKm+kOmzejYmIa\nkbWNcRpXPiUZ+xmwGt"
-          + "sq30xrzqiONmERkxqlmf7bVQPFvh3Kz6hGcmTBhTbHSe9h\nzDgmdaTNn3EH"
-          + "AgMBAAE=\n"
-          + "-----END RSA PUBLIC KEY-----\n"
-          + "dir-signing-key\n"
-          + "-----BEGIN RSA PUBLIC KEY-----\n"
-          + "MIGJAoGBAN05qyHFQlTqykMP8yLuD4G2UuYulD4Xs8iSX5uqF+WGsUA1E4zZ"
-          + "h48h\nDFj8+drFiCu3EqhMEmVG4ACtJK2uz6D1XohUsbPWTR6LSnWJ8q6/zf"
-          + "TSLumBGsN7\nPUXyMNjwRKL6UvrcbYk1d2mRBLO7SAP/sFW5fHhIBVeLIWrz"
-          + "Q19rAgMBAAE=\n"
-          + "-----END RSA PUBLIC KEY-----\n"
-          + "dir-key-crosscert\n"
-          + "-----BEGIN ID SIGNATURE-----\n"
-          + "rPBFn6IJ6TvAHj4pSwlg+RTn1fP89JGSVa08wuyJr5dAvZsdakQXvRjamT9o"
-          + "JUaZ\nnY5Rl/tRlGuSQ0BglTPPKoXdKERK0FUr9f0EKrQy7NDUgE2j9losiR"
-          + "uyKzhA3neZ\nK4yF8bhqAwM51u7fzAhIjNeRif9c04rhFJJCseco84w=\n"
-          + "-----END ID SIGNATURE-----\n"
-          + "dir-key-certification\n"
+    private String directorySignatureLines = "directory-signature "
+          + "80550987E1D626E3EBA5E5E75A458DE0626D088C "
+          + "EEB9299D295C1C815E289FBF2F2BBEA5F52FDD19\n"
           + "-----BEGIN SIGNATURE-----\n"
-          + "hPSh6FuohNF5ccjiMbkvr8cZJwGFuL11cNtwN9k0X3pUdFZVATIEkqBe7z+r"
-          + "E2PX\nPw+BGyC6wYAieoTVIhLpwKqd7DXLYjuhPZ28+7MQaDL01AqYeRp5PT"
-          + "01PxrFY0Um\nlVf95uqUitgvDT76Ne4ExWk6UvGlYB9OBgBySZz8VWe9znoM"
-          + "qb0uHn/p8IzqTApT\nAxRWXBHClntMeRqtGxaj8DcdJFn8yMxQiZG7MfDg2s"
-          + "q2ySPJyGlN+neoVDVhZiDI\n9LTNmw60gWlUp2erFeam8Mo1ZBC4DPNjQEm6"
-          + "QeHZFZMkhDuO6SwS/FL712A42+Co\nYtMaVot/p5FG2ZSBXbgl2XP5/z8ELn"
-          + "pmXqMbPAoWRo3BPNSJkIQQNog8Q5ZrK+av\nZDw5eGPltGKsXOkvuzIMM8nB"
-          + "eAnDPDgYvzrIFObEGbvY/P8mzVAZxp3Yz+sRtNel\nC1SWz/Fx+Saex5oI7D"
-          + "J3xtSD4XqKb/wYwZFT8IxDYq1t2tFXdHxd4QPRVcvc0zYC\n"
-          + "-----END SIGNATURE-----");
+          + "iHEU3Iidya5RIrjyYgv8tlU0R+rF56/3/MmaaZi0a67e7ZkISfQ4dghScHxn"
+          + "F3Yh\nrXVaaoP07r6Ta+s0g1Zijm3lms50Nk/4tV2p8Y63c3F4Q3DAnK40Oi"
+          + "kfOIwEj+Ny\n+zBRQssP3hPhTPOj/A7o3mZZwtL6x1sxpeu/nME1l5E=\n"
+          + "-----END SIGNATURE-----";
+    private static RelayNetworkStatusVote
+        createWithDirectorySignatureLines(String lines)
+        throws DescriptorParseException {
+      VoteBuilder vb = new VoteBuilder();
+      vb.directorySignatureLines = lines;
+      return new RelayNetworkStatusVoteImpl(vb.buildVote());
+    }
+    private VoteBuilder() {
       this.statusEntries.add("r right2privassy3 "
           + "ADQ6gCT3DiFHKPDFr3rODBUI8HM lJY5Vf7kXec+VdkGW2flEsfkFC8 "
           + "2011-11-12 00:03:40 50.63.8.215 9023 0\n"
@@ -211,14 +282,6 @@ public class RelayNetworkStatusVoteImplTest {
           + "19638\n"
           + "m 8,9,10,11 "
           + "sha256=9ciEx9t0McXk9A06I7qwN7pxuNOdpCP64RV/6cx2Zkc");
-      this.directorySignatures.add("directory-signature "
-          + "80550987E1D626E3EBA5E5E75A458DE0626D088C "
-          + "EEB9299D295C1C815E289FBF2F2BBEA5F52FDD19\n"
-          + "-----BEGIN SIGNATURE-----\n"
-          + "iHEU3Iidya5RIrjyYgv8tlU0R+rF56/3/MmaaZi0a67e7ZkISfQ4dghScHxn"
-          + "F3Yh\nrXVaaoP07r6Ta+s0g1Zijm3lms50Nk/4tV2p8Y63c3F4Q3DAnK40Oi"
-          + "kfOIwEj+Ny\n+zBRQssP3hPhTPOj/A7o3mZZwtL6x1sxpeu/nME1l5E=\n"
-          + "-----END SIGNATURE-----");
     }
     private byte[] buildVote() {
       StringBuilder sb = new StringBuilder();
@@ -264,8 +327,35 @@ public class RelayNetworkStatusVoteImplTest {
       if (this.paramsLine != null) {
         sb.append(this.paramsLine + "\n");
       }
-      for (String dirSource : this.dirSources) {
-        sb.append(dirSource + "\n");
+      if (this.dirSourceLine != null) {
+        sb.append(this.dirSourceLine + "\n");
+      }
+      if (this.contactLine != null) {
+        sb.append(this.contactLine + "\n");
+      }
+      if (this.dirKeyCertificateVersionLine != null) {
+        sb.append(this.dirKeyCertificateVersionLine + "\n");
+      }
+      if (this.fingerprintLine != null) {
+        sb.append(this.fingerprintLine + "\n");
+      }
+      if (this.dirKeyPublishedLine != null) {
+        sb.append(this.dirKeyPublishedLine + "\n");
+      }
+      if (this.dirKeyExpiresLine != null) {
+        sb.append(this.dirKeyExpiresLine + "\n");
+      }
+      if (this.dirIdentityKeyLines != null) {
+        sb.append(this.dirIdentityKeyLines + "\n");
+      }
+      if (this.dirSigningKeyLines != null) {
+        sb.append(this.dirSigningKeyLines + "\n");
+      }
+      if (this.dirKeyCrosscertLines != null) {
+        sb.append(this.dirKeyCrosscertLines + "\n");
+      }
+      if (this.dirKeyCertificationLines != null) {
+        sb.append(this.dirKeyCertificationLines + "\n");
       }
     }
     private void appendBody(StringBuilder sb) {
@@ -277,8 +367,8 @@ public class RelayNetworkStatusVoteImplTest {
       if (this.directoryFooterLine != null) {
         sb.append(this.directoryFooterLine + "\n");
       }
-      for (String directorySignature : this.directorySignatures) {
-        sb.append(directorySignature + "\n");
+      if (this.directorySignatureLines != null) {
+        sb.append(directorySignatureLines + "\n");
       }
     }
   }
@@ -571,5 +661,287 @@ public class RelayNetworkStatusVoteImplTest {
   public void testKnownFlagsOneSpace() throws DescriptorParseException {
     VoteBuilder.createWithKnownFlagsLine("known-flags ");
   }
+
+  @Test(expected = DescriptorParseException.class)
+  public void testNicknameMissing() throws DescriptorParseException {
+    VoteBuilder.createWithDirSourceLine("dir-source  "
+        + "80550987E1D626E3EBA5E5E75A458DE0626D088C 208.83.223.34 "
+        + "208.83.223.34 443 80");
+  }
+
+  @Test(expected = DescriptorParseException.class)
+  public void testNicknameTooLong() throws DescriptorParseException {
+    VoteBuilder.createWithDirSourceLine("dir-source "
+        + "urrassssssssssssssssssssssssssssssssssssssssssssssss "
+        + "80550987E1D626E3EBA5E5E75A458DE0626D088C 208.83.223.34 "
+        + "208.83.223.34 443 80");
+  }
+
+  @Test(expected = DescriptorParseException.class)
+  public void testNicknameIllegalCharacters()
+      throws DescriptorParseException {
+    VoteBuilder.createWithDirSourceLine("dir-source urra$ "
+        + "80550987E1D626E3EBA5E5E75A458DE0626D088C 208.83.223.34 "
+        + "208.83.223.34 443 80");
+  }
+
+  @Test(expected = DescriptorParseException.class)
+  public void testFingerprintLowerCase() throws DescriptorParseException {
+    VoteBuilder.createWithDirSourceLine("dir-source urras "
+        + "80550987e1d626e3eba5e5e75a458de0626d088c 208.83.223.34 "
+        + "208.83.223.34 443 80");
+  }
+
+  @Test(expected = DescriptorParseException.class)
+  public void testFingerprintTooShort() throws DescriptorParseException {
+    VoteBuilder.createWithDirSourceLine("dir-source urras "
+        + "80550987E1D626E3EBA5E5E75A458DE0626D 208.83.223.34 "
+        + "208.83.223.34 443 80");
+  }
+
+  @Test(expected = DescriptorParseException.class)
+  public void testFingerprintTooLong() throws DescriptorParseException {
+    VoteBuilder.createWithDirSourceLine("dir-source urras "
+        + "80550987E1D626E3EBA5E5E75A458DE0626D088C8055 208.83.223.34 "
+        + "208.83.223.34 443 80");
+  }
+
+  @Test(expected = DescriptorParseException.class)
+  public void testFingerprintIllegalCharacters()
+      throws DescriptorParseException {
+    VoteBuilder.createWithDirSourceLine("dir-source urras "
+        + "ABCDEFGHIJKLM6E3EBA5E5E75A458DE0626D088C 208.83.223.34 "
+        + "208.83.223.34 443 80");
+  }
+
+  @Test(expected = DescriptorParseException.class)
+  public void testFingerprintMissing()
+      throws DescriptorParseException {
+    VoteBuilder.createWithDirSourceLine("dir-source urras "
+        + " 208.83.223.34 208.83.223.34 443 80");
+  }
+
+  @Test()
+  public void testHostname256()
+      throws DescriptorParseException {
+    /* This test doesn't fail, because we're not parsing the hostname. */
+    VoteBuilder.createWithDirSourceLine("dir-source urras "
+        + "80550987E1D626E3EBA5E5E75A458DE0626D088C 256.256.256.256 "
+        + "208.83.223.34 443 80");
+  }
+
+  @Test(expected = DescriptorParseException.class)
+  public void testHostnameMissing()
+      throws DescriptorParseException {
+    VoteBuilder.createWithDirSourceLine("dir-source urras "
+        + "80550987E1D626E3EBA5E5E75A458DE0626D088C  208.83.223.34 443 "
+        + "80");
+  }
+
+  @Test(expected = DescriptorParseException.class)
+  public void testAddress256()
+      throws DescriptorParseException {
+    VoteBuilder.createWithDirSourceLine("dir-source urras "
+        + "80550987E1D626E3EBA5E5E75A458DE0626D088C 208.83.223.34 "
+        + "256.256.256.256 443 80");
+  }
+
+  @Test(expected = DescriptorParseException.class)
+  public void testAddressMissing()
+      throws DescriptorParseException {
+    VoteBuilder.createWithDirSourceLine("dir-source urras "
+        + "80550987E1D626E3EBA5E5E75A458DE0626D088C 208.83.223.34  443 "
+        + "80");
+  }
+
+  @Test(expected = DescriptorParseException.class)
+  public void testDirPortMinus443()
+      throws DescriptorParseException {
+    VoteBuilder.createWithDirSourceLine("dir-source urras "
+        + "80550987E1D626E3EBA5E5E75A458DE0626D088C 208.83.223.34 "
+        + "208.83.223.34 -443 80");
+  }
+
+  @Test(expected = DescriptorParseException.class)
+  public void testDirPortFourFourThree()
+      throws DescriptorParseException {
+    VoteBuilder.createWithDirSourceLine("dir-source urras "
+        + "80550987E1D626E3EBA5E5E75A458DE0626D088C 208.83.223.34 "
+        + "208.83.223.34 four-four-three 80");
+  }
+
+  @Test()
+  public void testDirPort0() throws DescriptorParseException {
+    /* This test doesn't fail, because we're accepting DirPort 0, even
+     * though it doesn't make sense from Tor's view. */
+    VoteBuilder.createWithDirSourceLine("dir-source urras "
+        + "80550987E1D626E3EBA5E5E75A458DE0626D088C 208.83.223.34 "
+        + "208.83.223.34 0 80");
+  }
+
+  @Test(expected = DescriptorParseException.class)
+  public void testOrPortMissing() throws DescriptorParseException {
+    VoteBuilder.createWithDirSourceLine("dir-source urras "
+        + "80550987E1D626E3EBA5E5E75A458DE0626D088C 208.83.223.34 "
+        + "208.83.223.34 443 ");
+  }
+
+  @Test()
+  public void testDirPortOrPortIdentical()
+      throws DescriptorParseException {
+    /* This test doesn't fail, even though identical OR and Dir port don't
+     * make much sense from Tor's view. */
+    VoteBuilder.createWithDirSourceLine("dir-source urras "
+        + "80550987E1D626E3EBA5E5E75A458DE0626D088C 208.83.223.34 "
+        + "208.83.223.34 80 80");
+  }
+
+  @Test(expected = DescriptorParseException.class)
+  public void testDirSourceLineMissing()
+      throws DescriptorParseException {
+    VoteBuilder.createWithDirSourceLine(null);
+  }
+
+  @Test(expected = DescriptorParseException.class)
+  public void testDirSourceLineDuplicate()
+      throws DescriptorParseException {
+    VoteBuilder.createWithDirSourceLine("dir-source urras "
+        + "80550987E1D626E3EBA5E5E75A458DE0626D088C 208.83.223.34 "
+        + "208.83.223.34 443 80\ndir-source urras "
+        + "80550987E1D626E3EBA5E5E75A458DE0626D088C 208.83.223.34 "
+        + "208.83.223.34 443 80");
+  }
+
+  @Test()
+  public void testContactLineMissing()
+      throws DescriptorParseException {
+    VoteBuilder.createWithContactLine(null);
+  }
+
+  @Test(expected = DescriptorParseException.class)
+  public void testContactLineDuplicate()
+      throws DescriptorParseException {
+    VoteBuilder.createWithContactLine("contact 4096R/E012B42D Jacob "
+        + "Appelbaum <jacob at appelbaum.net>\ncontact 4096R/E012B42D Jacob "
+        + "Appelbaum <jacob at appelbaum.net>");
+  }
+
+  @Test(expected = DescriptorParseException.class)
+  public void testDirKeyCertificateVersionLineMissing()
+      throws DescriptorParseException {
+    VoteBuilder.createWithDirKeyCertificateVersionLine(null);
+  }
+
+  @Test(expected = DescriptorParseException.class)
+  public void testDirKeyCertificateVersionLineDuplicate()
+      throws DescriptorParseException {
+    VoteBuilder.createWithDirKeyCertificateVersionLine(
+        "dir-key-certificate-version 3\ndir-key-certificate-version 3");
+  }
+
+  @Test(expected = DescriptorParseException.class)
+  public void testFingerprintLineMissing()
+      throws DescriptorParseException {
+    VoteBuilder.createWithFingerprintLine(null);
+  }
+
+  @Test(expected = DescriptorParseException.class)
+  public void testFingerprintLineDuplicate()
+      throws DescriptorParseException {
+    VoteBuilder.createWithFingerprintLine("fingerprint "
+        + "80550987E1D626E3EBA5E5E75A458DE0626D088C\nfingerprint "
+        + "80550987E1D626E3EBA5E5E75A458DE0626D088C");
+  }
+
+  @Test(expected = DescriptorParseException.class)
+  public void testFingerprintLineTooLong()
+      throws DescriptorParseException {
+    VoteBuilder.createWithFingerprintLine("fingerprint "
+        + "80550987E1D626E3EBA5E5E75A458DE0626D088C8055");
+  }
+
+  @Test(expected = DescriptorParseException.class)
+  public void testFingerprintLineTooShort()
+      throws DescriptorParseException {
+    VoteBuilder.createWithFingerprintLine("fingerprint "
+        + "80550987E1D626E3EBA5E5E75A458DE0626D");
+  }
+
+  @Test(expected = DescriptorParseException.class)
+  public void testDirKeyPublished3011()
+      throws DescriptorParseException {
+    VoteBuilder.createWithDirKeyPublishedLine("dir-key-published "
+        + "3011-04-27 05:34:37");
+  }
+
+  @Test(expected = DescriptorParseException.class)
+  public void testDirKeyPublishedRecentlyAtNoon()
+      throws DescriptorParseException {
+    VoteBuilder.createWithDirKeyPublishedLine("dir-key-published "
+        + "recently 12:00:00");
+  }
+
+  @Test(expected = DescriptorParseException.class)
+  public void testDirKeyPublishedRecentlyNoTime()
+      throws DescriptorParseException {
+    VoteBuilder.createWithDirKeyPublishedLine("dir-key-published "
+        + "recently");
+  }
+
+  @Test(expected = DescriptorParseException.class)
+  public void testDirKeyExpiresSoonAtNoon()
+      throws DescriptorParseException {
+    VoteBuilder.createWithDirKeyExpiresLine("dir-key-expires "
+        + "soon 12:00:00");
+  }
+
+  @Test(expected = DescriptorParseException.class)
+  public void testDirKeyExpiresLineMissing()
+      throws DescriptorParseException {
+    VoteBuilder.createWithDirKeyExpiresLine(null);
+  }
+
+  @Test(expected = DescriptorParseException.class)
+  public void testDirKeyExpiresLineDuplicate()
+      throws DescriptorParseException {
+    VoteBuilder.createWithDirKeyExpiresLine("dir-key-expires 2012-04-27 "
+        + "05:34:37\ndir-key-expires 2012-04-27 05:34:37");
+  }
+
+  @Test(expected = DescriptorParseException.class)
+  public void testDirIdentityKeyLinesMissing()
+      throws DescriptorParseException {
+    VoteBuilder.createWithDirIdentityKeyLines(null);
+  }
+
+  @Test(expected = DescriptorParseException.class)
+  public void testDirSigningKeyLinesMissing()
+      throws DescriptorParseException {
+    VoteBuilder.createWithDirSigningKeyLines(null);
+  }
+
+  @Test()
+  public void testDirKeyCrosscertLinesMissing()
+      throws DescriptorParseException {
+    VoteBuilder.createWithDirKeyCrosscertLines(null);
+  }
+
+  @Test(expected = DescriptorParseException.class)
+  public void testDirKeyCertificationLinesMissing()
+      throws DescriptorParseException {
+    VoteBuilder.createWithDirKeyCertificationLines(null);
+  }
+
+  @Test(expected = DescriptorParseException.class)
+  public void testDirectoryFooterLineMissing()
+      throws DescriptorParseException {
+    VoteBuilder.createWithDirectoryFooterLine(null);
+  }
+
+  @Test(expected = DescriptorParseException.class)
+  public void testDirectorySignaturesLinesMissing()
+      throws DescriptorParseException {
+    VoteBuilder.createWithDirectorySignatureLines(null);
+  }
 }
 





More information about the tor-commits mailing list