]> arthur.barton.de Git - bup.git/blob - test/int/test_index.py
f24b719a67dc8e671410fb0296fcd514779f045f
[bup.git] / test / int / test_index.py
1
2 from __future__ import absolute_import, print_function
3 import os, time
4
5 from wvpytest import *
6
7 from bup import index, metadata
8 from bup.compat import fsencode
9 from bup.helpers import resolve_parent
10 import bup.xstat as xstat
11
12
13 lib_t_dir = os.path.dirname(fsencode(__file__))
14
15
16 def test_index_basic():
17     cd = os.path.realpath(os.path.join(lib_t_dir, b'../'))
18     WVPASS(cd)
19     sd = os.path.realpath(cd + b'/sampledata')
20     WVPASSEQ(resolve_parent(cd + b'/sampledata'), sd)
21     WVPASSEQ(os.path.realpath(cd + b'/sampledata/x'), sd + b'/x')
22     WVPASSEQ(os.path.realpath(cd + b'/sampledata/var/abs-symlink'),
23              sd + b'/var/abs-symlink-target')
24     WVPASSEQ(resolve_parent(cd + b'/sampledata/var/abs-symlink'),
25              sd + b'/var/abs-symlink')
26
27
28 def test_index_writer(tmpdir):
29     orig_cwd = os.getcwd()
30     try:
31         os.chdir(tmpdir)
32         ds = xstat.stat(b'.')
33         fs = xstat.stat(lib_t_dir + b'/test_index.py')
34         ms = index.MetaStoreWriter(b'index.meta.tmp');
35         tmax = (time.time() - 1) * 10**9
36         w = index.Writer(b'index.tmp', ms, tmax)
37         w.add(b'/var/tmp/sporky', fs, 0)
38         w.add(b'/etc/passwd', fs, 0)
39         w.add(b'/etc/', ds, 0)
40         w.add(b'/', ds, 0)
41         ms.close()
42         w.close()
43     finally:
44         os.chdir(orig_cwd)
45
46
47 def dump(m):
48     for e in list(m):
49         print('%s%s %s' % (e.is_valid() and ' ' or 'M',
50                            e.is_fake() and 'F' or ' ',
51                            e.name))
52
53 def fake_validate(*l):
54     for i in l:
55         for e in i:
56             e.validate(0o100644, index.FAKE_SHA)
57             e.repack()
58
59 def eget(l, ename):
60     for e in l:
61         if e.name == ename:
62             return e
63     return None
64
65 def test_index_negative_timestamps(tmpdir):
66     # Makes 'foo' exist
67     foopath = tmpdir + b'/foo'
68     f = open(foopath, 'wb')
69     f.close()
70
71     # Dec 31, 1969
72     os.utime(foopath, (-86400, -86400))
73     ns_per_sec = 10**9
74     tmax = (time.time() - 1) * ns_per_sec
75     e = index.BlankNewEntry(foopath, 0, tmax)
76     e.update_from_stat(xstat.stat(foopath), 0)
77     WVPASS(e.packed())
78
79     # Jun 10, 1893
80     os.utime(foopath, (-0x80000000, -0x80000000))
81     e = index.BlankNewEntry(foopath, 0, tmax)
82     e.update_from_stat(xstat.stat(foopath), 0)
83     WVPASS(e.packed())
84
85
86 def test_index_dirty(tmpdir):
87     orig_cwd = os.getcwd()
88     try:
89         os.chdir(tmpdir)
90         default_meta = metadata.Metadata()
91         ms1 = index.MetaStoreWriter(b'index.meta.tmp')
92         ms2 = index.MetaStoreWriter(b'index2.meta.tmp')
93         ms3 = index.MetaStoreWriter(b'index3.meta.tmp')
94         meta_ofs1 = ms1.store(default_meta)
95         meta_ofs2 = ms2.store(default_meta)
96         meta_ofs3 = ms3.store(default_meta)
97
98         ds = xstat.stat(lib_t_dir)
99         fs = xstat.stat(lib_t_dir + b'/test_index.py')
100         tmax = (time.time() - 1) * 10**9
101
102         w1 = index.Writer(b'index.tmp', ms1, tmax)
103         w1.add(b'/a/b/x', fs, meta_ofs1)
104         w1.add(b'/a/b/c', fs, meta_ofs1)
105         w1.add(b'/a/b/', ds, meta_ofs1)
106         w1.add(b'/a/', ds, meta_ofs1)
107         #w1.close()
108         WVPASS()
109
110         w2 = index.Writer(b'index2.tmp', ms2, tmax)
111         w2.add(b'/a/b/n/2', fs, meta_ofs2)
112         #w2.close()
113         WVPASS()
114
115         w3 = index.Writer(b'index3.tmp', ms3, tmax)
116         w3.add(b'/a/c/n/3', fs, meta_ofs3)
117         #w3.close()
118         WVPASS()
119
120         r1 = w1.new_reader()
121         r2 = w2.new_reader()
122         r3 = w3.new_reader()
123         WVPASS()
124
125         r1all = [e.name for e in r1]
126         WVPASSEQ(r1all,
127                  [b'/a/b/x', b'/a/b/c', b'/a/b/', b'/a/', b'/'])
128         r2all = [e.name for e in r2]
129         WVPASSEQ(r2all,
130                  [b'/a/b/n/2', b'/a/b/n/', b'/a/b/', b'/a/', b'/'])
131         r3all = [e.name for e in r3]
132         WVPASSEQ(r3all,
133                  [b'/a/c/n/3', b'/a/c/n/', b'/a/c/', b'/a/', b'/'])
134         all = [e.name for e in index.merge(r2, r1, r3)]
135         WVPASSEQ(all,
136                  [b'/a/c/n/3', b'/a/c/n/', b'/a/c/',
137                   b'/a/b/x', b'/a/b/n/2', b'/a/b/n/', b'/a/b/c',
138                   b'/a/b/', b'/a/', b'/'])
139         fake_validate(r1)
140         dump(r1)
141
142         print([hex(e.flags) for e in r1])
143         WVPASSEQ([e.name for e in r1 if e.is_valid()], r1all)
144         WVPASSEQ([e.name for e in r1 if not e.is_valid()], [])
145         WVPASSEQ([e.name for e in index.merge(r2, r1, r3) if not e.is_valid()],
146                  [b'/a/c/n/3', b'/a/c/n/', b'/a/c/',
147                   b'/a/b/n/2', b'/a/b/n/', b'/a/b/', b'/a/', b'/'])
148
149         expect_invalid = [b'/'] + r2all + r3all
150         expect_real = (set(r1all) - set(r2all) - set(r3all)) \
151                         | set([b'/a/b/n/2', b'/a/c/n/3'])
152         dump(index.merge(r2, r1, r3))
153         for e in index.merge(r2, r1, r3):
154             print(e.name, hex(e.flags), e.ctime)
155             eiv = e.name in expect_invalid
156             er  = e.name in expect_real
157             WVPASSEQ(eiv, not e.is_valid())
158             WVPASSEQ(er, e.is_real())
159         fake_validate(r2, r3)
160         dump(index.merge(r2, r1, r3))
161         WVPASSEQ([e.name for e in index.merge(r2, r1, r3) if not e.is_valid()], [])
162
163         e = eget(index.merge(r2, r1, r3), b'/a/b/c')
164         e.invalidate()
165         e.repack()
166         dump(index.merge(r2, r1, r3))
167         WVPASSEQ([e.name for e in index.merge(r2, r1, r3) if not e.is_valid()],
168                  [b'/a/b/c', b'/a/b/', b'/a/', b'/'])
169         w1.close()
170         w2.close()
171         w3.close()
172     finally:
173         os.chdir(orig_cwd)