]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/blobdiff - src/allmydata/test/test_mutable.py
debugprint the values of blocks and hashes thereof; make the test data and the seg...
[tahoe-lafs/tahoe-lafs.git] / src / allmydata / test / test_mutable.py
index 1dc87b984a1bafd5c20b40131599986fbcd779f0..0facb7d857b2b4b498cfd77a419dad0139a9fc44 100644 (file)
@@ -190,7 +190,7 @@ def corrupt(res, s, offset, shnums_to_corrupt=None, offset_offset=0):
             reader = MDMFSlotReadProxy(None, None, shnum, data)
             # We need to get the offsets for the next part.
             d = reader.get_verinfo()
-            def _do_corruption(verinfo, data, shnum):
+            def _do_corruption(verinfo, data, shnum, shares):
                 (seqnum,
                  root_hash,
                  IV,
@@ -215,7 +215,7 @@ def corrupt(res, s, offset, shnums_to_corrupt=None, offset_offset=0):
                 else:
                     f = flip_bit
                 shares[shnum] = f(data, real_offset)
-            d.addCallback(_do_corruption, data, shnum)
+            d.addCallback(_do_corruption, data, shnum, shares)
             ds.append(d)
     dl = defer.DeferredList(ds)
     dl.addCallback(lambda ignored: res)
@@ -239,7 +239,7 @@ def make_nodemaker(s=None, num_peers=10):
     keygen.set_default_keysize(TEST_RSA_KEY_SIZE)
     nodemaker = NodeMaker(storage_broker, sh, None,
                           None, None,
-                          {"k": 3, "n": 10}, keygen)
+                          {"k": 3, "n": 10}, SDMF_VERSION, keygen)
     return nodemaker
 
 class Filenode(unittest.TestCase, testutil.ShouldFailMixin):
@@ -283,7 +283,7 @@ class Filenode(unittest.TestCase, testutil.ShouldFailMixin):
         self.nodemaker.default_encoding_parameters['n'] = 1
         d = defer.succeed(None)
         for v in (SDMF_VERSION, MDMF_VERSION):
