]> arthur.barton.de Git - bup.git/blob - lib/bup/t/tclient.py
d0ff73b3bb302088770fc30b3a8b49ddd3657351
[bup.git] / lib / bup / t / tclient.py
1
2 import sys, os, stat, time, random, subprocess, glob
3
4 from wvtest import *
5
6 from bup import client, git
7 from bup.helpers import mkdirp
8 from buptest import no_lingering_errors, test_tempdir
9
10
11 def randbytes(sz):
12     s = ''
13     for i in xrange(sz):
14         s += chr(random.randrange(0,256))
15     return s
16
17
18 s1 = randbytes(10000)
19 s2 = randbytes(10000)
20 s3 = randbytes(10000)
21
22 IDX_PAT = '/*.idx'
23     
24
25 @wvtest
26 def test_server_split_with_indexes():
27     with no_lingering_errors(), test_tempdir('bup-tclient-') as tmpdir:
28         os.environ['BUP_MAIN_EXE'] = '../../../bup'
29         os.environ['BUP_DIR'] = bupdir = tmpdir
30         git.init_repo(bupdir)
31         lw = git.PackWriter()
32         c = client.Client(bupdir, create=True)
33         rw = c.new_packwriter()
34
35         lw.new_blob(s1)
36         lw.close()
37
38         rw.new_blob(s2)
39         rw.breakpoint()
40         rw.new_blob(s1)
41         rw.close()
42     
43
44 @wvtest
45 def test_multiple_suggestions():
46     with no_lingering_errors(), test_tempdir('bup-tclient-') as tmpdir:
47         os.environ['BUP_MAIN_EXE'] = '../../../bup'
48         os.environ['BUP_DIR'] = bupdir = tmpdir
49         git.init_repo(bupdir)
50
51         lw = git.PackWriter()
52         lw.new_blob(s1)
53         lw.close()
54         lw = git.PackWriter()
55         lw.new_blob(s2)
56         lw.close()
57         WVPASSEQ(len(glob.glob(git.repo('objects/pack'+IDX_PAT))), 2)
58
59         c = client.Client(bupdir, create=True)
60         WVPASSEQ(len(glob.glob(c.cachedir+IDX_PAT)), 0)
61         rw = c.new_packwriter()
62         s1sha = rw.new_blob(s1)
63         WVPASS(rw.exists(s1sha))
64         s2sha = rw.new_blob(s2)
65         # This is a little hacky, but ensures that we test the code under test
66         while (len(glob.glob(c.cachedir+IDX_PAT)) < 2 and
67                not c.conn.has_input()):
68             pass
69         rw.new_blob(s2)
70         WVPASS(rw.objcache.exists(s1sha))
71         WVPASS(rw.objcache.exists(s2sha))
72         rw.new_blob(s3)
73         WVPASSEQ(len(glob.glob(c.cachedir+IDX_PAT)), 2)
74         rw.close()
75         WVPASSEQ(len(glob.glob(c.cachedir+IDX_PAT)), 3)
76
77
78 @wvtest
79 def test_dumb_client_server():
80     with no_lingering_errors(), test_tempdir('bup-tclient-') as tmpdir:
81         os.environ['BUP_MAIN_EXE'] = '../../../bup'
82         os.environ['BUP_DIR'] = bupdir = tmpdir
83         git.init_repo(bupdir)
84         open(git.repo('bup-dumb-server'), 'w').close()
85
86         lw = git.PackWriter()
87         lw.new_blob(s1)
88         lw.close()
89
90         c = client.Client(bupdir, create=True)
91         rw = c.new_packwriter()
92         WVPASSEQ(len(glob.glob(c.cachedir+IDX_PAT)), 1)
93         rw.new_blob(s1)
94         WVPASSEQ(len(glob.glob(c.cachedir+IDX_PAT)), 1)
95         rw.new_blob(s2)
96         rw.close()
97         WVPASSEQ(len(glob.glob(c.cachedir+IDX_PAT)), 2)
98
99
100 @wvtest
101 def test_midx_refreshing():
102     with no_lingering_errors(), test_tempdir('bup-tclient-') as tmpdir:
103         os.environ['BUP_MAIN_EXE'] = bupmain = '../../../bup'
104         os.environ['BUP_DIR'] = bupdir = tmpdir
105         git.init_repo(bupdir)
106         c = client.Client(bupdir, create=True)
107         rw = c.new_packwriter()
108         rw.new_blob(s1)
109         p1base = rw.breakpoint()
110         p1name = os.path.join(c.cachedir, p1base)
111         s1sha = rw.new_blob(s1)  # should not be written; it's already in p1
112         s2sha = rw.new_blob(s2)
113         p2base = rw.close()
114         p2name = os.path.join(c.cachedir, p2base)
115         del rw
116
117         pi = git.PackIdxList(bupdir + '/objects/pack')
118         WVPASSEQ(len(pi.packs), 2)
119         pi.refresh()
120         WVPASSEQ(len(pi.packs), 2)
121         WVPASSEQ(sorted([os.path.basename(i.name) for i in pi.packs]),
122                  sorted([p1base, p2base]))
123
124         p1 = git.open_idx(p1name)
125         WVPASS(p1.exists(s1sha))
126         p2 = git.open_idx(p2name)
127         WVFAIL(p2.exists(s1sha))
128         WVPASS(p2.exists(s2sha))
129
130         subprocess.call([bupmain, 'midx', '-f'])
131         pi.refresh()
132         WVPASSEQ(len(pi.packs), 1)
133         pi.refresh(skip_midx=True)
134         WVPASSEQ(len(pi.packs), 2)
135         pi.refresh(skip_midx=False)
136         WVPASSEQ(len(pi.packs), 1)
137
138
139 @wvtest
140 def test_remote_parsing():
141     with no_lingering_errors():
142         tests = (
143             (':/bup', ('file', None, None, '/bup')),
144             ('file:///bup', ('file', None, None, '/bup')),
145             ('192.168.1.1:/bup', ('ssh', '192.168.1.1', None, '/bup')),
146             ('ssh://192.168.1.1:2222/bup', ('ssh', '192.168.1.1', '2222', '/bup')),
147             ('ssh://[ff:fe::1]:2222/bup', ('ssh', 'ff:fe::1', '2222', '/bup')),
148             ('bup://foo.com:1950', ('bup', 'foo.com', '1950', None)),
149             ('bup://foo.com:1950/bup', ('bup', 'foo.com', '1950', '/bup')),
150             ('bup://[ff:fe::1]/bup', ('bup', 'ff:fe::1', None, '/bup')),)
151         for remote, values in tests:
152             WVPASSEQ(client.parse_remote(remote), values)
153         try:
154             client.parse_remote('http://asdf.com/bup')
155             WVFAIL()
156         except client.ClientError:
157             WVPASS()