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 IMutableFileURI, IVerifierURI
7 from foolscap.schema import Violation
9 class Literal(unittest.TestCase):
10 def _help_test(self, data):
11 u = uri.LiteralFileURI(data)
12 self.failUnless(IURI.providedBy(u))
13 self.failUnless(IFileURI.providedBy(u))
14 self.failIf(IDirnodeURI.providedBy(u))
15 self.failUnlessEqual(u.data, data)
16 self.failUnlessEqual(u.get_size(), len(data))
17 self.failUnless(u.is_readonly())
18 self.failIf(u.is_mutable())
20 u2 = uri.from_string(u.to_string())
21 self.failUnless(IURI.providedBy(u2))
22 self.failUnless(IFileURI.providedBy(u2))
23 self.failIf(IDirnodeURI.providedBy(u2))
24 self.failUnlessEqual(u2.data, data)
25 self.failUnlessEqual(u2.get_size(), len(data))
26 self.failUnless(u.is_readonly())
27 self.failIf(u.is_mutable())
30 data = "" # This data is some *very* small data!
31 return self._help_test(data)
34 data = "This is some small data"
35 return self._help_test(data)
37 def test_nonascii(self):
38 data = "This contains \x00 and URI:LIT: and \n, oh my."
39 return self._help_test(data)
41 class Compare(unittest.TestCase):
42 def test_compare(self):
43 lit1 = uri.LiteralFileURI("some data")
44 fileURI = 'URI:CHK:f3mf6az85wpcai8ma4qayfmxuc:nnw518w5hu3t5oohwtp7ah9n81z9rfg6c1ywk33ia3m64o67nsgo:3:10:345834'
45 chk1 = uri.CHKFileURI().init_from_string(fileURI)
46 chk2 = uri.CHKFileURI().init_from_string(fileURI)
47 self.failIfEqual(lit1, chk1)
48 self.failUnlessEqual(chk1, chk2)
49 self.failIfEqual(chk1, "not actually a URI")
50 # these should be hashable too
51 s = set([lit1, chk1, chk2])
52 self.failUnlessEqual(len(s), 2) # since chk1==chk2
54 class CHKFile(unittest.TestCase):
56 key = "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
57 storage_index = hashutil.storage_index_chk_hash(key)
58 uri_extension_hash = hashutil.uri_extension_hash("stuff")
62 u = uri.CHKFileURI(key=key,
63 uri_extension_hash=uri_extension_hash,
64 needed_shares=needed_shares,
65 total_shares=total_shares,
67 self.failUnlessEqual(u.storage_index, storage_index)
68 self.failUnlessEqual(u.key, key)
69 self.failUnlessEqual(u.uri_extension_hash, uri_extension_hash)
70 self.failUnlessEqual(u.needed_shares, needed_shares)
71 self.failUnlessEqual(u.total_shares, total_shares)
72 self.failUnlessEqual(u.size, size)
73 self.failUnless(u.is_readonly())
74 self.failIf(u.is_mutable())
75 self.failUnless(IURI.providedBy(u))
76 self.failUnless(IFileURI.providedBy(u))
77 self.failIf(IDirnodeURI.providedBy(u))
78 self.failUnlessEqual(u.get_size(), 1234)
79 self.failUnless(u.is_readonly())
80 self.failIf(u.is_mutable())
82 u2 = uri.from_string(u.to_string())
83 self.failUnlessEqual(u2.storage_index, storage_index)
84 self.failUnlessEqual(u2.key, key)
85 self.failUnlessEqual(u2.uri_extension_hash, uri_extension_hash)
86 self.failUnlessEqual(u2.needed_shares, needed_shares)
87 self.failUnlessEqual(u2.total_shares, total_shares)
88 self.failUnlessEqual(u2.size, size)
89 self.failUnless(u2.is_readonly())
90 self.failIf(u2.is_mutable())
91 self.failUnless(IURI.providedBy(u2))
92 self.failUnless(IFileURI.providedBy(u2))
93 self.failIf(IDirnodeURI.providedBy(u2))
94 self.failUnlessEqual(u2.get_size(), 1234)
95 self.failUnless(u2.is_readonly())
96 self.failIf(u2.is_mutable())
98 def test_pack_badly(self):
99 key = "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
100 storage_index = hashutil.storage_index_chk_hash(key)
101 uri_extension_hash = hashutil.uri_extension_hash("stuff")
105 self.failUnlessRaises(TypeError,
108 uri_extension_hash=uri_extension_hash,
109 needed_shares=needed_shares,
110 total_shares=total_shares,
113 bogus_extra_argument="reject me",
116 class Extension(unittest.TestCase):
118 data = {"stuff": "value",
121 "big_hash": hashutil.tagged_hash("foo", "bar"),
123 ext = uri.pack_extension(data)
124 d = uri.unpack_extension(ext)
125 self.failUnlessEqual(d["stuff"], "value")
126 self.failUnlessEqual(d["size"], 12)
127 self.failUnlessEqual(d["big_hash"], hashutil.tagged_hash("foo", "bar"))
129 readable = uri.unpack_extension_readable(ext)
131 class Invalid(unittest.TestCase):
132 def test_create_invalid(self):
133 not_uri = "I am not a URI"
134 self.failUnlessRaises(TypeError, uri.from_string, not_uri)
137 class Constraint(unittest.TestCase):
138 def test_constraint(self):
139 good = 'URI:DIR:pb://xextf3eap44o3wi27mf7ehiur6wvhzr6@207.7.153.180:56677,127.0.0.1:56677/vdrive:qj51rfpnukhjmo7cm9awe5ks5e'
140 DirnodeURI.checkObject(good, False)
142 self.failUnlessRaises(Violation, DirnodeURI.checkObject, bad, False)
143 fileURI = 'URI:CHK:f3mf6az85wpcai8ma4qayfmxuc:nnw518w5hu3t5oohwtp7ah9n81z9rfg6c1ywk33ia3m64o67nsgo:3:10:345834'
144 self.failUnlessRaises(Violation, DirnodeURI.checkObject, fileURI, False)
147 class Mutable(unittest.TestCase):
149 writekey = "\x01" * 16
150 fingerprint = "\x02" * 32
152 u = uri.WriteableSSKFileURI(writekey, fingerprint)
153 self.failUnlessEqual(u.writekey, writekey)
154 self.failUnlessEqual(u.fingerprint, fingerprint)
155 self.failIf(u.is_readonly())
156 self.failUnless(u.is_mutable())
157 self.failUnless(IURI.providedBy(u))
158 self.failUnless(IMutableFileURI.providedBy(u))
159 self.failIf(IDirnodeURI.providedBy(u))
161 u2 = uri.from_string(u.to_string())
162 self.failUnlessEqual(u2.writekey, writekey)
163 self.failUnlessEqual(u2.fingerprint, fingerprint)
164 self.failIf(u2.is_readonly())
165 self.failUnless(u2.is_mutable())
166 self.failUnless(IURI.providedBy(u2))
167 self.failUnless(IMutableFileURI.providedBy(u2))
168 self.failIf(IDirnodeURI.providedBy(u2))
170 u3 = u2.get_readonly()
171 readkey = hashutil.ssk_readkey_hash(writekey)
172 self.failUnlessEqual(u3.fingerprint, fingerprint)
173 self.failUnlessEqual(u3.readkey, readkey)
174 self.failUnless(u3.is_readonly())
175 self.failUnless(u3.is_mutable())
176 self.failUnless(IURI.providedBy(u3))
177 self.failUnless(IMutableFileURI.providedBy(u3))
178 self.failIf(IDirnodeURI.providedBy(u3))
180 u4 = uri.ReadonlySSKFileURI(readkey, fingerprint)
181 self.failUnlessEqual(u4.fingerprint, fingerprint)
182 self.failUnlessEqual(u4.readkey, readkey)
183 self.failUnless(u4.is_readonly())
184 self.failUnless(u4.is_mutable())
185 self.failUnless(IURI.providedBy(u4))
186 self.failUnless(IMutableFileURI.providedBy(u4))
187 self.failIf(IDirnodeURI.providedBy(u4))
189 u5 = u4.get_verifier()
190 self.failUnless(IVerifierURI.providedBy(u5))
191 self.failUnlessEqual(u5.storage_index, u.storage_index)
192 u6 = IVerifierURI(u5.to_string())
193 self.failUnless(IVerifierURI.providedBy(u6))
194 self.failUnlessEqual(u6.storage_index, u.storage_index)
195 u7 = u.get_verifier()
196 self.failUnless(IVerifierURI.providedBy(u7))
197 self.failUnlessEqual(u7.storage_index, u.storage_index)
200 class NewDirnode(unittest.TestCase):
202 writekey = "\x01" * 16
203 fingerprint = "\x02" * 16
205 n = uri.WriteableSSKFileURI(writekey, fingerprint)
206 u1 = uri.NewDirectoryURI(n)
207 self.failIf(u1.is_readonly())
208 self.failUnless(u1.is_mutable())
209 self.failUnless(IURI.providedBy(u1))
210 self.failIf(IFileURI.providedBy(u1))
211 self.failUnless(IDirnodeURI.providedBy(u1))
213 u2 = uri.from_string(u1.to_string())
214 self.failUnlessEqual(u1.to_string(), u2.to_string())
215 self.failIf(u2.is_readonly())
216 self.failUnless(u2.is_mutable())
217 self.failUnless(IURI.providedBy(u2))
218 self.failIf(IFileURI.providedBy(u2))
219 self.failUnless(IDirnodeURI.providedBy(u2))
221 u3 = u2.get_readonly()
222 self.failUnless(u3.is_readonly())
223 self.failUnless(u3.is_mutable())
224 self.failUnless(IURI.providedBy(u3))
225 self.failIf(IFileURI.providedBy(u3))
226 self.failUnless(IDirnodeURI.providedBy(u3))
227 u3n = u3._filenode_uri
228 self.failUnless(u3n.is_readonly())
229 self.failUnless(u3n.is_mutable())
231 u4 = uri.ReadonlyNewDirectoryURI(u2._filenode_uri.get_readonly())
232 self.failUnlessEqual(u4.to_string(), u3.to_string())
233 self.failUnless(u4.is_readonly())
234 self.failUnless(u4.is_mutable())
235 self.failUnless(IURI.providedBy(u4))
236 self.failIf(IFileURI.providedBy(u4))
237 self.failUnless(IDirnodeURI.providedBy(u4))
239 verifiers = [u1.get_verifier(), u2.get_verifier(),
240 u3.get_verifier(), u4.get_verifier(),
241 IVerifierURI(u1.get_verifier().to_string()),
242 uri.NewDirectoryURIVerifier(n.get_verifier()),
243 uri.NewDirectoryURIVerifier(n.get_verifier().to_string()),
246 self.failUnless(IVerifierURI.providedBy(v))
247 self.failUnlessEqual(v._filenode_uri,
248 u1.get_verifier()._filenode_uri)