-            d.addCallback(lambda ignored:
+            d.addCallback(lambda ignored, v=v:
                 self.nodemaker.create_mutable_file(version=v))
             def _created(n):
                 self.failUnless(isinstance(n, MutableFileNode))
@@ -375,28 +375,6 @@ class Filenode(unittest.TestCase, testutil.ShouldFailMixin):
         return d
 
 
-    def test_create_from_mdmf_writecap_with_extensions(self):
-        # Test that the nodemaker is capable of creating an MDMF
-        # filenode when given a writecap with extension parameters in
-        # them.
-        d = self.nodemaker.create_mutable_file(version=MDMF_VERSION)
-        def _created(n):
-            self.failUnless(isinstance(n, MutableFileNode))
-            s = n.get_uri()
-            # We need to cheat a little and delete the nodemaker's
-            # cache, otherwise we'll get the same node instance back.
-            self.failUnlessIn(":3:131073", s)
-            n2 = self.nodemaker.create_from_cap(s)
-
-            self.failUnlessEqual(n2.get_storage_index(), n.get_storage_index())
-            self.failUnlessEqual(n.get_writekey(), n2.get_writekey())
-            hints = n2._downloader_hints
-            self.failUnlessEqual(hints['k'], 3)
-            self.failUnlessEqual(hints['segsize'], 131073)
-        d.addCallback(_created)
-        return d
-
-
     def test_create_from_mdmf_readcap(self):
         d = self.nodemaker.create_mutable_file(version=MDMF_VERSION)
         def _created(n):
@@ -411,26 +389,6 @@ class Filenode(unittest.TestCase, testutil.ShouldFailMixin):
         return d
 
 
-    def test_create_from_mdmf_readcap_with_extensions(self):
-        # We should be able to create an MDMF filenode with the
-        # extension parameters without it breaking.
-        d = self.nodemaker.create_mutable_file(version=MDMF_VERSION)
-        def _created(n):
-            self.failUnless(isinstance(n, MutableFileNode))
-            s = n.get_readonly_uri()
-            self.failUnlessIn(":3:131073", s)
-
-            n2 = self.nodemaker.create_from_cap(s)
-            self.failUnless(isinstance(n2, MutableFileNode))
-            self.failUnless(n2.is_readonly())
-            self.failUnlessEqual(n.get_storage_index(), n2.get_storage_index())
-            hints = n2._downloader_hints
-            self.failUnlessEqual(hints["k"], 3)
-            self.failUnlessEqual(hints["segsize"], 131073)
-        d.addCallback(_created)
-        return d
-
-
     def test_internal_version_from_cap(self):
         # MutableFileNodes and MutableFileVersions have an internal
         # switch that tells them whether they're dealing with an SDMF or
@@ -606,6 +564,9 @@ class Filenode(unittest.TestCase, testutil.ShouldFailMixin):
         d = self.nodemaker.create_mutable_file(version=MDMF_VERSION)
         def _created(node):
             self.uri = node.get_uri()
+            # also confirm that the cap has no extension fields
+            pieces = self.uri.split(":")
+            self.failUnlessEqual(len(pieces), 4)
 
             return node.overwrite(MutableData("contents1" * 100000))
         def _then(ignored):
@@ -619,37 +580,6 @@ class Filenode(unittest.TestCase, testutil.ShouldFailMixin):
         return d
 
 
-    def test_create_and_download_from_bare_mdmf_cap(self):
-        # MDMF caps have extension parameters on them by default. We
-        # need to make sure that they work without extension parameters.
-        contents = MutableData("contents" * 100000)
-        d = self.nodemaker.create_mutable_file(version=MDMF_VERSION,
-                                               contents=contents)
-        def _created(node):
-            uri = node.get_uri()
-            self._created = node
-            self.failUnlessIn(":3:131073", uri)
-            # Now strip that off the end of the uri, then try creating
-            # and downloading the node again.
-            bare_uri = uri.replace(":3:131073", "")
-            assert ":3:131073" not in bare_uri
-
-            return self.nodemaker.create_from_cap(bare_uri)
-        d.addCallback(_created)
-        def _created_bare(node):
-            self.failUnlessEqual(node.get_writekey(),
-                                 self._created.get_writekey())
-            self.failUnlessEqual(node.get_readkey(),
-                                 self._created.get_readkey())
-            self.failUnlessEqual(node.get_storage_index(),
-                                 self._created.get_storage_index())
-            return node.download_best_version()
-        d.addCallback(_created_bare)
-        d.addCallback(lambda data:
-            self.failUnlessEqual(data, "contents" * 100000))
-        return d
-
-
     def test_mdmf_write_count(self):
         # Publishing an MDMF file should only cause one write for each
         # share that is to be published. Otherwise, we introduce
@@ -2533,7 +2463,6 @@ class Problems(GridTestMixin, unittest.TestCase, testutil.ShouldFailMixin):
         return self.do_publish_surprise(SDMF_VERSION)
 
     def test_publish_surprise_mdmf(self):
-        raise unittest.SkipTest("this currently triggers a decoding error in unpack_checkstring (see #1534)")
         return self.do_publish_surprise(MDMF_VERSION)
 
     def test_retrieve_surprise(self):
@@ -2943,7 +2872,7 @@ class Version(GridTestMixin, unittest.TestCase, testutil.ShouldFailMixin, \
         self.set_up_grid()
         self.c = self.g.clients[0]
         self.nm = self.c.nodemaker
-        self.data = "test data" * 100000 # about 900 KiB; MDMF
+        self.data = "test data" * 32 # about 900 KiB; MDMF
         self.small_data = "test data" * 10 # about 90 B; SDMF
 
 
@@ -3069,62 +2998,6 @@ class Version(GridTestMixin, unittest.TestCase, testutil.ShouldFailMixin, \
         return d
 
 
-    def test_version_extension_api(self):
-        # We need to define an API by which an uploader can set the
-        # extension parameters, and by which a downloader can retrieve
-        # extensions.
-        d = self.do_upload_mdmf()
-        d.addCallback(lambda ign: self.mdmf_node.get_best_mutable_version())
-        def _got_version(version):
-            hints = version.get_downloader_hints()
-            # Should be empty at this point.
-            self.failUnlessIn("k", hints)
-            self.failUnlessEqual(hints['k'], 3)
-            self.failUnlessIn('segsize', hints)
-            self.failUnlessEqual(hints['segsize'], 131073)
-        d.addCallback(_got_version)
-        return d
-
-
-    def test_extensions_from_cap(self):
-        # If we initialize a mutable file with a cap that has extension
-        # parameters in it and then grab the extension parameters using
-        # our API, we should see that they're set correctly.
-        d = self.do_upload_mdmf()
-        def _then(ign):
-            mdmf_uri = self.mdmf_node.get_uri()
-            new_node = self.nm.create_from_cap(mdmf_uri)
-            return new_node.get_best_mutable_version()
-        d.addCallback(_then)
-        def _got_version(version):
-            hints = version.get_downloader_hints()
-            self.failUnlessIn("k", hints)
-            self.failUnlessEqual(hints["k"], 3)
-            self.failUnlessIn("segsize", hints)
-            self.failUnlessEqual(hints["segsize"], 131073)
-        d.addCallback(_got_version)
-        return d
-
-
-    def test_extensions_from_upload(self):
-        # If we create a new mutable file with some contents, we should
-        # get back an MDMF cap with the right hints in place.
-        contents = "foo bar baz" * 100000
-        d = self.nm.create_mutable_file(contents, version=MDMF_VERSION)
-        def _got_mutable_file(n):
-            rw_uri = n.get_uri()
-            expected_k = str(self.c.DEFAULT_ENCODING_PARAMETERS['k'])
-            self.failUnlessIn(expected_k, rw_uri)
-            # XXX: Get this more intelligently.
-            self.failUnlessIn("131073", rw_uri)
-
-            ro_uri = n.get_readonly_uri()
-            self.failUnlessIn(expected_k, ro_uri)
-            self.failUnlessIn("131073", ro_uri)
-        d.addCallback(_got_mutable_file)
-        return d
-
-
     def test_cap_after_upload(self):
         # If we create a new mutable file and upload things to it, and
         # it's an MDMF file, we should get an MDMF cap back from that
@@ -3372,7 +3245,7 @@ class Update(GridTestMixin, unittest.TestCase, testutil.ShouldFailMixin):
         self.set_up_grid()
         self.c = self.g.clients[0]
         self.nm = self.c.nodemaker
-        self.data = "testdata " * 100000 # about 900 KiB; MDMF
+        self.data = "testdata " * 30 # about 900 KiB; MDMF
         self.small_data = "test data" * 10 # about 90 B; SDMF
 
 
@@ -3416,12 +3289,13 @@ class Update(GridTestMixin, unittest.TestCase, testutil.ShouldFailMixin):
         def _run(ign):
             d = defer.succeed(None)
             for node in (self.mdmf_node, self.mdmf_max_shares_node):
-                d.addCallback(lambda ign: node.get_best_mutable_version())
+                # close over 'node'.
+                d.addCallback(lambda ign, node=node:
+                              node.get_best_mutable_version())
                 d.addCallback(lambda mv:
-                    mv.update(MutableData(new_data), offset))
-                # close around node.
-                d.addCallback(lambda ignored, node=node:
-                    node.download_best_version())
+                              mv.update(MutableData(new_data), offset))
+                d.addCallback(lambda ign, node=node:
+                              node.download_best_version())
                 def _check(results):
                     if results != expected:
                         print
@@ -3566,13 +3440,15 @@ class Update(GridTestMixin, unittest.TestCase, testutil.ShouldFailMixin):
         def _run(ign):
             d = defer.succeed(None)
             for node in (self.mdmf_node, self.mdmf_max_shares_node):
-                d.addCallback(lambda ign: node.get_best_mutable_version())
+                # close over 'node'.
+                d.addCallback(lambda ign, node=node:
+                              node.get_best_mutable_version())
                 d.addCallback(lambda mv:
-                    mv.update(MutableData(segment * 2), len(self.data)))
-                d.addCallback(lambda ignored, node=node:
-                    node.download_best_version())
+                              mv.update(MutableData(segment * 2), len(self.data)))
+                d.addCallback(lambda ign, node=node:
+                              node.download_best_version())
                 d.addCallback(lambda results:
-                    self.failUnlessEqual(results, new_data))
+                              self.failUnlessEqual(results, new_data))
             return d
         d0.addCallback(_run)
         return d0
