2 from twisted.trial import unittest
3 from allmydata import uri
4 from allmydata.util import hashutil
5 from allmydata.interfaces import IURI, IFileURI, IDirnodeURI, DirnodeURI
6 from foolscap.schema import Violation
8 class Literal(unittest.TestCase):
9 def _help_test(self, data):
10 u = uri.LiteralFileURI(data)
11 self.failUnless(IURI.providedBy(u))
12 self.failUnless(IFileURI.providedBy(u))
13 self.failIf(IDirnodeURI.providedBy(u))
14 self.failUnlessEqual(u.data, data)
15 self.failUnlessEqual(u.get_size(), len(data))
16 self.failUnless(u.is_readonly())
17 self.failIf(u.is_mutable())
19 u2 = uri.from_string(u.to_string())
20 self.failUnless(IURI.providedBy(u2))
21 self.failUnless(IFileURI.providedBy(u2))
22 self.failIf(IDirnodeURI.providedBy(u2))
23 self.failUnlessEqual(u2.data, data)
24 self.failUnlessEqual(u2.get_size(), len(data))
25 self.failUnless(u.is_readonly())
26 self.failIf(u.is_mutable())
29 data = "" # This data is some *very* small data!
30 return self._help_test(data)
33 data = "This is some small data"
34 return self._help_test(data)
36 def test_nonascii(self):
37 data = "This contains \x00 and URI:LIT: and \n, oh my."
38 return self._help_test(data)
40 class CHKFile(unittest.TestCase):
42 key = "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
43 storage_index = hashutil.storage_index_chk_hash(key)
44 uri_extension_hash = hashutil.uri_extension_hash("stuff")
48 u = uri.CHKFileURI(key=key,
49 uri_extension_hash=uri_extension_hash,
50 needed_shares=needed_shares,
51 total_shares=total_shares,
53 self.failUnlessEqual(u.storage_index, storage_index)
54 self.failUnlessEqual(u.key, key)
55 self.failUnlessEqual(u.uri_extension_hash, uri_extension_hash)
56 self.failUnlessEqual(u.needed_shares, needed_shares)
57 self.failUnlessEqual(u.total_shares, total_shares)
58 self.failUnlessEqual(u.size, size)
59 self.failUnless(u.is_readonly())
60 self.failIf(u.is_mutable())
61 self.failUnless(IURI.providedBy(u))
62 self.failUnless(IFileURI.providedBy(u))
63 self.failIf(IDirnodeURI.providedBy(u))
64 self.failUnlessEqual(u.get_size(), 1234)
65 self.failUnless(u.is_readonly())
66 self.failIf(u.is_mutable())
68 u2 = uri.from_string(u.to_string())
69 self.failUnlessEqual(u2.storage_index, storage_index)
70 self.failUnlessEqual(u2.key, key)
71 self.failUnlessEqual(u2.uri_extension_hash, uri_extension_hash)
72 self.failUnlessEqual(u2.needed_shares, needed_shares)
73 self.failUnlessEqual(u2.total_shares, total_shares)
74 self.failUnlessEqual(u2.size, size)
75 self.failUnless(u2.is_readonly())
76 self.failIf(u2.is_mutable())
77 self.failUnless(IURI.providedBy(u2))
78 self.failUnless(IFileURI.providedBy(u2))
79 self.failIf(IDirnodeURI.providedBy(u2))
80 self.failUnlessEqual(u2.get_size(), 1234)
81 self.failUnless(u2.is_readonly())
82 self.failIf(u2.is_mutable())
84 class Extension(unittest.TestCase):
86 data = {"stuff": "value",
89 "big_hash": hashutil.tagged_hash("foo", "bar"),
91 ext = uri.pack_extension(data)
92 d = uri.unpack_extension(ext)
93 self.failUnlessEqual(d["stuff"], "value")
94 self.failUnlessEqual(d["size"], 12)
95 self.failUnlessEqual(d["big_hash"], hashutil.tagged_hash("foo", "bar"))
97 readable = uri.unpack_extension_readable(ext)
99 class Dirnode(unittest.TestCase):
101 furl = "pb://stuff@morestuff:stuff/andstuff"
102 writekey = "\x01" * 16
104 u = uri.DirnodeURI(furl, writekey)
105 self.failUnlessEqual(u.furl, furl)
106 self.failUnlessEqual(u.writekey, writekey)
107 self.failIf(u.is_readonly())
108 self.failUnless(u.is_mutable())
109 self.failUnless(IURI.providedBy(u))
110 self.failIf(IFileURI.providedBy(u))
111 self.failUnless(IDirnodeURI.providedBy(u))
113 u2 = uri.from_string(u.to_string())
114 self.failUnlessEqual(u2.furl, furl)
115 self.failUnlessEqual(u2.writekey, writekey)
116 self.failIf(u2.is_readonly())
117 self.failUnless(u2.is_mutable())
118 self.failUnless(IURI.providedBy(u2))
119 self.failIf(IFileURI.providedBy(u2))
120 self.failUnless(IDirnodeURI.providedBy(u2))
122 u3 = u2.get_readonly()
123 readkey = hashutil.dir_read_key_hash(writekey)
124 self.failUnlessEqual(u3.furl, furl)
125 self.failUnlessEqual(u3.readkey, readkey)
126 self.failUnless(u3.is_readonly())
127 self.failUnless(u3.is_mutable())
128 self.failUnless(IURI.providedBy(u3))
129 self.failIf(IFileURI.providedBy(u3))
130 self.failUnless(IDirnodeURI.providedBy(u3))
132 u4 = uri.ReadOnlyDirnodeURI(furl, readkey)
133 self.failUnlessEqual(u4.furl, furl)
134 self.failUnlessEqual(u4.readkey, readkey)
135 self.failUnless(u4.is_readonly())
136 self.failUnless(u4.is_mutable())
137 self.failUnless(IURI.providedBy(u4))
138 self.failIf(IFileURI.providedBy(u4))
139 self.failUnless(IDirnodeURI.providedBy(u4))
142 class Constraint(unittest.TestCase):
143 def test_constraint(self):
144 good = 'URI:DIR:pb://xextf3eap44o3wi27mf7ehiur6wvhzr6@207.7.153.180:56677,127.0.0.1:56677/vdrive:qj51rfpnukhjmo7cm9awe5ks5e'
145 DirnodeURI.checkObject(good, False)
147 self.failUnlessRaises(Violation, DirnodeURI.checkObject, bad, False)
148 fileURI = 'URI:CHK:f3mf6az85wpcai8ma4qayfmxuc:nnw518w5hu3t5oohwtp7ah9n81z9rfg6c1ywk33ia3m64o67nsgo:3:10:345834'
149 self.failUnlessRaises(Violation, DirnodeURI.checkObject, fileURI, False)