1 | Tue Feb 23 23:45:49 MST 2010 zooko@zooko.com |
---|
2 | * directories: add immutable directories to test_deepcheck.py |
---|
3 | |
---|
4 | New patches: |
---|
5 | |
---|
6 | [directories: add immutable directories to test_deepcheck.py |
---|
7 | zooko@zooko.com**20100224064549 |
---|
8 | Ignore-this: 679f2b3cbbf02d59a44a7727c6eeb16d |
---|
9 | ] { |
---|
10 | hunk ./src/allmydata/nodemaker.py 48 |
---|
11 | return DirectoryNode(filenode, self, self.uploader) |
---|
12 | |
---|
13 | def create_from_cap(self, writecap, readcap=None, deep_immutable=False, name=u"<unknown name>"): |
---|
14 | + """ The 'name' argument is solely for debugging -- it is not |
---|
15 | + necessarily the name of this node in any Tahoe-LAFS namespace. """ |
---|
16 | # this returns synchronously. It starts with a "cap string". |
---|
17 | assert isinstance(writecap, (str, type(None))), type(writecap) |
---|
18 | assert isinstance(readcap, (str, type(None))), type(readcap) |
---|
19 | hunk ./src/allmydata/test/test_deepcheck.py 149 |
---|
20 | if not unit: |
---|
21 | # stream should end with a newline, so split returns "" |
---|
22 | continue |
---|
23 | - yield simplejson.loads(unit) |
---|
24 | + try: |
---|
25 | + yield simplejson.loads(unit) |
---|
26 | + except ValueError, le: |
---|
27 | + le.args = tuple(le.args + (unit,)) |
---|
28 | + raise |
---|
29 | |
---|
30 | def web(self, n, method="GET", **kwargs): |
---|
31 | # returns (data, url) |
---|
32 | hunk ./src/allmydata/test/test_deepcheck.py 207 |
---|
33 | |
---|
34 | class DeepCheckWebGood(DeepCheckBase, unittest.TestCase): |
---|
35 | # construct a small directory tree (with one dir, one immutable file, one |
---|
36 | - # mutable file, one LIT file, and a loop), and then check/examine it in |
---|
37 | - # various ways. |
---|
38 | + # mutable file, one LIT file, one DIR2:LIT empty dir, one DIR2:LIT tiny |
---|
39 | + # dir, and a loop), and then check/examine it in various ways. |
---|
40 | |
---|
41 | def set_up_tree(self): |
---|
42 | # 2.9s |
---|
43 | hunk ./src/allmydata/test/test_deepcheck.py 213 |
---|
44 | |
---|
45 | - # root |
---|
46 | - # mutable |
---|
47 | - # large |
---|
48 | - # small |
---|
49 | - # small2 |
---|
50 | - # loop -> root |
---|
51 | c0 = self.g.clients[0] |
---|
52 | d = c0.create_dirnode() |
---|
53 | def _created_root(n): |
---|
54 | hunk ./src/allmydata/test/test_deepcheck.py 247 |
---|
55 | self.small2_uri = n.get_uri() |
---|
56 | d.addCallback(_created_small2) |
---|
57 | |
---|
58 | + empty_litdir_uri = "URI:DIR2-LIT:" |
---|
59 | + tiny_litdir_uri = "URI:DIR2-LIT:gqytunj2onug64tufqzdcosvkjetutcjkq5gw4tvm5vwszdgnz5hgyzufqydulbshj5x2lbm" # contains one child which is itself also LIT |
---|
60 | + |
---|
61 | + d.addCallback(lambda ign: self.root._create_and_validate_node(None, empty_litdir_uri, name=u"test_deepcheck empty_lit_dir")) |
---|
62 | + def _created_empty_lit_dir(n): |
---|
63 | + self.empty_lit_dir = n |
---|
64 | + self.empty_lit_dir_uri = n.get_uri() |
---|
65 | + self.root.set_node(u"empty_lit_dir", n) |
---|
66 | + d.addCallback(_created_empty_lit_dir) |
---|
67 | + |
---|
68 | + d.addCallback(lambda ign: self.root._create_and_validate_node(None, tiny_litdir_uri, name=u"test_deepcheck tiny_lit_dir")) |
---|
69 | + def _created_tiny_lit_dir(n): |
---|
70 | + self.tiny_lit_dir = n |
---|
71 | + self.tiny_lit_dir_uri = n.get_uri() |
---|
72 | + self.root.set_node(u"tiny_lit_dir", n) |
---|
73 | + d.addCallback(_created_tiny_lit_dir) |
---|
74 | + |
---|
75 | d.addCallback(lambda ign: self.root.set_node(u"loop", self.root)) |
---|
76 | return d |
---|
77 | |
---|
78 | hunk ./src/allmydata/test/test_deepcheck.py 348 |
---|
79 | return d |
---|
80 | |
---|
81 | def check_stats_good(self, s): |
---|
82 | - self.failUnlessEqual(s["count-directories"], 1) |
---|
83 | - self.failUnlessEqual(s["count-files"], 4) |
---|
84 | + self.failUnlessEqual(s["count-directories"], 3) |
---|
85 | + self.failUnlessEqual(s["count-files"], 5) |
---|
86 | self.failUnlessEqual(s["count-immutable-files"], 1) |
---|
87 | hunk ./src/allmydata/test/test_deepcheck.py 351 |
---|
88 | - self.failUnlessEqual(s["count-literal-files"], 2) |
---|
89 | + self.failUnlessEqual(s["count-literal-files"], 3) |
---|
90 | self.failUnlessEqual(s["count-mutable-files"], 1) |
---|
91 | # don't check directories: their size will vary |
---|
92 | # s["largest-directory"] |
---|
93 | hunk ./src/allmydata/test/test_deepcheck.py 356 |
---|
94 | # s["size-directories"] |
---|
95 | - self.failUnlessEqual(s["largest-directory-children"], 5) |
---|
96 | + self.failUnlessEqual(s["largest-directory-children"], 7) |
---|
97 | self.failUnlessEqual(s["largest-immutable-file"], 13000) |
---|
98 | # to re-use this function for both the local |
---|
99 | # dirnode.start_deep_stats() and the webapi t=start-deep-stats, we |
---|
100 | hunk ./src/allmydata/test/test_deepcheck.py 364 |
---|
101 | # returns a list of tuples, but JSON only knows about lists., so |
---|
102 | # t=start-deep-stats returns a list of lists. |
---|
103 | histogram = [tuple(stuff) for stuff in s["size-files-histogram"]] |
---|
104 | - self.failUnlessEqual(histogram, [(11, 31, 2), |
---|
105 | + self.failUnlessEqual(histogram, [(4, 10, 1), (11, 31, 2), |
---|
106 | (10001, 31622, 1), |
---|
107 | ]) |
---|
108 | self.failUnlessEqual(s["size-immutable-files"], 13000) |
---|
109 | hunk ./src/allmydata/test/test_deepcheck.py 368 |
---|
110 | - self.failUnlessEqual(s["size-literal-files"], 48) |
---|
111 | + self.failUnlessEqual(s["size-literal-files"], 56) |
---|
112 | |
---|
113 | def do_web_stream_manifest(self, ignored): |
---|
114 | d = self.web(self.root, method="POST", t="stream-manifest") |
---|
115 | hunk ./src/allmydata/test/test_deepcheck.py 381 |
---|
116 | files = [u for u in units if u["type"] in ("file", "directory")] |
---|
117 | assert units[-1]["type"] == "stats" |
---|
118 | stats = units[-1]["stats"] |
---|
119 | - self.failUnlessEqual(len(files), 5) |
---|
120 | - # [root,mutable,large] are distributed, [small,small2] are not |
---|
121 | + self.failUnlessEqual(len(files), 8) |
---|
122 | + # [root,mutable,large] are distributed, [small,small2,empty_litdir,tiny_litdir] are not |
---|
123 | self.failUnlessEqual(len([f for f in files |
---|
124 | if f["verifycap"] is not None]), 3) |
---|
125 | self.failUnlessEqual(len([f for f in files |
---|
126 | hunk ./src/allmydata/test/test_deepcheck.py 386 |
---|
127 | - if f["verifycap"] is None]), 2) |
---|
128 | + if f["verifycap"] is None]), 5) |
---|
129 | self.failUnlessEqual(len([f for f in files |
---|
130 | if f["repaircap"] is not None]), 3) |
---|
131 | self.failUnlessEqual(len([f for f in files |
---|
132 | hunk ./src/allmydata/test/test_deepcheck.py 390 |
---|
133 | - if f["repaircap"] is None]), 2) |
---|
134 | + if f["repaircap"] is None]), 5) |
---|
135 | self.failUnlessEqual(len([f for f in files |
---|
136 | if f["storage-index"] is not None]), 3) |
---|
137 | self.failUnlessEqual(len([f for f in files |
---|
138 | hunk ./src/allmydata/test/test_deepcheck.py 394 |
---|
139 | - if f["storage-index"] is None]), 2) |
---|
140 | + if f["storage-index"] is None]), 5) |
---|
141 | # make sure that a mutable file has filecap==repaircap!=verifycap |
---|
142 | mutable = [f for f in files |
---|
143 | if f["cap"] is not None |
---|
144 | hunk ./src/allmydata/test/test_deepcheck.py 437 |
---|
145 | d.addCallback(self.failUnlessEqual, None, "small") |
---|
146 | d.addCallback(lambda ign: self.small2.check(Monitor())) |
---|
147 | d.addCallback(self.failUnlessEqual, None, "small2") |
---|
148 | + d.addCallback(lambda ign: self.empty_lit_dir.check(Monitor())) |
---|
149 | + d.addCallback(self.failUnlessEqual, None, "empty_lit_dir") |
---|
150 | + d.addCallback(lambda ign: self.tiny_lit_dir.check(Monitor())) |
---|
151 | + d.addCallback(self.failUnlessEqual, None, "tiny_lit_dir") |
---|
152 | |
---|
153 | # and again with verify=True |
---|
154 | d.addCallback(lambda ign: self.root.check(Monitor(), verify=True)) |
---|
155 | hunk ./src/allmydata/test/test_deepcheck.py 453 |
---|
156 | d.addCallback(self.failUnlessEqual, None, "small") |
---|
157 | d.addCallback(lambda ign: self.small2.check(Monitor(), verify=True)) |
---|
158 | d.addCallback(self.failUnlessEqual, None, "small2") |
---|
159 | + d.addCallback(lambda ign: self.empty_lit_dir.check(Monitor(), verify=True)) |
---|
160 | + d.addCallback(self.failUnlessEqual, None, "empty_lit_dir") |
---|
161 | + d.addCallback(lambda ign: self.tiny_lit_dir.check(Monitor(), verify=True)) |
---|
162 | + d.addCallback(self.failUnlessEqual, None, "tiny_lit_dir") |
---|
163 | |
---|
164 | # and check_and_repair(), which should be a nop |
---|
165 | d.addCallback(lambda ign: self.root.check_and_repair(Monitor())) |
---|
166 | hunk ./src/allmydata/test/test_deepcheck.py 463 |
---|
167 | d.addCallback(self.check_and_repair_is_healthy, self.root, "root") |
---|
168 | d.addCallback(lambda ign: self.mutable.check_and_repair(Monitor())) |
---|
169 | d.addCallback(self.check_and_repair_is_healthy, self.mutable, "mutable") |
---|
170 | - #TODO d.addCallback(lambda ign: self.large.check_and_repair(Monitor())) |
---|
171 | - #TODO d.addCallback(self.check_and_repair_is_healthy, self.large, "large") |
---|
172 | - #TODO d.addCallback(lambda ign: self.small.check_and_repair(Monitor())) |
---|
173 | - #TODO d.addCallback(self.failUnlessEqual, None, "small") |
---|
174 | - #TODO d.addCallback(lambda ign: self.small2.check_and_repair(Monitor())) |
---|
175 | - #TODO d.addCallback(self.failUnlessEqual, None, "small2") |
---|
176 | + d.addCallback(lambda ign: self.large.check_and_repair(Monitor())) |
---|
177 | + d.addCallback(self.check_and_repair_is_healthy, self.large, "large") |
---|
178 | + d.addCallback(lambda ign: self.small.check_and_repair(Monitor())) |
---|
179 | + d.addCallback(self.failUnlessEqual, None, "small") |
---|
180 | + d.addCallback(lambda ign: self.small2.check_and_repair(Monitor())) |
---|
181 | + d.addCallback(self.failUnlessEqual, None, "small2") |
---|
182 | + d.addCallback(lambda ign: self.empty_lit_dir.check_and_repair(Monitor())) |
---|
183 | + d.addCallback(self.failUnlessEqual, None, "empty_lit_dir") |
---|
184 | + d.addCallback(lambda ign: self.tiny_lit_dir.check_and_repair(Monitor())) |
---|
185 | |
---|
186 | # check_and_repair(verify=True) |
---|
187 | d.addCallback(lambda ign: self.root.check_and_repair(Monitor(), verify=True)) |
---|
188 | hunk ./src/allmydata/test/test_deepcheck.py 478 |
---|
189 | d.addCallback(self.check_and_repair_is_healthy, self.root, "root") |
---|
190 | d.addCallback(lambda ign: self.mutable.check_and_repair(Monitor(), verify=True)) |
---|
191 | d.addCallback(self.check_and_repair_is_healthy, self.mutable, "mutable") |
---|
192 | - #TODO d.addCallback(lambda ign: self.large.check_and_repair(Monitor(), verify=True)) |
---|
193 | - #TODO d.addCallback(self.check_and_repair_is_healthy, self.large, "large", |
---|
194 | - #TODO incomplete=True) |
---|
195 | - #TODO d.addCallback(lambda ign: self.small.check_and_repair(Monitor(), verify=True)) |
---|
196 | - #TODO d.addCallback(self.failUnlessEqual, None, "small") |
---|
197 | - #TODO d.addCallback(lambda ign: self.small2.check_and_repair(Monitor(), verify=True)) |
---|
198 | - #TODO d.addCallback(self.failUnlessEqual, None, "small2") |
---|
199 | + d.addCallback(lambda ign: self.large.check_and_repair(Monitor(), verify=True)) |
---|
200 | + d.addCallback(self.check_and_repair_is_healthy, self.large, "large", incomplete=True) |
---|
201 | + d.addCallback(lambda ign: self.small.check_and_repair(Monitor(), verify=True)) |
---|
202 | + d.addCallback(self.failUnlessEqual, None, "small") |
---|
203 | + d.addCallback(lambda ign: self.small2.check_and_repair(Monitor(), verify=True)) |
---|
204 | + d.addCallback(self.failUnlessEqual, None, "small2") |
---|
205 | + d.addCallback(self.failUnlessEqual, None, "small2") |
---|
206 | + d.addCallback(lambda ign: self.empty_lit_dir.check_and_repair(Monitor(), verify=True)) |
---|
207 | + d.addCallback(self.failUnlessEqual, None, "empty_lit_dir") |
---|
208 | + d.addCallback(lambda ign: self.tiny_lit_dir.check_and_repair(Monitor(), verify=True)) |
---|
209 | |
---|
210 | |
---|
211 | # now deep-check the root, with various verify= and repair= options |
---|
212 | hunk ./src/allmydata/test/test_deepcheck.py 631 |
---|
213 | d.addCallback(self.json_check_lit, self.small, "small") |
---|
214 | d.addCallback(lambda ign: self.web_json(self.small2, t="check")) |
---|
215 | d.addCallback(self.json_check_lit, self.small2, "small2") |
---|
216 | + d.addCallback(lambda ign: self.web_json(self.empty_lit_dir, t="check")) |
---|
217 | + d.addCallback(self.json_check_lit, self.empty_lit_dir, "empty_lit_dir") |
---|
218 | + d.addCallback(lambda ign: self.web_json(self.tiny_lit_dir, t="check")) |
---|
219 | + d.addCallback(self.json_check_lit, self.tiny_lit_dir, "tiny_lit_dir") |
---|
220 | |
---|
221 | # check and verify |
---|
222 | d.addCallback(lambda ign: |
---|
223 | hunk ./src/allmydata/test/test_deepcheck.py 653 |
---|
224 | d.addCallback(lambda ign: |
---|
225 | self.web_json(self.small2, t="check", verify="true")) |
---|
226 | d.addCallback(self.json_check_lit, self.small2, "small2+v") |
---|
227 | + d.addCallback(lambda ign: self.web_json(self.empty_lit_dir, t="check", verify="true")) |
---|
228 | + d.addCallback(self.json_check_lit, self.empty_lit_dir, "empty_lit_dir+v") |
---|
229 | + d.addCallback(lambda ign: self.web_json(self.tiny_lit_dir, t="check", verify="true")) |
---|
230 | + d.addCallback(self.json_check_lit, self.tiny_lit_dir, "tiny_lit_dir+v") |
---|
231 | |
---|
232 | # check and repair, no verify |
---|
233 | d.addCallback(lambda ign: |
---|
234 | hunk ./src/allmydata/test/test_deepcheck.py 674 |
---|
235 | d.addCallback(lambda ign: |
---|
236 | self.web_json(self.small2, t="check", repair="true")) |
---|
237 | d.addCallback(self.json_check_lit, self.small2, "small2+r") |
---|
238 | + d.addCallback(lambda ign: self.web_json(self.empty_lit_dir, t="check", repair="true")) |
---|
239 | + d.addCallback(self.json_check_lit, self.empty_lit_dir, "empty_lit_dir+r") |
---|
240 | + d.addCallback(lambda ign: self.web_json(self.tiny_lit_dir, t="check", repair="true")) |
---|
241 | + d.addCallback(self.json_check_lit, self.tiny_lit_dir, "tiny_lit_dir+r") |
---|
242 | |
---|
243 | # check+verify+repair |
---|
244 | d.addCallback(lambda ign: |
---|
245 | hunk ./src/allmydata/test/test_deepcheck.py 695 |
---|
246 | d.addCallback(lambda ign: |
---|
247 | self.web_json(self.small2, t="check", repair="true", verify="true")) |
---|
248 | d.addCallback(self.json_check_lit, self.small2, "small2+vr") |
---|
249 | + d.addCallback(lambda ign: self.web_json(self.empty_lit_dir, t="check", repair="true", verify=True)) |
---|
250 | + d.addCallback(self.json_check_lit, self.empty_lit_dir, "empty_lit_dir+vr") |
---|
251 | + d.addCallback(lambda ign: self.web_json(self.tiny_lit_dir, t="check", repair="true", verify=True)) |
---|
252 | + d.addCallback(self.json_check_lit, self.tiny_lit_dir, "tiny_lit_dir+vr") |
---|
253 | |
---|
254 | # now run a deep-check, with various verify= and repair= flags |
---|
255 | d.addCallback(lambda ign: |
---|
256 | hunk ./src/allmydata/test/test_deepcheck.py 723 |
---|
257 | d.addCallback(lambda ign: self.web(self.large, t="info")) |
---|
258 | d.addCallback(lambda ign: self.web(self.small, t="info")) |
---|
259 | d.addCallback(lambda ign: self.web(self.small2, t="info")) |
---|
260 | + d.addCallback(lambda ign: self.web(self.empty_lit_dir, t="info")) |
---|
261 | + d.addCallback(lambda ign: self.web(self.tiny_lit_dir, t="info")) |
---|
262 | |
---|
263 | return d |
---|
264 | |
---|
265 | hunk ./src/allmydata/test/test_deepcheck.py 780 |
---|
266 | self.failUnlessEqual(caps[self.large.get_uri()], "large") |
---|
267 | self.failUnlessEqual(caps[self.small.get_uri()], "small") |
---|
268 | self.failUnlessEqual(caps[self.small2.get_uri()], "small2") |
---|
269 | + self.failUnlessEqual(caps[self.empty_lit_dir.get_uri()], "empty_lit_dir") |
---|
270 | + self.failUnlessEqual(caps[self.tiny_lit_dir.get_uri()], "tiny_lit_dir") |
---|
271 | d.addCallback(_check) |
---|
272 | return d |
---|
273 | |
---|
274 | hunk ./src/allmydata/uri.py 197 |
---|
275 | STRING_RE=re.compile('^URI:LIT:'+base32.BASE32STR_anybytes+'$') |
---|
276 | HUMAN_RE=re.compile('^'+OPTIONALHTTPLEAD+'URI'+SEP+'LIT'+SEP+base32.BASE32STR_anybytes+'$') |
---|
277 | |
---|
278 | - def __init__(self, data=None): |
---|
279 | - if data is not None: |
---|
280 | - assert isinstance(data, str) |
---|
281 | - self.data = data |
---|
282 | + def __init__(self, data): |
---|
283 | + assert isinstance(data, str) |
---|
284 | + self.data = data |
---|
285 | |
---|
286 | @classmethod |
---|
287 | def init_from_human_encoding(cls, uri): |
---|
288 | } |
---|
289 | |
---|
290 | Context: |
---|
291 | |
---|
292 | [More cleanups to test_cli using new utilities for reading and writing files. |
---|
293 | david-sarah@jacaranda.org**20100206013855 |
---|
294 | Ignore-this: 9fd2294406b346bfe9144fff6a61f789 |
---|
295 | ] |
---|
296 | [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. |
---|
297 | david-sarah@jacaranda.org**20100206013727 |
---|
298 | Ignore-this: 49da6c33190d526a4ae84c472f04d5f4 |
---|
299 | ] |
---|
300 | [setup: comment-out the dependency on pycrypto, see #953 |
---|
301 | zooko@zooko.com**20100215050844 |
---|
302 | Ignore-this: 2751120921ff35b8189d8fcd896da149 |
---|
303 | ] |
---|
304 | [Add tests for #939 |
---|
305 | Kevan Carstensen <kevan@isnotajoke.com>**20100212062137 |
---|
306 | Ignore-this: 5459e8c64ba76cca70aa720e68549637 |
---|
307 | ] |
---|
308 | [Alter CLI utilities to handle nonexistent aliases better |
---|
309 | Kevan Carstensen <kevan@isnotajoke.com>**20100211024318 |
---|
310 | Ignore-this: e698ea4a57f5fe27c24336581ca0cf65 |
---|
311 | ] |
---|
312 | [adding pycrypto to the auto dependencies |
---|
313 | secorp@allmydata.com**20100206054314 |
---|
314 | Ignore-this: b873fc00a6a5b001d30d479e6053cf2f |
---|
315 | ] |
---|
316 | [docs running.html - "tahoe run ." does not work with the current installation, replaced with "tahoe start ." |
---|
317 | secorp@allmydata.com**20100206165320 |
---|
318 | Ignore-this: fdb2dcb0e417d303cd43b1951a4f8c03 |
---|
319 | ] |
---|
320 | [web/storage.py: display total-seen on the last-complete-cycle line. For #940. |
---|
321 | Brian Warner <warner@lothar.com>**20100208002010 |
---|
322 | Ignore-this: c0ed860f3e9628d3171d2b055d96c5aa |
---|
323 | ] |
---|
324 | [code coverage: replace figleaf with coverage.py, should work on py2.6 now. |
---|
325 | Brian Warner <warner@lothar.com>**20100203165421 |
---|
326 | Ignore-this: 46ab590360be6a385cb4fc4e68b6b42c |
---|
327 | |
---|
328 | It still lacks the right HTML report (the builtin report is very pretty, but |
---|
329 | lacks the "lines uncovered" numbers that I want), and the half-finished |
---|
330 | delta-from-last-run measurements. |
---|
331 | ] |
---|
332 | [More comprehensive changes and ticket references for NEWS |
---|
333 | david-sarah@jacaranda.org**20100202061256 |
---|
334 | Ignore-this: 696cf0106e8a7fd388afc5b55fba8a1b |
---|
335 | ] |
---|
336 | [docs: install.html: link into Python 2.5.5 download page |
---|
337 | zooko@zooko.com**20100202065852 |
---|
338 | Ignore-this: 1a9471b8175b7de5741d8445a7ede29d |
---|
339 | ] |
---|
340 | [TAG allmydata-tahoe-1.6.0 |
---|
341 | zooko@zooko.com**20100202061125 |
---|
342 | Ignore-this: dee6ade7ac1452cf5d1d9c69a8146d84 |
---|
343 | ] |
---|
344 | Patch bundle hash: |
---|
345 | 7d1641ff84c408c3275fe709337123b0c4a988e9 |
---|