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, IMutableFileURI, \
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 self.failUnlessIdentical(u, u3)
30 self.failUnlessEqual(u.get_verifier(), None)
33 data = "" # This data is some *very* small data!
34 return self._help_test(data)
37 data = "This is some small data"
38 return self._help_test(data)
40 def test_nonascii(self):
41 data = "This contains \x00 and URI:LIT: and \n, oh my."
42 return self._help_test(data)
44 class Compare(unittest.TestCase):
45 def test_compare(self):
46 lit1 = uri.LiteralFileURI("some data")
47 fileURI = 'URI:CHK:f3mf6az85wpcai8ma4qayfmxuc:nnw518w5hu3t5oohwtp7ah9n81z9rfg6c1ywk33ia3m64o67nsgo:3:10:345834'
48 chk1 = uri.CHKFileURI().init_from_string(fileURI)
49 chk2 = uri.CHKFileURI().init_from_string(fileURI)
50 self.failIfEqual(lit1, chk1)
51 self.failUnlessEqual(chk1, chk2)
52 self.failIfEqual(chk1, "not actually a URI")
53 # these should be hashable too
54 s = set([lit1, chk1, chk2])
55 self.failUnlessEqual(len(s), 2) # since chk1==chk2
57 class CHKFile(unittest.TestCase):
59 key = "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
60 storage_index = hashutil.storage_index_chk_hash(key)
61 uri_extension_hash = hashutil.uri_extension_hash("stuff")
65 u = uri.CHKFileURI(key=key,
66 uri_extension_hash=uri_extension_hash,
67 needed_shares=needed_shares,
68 total_shares=total_shares,
70 self.failUnlessEqual(u.storage_index, storage_index)
71 self.failUnlessEqual(u.key, key)
72 self.failUnlessEqual(u.uri_extension_hash, uri_extension_hash)
73 self.failUnlessEqual(u.needed_shares, needed_shares)
74 self.failUnlessEqual(u.total_shares, total_shares)
75 self.failUnlessEqual(u.size, size)
76 self.failUnless(u.is_readonly())
77 self.failIf(u.is_mutable())
78 self.failUnless(IURI.providedBy(u))
79 self.failUnless(IFileURI.providedBy(u))
80 self.failIf(IDirnodeURI.providedBy(u))
81 self.failUnlessEqual(u.get_size(), 1234)
82 self.failUnless(u.is_readonly())
83 self.failIf(u.is_mutable())
84 u_ro = u.get_readonly()
85 self.failUnlessIdentical(u, u_ro)
86 u1a = IFileURI(u.to_string())
87 self.failUnlessEqual(u1a, u)
89 u2 = uri.from_string(u.to_string())
90 self.failUnlessEqual(u2.storage_index, storage_index)
91 self.failUnlessEqual(u2.key, key)
92 self.failUnlessEqual(u2.uri_extension_hash, uri_extension_hash)
93 self.failUnlessEqual(u2.needed_shares, needed_shares)
94 self.failUnlessEqual(u2.total_shares, total_shares)
95 self.failUnlessEqual(u2.size, size)
96 self.failUnless(u2.is_readonly())
97 self.failIf(u2.is_mutable())
98 self.failUnless(IURI.providedBy(u2))
99 self.failUnless(IFileURI.providedBy(u2))
100 self.failIf(IDirnodeURI.providedBy(u2))
101 self.failUnlessEqual(u2.get_size(), 1234)
102 self.failUnless(u2.is_readonly())
103 self.failIf(u2.is_mutable())
106 self.failUnless(isinstance(v.to_string(), str))
107 v2 = uri.from_string(v.to_string())
108 self.failUnlessEqual(v, v2)
110 v3 = uri.CHKFileVerifierURI(storage_index="\x00"*16,
111 uri_extension_hash="\x00"*32,
115 self.failUnless(isinstance(v3.to_string(), str))
117 def test_pack_badly(self):
118 key = "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
119 storage_index = hashutil.storage_index_chk_hash(key)
120 uri_extension_hash = hashutil.uri_extension_hash("stuff")
124 self.failUnlessRaises(TypeError,
127 uri_extension_hash=uri_extension_hash,
128 needed_shares=needed_shares,
129 total_shares=total_shares,
132 bogus_extra_argument="reject me",
134 self.failUnlessRaises(TypeError,
135 uri.CHKFileVerifierURI,
137 self.failUnlessRaises(TypeError,
138 uri.CHKFileVerifierURI,
139 storage_index=storage_index,
140 uri_extension_hash=uri_extension_hash,
143 # leave size= missing
147 class Extension(unittest.TestCase):
149 data = {"stuff": "value",
152 "big_hash": hashutil.tagged_hash("foo", "bar"),
154 ext = uri.pack_extension(data)
155 d = uri.unpack_extension(ext)
156 self.failUnlessEqual(d["stuff"], "value")
157 self.failUnlessEqual(d["size"], 12)
158 self.failUnlessEqual(d["big_hash"], hashutil.tagged_hash("foo", "bar"))
160 readable = uri.unpack_extension_readable(ext)
162 class Invalid(unittest.TestCase):
163 def test_create_invalid(self):
164 not_uri = "I am not a URI"
165 self.failUnlessRaises(TypeError, uri.from_string, not_uri)
168 class Constraint(unittest.TestCase):
169 def test_constraint(self):
170 good="http://127.0.0.1:8123/uri/URI%3ADIR2%3Aqo8ayna47cpw3rx3kho3mu7q4h%3Abk9qbgx76gh6eyj5ps8p6buz8fffw1ofc37e9w9d6ncsfpuz7icy/"
171 self.failUnless(uri.DirnodeURI_RE.search(good))
173 self.failIf(uri.DirnodeURI_RE.search(bad))
174 fileURI = 'URI:CHK:f3mf6az85wpcai8ma4qayfmxuc:nnw518w5hu3t5oohwtp7ah9n81z9rfg6c1ywk33ia3m64o67nsgo:3:10:345834'
175 self.failIf(uri.DirnodeURI_RE.search(fileURI))
178 class Mutable(unittest.TestCase):
180 writekey = "\x01" * 16
181 fingerprint = "\x02" * 32
183 u = uri.WriteableSSKFileURI(writekey, fingerprint)
184 self.failUnlessEqual(u.writekey, writekey)
185 self.failUnlessEqual(u.fingerprint, fingerprint)
186 self.failIf(u.is_readonly())
187 self.failUnless(u.is_mutable())
188 self.failUnless(IURI.providedBy(u))
189 self.failUnless(IMutableFileURI.providedBy(u))
190 self.failIf(IDirnodeURI.providedBy(u))
191 self.failUnless("WriteableSSKFileURI" in str(u))
192 u1a = IMutableFileURI(u.to_string())
193 self.failUnlessEqual(u1a, u)
195 u2 = uri.from_string(u.to_string())
196 self.failUnlessEqual(u2.writekey, writekey)
197 self.failUnlessEqual(u2.fingerprint, fingerprint)
198 self.failIf(u2.is_readonly())
199 self.failUnless(u2.is_mutable())
200 self.failUnless(IURI.providedBy(u2))
201 self.failUnless(IMutableFileURI.providedBy(u2))
202 self.failIf(IDirnodeURI.providedBy(u2))
204 u3 = u2.get_readonly()
205 readkey = hashutil.ssk_readkey_hash(writekey)
206 self.failUnlessEqual(u3.fingerprint, fingerprint)
207 self.failUnlessEqual(u3.readkey, readkey)
208 self.failUnless(u3.is_readonly())
209 self.failUnless(u3.is_mutable())
210 self.failUnless(IURI.providedBy(u3))
211 self.failUnless(IMutableFileURI.providedBy(u3))
212 self.failIf(IDirnodeURI.providedBy(u3))
214 u4 = uri.ReadonlySSKFileURI(readkey, fingerprint)
215 self.failUnlessEqual(u4.fingerprint, fingerprint)
216 self.failUnlessEqual(u4.readkey, readkey)
217 self.failUnless(u4.is_readonly())
218 self.failUnless(u4.is_mutable())
219 self.failUnless(IURI.providedBy(u4))
220 self.failUnless(IMutableFileURI.providedBy(u4))
221 self.failIf(IDirnodeURI.providedBy(u4))
223 u4a = uri.from_string(u4.to_string())
224 self.failUnlessEqual(u4a, u4)
225 self.failUnless("ReadonlySSKFileURI" in str(u4a))
226 self.failUnlessIdentical(u4a.get_readonly(), u4a)
228 u5 = u4.get_verifier()
229 self.failUnless(IVerifierURI.providedBy(u5))
230 self.failUnlessEqual(u5.storage_index, u.storage_index)
231 u6 = IVerifierURI(u5.to_string())
232 self.failUnless(IVerifierURI.providedBy(u6))
233 self.failUnlessEqual(u6.storage_index, u.storage_index)
234 u7 = u.get_verifier()
235 self.failUnless(IVerifierURI.providedBy(u7))
236 self.failUnlessEqual(u7.storage_index, u.storage_index)
239 class NewDirnode(unittest.TestCase):
241 writekey = "\x01" * 16
242 fingerprint = "\x02" * 16
244 n = uri.WriteableSSKFileURI(writekey, fingerprint)
245 u1 = uri.NewDirectoryURI(n)
246 self.failIf(u1.is_readonly())
247 self.failUnless(u1.is_mutable())
248 self.failUnless(IURI.providedBy(u1))
249 self.failIf(IFileURI.providedBy(u1))
250 self.failUnless(IDirnodeURI.providedBy(u1))
251 self.failUnless("NewDirectoryURI" in str(u1))
252 u1_filenode = u1.get_filenode_uri()
253 self.failUnless(u1_filenode.is_mutable())
254 self.failIf(u1_filenode.is_readonly())
255 u1a = IDirnodeURI(u1.to_string())
256 self.failUnlessEqual(u1a, u1)
258 u2 = uri.from_string(u1.to_string())
259 self.failUnlessEqual(u1.to_string(), u2.to_string())
260 self.failIf(u2.is_readonly())
261 self.failUnless(u2.is_mutable())
262 self.failUnless(IURI.providedBy(u2))
263 self.failIf(IFileURI.providedBy(u2))
264 self.failUnless(IDirnodeURI.providedBy(u2))
266 u3 = u2.get_readonly()
267 self.failUnless(u3.is_readonly())
268 self.failUnless(u3.is_mutable())
269 self.failUnless(IURI.providedBy(u3))
270 self.failIf(IFileURI.providedBy(u3))
271 self.failUnless(IDirnodeURI.providedBy(u3))
272 u3n = u3._filenode_uri
273 self.failUnless(u3n.is_readonly())
274 self.failUnless(u3n.is_mutable())
275 u3_filenode = u3.get_filenode_uri()
276 self.failUnless(u3_filenode.is_mutable())
277 self.failUnless(u3_filenode.is_readonly())
279 u3a = uri.from_string(u3.to_string())
280 self.failUnlessIdentical(u3a, u3a.get_readonly())
282 u4 = uri.ReadonlyNewDirectoryURI(u2._filenode_uri.get_readonly())
283 self.failUnlessEqual(u4.to_string(), u3.to_string())
284 self.failUnless(u4.is_readonly())
285 self.failUnless(u4.is_mutable())
286 self.failUnless(IURI.providedBy(u4))
287 self.failIf(IFileURI.providedBy(u4))
288 self.failUnless(IDirnodeURI.providedBy(u4))
290 u4_verifier = u4.get_verifier()
291 u4_verifier_filenode = u4_verifier.get_filenode_uri()
292 self.failUnless(isinstance(u4_verifier_filenode, uri.SSKVerifierURI))
294 verifiers = [u1.get_verifier(), u2.get_verifier(),
295 u3.get_verifier(), u4.get_verifier(),
296 IVerifierURI(u1.get_verifier().to_string()),
297 uri.NewDirectoryURIVerifier(n.get_verifier()),
298 uri.NewDirectoryURIVerifier(n.get_verifier().to_string()),
301 self.failUnless(IVerifierURI.providedBy(v))
302 self.failUnlessEqual(v._filenode_uri,
303 u1.get_verifier()._filenode_uri)
305 def test_is_string_newdirnode_rw(self):
306 writekey = "\x01" * 16
307 fingerprint = "\x02" * 32
309 n = uri.WriteableSSKFileURI(writekey, fingerprint)
310 u1 = uri.NewDirectoryURI(n)
312 self.failUnless(uri.is_string_newdirnode_rw(u1.to_string()), u1.to_string())
314 self.failIf(uri.is_string_newdirnode_rw("bogus"))
315 self.failIf(uri.is_string_newdirnode_rw("URI:DIR2:bogus"))