1 | Sun Feb 21 22:27:33 MST 2010 zooko@zooko.com |
---|
2 | * dirnode: add tests of literal dirnodes (the current code already passes these tests) |
---|
3 | |
---|
4 | New patches: |
---|
5 | |
---|
6 | [dirnode: add tests of literal dirnodes (the current code already passes these tests) |
---|
7 | zooko@zooko.com**20100222052733 |
---|
8 | Ignore-this: 1fd7fa613c6f3e83dbbc6df03144bb4c |
---|
9 | ] { |
---|
10 | hunk ./src/allmydata/test/test_dirnode.py 6 |
---|
11 | from zope.interface import implements |
---|
12 | from twisted.trial import unittest |
---|
13 | from twisted.internet import defer |
---|
14 | +from twisted.internet.interfaces import IConsumer |
---|
15 | from allmydata import uri, dirnode |
---|
16 | from allmydata.client import Client |
---|
17 | from allmydata.immutable import upload |
---|
18 | hunk ./src/allmydata/test/test_dirnode.py 27 |
---|
19 | from base64 import b32decode |
---|
20 | import common_util as testutil |
---|
21 | |
---|
22 | +class MemAccum: |
---|
23 | + implements(IConsumer) |
---|
24 | + def registerProducer(self, producer, streaming): |
---|
25 | + self.producer = producer |
---|
26 | + self.producer.resumeProducing() |
---|
27 | + pass |
---|
28 | + def unregisterProducer(self): |
---|
29 | + pass |
---|
30 | + def write(self, data): |
---|
31 | + assert not hasattr(self, 'data') |
---|
32 | + self.data = data |
---|
33 | + self.producer.resumeProducing() |
---|
34 | + |
---|
35 | +setup_py_uri = "URI:CHK:n7r3m6wmomelk4sep3kw5cvduq:os7ijw5c3maek7pg65e5254k2fzjflavtpejjyhshpsxuqzhcwwq:3:20:14861" |
---|
36 | +one_uri = "URI:LIT:n5xgk" # LIT for "one" |
---|
37 | +mut_write_uri = "URI:SSK:vfvcbdfbszyrsaxchgevhmmlii:euw4iw7bbnkrrwpzuburbhppuxhc3gwxv26f6imekhz7zyw2ojnq" |
---|
38 | +empty_litdir_uri = "URI:DIR2-LIT:" |
---|
39 | +tiny_litdir_uri = "URI:DIR2-LIT:gqytunj2onug64tufqzdcosvkjetutcjkq5gw4tvm5vwszdgnz5hgyzufqydulbshj5x2lbm" # contains one child which is itself also LIT |
---|
40 | +mut_read_uri = "URI:SSK-RO:jf6wkflosyvntwxqcdo7a54jvm:euw4iw7bbnkrrwpzuburbhppuxhc3gwxv26f6imekhz7zyw2ojnq" |
---|
41 | +future_write_uri = "x-tahoe-crazy://I_am_from_the_future." |
---|
42 | +future_read_uri = "x-tahoe-crazy-readonly://I_am_from_the_future." |
---|
43 | + |
---|
44 | class Dirnode(GridTestMixin, unittest.TestCase, |
---|
45 | testutil.ShouldFailMixin, testutil.StallMixin, ErrorMixin): |
---|
46 | timeout = 240 # It takes longer than 120 seconds on Francois's arm box. |
---|
47 | hunk ./src/allmydata/test/test_dirnode.py 76 |
---|
48 | c = self.g.clients[0] |
---|
49 | nm = c.nodemaker |
---|
50 | |
---|
51 | - setup_py_uri = "URI:CHK:n7r3m6wmomelk4sep3kw5cvduq:os7ijw5c3maek7pg65e5254k2fzjflavtpejjyhshpsxuqzhcwwq:3:20:14861" |
---|
52 | - one_uri = "URI:LIT:n5xgk" # LIT for "one" |
---|
53 | - mut_write_uri = "URI:SSK:vfvcbdfbszyrsaxchgevhmmlii:euw4iw7bbnkrrwpzuburbhppuxhc3gwxv26f6imekhz7zyw2ojnq" |
---|
54 | - mut_read_uri = "URI:SSK-RO:jf6wkflosyvntwxqcdo7a54jvm:euw4iw7bbnkrrwpzuburbhppuxhc3gwxv26f6imekhz7zyw2ojnq" |
---|
55 | - future_write_uri = "x-tahoe-crazy://I_am_from_the_future." |
---|
56 | - future_read_uri = "x-tahoe-crazy-readonly://I_am_from_the_future." |
---|
57 | kids = {u"one": (nm.create_from_cap(one_uri), {}), |
---|
58 | u"two": (nm.create_from_cap(setup_py_uri), |
---|
59 | {"metakey": "metavalue"}), |
---|
60 | hunk ./src/allmydata/test/test_dirnode.py 82 |
---|
61 | u"mut": (nm.create_from_cap(mut_write_uri, mut_read_uri), {}), |
---|
62 | u"fut": (nm.create_from_cap(future_write_uri, future_read_uri), {}), |
---|
63 | u"fro": (nm.create_from_cap(None, future_read_uri), {}), |
---|
64 | + u"empty_litdir": (nm.create_from_cap(empty_litdir_uri), {}), |
---|
65 | + u"tiny_litdir": (nm.create_from_cap(tiny_litdir_uri), {}), |
---|
66 | } |
---|
67 | d = c.create_dirnode(kids) |
---|
68 | |
---|
69 | hunk ./src/allmydata/test/test_dirnode.py 101 |
---|
70 | |
---|
71 | def _check_kids(children): |
---|
72 | self.failUnlessEqual(sorted(children.keys()), |
---|
73 | - [u"fro", u"fut", u"mut", u"one", u"two"]) |
---|
74 | + [u"empty_litdir", u"fro", u"fut", u"mut", u"one", u"tiny_litdir", u"two"]) |
---|
75 | one_node, one_metadata = children[u"one"] |
---|
76 | two_node, two_metadata = children[u"two"] |
---|
77 | mut_node, mut_metadata = children[u"mut"] |
---|
78 | hunk ./src/allmydata/test/test_dirnode.py 107 |
---|
79 | fut_node, fut_metadata = children[u"fut"] |
---|
80 | fro_node, fro_metadata = children[u"fro"] |
---|
81 | + emptylit_node, emptylit_metadata = children[u"empty_litdir"] |
---|
82 | + tinylit_node, tinylit_metadata = children[u"tiny_litdir"] |
---|
83 | |
---|
84 | self.failUnlessEqual(one_node.get_size(), 3) |
---|
85 | self.failUnlessEqual(one_node.get_uri(), one_uri) |
---|
86 | hunk ./src/allmydata/test/test_dirnode.py 133 |
---|
87 | self.failUnlessEqual(fro_node.get_uri(), "ro." + future_read_uri) |
---|
88 | self.failUnlessEqual(fut_node.get_readonly_uri(), "ro." + future_read_uri) |
---|
89 | self.failUnless(isinstance(fro_metadata, dict), fro_metadata) |
---|
90 | + |
---|
91 | + self.failIf(emptylit_node.is_unknown()) |
---|
92 | + self.failIf(tinylit_node.is_unknown()) |
---|
93 | + |
---|
94 | + d2 = defer.succeed(None) |
---|
95 | + d2.addCallback(lambda ignored: emptylit_node.list()) |
---|
96 | + d2.addCallback(lambda children: self.failUnlessEqual(children, {})) |
---|
97 | + d2.addCallback(lambda ignored: tinylit_node.list()) |
---|
98 | + d2.addCallback(lambda children: self.failUnlessEqual(set(children.keys()), set(['short']))) |
---|
99 | + d2.addCallback(lambda ignored: tinylit_node.list()) |
---|
100 | + d2.addCallback(lambda children: children['short'][0].read(MemAccum())) |
---|
101 | + d2.addCallback(lambda accum: self.failUnlessEqual(accum.data, "The end.")) |
---|
102 | + return d2 |
---|
103 | + |
---|
104 | d.addCallback(_check_kids) |
---|
105 | |
---|
106 | d.addCallback(lambda ign: nm.create_new_mutable_directory(kids)) |
---|
107 | hunk ./src/allmydata/test/test_dirnode.py 176 |
---|
108 | c = self.g.clients[0] |
---|
109 | nm = c.nodemaker |
---|
110 | |
---|
111 | - setup_py_uri = "URI:CHK:n7r3m6wmomelk4sep3kw5cvduq:os7ijw5c3maek7pg65e5254k2fzjflavtpejjyhshpsxuqzhcwwq:3:20:14861" |
---|
112 | - one_uri = "URI:LIT:n5xgk" # LIT for "one" |
---|
113 | - mut_write_uri = "URI:SSK:vfvcbdfbszyrsaxchgevhmmlii:euw4iw7bbnkrrwpzuburbhppuxhc3gwxv26f6imekhz7zyw2ojnq" |
---|
114 | - mut_read_uri = "URI:SSK-RO:e3mdrzfwhoq42hy5ubcz6rp3o4:ybyibhnp3vvwuq2vaw2ckjmesgkklfs6ghxleztqidihjyofgw7q" |
---|
115 | - future_write_uri = "x-tahoe-crazy://I_am_from_the_future." |
---|
116 | - future_read_uri = "x-tahoe-crazy-readonly://I_am_from_the_future." |
---|
117 | kids = {u"one": (nm.create_from_cap(one_uri), {}), |
---|
118 | u"two": (nm.create_from_cap(setup_py_uri), |
---|
119 | {"metakey": "metavalue"}), |
---|
120 | hunk ./src/allmydata/test/test_dirnode.py 180 |
---|
121 | u"fut": (nm.create_from_cap(None, future_read_uri), {}), |
---|
122 | + u"empty_litdir": (nm.create_from_cap(empty_litdir_uri), {}), |
---|
123 | + u"tiny_litdir": (nm.create_from_cap(tiny_litdir_uri), {}), |
---|
124 | } |
---|
125 | d = c.create_immutable_dirnode(kids) |
---|
126 | |
---|
127 | hunk ./src/allmydata/test/test_dirnode.py 201 |
---|
128 | d.addCallback(_created) |
---|
129 | |
---|
130 | def _check_kids(children): |
---|
131 | - self.failUnlessEqual(sorted(children.keys()), [u"fut", u"one", u"two"]) |
---|
132 | + self.failUnlessEqual(set(children.keys()), set([u"fut", u"one", u"two", u"empty_litdir", u"tiny_litdir"])) |
---|
133 | one_node, one_metadata = children[u"one"] |
---|
134 | two_node, two_metadata = children[u"two"] |
---|
135 | fut_node, fut_metadata = children[u"fut"] |
---|
136 | hunk ./src/allmydata/test/test_dirnode.py 205 |
---|
137 | + emptylit_node, emptylit_metadata = children[u"empty_litdir"] |
---|
138 | + tinylit_node, tinylit_metadata = children[u"tiny_litdir"] |
---|
139 | |
---|
140 | self.failUnlessEqual(one_node.get_size(), 3) |
---|
141 | self.failUnlessEqual(one_node.get_uri(), one_uri) |
---|
142 | hunk ./src/allmydata/test/test_dirnode.py 222 |
---|
143 | self.failUnlessEqual(fut_node.get_uri(), "imm." + future_read_uri) |
---|
144 | self.failUnlessEqual(fut_node.get_readonly_uri(), "imm." + future_read_uri) |
---|
145 | self.failUnless(isinstance(fut_metadata, dict), fut_metadata) |
---|
146 | + |
---|
147 | + d2 = defer.succeed(None) |
---|
148 | + d2.addCallback(lambda ignored: emptylit_node.list()) |
---|
149 | + d2.addCallback(lambda children: self.failUnlessEqual(children, {})) |
---|
150 | + d2.addCallback(lambda ignored: tinylit_node.list()) |
---|
151 | + d2.addCallback(lambda children: self.failUnlessEqual(set(children.keys()), set(['short']))) |
---|
152 | + d2.addCallback(lambda ignored: tinylit_node.list()) |
---|
153 | + d2.addCallback(lambda children: children['short'][0].read(MemAccum())) |
---|
154 | + d2.addCallback(lambda accum: self.failUnlessEqual(accum.data, "The end.")) |
---|
155 | + return d2 |
---|
156 | + |
---|
157 | d.addCallback(_check_kids) |
---|
158 | |
---|
159 | d.addCallback(lambda ign: nm.create_from_cap(self.cap.to_string())) |
---|
160 | } |
---|
161 | |
---|
162 | Context: |
---|
163 | |
---|
164 | [More cleanups to test_cli using new utilities for reading and writing files. |
---|
165 | david-sarah@jacaranda.org**20100206013855 |
---|
166 | Ignore-this: 9fd2294406b346bfe9144fff6a61f789 |
---|
167 | ] |
---|
168 | [Fix race conditions and missing callback in allmydata.test.test_cli.Cp.test_copy_using_filecap, add utilities for one-liner reading and writing of files, and fix cases in test_cli where files were not being closed after writing. |
---|
169 | david-sarah@jacaranda.org**20100206013727 |
---|
170 | Ignore-this: 49da6c33190d526a4ae84c472f04d5f4 |
---|
171 | ] |
---|
172 | [setup: comment-out the dependency on pycrypto, see #953 |
---|
173 | zooko@zooko.com**20100215050844 |
---|
174 | Ignore-this: 2751120921ff35b8189d8fcd896da149 |
---|
175 | ] |
---|
176 | [Add tests for #939 |
---|
177 | Kevan Carstensen <kevan@isnotajoke.com>**20100212062137 |
---|
178 | Ignore-this: 5459e8c64ba76cca70aa720e68549637 |
---|
179 | ] |
---|
180 | [Alter CLI utilities to handle nonexistent aliases better |
---|
181 | Kevan Carstensen <kevan@isnotajoke.com>**20100211024318 |
---|
182 | Ignore-this: e698ea4a57f5fe27c24336581ca0cf65 |
---|
183 | ] |
---|
184 | [adding pycrypto to the auto dependencies |
---|
185 | secorp@allmydata.com**20100206054314 |
---|
186 | Ignore-this: b873fc00a6a5b001d30d479e6053cf2f |
---|
187 | ] |
---|
188 | [docs running.html - "tahoe run ." does not work with the current installation, replaced with "tahoe start ." |
---|
189 | secorp@allmydata.com**20100206165320 |
---|
190 | Ignore-this: fdb2dcb0e417d303cd43b1951a4f8c03 |
---|
191 | ] |
---|
192 | [web/storage.py: display total-seen on the last-complete-cycle line. For #940. |
---|
193 | Brian Warner <warner@lothar.com>**20100208002010 |
---|
194 | Ignore-this: c0ed860f3e9628d3171d2b055d96c5aa |
---|
195 | ] |
---|
196 | [code coverage: replace figleaf with coverage.py, should work on py2.6 now. |
---|
197 | Brian Warner <warner@lothar.com>**20100203165421 |
---|
198 | Ignore-this: 46ab590360be6a385cb4fc4e68b6b42c |
---|
199 | |
---|
200 | It still lacks the right HTML report (the builtin report is very pretty, but |
---|
201 | lacks the "lines uncovered" numbers that I want), and the half-finished |
---|
202 | delta-from-last-run measurements. |
---|
203 | ] |
---|
204 | [More comprehensive changes and ticket references for NEWS |
---|
205 | david-sarah@jacaranda.org**20100202061256 |
---|
206 | Ignore-this: 696cf0106e8a7fd388afc5b55fba8a1b |
---|
207 | ] |
---|
208 | [docs: install.html: link into Python 2.5.5 download page |
---|
209 | zooko@zooko.com**20100202065852 |
---|
210 | Ignore-this: 1a9471b8175b7de5741d8445a7ede29d |
---|
211 | ] |
---|
212 | [TAG allmydata-tahoe-1.6.0 |
---|
213 | zooko@zooko.com**20100202061125 |
---|
214 | Ignore-this: dee6ade7ac1452cf5d1d9c69a8146d84 |
---|
215 | ] |
---|
216 | Patch bundle hash: |
---|
217 | 563cb58440ac6de6d750b4dbf66761a4dc167317 |
---|