mirror of
https://github.com/tahoe-lafs/tahoe-lafs.git
synced 2025-01-19 19:26:25 +00:00
dirnode: add tests of literal dirnodes (current and fix for #948)
This commit is contained in:
parent
fec9185f2a
commit
187d837c1d
@ -3,6 +3,7 @@ import time
|
||||
from zope.interface import implements
|
||||
from twisted.trial import unittest
|
||||
from twisted.internet import defer
|
||||
from twisted.internet.interfaces import IConsumer
|
||||
from allmydata import uri, dirnode
|
||||
from allmydata.client import Client
|
||||
from allmydata.immutable import upload
|
||||
@ -23,6 +24,28 @@ from allmydata.nodemaker import NodeMaker
|
||||
from base64 import b32decode
|
||||
import common_util as testutil
|
||||
|
||||
class MemAccum:
|
||||
implements(IConsumer)
|
||||
def registerProducer(self, producer, streaming):
|
||||
self.producer = producer
|
||||
self.producer.resumeProducing()
|
||||
pass
|
||||
def unregisterProducer(self):
|
||||
pass
|
||||
def write(self, data):
|
||||
assert not hasattr(self, 'data')
|
||||
self.data = data
|
||||
self.producer.resumeProducing()
|
||||
|
||||
setup_py_uri = "URI:CHK:n7r3m6wmomelk4sep3kw5cvduq:os7ijw5c3maek7pg65e5254k2fzjflavtpejjyhshpsxuqzhcwwq:3:20:14861"
|
||||
one_uri = "URI:LIT:n5xgk" # LIT for "one"
|
||||
mut_write_uri = "URI:SSK:vfvcbdfbszyrsaxchgevhmmlii:euw4iw7bbnkrrwpzuburbhppuxhc3gwxv26f6imekhz7zyw2ojnq"
|
||||
empty_litdir_uri = "URI:DIR2-LIT:"
|
||||
tiny_litdir_uri = "URI:DIR2-LIT:gqytunj2onug64tufqzdcosvkjetutcjkq5gw4tvm5vwszdgnz5hgyzufqydulbshj5x2lbm" # contains one child which is itself also LIT
|
||||
mut_read_uri = "URI:SSK-RO:jf6wkflosyvntwxqcdo7a54jvm:euw4iw7bbnkrrwpzuburbhppuxhc3gwxv26f6imekhz7zyw2ojnq"
|
||||
future_write_uri = "x-tahoe-crazy://I_am_from_the_future."
|
||||
future_read_uri = "x-tahoe-crazy-readonly://I_am_from_the_future."
|
||||
|
||||
class Dirnode(GridTestMixin, unittest.TestCase,
|
||||
testutil.ShouldFailMixin, testutil.StallMixin, ErrorMixin):
|
||||
timeout = 240 # It takes longer than 120 seconds on Francois's arm box.
|
||||
@ -50,18 +73,14 @@ class Dirnode(GridTestMixin, unittest.TestCase,
|
||||
c = self.g.clients[0]
|
||||
nm = c.nodemaker
|
||||
|
||||
setup_py_uri = "URI:CHK:n7r3m6wmomelk4sep3kw5cvduq:os7ijw5c3maek7pg65e5254k2fzjflavtpejjyhshpsxuqzhcwwq:3:20:14861"
|
||||
one_uri = "URI:LIT:n5xgk" # LIT for "one"
|
||||
mut_write_uri = "URI:SSK:vfvcbdfbszyrsaxchgevhmmlii:euw4iw7bbnkrrwpzuburbhppuxhc3gwxv26f6imekhz7zyw2ojnq"
|
||||
mut_read_uri = "URI:SSK-RO:jf6wkflosyvntwxqcdo7a54jvm:euw4iw7bbnkrrwpzuburbhppuxhc3gwxv26f6imekhz7zyw2ojnq"
|
||||
future_write_uri = "x-tahoe-crazy://I_am_from_the_future."
|
||||
future_read_uri = "x-tahoe-crazy-readonly://I_am_from_the_future."
|
||||
kids = {u"one": (nm.create_from_cap(one_uri), {}),
|
||||
u"two": (nm.create_from_cap(setup_py_uri),
|
||||
{"metakey": "metavalue"}),
|
||||
u"mut": (nm.create_from_cap(mut_write_uri, mut_read_uri), {}),
|
||||
u"fut": (nm.create_from_cap(future_write_uri, future_read_uri), {}),
|
||||
u"fro": (nm.create_from_cap(None, future_read_uri), {}),
|
||||
u"empty_litdir": (nm.create_from_cap(empty_litdir_uri), {}),
|
||||
u"tiny_litdir": (nm.create_from_cap(tiny_litdir_uri), {}),
|
||||
}
|
||||
d = c.create_dirnode(kids)
|
||||
|
||||
@ -78,13 +97,15 @@ class Dirnode(GridTestMixin, unittest.TestCase,
|
||||
d.addCallback(_created)
|
||||
|
||||
def _check_kids(children):
|
||||
self.failUnlessEqual(sorted(children.keys()),
|
||||
[u"fro", u"fut", u"mut", u"one", u"two"])
|
||||
self.failUnlessEqual(set(children.keys()),
|
||||
set([u"one", u"two", u"mut", u"fut", u"fro", u"empty_litdir", u"tiny_litdir"]))
|
||||
one_node, one_metadata = children[u"one"]
|
||||
two_node, two_metadata = children[u"two"]
|
||||
mut_node, mut_metadata = children[u"mut"]
|
||||
fut_node, fut_metadata = children[u"fut"]
|
||||
fro_node, fro_metadata = children[u"fro"]
|
||||
emptylit_node, emptylit_metadata = children[u"empty_litdir"]
|
||||
tinylit_node, tinylit_metadata = children[u"tiny_litdir"]
|
||||
|
||||
self.failUnlessEqual(one_node.get_size(), 3)
|
||||
self.failUnlessEqual(one_node.get_uri(), one_uri)
|
||||
@ -109,6 +130,23 @@ class Dirnode(GridTestMixin, unittest.TestCase,
|
||||
self.failUnlessEqual(fro_node.get_uri(), "ro." + future_read_uri)
|
||||
self.failUnlessEqual(fut_node.get_readonly_uri(), "ro." + future_read_uri)
|
||||
self.failUnless(isinstance(fro_metadata, dict), fro_metadata)
|
||||
|
||||
self.failIf(emptylit_node.is_unknown())
|
||||
self.failUnlessEqual(emptylit_node.get_storage_index(), None)
|
||||
self.failIf(tinylit_node.is_unknown())
|
||||
self.failUnlessEqual(tinylit_node.get_storage_index(), None)
|
||||
|
||||
d2 = defer.succeed(None)
|
||||
d2.addCallback(lambda ignored: emptylit_node.list())
|
||||
d2.addCallback(lambda children: self.failUnlessEqual(children, {}))
|
||||
d2.addCallback(lambda ignored: tinylit_node.list())
|
||||
d2.addCallback(lambda children: self.failUnlessEqual(set(children.keys()),
|
||||
set([u"short"])))
|
||||
d2.addCallback(lambda ignored: tinylit_node.list())
|
||||
d2.addCallback(lambda children: children[u"short"][0].read(MemAccum()))
|
||||
d2.addCallback(lambda accum: self.failUnlessEqual(accum.data, "The end."))
|
||||
return d2
|
||||
|
||||
d.addCallback(_check_kids)
|
||||
|
||||
d.addCallback(lambda ign: nm.create_new_mutable_directory(kids))
|
||||
@ -138,16 +176,12 @@ class Dirnode(GridTestMixin, unittest.TestCase,
|
||||
c = self.g.clients[0]
|
||||
nm = c.nodemaker
|
||||
|
||||
setup_py_uri = "URI:CHK:n7r3m6wmomelk4sep3kw5cvduq:os7ijw5c3maek7pg65e5254k2fzjflavtpejjyhshpsxuqzhcwwq:3:20:14861"
|
||||
one_uri = "URI:LIT:n5xgk" # LIT for "one"
|
||||
mut_write_uri = "URI:SSK:vfvcbdfbszyrsaxchgevhmmlii:euw4iw7bbnkrrwpzuburbhppuxhc3gwxv26f6imekhz7zyw2ojnq"
|
||||
mut_read_uri = "URI:SSK-RO:e3mdrzfwhoq42hy5ubcz6rp3o4:ybyibhnp3vvwuq2vaw2ckjmesgkklfs6ghxleztqidihjyofgw7q"
|
||||
future_write_uri = "x-tahoe-crazy://I_am_from_the_future."
|
||||
future_read_uri = "x-tahoe-crazy-readonly://I_am_from_the_future."
|
||||
kids = {u"one": (nm.create_from_cap(one_uri), {}),
|
||||
u"two": (nm.create_from_cap(setup_py_uri),
|
||||
{"metakey": "metavalue"}),
|
||||
u"fut": (nm.create_from_cap(None, future_read_uri), {}),
|
||||
u"empty_litdir": (nm.create_from_cap(empty_litdir_uri), {}),
|
||||
u"tiny_litdir": (nm.create_from_cap(tiny_litdir_uri), {}),
|
||||
}
|
||||
d = c.create_immutable_dirnode(kids)
|
||||
|
||||
@ -167,10 +201,13 @@ class Dirnode(GridTestMixin, unittest.TestCase,
|
||||
d.addCallback(_created)
|
||||
|
||||
def _check_kids(children):
|
||||
self.failUnlessEqual(sorted(children.keys()), [u"fut", u"one", u"two"])
|
||||
self.failUnlessEqual(set(children.keys()),
|
||||
set([u"one", u"two", u"fut", u"empty_litdir", u"tiny_litdir"]))
|
||||
one_node, one_metadata = children[u"one"]
|
||||
two_node, two_metadata = children[u"two"]
|
||||
fut_node, fut_metadata = children[u"fut"]
|
||||
emptylit_node, emptylit_metadata = children[u"empty_litdir"]
|
||||
tinylit_node, tinylit_metadata = children[u"tiny_litdir"]
|
||||
|
||||
self.failUnlessEqual(one_node.get_size(), 3)
|
||||
self.failUnlessEqual(one_node.get_uri(), one_uri)
|
||||
@ -186,6 +223,23 @@ class Dirnode(GridTestMixin, unittest.TestCase,
|
||||
self.failUnlessEqual(fut_node.get_uri(), "imm." + future_read_uri)
|
||||
self.failUnlessEqual(fut_node.get_readonly_uri(), "imm." + future_read_uri)
|
||||
self.failUnless(isinstance(fut_metadata, dict), fut_metadata)
|
||||
|
||||
self.failIf(emptylit_node.is_unknown())
|
||||
self.failUnlessEqual(emptylit_node.get_storage_index(), None)
|
||||
self.failIf(tinylit_node.is_unknown())
|
||||
self.failUnlessEqual(tinylit_node.get_storage_index(), None)
|
||||
|
||||
d2 = defer.succeed(None)
|
||||
d2.addCallback(lambda ignored: emptylit_node.list())
|
||||
d2.addCallback(lambda children: self.failUnlessEqual(children, {}))
|
||||
d2.addCallback(lambda ignored: tinylit_node.list())
|
||||
d2.addCallback(lambda children: self.failUnlessEqual(set(children.keys()),
|
||||
set([u"short"])))
|
||||
d2.addCallback(lambda ignored: tinylit_node.list())
|
||||
d2.addCallback(lambda children: children[u"short"][0].read(MemAccum()))
|
||||
d2.addCallback(lambda accum: self.failUnlessEqual(accum.data, "The end."))
|
||||
return d2
|
||||
|
||||
d.addCallback(_check_kids)
|
||||
|
||||
d.addCallback(lambda ign: nm.create_from_cap(self.cap.to_string()))
|
||||
@ -342,7 +396,7 @@ class Dirnode(GridTestMixin, unittest.TestCase,
|
||||
# should have been stripped (and "ro." should have been prepended to the
|
||||
# ro_uri, since it's unknown).
|
||||
def _check_kids(children):
|
||||
self.failUnlessEqual(sorted(children.keys()), [u"child"])
|
||||
self.failUnlessEqual(set(children.keys()), set([u"child"]))
|
||||
child_node, child_metadata = children[u"child"]
|
||||
|
||||
self.failUnlessEqual(child_node.get_write_uri(), stripped_write_uri)
|
||||
@ -599,8 +653,8 @@ class Dirnode(GridTestMixin, unittest.TestCase,
|
||||
|
||||
d.addCallback(lambda res: n.list())
|
||||
d.addCallback(lambda children:
|
||||
self.failUnlessEqual(sorted(children.keys()),
|
||||
sorted([u"child", u"subdir"])))
|
||||
self.failUnlessEqual(set(children.keys()),
|
||||
set([u"child", u"subdir"])))
|
||||
|
||||
d.addCallback(lambda res: n.start_deep_stats().when_done())
|
||||
def _check_deepstats(stats):
|
||||
@ -672,7 +726,7 @@ class Dirnode(GridTestMixin, unittest.TestCase,
|
||||
child, metadata = res
|
||||
self.failUnless(isinstance(child, dirnode.DirectoryNode))
|
||||
# edge-metadata needs at least one path segment
|
||||
self.failUnlessEqual(sorted(metadata.keys()), [])
|
||||
self.failUnlessEqual(set(metadata.keys()), set([]))
|
||||
d.addCallback(_check_child_and_metadata1)
|
||||
d.addCallback(lambda res:
|
||||
n.get_child_and_metadata_at_path(u"child"))
|
||||
@ -908,8 +962,8 @@ class Dirnode(GridTestMixin, unittest.TestCase,
|
||||
|
||||
d.addCallback(lambda res: n.list())
|
||||
d.addCallback(lambda children:
|
||||
self.failUnlessEqual(sorted(children.keys()),
|
||||
sorted([u"child"])))
|
||||
self.failUnlessEqual(set(children.keys()),
|
||||
set([u"child"])))
|
||||
|
||||
uploadable1 = upload.Data("some data", convergence="converge")
|
||||
d.addCallback(lambda res: n.add_file(u"newfile", uploadable1))
|
||||
@ -924,8 +978,8 @@ class Dirnode(GridTestMixin, unittest.TestCase,
|
||||
overwrite=False))
|
||||
d.addCallback(lambda res: n.list())
|
||||
d.addCallback(lambda children:
|
||||
self.failUnlessEqual(sorted(children.keys()),
|
||||
sorted([u"child", u"newfile"])))
|
||||
self.failUnlessEqual(set(children.keys()),
|
||||
set([u"child", u"newfile"])))
|
||||
d.addCallback(lambda res: n.get_metadata_for(u"newfile"))
|
||||
d.addCallback(lambda metadata:
|
||||
self.failUnlessEqual(set(metadata.keys()),
|
||||
@ -955,12 +1009,12 @@ class Dirnode(GridTestMixin, unittest.TestCase,
|
||||
n.move_child_to(u"child", self.subdir2))
|
||||
d.addCallback(lambda res: n.list())
|
||||
d.addCallback(lambda children:
|
||||
self.failUnlessEqual(sorted(children.keys()),
|
||||
sorted([u"newfile", u"subdir2"])))
|
||||
self.failUnlessEqual(set(children.keys()),
|
||||
set([u"newfile", u"subdir2"])))
|
||||
d.addCallback(lambda res: self.subdir2.list())
|
||||
d.addCallback(lambda children:
|
||||
self.failUnlessEqual(sorted(children.keys()),
|
||||
sorted([u"child"])))
|
||||
self.failUnlessEqual(set(children.keys()),
|
||||
set([u"child"])))
|
||||
d.addCallback(lambda res: self.subdir2.get(u"child"))
|
||||
d.addCallback(lambda child:
|
||||
self.failUnlessEqual(child.get_uri(),
|
||||
@ -971,12 +1025,12 @@ class Dirnode(GridTestMixin, unittest.TestCase,
|
||||
self.subdir2.move_child_to(u"child", n, u"newchild"))
|
||||
d.addCallback(lambda res: n.list())
|
||||
d.addCallback(lambda children:
|
||||
self.failUnlessEqual(sorted(children.keys()),
|
||||
sorted([u"newchild", u"newfile",
|
||||
u"subdir2"])))
|
||||
self.failUnlessEqual(set(children.keys()),
|
||||
set([u"newchild", u"newfile",
|
||||
u"subdir2"])))
|
||||
d.addCallback(lambda res: self.subdir2.list())
|
||||
d.addCallback(lambda children:
|
||||
self.failUnlessEqual(sorted(children.keys()), []))
|
||||
self.failUnlessEqual(set(children.keys()), set([])))
|
||||
|
||||
# now make sure that we honor overwrite=False
|
||||
d.addCallback(lambda res:
|
||||
@ -1026,7 +1080,7 @@ class Dirnode(GridTestMixin, unittest.TestCase,
|
||||
return d
|
||||
d.addCallback(_check)
|
||||
def _check_kids(kids2):
|
||||
self.failUnlessEqual(sorted(kids.keys()), sorted(kids2.keys()))
|
||||
self.failUnlessEqual(set(kids.keys()), set(kids2.keys()))
|
||||
self.failUnlessEqual(kids2[u"kid2"][1]["metakey"], "metavalue")
|
||||
d.addCallback(_check_kids)
|
||||
return d
|
||||
|
Loading…
Reference in New Issue
Block a user