From: Brian Warner <warner@allmydata.com>
Date: Tue, 17 Apr 2007 00:15:44 +0000 (-0700)
Subject: download: validate handling of missing sharehashes too
X-Git-Tag: tahoe_v0.1.0-0-UNSTABLE~91
X-Git-Url: https://git.rkrishnan.org/vdrive/listings/install-details.html?a=commitdiff_plain;h=2f5fb518485e30fddb3a88f9154d915cfd8977ab;p=tahoe-lafs%2Ftahoe-lafs.git

download: validate handling of missing sharehashes too
---

diff --git a/src/allmydata/test/test_encode.py b/src/allmydata/test/test_encode.py
index eb311037..fcbcabca 100644
--- a/src/allmydata/test/test_encode.py
+++ b/src/allmydata/test/test_encode.py
@@ -94,6 +94,11 @@ class FakeBucketWriter:
             hashes = self.share_hashes[:]
             hashes[1] = (hashes[1][0], self.flip_bit(hashes[1][1]))
             return hashes
+        if self.mode == "missing sharehash":
+            # one sneaky attack would be to pretend we don't know our own
+            # sharehash, which could manage to frame someone else.
+            # download.py is supposed to guard against this case.
+            return []
         return self.share_hashes
 
 
@@ -256,3 +261,26 @@ class Roundtrip(unittest.TestCase):
         d.addBoth(_done)
         return d
 
+    def test_missing_sharehashes(self):
+        # the first 74 servers are missing their sharehashes, so the
+        # sharehash tree will not validate
+        modemap = dict([(i, "missing sharehash")
+                        for i in range(74)]
+                       + [(i, "good")
+                          for i in range(74, 100)])
+        return self.send_and_recover(100, bucket_modes=modemap)
+
+    def test_missing_sharehashes_failure(self):
+        # the first 76 servers are missing their sharehashes, so the
+        # sharehash tree will not validate, and the download will fail
+        modemap = dict([(i, "missing sharehash")
+                        for i in range(76)]
+                       + [(i, "good")
+                          for i in range(76, 100)])
+        d = self.send_and_recover(100, bucket_modes=modemap)
+        def _done(res):
+            self.failUnless(isinstance(res, Failure))
+            self.failUnless(res.check(download.NotEnoughPeersError))
+        d.addBoth(_done)
+        return d
+