download: validate handling of missing sharehashes too
authorBrian Warner <warner@allmydata.com>
Tue, 17 Apr 2007 00:15:44 +0000 (17:15 -0700)
committerBrian Warner <warner@allmydata.com>
Tue, 17 Apr 2007 00:15:44 +0000 (17:15 -0700)
src/allmydata/test/test_encode.py

index eb311037f5046424754116808ddd54c3660a4b1c..fcbcabca3efa97978c61e6b173ac13575055ac6b 100644 (file)
@@ -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
+