3
# Copyright (C) 2005 Canonical Ltd
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.
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.
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
20
"""External black-box test for bzr.
22
This always runs bzr as an external process to try to catch bugs
23
related to argument processing, startup, etc.
25
This replaces the previous test.sh which was not very portable."""
27
import sys, os, traceback
29
from os.path import exists
31
TESTDIR = "testbzr.tmp"
33
LOGFILENAME = 'testbzr.log'
37
from subprocess import call, Popen, PIPE
38
except ImportError, e:
39
sys.stderr.write("testbzr: sorry, this test suite requires modules from python2.4\n"
44
class CommandFailed(Exception):
49
if isinstance(cmd, basestring):
50
logfile.write('$ %s\n' % cmd)
53
logfile.write('$ %r\n' % cmd)
61
def runcmd(cmd, retcode=0):
62
"""Run one command and check the return code.
64
Returns a tuple of (stdout,stderr) strings.
66
If a single string is based, it is split into words.
67
For commands that are not simple space-separated words, please
68
pass a list instead."""
72
actual_retcode = call(cmd, stdout=logfile, stderr=logfile)
74
if retcode != actual_retcode:
75
raise CommandFailed("test failed: %r returned %d, expected %d"
76
% (cmd, actual_retcode, retcode))
80
def backtick(cmd, retcode=0):
83
child = Popen(cmd, stdout=PIPE, stderr=logfile)
84
outd, errd = child.communicate()
86
actual_retcode = child.wait()
88
outd = outd.replace('\r', '')
90
if retcode != actual_retcode:
91
raise CommandFailed("test failed: %r returned %d, expected %d"
92
% (cmd, actual_retcode, retcode))
100
logfile.write('* '+ msg + '\n')
105
logfile.write('$ cd %s\n' % dirname)
110
def log_linenumber():
111
"""Log the stack frame location two things up."""
112
stack = traceback.extract_stack()[-3]
113
logfile.write(' at %s:%d\n' % stack[:2])
117
# prepare an empty scratch directory
118
if os.path.exists(TESTDIR):
119
shutil.rmtree(TESTDIR)
122
logfile = open(LOGFILENAME, 'wt', buffering=1)
126
mypath = os.path.abspath(sys.argv[0])
127
print 'running tests from', mypath
131
if len(sys.argv) > 1:
132
BZRPATH = sys.argv[1]
134
BZRPATH = os.path.join(os.path.split(mypath)[0], 'bzr')
136
print 'against bzr', BZRPATH
138
print backtick([BZRPATH, 'version'])
140
runcmd(['mkdir', TESTDIR])
143
progress("introductory commands")
144
runcmd("bzr version")
145
runcmd("bzr --version")
149
progress("internal tests")
150
runcmd("bzr selftest")
152
progress("user identity")
153
# this should always identify something, if only "john@localhost"
155
runcmd("bzr whoami --email")
156
assert backtick("bzr whoami --email").count('@') == 1
158
progress("invalid commands")
159
runcmd("bzr pants", retcode=1)
160
runcmd("bzr --pants off", retcode=1)
161
runcmd("bzr diff --message foo", retcode=1)
163
progress("basic branch creation")
164
runcmd(['mkdir', 'branch1'])
168
progress("status of new file")
170
f = file('test.txt', 'wt')
171
f.write('hello world!\n')
174
out = backtick("bzr unknowns")
175
assert out == 'test.txt\n'
177
out = backtick("bzr status")
178
assert out == '''? test.txt\n'''
180
out = backtick("bzr status --all")
181
assert out == "? test.txt\n"
183
out = backtick("bzr status test.txt --all")
184
assert out == "? test.txt\n"
186
f = file('test2.txt', 'wt')
187
f.write('goodbye cruel world...\n')
190
out = backtick("bzr status test.txt")
191
assert out == "? test.txt\n"
193
out = backtick("bzr status")
194
assert out == "? test.txt\n" \
197
os.unlink('test2.txt')
199
progress("command aliases")
200
out = backtick("bzr st --all")
201
assert out == "? test.txt\n"
202
out = backtick("bzr stat")
203
assert out == "? test.txt\n"
205
progress("command help")
206
runcmd("bzr help st")
208
runcmd("bzr help commands")
209
runcmd("bzr help slartibartfast", 1)
211
out = backtick("bzr help ci")
212
out.index('aliases: ')
214
progress("can't rename unversioned file")
215
runcmd("bzr rename test.txt new-test.txt", 1)
217
progress("adding a file")
219
runcmd("bzr add test.txt")
220
assert backtick("bzr unknowns") == ''
221
assert backtick("bzr status --all") == "A test.txt\n"
223
progress("rename newly-added file")
224
runcmd("bzr rename test.txt hello.txt")
225
assert os.path.exists("hello.txt")
226
assert not os.path.exists("test.txt")
228
assert backtick("bzr revno") == '0\n'
230
progress("add first revision")
231
runcmd(["bzr", "commit", "-m", 'add first revision'])
233
progress("more complex renames")
235
runcmd("bzr rename hello.txt sub1", 1)
236
runcmd("bzr rename hello.txt sub1/hello.txt", 1)
237
runcmd("bzr move hello.txt sub1", 1)
239
runcmd("bzr add sub1")
240
runcmd("bzr rename sub1 sub2")
241
runcmd("bzr move hello.txt sub2")
242
assert backtick("bzr relpath sub2/hello.txt") == "sub2/hello.txt\n"
244
assert exists("sub2")
245
assert exists("sub2/hello.txt")
246
assert not exists("sub1")
247
assert not exists("hello.txt")
249
runcmd(['bzr', 'commit', '-m', 'commit with some things moved to subdirs'])
252
runcmd('bzr add sub1')
253
runcmd('bzr move sub2/hello.txt sub1')
254
assert not exists('sub2/hello.txt')
255
assert exists('sub1/hello.txt')
256
runcmd('bzr move sub2 sub1')
257
assert not exists('sub2')
258
assert exists('sub1/sub2')
260
runcmd(['bzr', 'commit', '-m', 'rename nested subdirectories'])
263
runcmd('bzr move ../hello.txt .')
264
assert exists('./hello.txt')
265
assert backtick('bzr relpath hello.txt') == 'sub1/sub2/hello.txt\n'
266
assert backtick('bzr relpath ../../sub1/sub2/hello.txt') == 'sub1/sub2/hello.txt\n'
267
runcmd(['bzr', 'commit', '-m', 'move to parent directory'])
269
assert backtick('bzr relpath sub2/hello.txt') == 'sub1/sub2/hello.txt\n'
271
runcmd('bzr move sub2/hello.txt .')
272
assert exists('hello.txt')
274
f = file('hello.txt', 'wt')
275
f.write('some nice new content\n')
278
f = file('msg.tmp', 'wt')
279
f.write('this is my new commit\n')
282
runcmd('bzr commit -F msg.tmp')
284
assert backtick('bzr revno') == '5\n'
285
runcmd('bzr export -r 5 export-5.tmp')
286
runcmd('bzr export export.tmp')
290
progress("all tests passed!")
292
sys.stderr.write('*' * 50 + '\n'
293
+ 'testbzr: tests failed\n'
294
+ 'see ' + LOGFILENAME + ' for more information\n'
296
logfile.write('tests failed!\n')
297
traceback.print_exc(None, logfile)