Ticket #948: test-dirnode-lit-in-deep-check.darcspatch.txt

File test-dirnode-lit-in-deep-check.darcspatch.txt, 17.3 KB (added by zooko, at 2010-02-24T06:56:03Z)

add tests of literal dirnodes to test_deepcheck.py (the current trunk fails these tests and so does the current all-948-darcspatch.txt! Of course I'm not sure if it is the tests or the code that is wrong)

Line 
1Tue Feb 23 23:45:49 MST 2010  zooko@zooko.com
2  * directories: add immutable directories to test_deepcheck.py
3
4New patches:
5
6[directories: add immutable directories to test_deepcheck.py
7zooko@zooko.com**20100224064549
8 Ignore-this: 679f2b3cbbf02d59a44a7727c6eeb16d
9] {
10hunk ./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)
19hunk ./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)
32hunk ./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
43hunk ./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):
54hunk ./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 
78hunk ./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)
87hunk ./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"]
93hunk ./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
100hunk ./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)
109hunk ./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")
115hunk ./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
126hunk ./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
132hunk ./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
138hunk ./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
144hunk ./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))
155hunk ./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()))
166hunk ./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))
188hunk ./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
212hunk ./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:
223hunk ./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:
234hunk ./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:
245hunk ./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:
256hunk ./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 
265hunk ./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 
274hunk ./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
290Context:
291
292[More cleanups to test_cli using new utilities for reading and writing files.
293david-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.
297david-sarah@jacaranda.org**20100206013727
298 Ignore-this: 49da6c33190d526a4ae84c472f04d5f4
299]
300[setup: comment-out the dependency on pycrypto, see #953
301zooko@zooko.com**20100215050844
302 Ignore-this: 2751120921ff35b8189d8fcd896da149
303]
304[Add tests for #939
305Kevan Carstensen <kevan@isnotajoke.com>**20100212062137
306 Ignore-this: 5459e8c64ba76cca70aa720e68549637
307]
308[Alter CLI utilities to handle nonexistent aliases better
309Kevan Carstensen <kevan@isnotajoke.com>**20100211024318
310 Ignore-this: e698ea4a57f5fe27c24336581ca0cf65
311]
312[adding pycrypto to the auto dependencies
313secorp@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 ."
317secorp@allmydata.com**20100206165320
318 Ignore-this: fdb2dcb0e417d303cd43b1951a4f8c03
319]
320[web/storage.py: display total-seen on the last-complete-cycle line. For #940.
321Brian Warner <warner@lothar.com>**20100208002010
322 Ignore-this: c0ed860f3e9628d3171d2b055d96c5aa
323]
324[code coverage: replace figleaf with coverage.py, should work on py2.6 now.
325Brian 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
333david-sarah@jacaranda.org**20100202061256
334 Ignore-this: 696cf0106e8a7fd388afc5b55fba8a1b
335]
336[docs: install.html: link into Python 2.5.5 download page
337zooko@zooko.com**20100202065852
338 Ignore-this: 1a9471b8175b7de5741d8445a7ede29d
339]
340[TAG allmydata-tahoe-1.6.0
341zooko@zooko.com**20100202061125
342 Ignore-this: dee6ade7ac1452cf5d1d9c69a8146d84
343]
344Patch bundle hash:
3457d1641ff84c408c3275fe709337123b0c4a988e9