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)
58
def runcmd(cmd, retcode=0):
59
"""Run one command and check the return code.
61
Returns a tuple of (stdout,stderr) strings.
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."""
69
actual_retcode = call(cmd, stdout=logfile, stderr=logfile)
71
if retcode != actual_retcode:
72
raise CommandFailed("test failed: %r returned %d, expected %d"
73
% (cmd, actual_retcode, retcode))
77
def backtick(cmd, retcode=0):
80
child = Popen(cmd, stdout=PIPE, stderr=logfile)
81
outd, errd = child.communicate()
83
actual_retcode = child.wait()
85
outd = outd.replace('\r', '')
87
if retcode != actual_retcode:
88
raise CommandFailed("test failed: %r returned %d, expected %d"
89
% (cmd, actual_retcode, retcode))
97
logfile.write('* '+ msg + '\n')
102
logfile.write('$ cd %s\n' % dirname)
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])
113
# prepare an empty scratch directory
114
if os.path.exists(TESTDIR):
115
shutil.rmtree(TESTDIR)
118
logfile = open(LOGFILENAME, 'wt', buffering=1)
122
runcmd(['mkdir', TESTDIR])
125
progress("introductory commands")
126
runcmd("bzr version")
127
runcmd("bzr --version")
131
progress("user identity")
132
# this should always identify something, if only "john@localhost"
134
runcmd("bzr whoami --email")
135
assert backtick("bzr whoami --email").count('@') == 1
137
progress("invalid commands")
138
runcmd("bzr pants", retcode=1)
139
runcmd("bzr --pants off", retcode=1)
141
progress("basic branch creation")
142
runcmd(['mkdir', 'branch1'])
146
progress("status of new file")
148
f = file('test.txt', 'wt')
149
f.write('hello world!\n')
152
out = backtick("bzr unknowns")
153
assert out == 'test.txt\n'
155
out = backtick("bzr status")
156
assert out == '''? test.txt\n'''
158
out = backtick("bzr status --all")
159
assert out == "? test.txt\n"
161
progress("can't rename unversioned file")
162
runcmd("bzr rename test.txt new-test.txt", 1)
164
progress("adding a file")
166
runcmd("bzr add test.txt")
167
assert backtick("bzr unknowns") == ''
168
assert backtick("bzr status --all") == "A test.txt\n"
170
progress("rename newly-added file")
171
runcmd("bzr rename test.txt hello.txt")
172
assert os.path.exists("hello.txt")
173
assert not os.path.exists("test.txt")
175
assert backtick("bzr revno") == '0\n'
177
progress("add first revision")
178
runcmd(["bzr", "commit", "-m", 'add first revision'])
180
progress("more complex renames")
182
runcmd("bzr rename hello.txt sub1", 1)
183
runcmd("bzr rename hello.txt sub1/hello.txt", 1)
184
runcmd("bzr move hello.txt sub1", 1)
186
runcmd("bzr add sub1")
187
runcmd("bzr rename sub1 sub2")
188
runcmd("bzr move hello.txt sub2")
190
assert exists("sub2")
191
assert exists("sub2/hello.txt")
192
assert not exists("sub1")
193
assert not exists("hello.txt")
195
runcmd(['bzr', 'commit', '-m', 'commit with some things moved to subdirs'])
198
runcmd('bzr add sub1')
199
runcmd('bzr move sub2/hello.txt sub1')
200
assert not exists('sub2/hello.txt')
201
assert exists('sub1/hello.txt')
202
runcmd('bzr move sub2 sub1')
203
assert not exists('sub2')
204
assert exists('sub1/sub2')
206
runcmd(['bzr', 'commit', '-m', 'rename nested subdirectories'])
209
runcmd('bzr move ../hello.txt .')
210
assert exists('../hello.txt')
211
runcmd(['bzr', 'commit', '-m', 'move to parent directory'])
216
progress("all tests passed!")
218
sys.stderr.write('*' * 50 + '\n'
219
+ 'testbzr: tests failed\n'
220
+ 'see ' + LOGFILENAME + ' for more information\n'
222
logfile.write('tests failed!\n')
223
traceback.print_exc(None, logfile)