/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
292 by Martin Pool
- start adding a pure-python blackbox test suite
1
#! /usr/bin/python
2
3
# Copyright (C) 2005 Canonical Ltd
4
5
# This program is free software; you can redistribute it and/or modify
6
# it under the terms of the GNU General Public License as published by
7
# the Free Software Foundation; either version 2 of the License, or
8
# (at your option) any later version.
9
10
# This program is distributed in the hope that it will be useful,
11
# but WITHOUT ANY WARRANTY; without even the implied warranty of
12
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
# GNU General Public License for more details.
14
15
# You should have received a copy of the GNU General Public License
16
# along with this program; if not, write to the Free Software
17
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18
19
20
"""External black-box test for bzr.
21
22
This always runs bzr as an external process to try to catch bugs
23
related to argument processing, startup, etc.
24
25
This replaces the previous test.sh which was not very portable."""
26
296 by Martin Pool
- better reports from testbzr when it fails
27
import sys, os, traceback
339 by Martin Pool
many more diffs
28
from os import mkdir
29
from os.path import exists
292 by Martin Pool
- start adding a pure-python blackbox test suite
30
335 by Martin Pool
- add new failing test for command parsing
31
TESTDIR = "testbzr.tmp"
32
33
LOGFILENAME = 'testbzr.log'
34
292 by Martin Pool
- start adding a pure-python blackbox test suite
35
try:
36
    import shutil
301 by Martin Pool
- provide for catching output from shell commands
37
    from subprocess import call, Popen, PIPE
292 by Martin Pool
- start adding a pure-python blackbox test suite
38
except ImportError, e:
39
    sys.stderr.write("testbzr: sorry, this test suite requires modules from python2.4\n"
40
                     + '    ' + str(e))
41
    sys.exit(1)
42
43
296 by Martin Pool
- better reports from testbzr when it fails
44
class CommandFailed(Exception):
45
    pass
46
47
302 by Martin Pool
testbzr: new backtick() helper
48
def formcmd(cmd):
49
    if isinstance(cmd, basestring):
50
        logfile.write('$ %s\n' % cmd)
51
        cmd = cmd.split()
52
    else:
53
        logfile.write('$ %r\n' % cmd)
54
55
    return cmd
56
57
58
def runcmd(cmd, retcode=0):
300 by Martin Pool
- more tests
59
    """Run one command and check the return code.
292 by Martin Pool
- start adding a pure-python blackbox test suite
60
301 by Martin Pool
- provide for catching output from shell commands
61
    Returns a tuple of (stdout,stderr) strings.
62
292 by Martin Pool
- start adding a pure-python blackbox test suite
63
    If a single string is based, it is split into words.
64
    For commands that are not simple space-separated words, please
65
    pass a list instead."""
302 by Martin Pool
testbzr: new backtick() helper
66
    cmd = formcmd(cmd)
67
    log_linenumber()
68
    
69
    actual_retcode = call(cmd, stdout=logfile, stderr=logfile)
70
    
71
    if retcode != actual_retcode:
72
        raise CommandFailed("test failed: %r returned %d, expected %d"
73
                            % (cmd, actual_retcode, retcode))
74
75
76
77
def backtick(cmd, retcode=0):
78
    cmd = formcmd(cmd)
79
    log_linenumber()
80
    child = Popen(cmd, stdout=PIPE, stderr=logfile)
301 by Martin Pool
- provide for catching output from shell commands
81
    outd, errd = child.communicate()
302 by Martin Pool
testbzr: new backtick() helper
82
    logfile.write(outd)
301 by Martin Pool
- provide for catching output from shell commands
83
    actual_retcode = child.wait()
307 by Martin Pool
testbzr: clean up crlf handling
84
85
    outd = outd.replace('\r', '')
301 by Martin Pool
- provide for catching output from shell commands
86
    
298 by Martin Pool
- test some commands known to fail
87
    if retcode != actual_retcode:
88
        raise CommandFailed("test failed: %r returned %d, expected %d"
89
                            % (cmd, actual_retcode, retcode))
292 by Martin Pool
- start adding a pure-python blackbox test suite
90
302 by Martin Pool
testbzr: new backtick() helper
91
    return outd
92
301 by Martin Pool
- provide for catching output from shell commands
93
292 by Martin Pool
- start adding a pure-python blackbox test suite
94
95
def progress(msg):
96
    print '* ' + msg
97
    logfile.write('* '+ msg + '\n')
297 by Martin Pool
- fix intentional testcase failure
98
    log_linenumber()
