]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/blobdiff - src/allmydata/test/test_mutable.py
MDMFSlotReadProxy: remove the queue
[tahoe-lafs/tahoe-lafs.git] / src / allmydata / test / test_mutable.py
index 147f7de5adf383224ff525d0a566e8df5b66228f..14b62ee2eae13da976608c296fe3c92638671b47 100644 (file)
@@ -72,7 +72,9 @@ class FakeStorage:
         d = defer.Deferred()
         if not self._pending:
             self._pending_timer = reactor.callLater(1.0, self._fire_readers)
-        self._pending[peerid] = (d, shares)
+        if peerid not in self._pending:
+            self._pending[peerid] = []
+        self._pending[peerid].append( (d, shares) )
         return d
 
     def _fire_readers(self):
@@ -81,10 +83,11 @@ class FakeStorage:
         self._pending = {}
         for peerid in self._sequence:
             if peerid in pending:
-                d, shares = pending.pop(peerid)
+                for (d, shares) in pending.pop(peerid):
+                    eventually(d.callback, shares)
+        for peerid in pending:
+            for (d, shares) in pending[peerid]:
                 eventually(d.callback, shares)
-        for (d, shares) in pending.values():
-            eventually(d.callback, shares)
 
     def write(self, peerid, storage_index, shnum, offset, data):
         if peerid not in self._peers:
@@ -3266,10 +3269,21 @@ class Version(GridTestMixin, unittest.TestCase, testutil.ShouldFailMixin, \
 
 
     def test_partial_read(self):
-        # read only a few bytes at a time, and see that the results are
-        # what we expect.
         d = self.do_upload_mdmf()
         d.addCallback(lambda ign: self.mdmf_node.get_best_readable_version())
+        modes = [("start_on_segment_boundary",
+                  mathutil.next_multiple(128 * 1024, 3), 50),
+                 ("ending_one_byte_after_segment_boundary",
+                  mathutil.next_multiple(128 * 1024, 3)-50, 51),
+                 ("zero_length_at_start", 0, 0),
+                 ("zero_length_in_middle", 50, 0),
+                 ("zero_length_at_segment_boundary",
+                  mathutil.next_multiple(128 * 1024, 3), 0),
+                 ]
+        for (name, offset, length) in modes:
+            d.addCallback(self._do_partial_read, name, offset, length)
+        # then read only a few bytes at a time, and see that the results are
+        # what we expect.
         def _read_data(version):
             c = consumer.MemoryConsumer()
             d2 = defer.succeed(None)
@@ -3280,14 +3294,9 @@ class Version(GridTestMixin, unittest.TestCase, testutil.ShouldFailMixin, \
             return d2
         d.addCallback(_read_data)
         return d
-
-
-    def _test_partial_read(self, offset, length):
-        d = self.do_upload_mdmf()
-        d.addCallback(lambda ign: self.mdmf_node.get_best_readable_version())
+    def _do_partial_read(self, version, name, offset, length):
         c = consumer.MemoryConsumer()
-        d.addCallback(lambda version:
-            version.read(c, offset, length))
+        d = version.read(c, offset, length)
         expected = self.data[offset:offset+length]
         d.addCallback(lambda ignored: "".join(c.chunks))
         def _check(results):
@@ -3295,30 +3304,11 @@ class Version(GridTestMixin, unittest.TestCase, testutil.ShouldFailMixin, \
                 print
                 print "got: %s ... %s" % (results[:20], results[-20:])
                 print "exp: %s ... %s" % (expected[:20], expected[-20:])
-                self.fail("results != expected")
+                self.fail("results[%s] != expected" % name)
+            return version # daisy-chained to next call
         d.addCallback(_check)
         return d
 
-    def test_partial_read_starting_on_segment_boundary(self):
-        return self._test_partial_read(mathutil.next_multiple(128 * 1024, 3), 50)
-
-    def test_partial_read_ending_one_byte_after_segment_boundary(self):
-        return self._test_partial_read(mathutil.next_multiple(128 * 1024, 3)-50, 51)
-
-    def test_partial_read_zero_length_at_start(self):
-        return self._test_partial_read(0, 0)
-
-    def test_partial_read_zero_length_in_middle(self):
-        return self._test_partial_read(50, 0)
-
-    def test_partial_read_zero_length_at_segment_boundary(self):
-        return self._test_partial_read(mathutil.next_multiple(128 * 1024, 3), 0)
-
-    # XXX factor these into a single upload after they pass
-    _broken = "zero-length reads of mutable files don't work"
-    test_partial_read_zero_length_at_start.todo = _broken
-    test_partial_read_zero_length_in_middle.todo = _broken
-    test_partial_read_zero_length_at_segment_boundary.todo = _broken
 
     def _test_read_and_download(self, node, expected):
         d = node.get_best_readable_version()