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])
114
# prepare an empty scratch directory
115
if os.path.exists(TESTDIR):
116
shutil.rmtree(TESTDIR)
119
logfile = open(LOGFILENAME, 'wt', buffering=1)
123
runcmd(['mkdir', TESTDIR])
126
progress("introductory commands")
127
runcmd("bzr version")
128
runcmd("bzr --version")
132
progress("user identity")
133
# this should always identify something, if only "john@localhost"
135
runcmd("bzr whoami --email")
136
assert backtick("bzr whoami --email").count('@') == 1
138
progress("invalid commands")
139
runcmd("bzr pants", retcode=1)
140
runcmd("bzr --pants off", retcode=1)
142
progress("basic branch creation")
143
runcmd(['mkdir', 'branch1'])
147
progress("status of new file")
149
f = file('test.txt', 'wt')
150
f.write('hello world!\n')
153
out = backtick("bzr unknowns")
154
assert out == 'test.txt\n'
156
out = backtick("bzr status")
157
assert out == '''? test.txt\n'''
159
out = backtick("bzr status --all")
160
assert out == "? test.txt\n"
162
progress("command aliases")
163
out = backtick("bzr st --all")
164
assert out == "? test.txt\n"
165
out = backtick("bzr stat")
166
assert out == "? test.txt\n"
168
progress("command help")
169
runcmd("bzr help st")
171
runcmd("bzr help commands")
172
runcmd("bzr help slartibartfast", 1)
174
out = backtick("bzr help ci")
175
out.index('aliases: ')
177
progress("can't rename unversioned file")
178
runcmd("bzr rename test.txt new-test.txt", 1)
180
progress("adding a file")
182
runcmd("bzr add test.txt")
183
assert backtick("bzr unknowns") == ''
184
assert backtick("bzr status --all") == "A test.txt\n"
186
progress("rename newly-added file")
187
runcmd("bzr rename test.txt hello.txt")
188
assert os.path.exists("hello.txt")
189
assert not os.path.exists("test.txt")
191
assert backtick("bzr revno") == '0\n'
193
progress("add first revision")
194
runcmd(["bzr", "commit", "-m", 'add first revision'])
196
progress("more complex renames")
198
runcmd("bzr rename hello.txt sub1", 1)
199
runcmd("bzr rename hello.txt sub1/hello.txt", 1)
200
runcmd("bzr move hello.txt sub1", 1)
202
runcmd("bzr add sub1")
203
runcmd("bzr rename sub1 sub2")
204
runcmd("bzr move hello.txt sub2")
206
assert exists("sub2")
207
assert exists("sub2/hello.txt")
208
assert not exists("sub1")
209
assert not exists("hello.txt")
211
runcmd(['bzr', 'commit', '-m', 'commit with some things moved to subdirs'])
214
runcmd('bzr add sub1')
215
runcmd('bzr move sub2/hello.txt sub1')
216
assert not exists('sub2/hello.txt')
217
assert exists('sub1/hello.txt')
218
runcmd('bzr move sub2 sub1')
219
assert not exists('sub2')
220
assert exists('sub1/sub2')
222
runcmd(['bzr', 'commit', '-m', 'rename nested subdirectories'])
225
runcmd('bzr move ../hello.txt .')
226
assert exists('./hello.txt')
227
runcmd(['bzr', 'commit', '-m', 'move to parent directory'])
230
runcmd('bzr move sub2/hello.txt .')
231
assert exists('hello.txt')
236
progress("all tests passed!")
238
sys.stderr.write('*' * 50 + '\n'
239
+ 'testbzr: tests failed\n'
240
+ 'see ' + LOGFILENAME + ' for more information\n'
242
logfile.write('tests failed!\n')
243
traceback.print_exc(None, logfile)