mirror of
https://github.com/tahoe-lafs/tahoe-lafs.git
synced 2024-12-23 23:02:25 +00:00
repairer: assert that the test code isn't accidentally allowing the repairer code which is being tested to do impossible things
This commit is contained in:
parent
ebee8ee9f4
commit
cd0af638f3
@ -827,7 +827,7 @@ class ShareManglingMixin(SystemTestMixin):
|
||||
|
||||
return shares
|
||||
|
||||
def replace_shares(self, newshares):
|
||||
def replace_shares(self, newshares, storage_index):
|
||||
"""Replace shares on disk. Takes a dictionary in the same form
|
||||
as find_shares() returns."""
|
||||
|
||||
@ -843,9 +843,12 @@ class ShareManglingMixin(SystemTestMixin):
|
||||
else:
|
||||
pathtosharefile = os.path.join(sharedir, dirp, fn)
|
||||
os.unlink(pathtosharefile)
|
||||
newdata = newshares.get((i, sharenum))
|
||||
if newdata is not None:
|
||||
open(pathtosharefile, "w").write(newdata)
|
||||
for ((clientnum, sharenum), newdata) in newshares.iteritems():
|
||||
if clientnum == i:
|
||||
fullsharedirp=os.path.join(sharedir, storage_index[:2], storage_index)
|
||||
fileutil.make_dirs(fullsharedirp)
|
||||
wf = open(os.path.join(fullsharedirp, str(sharenum)), "w")
|
||||
wf.write(newdata)
|
||||
|
||||
class ShouldFailMixin:
|
||||
def shouldFail(self, expected_failure, which, substring,
|
||||
|
@ -1,6 +1,7 @@
|
||||
from allmydata.immutable import upload
|
||||
from allmydata.immutable import encode, upload
|
||||
from allmydata.test.common import SystemTestMixin, ShareManglingMixin
|
||||
from allmydata.util import testutil
|
||||
from allmydata.interfaces import IURI
|
||||
from twisted.internet import defer
|
||||
from twisted.trial import unittest
|
||||
import random, struct
|
||||
@ -19,7 +20,7 @@ class Test(ShareManglingMixin, unittest.TestCase):
|
||||
def _upload_a_file(ignored):
|
||||
d2 = self.clients[0].upload(upload.Data(TEST_DATA, convergence=""))
|
||||
def _after_upload(u):
|
||||
self.uri = u.uri
|
||||
self.uri = IURI(u.uri)
|
||||
return self.clients[0].create_node_from_uri(self.uri)
|
||||
d2.addCallback(_after_upload)
|
||||
return d2
|
||||
@ -49,7 +50,7 @@ class Test(ShareManglingMixin, unittest.TestCase):
|
||||
else:
|
||||
k = random.choice(ks)
|
||||
del shares[k]
|
||||
self.replace_shares(shares)
|
||||
self.replace_shares(shares, storage_index=self.uri.storage_index)
|
||||
|
||||
return unused
|
||||
|
||||
@ -69,7 +70,7 @@ class Test(ShareManglingMixin, unittest.TestCase):
|
||||
corrupteddata = data[:0xc]+corruptedsharedata+data[0xc+size:]
|
||||
shares[k] = corrupteddata
|
||||
|
||||
self.replace_shares(shares)
|
||||
self.replace_shares(shares, storage_index=self.uri.storage_index)
|
||||
|
||||
return unused
|
||||
|
||||
@ -85,7 +86,7 @@ class Test(ShareManglingMixin, unittest.TestCase):
|
||||
return res
|
||||
|
||||
d.addCallback(_stash_it)
|
||||
d.addCallback(self.replace_shares)
|
||||
d.addCallback(self.replace_shares, storage_index=self.uri.storage_index)
|
||||
|
||||
def _compare(res):
|
||||
oldshares = stash[0]
|
||||
@ -95,10 +96,43 @@ class Test(ShareManglingMixin, unittest.TestCase):
|
||||
d.addCallback(self.find_shares)
|
||||
d.addCallback(_compare)
|
||||
|
||||
d.addCallback(lambda ignore: self.replace_shares({}))
|
||||
d.addCallback(lambda ignore: self.replace_shares({}, storage_index=self.uri.storage_index))
|
||||
d.addCallback(self.find_shares)
|
||||
d.addCallback(lambda x: self.failUnlessEqual(x, {}))
|
||||
|
||||
# The following process of deleting 8 of the shares and asserting that you can't
|
||||
# download it is more to test this test code than to test the Tahoe code...
|
||||
def _then_delete_8(unused=None):
|
||||
self.replace_shares(stash[0], storage_index=self.uri.storage_index)
|
||||
for sharenum in range(2, 10):
|
||||
self._delete_a_share()
|
||||
d.addCallback(_then_delete_8)
|
||||
|
||||
def _then_download(unused=None):
|
||||
self.downloader = self.clients[1].getServiceNamed("downloader")
|
||||
d = self.downloader.download_to_data(self.uri)
|
||||
|
||||
def _after_download_callb(result):
|
||||
self.fail() # should have gotten an errback instead
|
||||
return result
|
||||
def _after_download_errb(failure):
|
||||
failure.trap(encode.NotEnoughSharesError)
|
||||
return None # success!
|
||||
d.addCallbacks(_after_download_callb, _after_download_errb)
|
||||
d.addCallback(_then_download)
|
||||
|
||||
# The following process of leaving 8 of the shares deleted and asserting that you can't
|
||||
# repair it is more to test this test code than to test the Tahoe code...
|
||||
def _then_repair(unused=None):
|
||||
d2 = self.filenode.check_and_repair(verify=False)
|
||||
def _after_repair(checkandrepairresults):
|
||||
prerepairres = checkandrepairresults.get_pre_repair_results()
|
||||
postrepairres = checkandrepairresults.get_post_repair_results()
|
||||
self.failIf(prerepairres.is_healthy())
|
||||
self.failIf(postrepairres.is_healthy())
|
||||
d2.addCallback(_after_repair)
|
||||
return d2
|
||||
d.addCallback(_then_repair)
|
||||
return d
|
||||
|
||||
def _count_reads(self):
|
||||
@ -148,7 +182,7 @@ class Test(ShareManglingMixin, unittest.TestCase):
|
||||
d.addCallback(_check2)
|
||||
return d
|
||||
|
||||
d.addCallback(lambda ignore: self.replace_shares({}))
|
||||
d.addCallback(lambda ignore: self.replace_shares({}, storage_index=self.uri.storage_index))
|
||||
def _check3(ignored):
|
||||
before_check_reads = self._count_reads()
|
||||
d2 = self.filenode.check(verify=False)
|
||||
@ -239,7 +273,7 @@ class Test(ShareManglingMixin, unittest.TestCase):
|
||||
# assert that it succeeds at downloading and has the right contents. This can't
|
||||
# work unless it has already repaired the previously-deleted share #2.
|
||||
for sharenum in range(3, 10):
|
||||
self._delete_a_share(sharenum)
|
||||
self._delete_a_share(sharenum=sharenum)
|
||||
|
||||
return self._download_and_check_plaintext()
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user