immutable: repairer: add a simple test to exercise the "leftover" code path, fix...
authorZooko O'Whielacronx <zooko@zooko.com>
Tue, 10 Feb 2009 19:12:45 +0000 (12:12 -0700)
committerZooko O'Whielacronx <zooko@zooko.com>
Tue, 10 Feb 2009 19:12:45 +0000 (12:12 -0700)
src/allmydata/immutable/repairer.py
src/allmydata/test/test_repairer.py

index 1fae5cd6cf70cb89740c8a11e58313b11a7bfc79..880188c8b83334d04ec5a9f4095e50573973fae2 100644 (file)
@@ -139,9 +139,9 @@ class DownUpConnector(log.PrefixingLogMixin):
                 res.append(nextbuf)
                 ressize += len(nextbuf)
                 if ressize > nrl:
-                    leftover = ressize - nrl
-                    self.bufs.appendleft(nextbuf[leftover:])
-                    res[-1] = nextbuf[:leftover]
+                    extra = ressize - nrl
+                    self.bufs.appendleft(nextbuf[:-extra])
+                    res[-1] = nextbuf[:-extra]
             self.bufsiz -= nrl
             if self.bufsiz < self.buflim and self.producer:
                 self.producer.resumeProducing()
index cea1713c848dfcbc143428c15ad6e67186caf455..d15f2eaef872c9cb9de79ab3b1760e1d3ef9bbe1 100644 (file)
@@ -353,6 +353,20 @@ class DownUpConnector(unittest.TestCase):
         duc.write('\x02')
         return d
 
+    def test_leftovers(self):
+        duc = repairer.DownUpConnector()
+        duc.registerProducer(None, True) # just because you have to call registerProducer first
+        # case 1: total data in buf is < requested data at time of request
+        duc.write('\x01')
+        d = duc.read_encrypted(2, False)
+        def _then(data):
+            self.failUnlessEqual(len(data), 2)
+            self.failUnlessEqual(data[0], '\x01')
+            self.failUnlessEqual(data[1], '\x02')
+        d.addCallback(_then)
+        duc.write('\x02\0x03')
+        return d
+
 class Repairer(common.ShareManglingMixin, unittest.TestCase):
     def test_test_code(self):
         # The following process of stashing the shares, running