2007-12-04 04:37:54 +00:00
|
|
|
|
|
|
|
from twisted.trial import unittest
|
2008-07-16 20:14:39 +00:00
|
|
|
from allmydata import uri
|
2008-10-22 08:38:18 +00:00
|
|
|
from allmydata.monitor import Monitor
|
2008-09-07 19:44:56 +00:00
|
|
|
from allmydata.immutable import filenode, download
|
2008-12-07 15:20:08 +00:00
|
|
|
from allmydata.mutable.filenode import MutableFileNode
|
2008-10-30 20:39:09 +00:00
|
|
|
from allmydata.util import hashutil, cachedir
|
2008-10-28 20:41:04 +00:00
|
|
|
from allmydata.test.common import download_to_data
|
2007-12-04 04:37:54 +00:00
|
|
|
|
|
|
|
class NotANode:
|
|
|
|
pass
|
|
|
|
|
2008-10-30 20:39:09 +00:00
|
|
|
class FakeClient:
|
2008-11-19 21:05:01 +00:00
|
|
|
# just enough to let the node acquire a downloader (which it won't use),
|
|
|
|
# and to get default encoding parameters
|
2008-10-30 20:39:09 +00:00
|
|
|
def getServiceNamed(self, name):
|
|
|
|
return None
|
2008-11-19 21:05:01 +00:00
|
|
|
def get_encoding_parameters(self):
|
|
|
|
return {"k": 3, "n": 10}
|
2008-10-30 20:39:09 +00:00
|
|
|
|
2007-12-04 04:37:54 +00:00
|
|
|
class Node(unittest.TestCase):
|
|
|
|
def test_chk_filenode(self):
|
|
|
|
u = uri.CHKFileURI(key="\x00"*16,
|
|
|
|
uri_extension_hash="\x00"*32,
|
|
|
|
needed_shares=3,
|
|
|
|
total_shares=10,
|
|
|
|
size=1000)
|
2008-10-30 20:39:09 +00:00
|
|
|
c = FakeClient()
|
|
|
|
cf = cachedir.CacheFile("none")
|
2009-01-08 18:25:30 +00:00
|
|
|
fn1 = filenode.FileNode(u.to_string(), c, cf)
|
2008-10-30 20:39:09 +00:00
|
|
|
fn2 = filenode.FileNode(u.to_string(), c, cf)
|
2007-12-04 04:37:54 +00:00
|
|
|
self.failUnlessEqual(fn1, fn2)
|
|
|
|
self.failIfEqual(fn1, "I am not a filenode")
|
|
|
|
self.failIfEqual(fn1, NotANode())
|
|
|
|
self.failUnlessEqual(fn1.get_uri(), u.to_string())
|
|
|
|
self.failUnlessEqual(fn1.is_readonly(), True)
|
2008-05-19 20:03:00 +00:00
|
|
|
self.failUnlessEqual(fn1.is_mutable(), False)
|
2007-12-04 04:37:54 +00:00
|
|
|
self.failUnlessEqual(fn1.get_readonly_uri(), u.to_string())
|
|
|
|
self.failUnlessEqual(fn1.get_size(), 1000)
|
2008-08-12 23:14:07 +00:00
|
|
|
self.failUnlessEqual(fn1.get_storage_index(), u.storage_index)
|
2007-12-04 04:37:54 +00:00
|
|
|
d = {}
|
|
|
|
d[fn1] = 1 # exercise __hash__
|
2008-12-08 19:44:11 +00:00
|
|
|
v = fn1.get_verify_cap()
|
2007-12-04 04:37:54 +00:00
|
|
|
self.failUnless(isinstance(v, uri.CHKFileVerifierURI))
|
|
|
|
|
2008-07-17 23:47:09 +00:00
|
|
|
|
2007-12-04 04:37:54 +00:00
|
|
|
def test_literal_filenode(self):
|
|
|
|
DATA = "I am a short file."
|
|
|
|
u = uri.LiteralFileURI(data=DATA)
|
|
|
|
c = None
|
|
|
|
fn1 = filenode.LiteralFileNode(u, c)
|
|
|
|
fn2 = filenode.LiteralFileNode(u.to_string(), c)
|
|
|
|
self.failUnlessEqual(fn1, fn2)
|
|
|
|
self.failIfEqual(fn1, "I am not a filenode")
|
|
|
|
self.failIfEqual(fn1, NotANode())
|
|
|
|
self.failUnlessEqual(fn1.get_uri(), u.to_string())
|
|
|
|
self.failUnlessEqual(fn1.is_readonly(), True)
|
2008-05-19 20:03:00 +00:00
|
|
|
self.failUnlessEqual(fn1.is_mutable(), False)
|
2007-12-04 04:37:54 +00:00
|
|
|
self.failUnlessEqual(fn1.get_readonly_uri(), u.to_string())
|
|
|
|
self.failUnlessEqual(fn1.get_size(), len(DATA))
|
2008-08-12 23:14:07 +00:00
|
|
|
self.failUnlessEqual(fn1.get_storage_index(), None)
|
2007-12-04 04:37:54 +00:00
|
|
|
d = {}
|
|
|
|
d[fn1] = 1 # exercise __hash__
|
|
|
|
|
2008-12-08 19:44:11 +00:00
|
|
|
v = fn1.get_verify_cap()
|
2007-12-04 04:37:54 +00:00
|
|
|
self.failUnlessEqual(v, None)
|
|
|
|
|
2008-07-17 23:47:09 +00:00
|
|
|
d = fn1.download(download.Data())
|
2007-12-04 04:37:54 +00:00
|
|
|
def _check(res):
|
|
|
|
self.failUnlessEqual(res, DATA)
|
|
|
|
d.addCallback(_check)
|
|
|
|
|
|
|
|
d.addCallback(lambda res: fn1.download_to_data())
|
|
|
|
d.addCallback(_check)
|
2008-07-17 23:47:09 +00:00
|
|
|
|
2008-10-28 20:41:04 +00:00
|
|
|
d.addCallback(lambda res: download_to_data(fn1))
|
|
|
|
d.addCallback(_check)
|
|
|
|
|
|
|
|
d.addCallback(lambda res: download_to_data(fn1, 1, 5))
|
|
|
|
def _check_segment(res):
|
|
|
|
self.failUnlessEqual(res, DATA[1:1+5])
|
|
|
|
d.addCallback(_check_segment)
|
|
|
|
|
2007-12-04 04:37:54 +00:00
|
|
|
return d
|
|
|
|
|
2008-03-04 21:01:28 +00:00
|
|
|
def test_mutable_filenode(self):
|
2008-11-19 21:05:01 +00:00
|
|
|
client = FakeClient()
|
2008-03-04 21:01:28 +00:00
|
|
|
wk = "\x00"*16
|
|
|
|
fp = "\x00"*32
|
|
|
|
rk = hashutil.ssk_readkey_hash(wk)
|
|
|
|
si = hashutil.ssk_storage_index_hash(rk)
|
|
|
|
|
|
|
|
u = uri.WriteableSSKFileURI("\x00"*16, "\x00"*32)
|
2008-04-11 21:31:16 +00:00
|
|
|
n = MutableFileNode(client).init_from_uri(u)
|
2008-03-04 21:01:28 +00:00
|
|
|
|
|
|
|
self.failUnlessEqual(n.get_writekey(), wk)
|
|
|
|
self.failUnlessEqual(n.get_readkey(), rk)
|
|
|
|
self.failUnlessEqual(n.get_storage_index(), si)
|
|
|
|
# these itmes are populated on first read (or create), so until that
|
|
|
|
# happens they'll be None
|
|
|
|
self.failUnlessEqual(n.get_privkey(), None)
|
|
|
|
self.failUnlessEqual(n.get_encprivkey(), None)
|
|
|
|
self.failUnlessEqual(n.get_pubkey(), None)
|
|
|
|
|
|
|
|
self.failUnlessEqual(n.get_uri(), u.to_string())
|
|
|
|
self.failUnlessEqual(n.get_readonly_uri(), u.get_readonly().to_string())
|
|
|
|
self.failUnlessEqual(n.is_mutable(), True)
|
|
|
|
self.failUnlessEqual(n.is_readonly(), False)
|
|
|
|
|
2008-04-11 21:31:16 +00:00
|
|
|
n2 = MutableFileNode(client).init_from_uri(u)
|
2008-03-04 21:01:28 +00:00
|
|
|
self.failUnlessEqual(n, n2)
|
|
|
|
self.failIfEqual(n, "not even the right type")
|
|
|
|
self.failIfEqual(n, u) # not the right class
|
|
|
|
d = {n: "can these be used as dictionary keys?"}
|
|
|
|
d[n2] = "replace the old one"
|
|
|
|
self.failUnlessEqual(len(d), 1)
|
|
|
|
|
|
|
|
nro = n.get_readonly()
|
2008-04-11 21:31:16 +00:00
|
|
|
self.failUnless(isinstance(nro, MutableFileNode))
|
2008-03-04 21:01:28 +00:00
|
|
|
|
|
|
|
self.failUnlessEqual(nro.get_readonly(), nro)
|
|
|
|
nro_u = nro.get_uri()
|
|
|
|
self.failUnlessEqual(nro_u, nro.get_readonly_uri())
|
|
|
|
self.failUnlessEqual(nro_u, u.get_readonly().to_string())
|
|
|
|
self.failUnlessEqual(nro.is_mutable(), True)
|
|
|
|
self.failUnlessEqual(nro.is_readonly(), True)
|
|
|
|
|
2008-12-08 19:44:11 +00:00
|
|
|
v = n.get_verify_cap()
|
2008-03-04 21:01:28 +00:00
|
|
|
self.failUnless(isinstance(v, uri.SSKVerifierURI))
|
|
|
|
|
2008-09-25 17:16:53 +00:00
|
|
|
class LiteralChecker(unittest.TestCase):
|
2008-07-17 23:47:09 +00:00
|
|
|
def test_literal_filenode(self):
|
|
|
|
DATA = "I am a short file."
|
|
|
|
u = uri.LiteralFileURI(data=DATA)
|
2008-09-25 16:15:44 +00:00
|
|
|
fn1 = filenode.LiteralFileNode(u, None)
|
2008-07-17 23:47:09 +00:00
|
|
|
|
2008-10-22 08:38:18 +00:00
|
|
|
d = fn1.check(Monitor())
|
2008-07-17 23:47:09 +00:00
|
|
|
def _check_checker_results(cr):
|
2008-09-07 19:44:56 +00:00
|
|
|
self.failUnlessEqual(cr, None)
|
2008-07-17 23:47:09 +00:00
|
|
|
d.addCallback(_check_checker_results)
|
|
|
|
|
2008-10-22 08:38:18 +00:00
|
|
|
d.addCallback(lambda res: fn1.check(Monitor(), verify=True))
|
2008-07-17 23:47:09 +00:00
|
|
|
d.addCallback(_check_checker_results)
|
|
|
|
|
|
|
|
return d
|