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
progress("command aliases")
184
out = backtick("bzr st --all")
185
assert out == "? test.txt\n"
186
out = backtick("bzr stat")
187
assert out == "? test.txt\n"
189
progress("command help")
190
runcmd("bzr help st")
192
runcmd("bzr help commands")
193
runcmd("bzr help slartibartfast", 1)
195
out = backtick("bzr help ci")
196
out.index('aliases: ')
198
progress("can't rename unversioned file")
199
runcmd("bzr rename test.txt new-test.txt", 1)
201
progress("adding a file")
203
runcmd("bzr add test.txt")
204
assert backtick("bzr unknowns") == ''
205
assert backtick("bzr status --all") == "A test.txt\n"
207
progress("rename newly-added file")
208
runcmd("bzr rename test.txt hello.txt")
209
assert os.path.exists("hello.txt")
210
assert not os.path.exists("test.txt")
212
assert backtick("bzr revno") == '0\n'
214
progress("add first revision")
215
runcmd(["bzr", "commit", "-m", 'add first revision'])
217
progress("more complex renames")
219
runcmd("bzr rename hello.txt sub1", 1)
220
runcmd("bzr rename hello.txt sub1/hello.txt", 1)
221
runcmd("bzr move hello.txt sub1", 1)
223
runcmd("bzr add sub1")
224
runcmd("bzr rename sub1 sub2")
225
runcmd("bzr move hello.txt sub2")
226
assert backtick("bzr relpath sub2/hello.txt") == "sub2/hello.txt\n"
228
assert exists("sub2")
229
assert exists("sub2/hello.txt")
230
assert not exists("sub1")
231
assert not exists("hello.txt")
233
runcmd(['bzr', 'commit', '-m', 'commit with some things moved to subdirs'])
236
runcmd('bzr add sub1')
237
runcmd('bzr move sub2/hello.txt sub1')
238
assert not exists('sub2/hello.txt')
239
assert exists('sub1/hello.txt')
240
runcmd('bzr move sub2 sub1')
241
assert not exists('sub2')
242
assert exists('sub1/sub2')
244
runcmd(['bzr', 'commit', '-m', 'rename nested subdirectories'])
247
runcmd('bzr move ../hello.txt .')
248
assert exists('./hello.txt')
249
assert backtick('bzr relpath hello.txt') == 'sub1/sub2/hello.txt\n'
250
assert backtick('bzr relpath ../../sub1/sub2/hello.txt') == 'sub1/sub2/hello.txt\n'
251
runcmd(['bzr', 'commit', '-m', 'move to parent directory'])
253
assert backtick('bzr relpath sub2/hello.txt') == 'sub1/sub2/hello.txt\n'
255
runcmd('bzr move sub2/hello.txt .')
256
assert exists('hello.txt')
258
f = file('hello.txt', 'wt')
259
f.write('some nice new content\n')
262
f = file('msg.tmp', 'wt')
263
f.write('this is my new commit\n')
266
runcmd('bzr commit -F msg.tmp')
268
assert backtick('bzr revno') == '5\n'
269
runcmd('bzr export -r 5 export-5.tmp')
270
runcmd('bzr export export.tmp')
274
progress("all tests passed!")
276
sys.stderr.write('*' * 50 + '\n'
277
+ 'testbzr: tests failed\n'
278
+ 'see ' + LOGFILENAME + ' for more information\n'
280
logfile.write('tests failed!\n')
281
traceback.print_exc(None, logfile)