99
100
299 by Martin Pool
testbzr:
101
def cd(dirname):
102
    logfile.write('$ cd %s\n' % dirname)
103
    os.chdir(dirname)
104
105
300 by Martin Pool
- more tests
106
297 by Martin Pool
- fix intentional testcase failure
107
def log_linenumber():
108
    """Log the stack frame location two things up."""
109
    stack = traceback.extract_stack()[-3]
110
    logfile.write('   at %s:%d\n' % stack[:2])
111
112
340 by Martin Pool
- more testcase fixes
113
292 by Martin Pool
- start adding a pure-python blackbox test suite
114
# prepare an empty scratch directory
115
if os.path.exists(TESTDIR):
116
    shutil.rmtree(TESTDIR)
117
118
335 by Martin Pool
- add new failing test for command parsing
119
logfile = open(LOGFILENAME, 'wt', buffering=1)
292 by Martin Pool
- start adding a pure-python blackbox test suite
120
121
300 by Martin Pool
- more tests
122
try:
123
    runcmd(['mkdir', TESTDIR])
299 by Martin Pool
testbzr:
124
    cd(TESTDIR)
296 by Martin Pool
- better reports from testbzr when it fails
125
300 by Martin Pool
- more tests
126
    progress("introductory commands")
296 by Martin Pool
- better reports from testbzr when it fails
127
    runcmd("bzr version")
335 by Martin Pool
- add new failing test for command parsing
128
    runcmd("bzr --version")
296 by Martin Pool
- better reports from testbzr when it fails
129
    runcmd("bzr help")
297 by Martin Pool
- fix intentional testcase failure
130
    runcmd("bzr --help")
131
300 by Martin Pool
- more tests
132
    progress("user identity")
297 by Martin Pool
- fix intentional testcase failure
133
    # this should always identify something, if only "john@localhost"
134
    runcmd("bzr whoami")
298 by Martin Pool
- test some commands known to fail
135
    runcmd("bzr whoami --email")
302 by Martin Pool
testbzr: new backtick() helper
136
    assert backtick("bzr whoami --email").count('@') == 1
298 by Martin Pool
- test some commands known to fail
137
300 by Martin Pool
- more tests
138
    progress("invalid commands")
298 by Martin Pool
- test some commands known to fail
139
    runcmd("bzr pants", retcode=1)
140
    runcmd("bzr --pants off", retcode=1)
382 by Martin Pool
- test previous commit
141
    runcmd("bzr diff --message foo", retcode=1)
296 by Martin Pool
- better reports from testbzr when it fails
142
300 by Martin Pool
- more tests
143
    progress("basic branch creation")
144
    runcmd(['mkdir', 'branch1'])
145
    cd('branch1')
146
    runcmd('bzr init')
303 by Martin Pool
- more tests for unknown file
147
148
    progress("status of new file")
300 by Martin Pool
- more tests
149
    
150
    f = file('test.txt', 'wt')
151
    f.write('hello world!\n')
152
    f.close()
153
307 by Martin Pool
testbzr: clean up crlf handling
154
    out = backtick("bzr unknowns")
155
    assert out == 'test.txt\n'
303 by Martin Pool
- more tests for unknown file
156
307 by Martin Pool
testbzr: clean up crlf handling
157
    out = backtick("bzr status")
303 by Martin Pool
- more tests for unknown file
158
    assert out == '''?       test.txt\n'''
159
307 by Martin Pool
testbzr: clean up crlf handling
160
    out = backtick("bzr status --all")
304 by Martin Pool
testbzr: test adding a file
161
    assert out == "?       test.txt\n"
162
350 by Martin Pool
- refactor command aliases into command classes
163
    progress("command aliases")
164
    out = backtick("bzr st --all")
165
    assert out == "?       test.txt\n"
166
    out = backtick("bzr stat")
167
    assert out == "?       test.txt\n"
168
169
    progress("command help")
170
    runcmd("bzr help st")
171
    runcmd("bzr help")
172
    runcmd("bzr help commands")
352 by Martin Pool
- Show aliases in command help
173
    runcmd("bzr help slartibartfast", 1)
174
175
    out = backtick("bzr help ci")
176
    out.index('aliases: ')
350 by Martin Pool
- refactor command aliases into command classes
177
305 by Martin Pool
testbzr: test renames
178
    progress("can't rename unversioned file")
179
    runcmd("bzr rename test.txt new-test.txt", 1)
180
304 by Martin Pool
testbzr: test adding a file
181
    progress("adding a file")
