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