]> arthur.barton.de Git - bup.git/blob - lib/bup/t/tgit.py
tgit.py: set BUP_MAIN_EXE and BUP_DIR in testpacks().
[bup.git] / lib / bup / t / tgit.py
1 import struct, os, tempfile, time
2 from bup import git
3 from bup.helpers import *
4 from wvtest import *
5
6
7 @wvtest
8 def testmangle():
9     afile  = 0100644
10     afile2 = 0100770
11     alink  = 0120000
12     adir   = 0040000
13     adir2  = 0040777
14     WVPASSEQ(git.mangle_name("a", adir2, adir), "a")
15     WVPASSEQ(git.mangle_name(".bup", adir2, adir), ".bup.bupl")
16     WVPASSEQ(git.mangle_name("a.bupa", adir2, adir), "a.bupa.bupl")
17     WVPASSEQ(git.mangle_name("b.bup", alink, alink), "b.bup.bupl")
18     WVPASSEQ(git.mangle_name("b.bu", alink, alink), "b.bu")
19     WVPASSEQ(git.mangle_name("f", afile, afile2), "f")
20     WVPASSEQ(git.mangle_name("f.bup", afile, afile2), "f.bup.bupl")
21     WVPASSEQ(git.mangle_name("f.bup", afile, adir), "f.bup.bup")
22     WVPASSEQ(git.mangle_name("f", afile, adir), "f.bup")
23
24     WVPASSEQ(git.demangle_name("f.bup"), ("f", git.BUP_CHUNKED))
25     WVPASSEQ(git.demangle_name("f.bupl"), ("f", git.BUP_NORMAL))
26     WVPASSEQ(git.demangle_name("f.bup.bupl"), ("f.bup", git.BUP_NORMAL))
27
28     # for safety, we ignore .bup? suffixes we don't recognize.  Future
29     # versions might implement a .bup[a-z] extension as something other
30     # than BUP_NORMAL.
31     WVPASSEQ(git.demangle_name("f.bupa"), ("f.bupa", git.BUP_NORMAL))
32
33
34 @wvtest
35 def testencode():
36     s = 'hello world'
37     looseb = ''.join(git._encode_looseobj('blob', s))
38     looset = ''.join(git._encode_looseobj('tree', s))
39     loosec = ''.join(git._encode_looseobj('commit', s))
40     packb = ''.join(git._encode_packobj('blob', s))
41     packt = ''.join(git._encode_packobj('tree', s))
42     packc = ''.join(git._encode_packobj('commit', s))
43     WVPASSEQ(git._decode_looseobj(looseb), ('blob', s))
44     WVPASSEQ(git._decode_looseobj(looset), ('tree', s))
45     WVPASSEQ(git._decode_looseobj(loosec), ('commit', s))
46     WVPASSEQ(git._decode_packobj(packb), ('blob', s))
47     WVPASSEQ(git._decode_packobj(packt), ('tree', s))
48     WVPASSEQ(git._decode_packobj(packc), ('commit', s))
49
50
51 @wvtest
52 def testpacks():
53     os.environ['BUP_MAIN_EXE'] = bupmain = '../../../bup'
54     os.environ['BUP_DIR'] = bupdir = 'pybuptest.tmp'
55     subprocess.call(['rm','-rf', bupdir])
56     git.init_repo(bupdir)
57     git.verbose = 1
58
59     w = git.PackWriter()
60     w.new_blob(os.urandom(100))
61     w.new_blob(os.urandom(100))
62     w.abort()
63     
64     w = git.PackWriter()
65     hashes = []
66     nobj = 1000
67     for i in range(nobj):
68         hashes.append(w.new_blob(str(i)))
69     log('\n')
70     nameprefix = w.close()
71     print repr(nameprefix)
72     WVPASS(os.path.exists(nameprefix + '.pack'))
73     WVPASS(os.path.exists(nameprefix + '.idx'))
74
75     r = git.open_idx(nameprefix + '.idx')
76     print repr(r.fanout)
77
78     for i in range(nobj):
79         WVPASS(r.find_offset(hashes[i]) > 0)
80     WVPASS(r.exists(hashes[99]))
81     WVFAIL(r.exists('\0'*20))
82
83     pi = iter(r)
84     for h in sorted(hashes):
85         WVPASSEQ(str(pi.next()).encode('hex'), h.encode('hex'))
86
87     WVFAIL(r.find_offset('\0'*20))
88
89     r = git.PackIdxList('pybuptest.tmp/objects/pack')
90     WVPASS(r.exists(hashes[5]))
91     WVPASS(r.exists(hashes[6]))
92     WVFAIL(r.exists('\0'*20))
93
94
95 @wvtest
96 def test_pack_name_lookup():
97     os.environ['BUP_MAIN_EXE'] = bupmain = '../../../bup'
98     os.environ['BUP_DIR'] = bupdir = 'pybuptest.tmp'
99     subprocess.call(['rm','-rf', bupdir])
100     git.init_repo(bupdir)
101     git.verbose = 1
102     packdir = git.repo('objects/pack')
103
104     idxnames = []
105     hashes = []
106
107     for start in range(0,28,2):
108         w = git.PackWriter()
109         for i in range(start, start+2):
110             hashes.append(w.new_blob(str(i)))
111         log('\n')
112         idxnames.append(os.path.basename(w.close() + '.idx'))
113
114     r = git.PackIdxList(packdir)
115     WVPASSEQ(len(r.packs), 2)
116     for e,idxname in enumerate(idxnames):
117         for i in range(e*2, (e+1)*2):
118             WVPASSEQ(r.exists(hashes[i], want_source=True), idxname)
119
120
121 @wvtest
122 def test_long_index():
123     w = git.PackWriter()
124     obj_bin = struct.pack('!IIIII',
125             0x00112233, 0x44556677, 0x88990011, 0x22334455, 0x66778899)
126     obj2_bin = struct.pack('!IIIII',
127             0x11223344, 0x55667788, 0x99001122, 0x33445566, 0x77889900)
128     obj3_bin = struct.pack('!IIIII',
129             0x22334455, 0x66778899, 0x00112233, 0x44556677, 0x88990011)
130     pack_bin = struct.pack('!IIIII',
131             0x99887766, 0x55443322, 0x11009988, 0x77665544, 0x33221100)
132     idx = list(list() for i in xrange(256))
133     idx[0].append((obj_bin, 1, 0xfffffffff))
134     idx[0x11].append((obj2_bin, 2, 0xffffffffff))
135     idx[0x22].append((obj3_bin, 3, 0xff))
136     (fd,name) = tempfile.mkstemp(suffix='.idx', dir=git.repo('objects'))
137     os.close(fd)
138     w.count = 3
139     r = w._write_pack_idx_v2(name, idx, pack_bin)
140     i = git.PackIdxV2(name, open(name, 'rb'))
141     WVPASSEQ(i.find_offset(obj_bin), 0xfffffffff)
142     WVPASSEQ(i.find_offset(obj2_bin), 0xffffffffff)
143     WVPASSEQ(i.find_offset(obj3_bin), 0xff)
144     os.remove(name)
145
146
147 @wvtest
148 def test_check_repo_or_die():
149     git.check_repo_or_die()
150     WVPASS('check_repo_or_die')  # if we reach this point the call above passed
151
152     os.rename('pybuptest.tmp/objects/pack', 'pybuptest.tmp/objects/pack.tmp')
153     open('pybuptest.tmp/objects/pack', 'w').close()
154     try:
155         git.check_repo_or_die()
156     except SystemExit, e:
157         WVPASSEQ(e.code, 14)
158     else:
159         WVFAIL()
160     os.unlink('pybuptest.tmp/objects/pack')
161     os.rename('pybuptest.tmp/objects/pack.tmp', 'pybuptest.tmp/objects/pack')
162
163     try:
164         git.check_repo_or_die('nonexistantbup.tmp')
165     except SystemExit, e:
166         WVPASSEQ(e.code, 15)
167     else:
168         WVFAIL()