182
183
    runcmd("bzr add test.txt")
184
    assert backtick("bzr unknowns") == ''
307 by Martin Pool
testbzr: clean up crlf handling
185
    assert backtick("bzr status --all") == "A       test.txt\n"
300 by Martin Pool
- more tests
186
305 by Martin Pool
testbzr: test renames
187
    progress("rename newly-added file")
188
    runcmd("bzr rename test.txt hello.txt")
306 by Martin Pool
testbzr: test renames
189
    assert os.path.exists("hello.txt")
190
    assert not os.path.exists("test.txt")
305 by Martin Pool
testbzr: test renames
191
308 by Martin Pool
fix test suite
192
    assert backtick("bzr revno") == '0\n'
307 by Martin Pool
testbzr: clean up crlf handling
193
339 by Martin Pool
many more diffs
194
    progress("add first revision")
195
    runcmd(["bzr", "commit", "-m", 'add first revision'])
196
197
    progress("more complex renames")
198
    os.mkdir("sub1")
199
    runcmd("bzr rename hello.txt sub1", 1)
200
    runcmd("bzr rename hello.txt sub1/hello.txt", 1)
201
    runcmd("bzr move hello.txt sub1", 1)
202
203
    runcmd("bzr add sub1")
204
    runcmd("bzr rename sub1 sub2")
205
    runcmd("bzr move hello.txt sub2")
392 by Martin Pool
- fix relpath and add tests
206
    assert backtick("bzr relpath sub2/hello.txt") == "sub2/hello.txt\n"
339 by Martin Pool
many more diffs
207
208
    assert exists("sub2")
209
    assert exists("sub2/hello.txt")
210
    assert not exists("sub1")
211
    assert not exists("hello.txt")
212
213
    runcmd(['bzr', 'commit', '-m', 'commit with some things moved to subdirs'])
214
215
    mkdir("sub1")
216
    runcmd('bzr add sub1')
217
    runcmd('bzr move sub2/hello.txt sub1')
218
    assert not exists('sub2/hello.txt')
219
    assert exists('sub1/hello.txt')
220
    runcmd('bzr move sub2 sub1')
221
    assert not exists('sub2')
222
    assert exists('sub1/sub2')
223
224
    runcmd(['bzr', 'commit', '-m', 'rename nested subdirectories'])
225
226
    cd('sub1/sub2')
227
    runcmd('bzr move ../hello.txt .')
340 by Martin Pool
- more testcase fixes
228
    assert exists('./hello.txt')
392 by Martin Pool
- fix relpath and add tests
229
    assert backtick('bzr relpath hello.txt') == 'sub1/sub2/hello.txt\n'
230
    assert backtick('bzr relpath ../../sub1/sub2/hello.txt') == 'sub1/sub2/hello.txt\n'
339 by Martin Pool
many more diffs
231
    runcmd(['bzr', 'commit', '-m', 'move to parent directory'])
232
    cd('..')
392 by Martin Pool
- fix relpath and add tests
233
    assert backtick('bzr relpath sub2/hello.txt') == 'sub1/sub2/hello.txt\n'
340 by Martin Pool
- more testcase fixes
234
235
    runcmd('bzr move sub2/hello.txt .')
236
    assert exists('hello.txt')
389 by Martin Pool
- new commit --file option!
237
238
    f = file('hello.txt', 'wt')
239
    f.write('some nice new content\n')
240
    f.close()
241
242
    f = file('msg.tmp', 'wt')
243
    f.write('this is my new commit\n')
244
    f.close()
245
246
    runcmd('bzr commit -F msg.tmp')
394 by Martin Pool
- Fix argument handling in export command
247
248
    assert backtick('bzr revno') == '5\n'
249
    runcmd('bzr export -r 5 export-5.tmp')
250
    runcmd('bzr export export.tmp')
339 by Martin Pool
many more diffs
251
    
300 by Martin Pool
- more tests
252
    cd('..')
253
296 by Martin Pool
- better reports from testbzr when it fails
254
    progress("all tests passed!")
255
except Exception, e:
256
    sys.stderr.write('*' * 50 + '\n'
257
                     + 'testbzr: tests failed\n'
335 by Martin Pool
- add new failing test for command parsing
258
                     + 'see ' + LOGFILENAME + ' for more information\n'
296 by Martin Pool
- better reports from testbzr when it fails
259
                     + '*' * 50 + '\n')
260
    logfile.write('tests failed!\n')
261
    traceback.print_exc(None, logfile)
262
    sys.exit(1)