@@ -3584,13 +3460,15 @@ class Update(GridTestMixin, unittest.TestCase, testutil.ShouldFailMixin):
         def _run(ign):
             d = defer.succeed(None)
             for node in (self.sdmf_node, self.sdmf_max_shares_node):
-                d.addCallback(lambda ign: node.get_best_mutable_version())
+                # close over 'node'.
+                d.addCallback(lambda ign, node=node:
+                              node.get_best_mutable_version())
                 d.addCallback(lambda mv:
-                    mv.update(MutableData("appended"), len(self.small_data)))
-                d.addCallback(lambda ignored, node=node:
-                    node.download_best_version())
+                              mv.update(MutableData("appended"), len(self.small_data)))
+                d.addCallback(lambda ign, node=node:
+                              node.download_best_version())
                 d.addCallback(lambda results:
-                    self.failUnlessEqual(results, new_data))
+                              self.failUnlessEqual(results, new_data))
             return d
         d0.addCallback(_run)
         return d0
@@ -3606,13 +3484,15 @@ class Update(GridTestMixin, unittest.TestCase, testutil.ShouldFailMixin):
         def _run(ign):
             d = defer.succeed(None)
             for node in (self.mdmf_node, self.mdmf_max_shares_node):
-                d.addCallback(lambda ign: node.get_best_mutable_version())
+                # close over 'node'.
+                d.addCallback(lambda ign, node=node:
+                              node.get_best_mutable_version())
                 d.addCallback(lambda mv:
-                    mv.update(MutableData("replaced"), replace_offset))
-                d.addCallback(lambda ignored, node=node:
-                    node.download_best_version())
+                              mv.update(MutableData("replaced"), replace_offset))
+                d.addCallback(lambda ign, node=node:
+                              node.download_best_version())
                 d.addCallback(lambda results:
-                    self.failUnlessEqual(results, new_data))
+                              self.failUnlessEqual(results, new_data))
             return d
         d0.addCallback(_run)
         return d0
@@ -3629,14 +3509,16 @@ class Update(GridTestMixin, unittest.TestCase, testutil.ShouldFailMixin):
         def _run(ign):
             d = defer.succeed(None)
             for node in (self.mdmf_node, self.mdmf_max_shares_node):
-                d.addCallback(lambda ign: node.get_best_mutable_version())
+                # close over 'node'.
+                d.addCallback(lambda ign, node=node:
+                              node.get_best_mutable_version())
                 d.addCallback(lambda mv:
-                    mv.update(MutableData((2 * new_segment) + "replaced"),
-                              replace_offset))
+                              mv.update(MutableData((2 * new_segment) + "replaced"),
+                                        replace_offset))
                 d.addCallback(lambda ignored, node=node:
-                    node.download_best_version())
+                              node.download_best_version())
                 d.addCallback(lambda results:
-                    self.failUnlessEqual(results, new_data))
+                              self.failUnlessEqual(results, new_data))
             return d
         d0.addCallback(_run)
         return d0