17
16
# along with this program; if not, write to the Free Software
18
17
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
print 'please use "bzr selftest" instead'
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 ci")
173
runcmd("bzr help slartibartfast", 1)
175
progress("can't rename unversioned file")
176
runcmd("bzr rename test.txt new-test.txt", 1)
178
progress("adding a file")
180
runcmd("bzr add test.txt")
181
assert backtick("bzr unknowns") == ''
182
assert backtick("bzr status --all") == "A test.txt\n"
184
progress("rename newly-added file")
185
runcmd("bzr rename test.txt hello.txt")
186
assert os.path.exists("hello.txt")
187
assert not os.path.exists("test.txt")
189
assert backtick("bzr revno") == '0\n'
191
progress("add first revision")
192
runcmd(["bzr", "commit", "-m", 'add first revision'])
194
progress("more complex renames")
196
runcmd("bzr rename hello.txt sub1", 1)
197
runcmd("bzr rename hello.txt sub1/hello.txt", 1)
198
runcmd("bzr move hello.txt sub1", 1)
200
runcmd("bzr add sub1")
201
runcmd("bzr rename sub1 sub2")
202
runcmd("bzr move hello.txt sub2")
204
assert exists("sub2")
205
assert exists("sub2/hello.txt")
206
assert not exists("sub1")
207
assert not exists("hello.txt")
209
runcmd(['bzr', 'commit', '-m', 'commit with some things moved to subdirs'])
212
runcmd('bzr add sub1')
213
runcmd('bzr move sub2/hello.txt sub1')
214
assert not exists('sub2/hello.txt')
215
assert exists('sub1/hello.txt')
216
runcmd('bzr move sub2 sub1')
217
assert not exists('sub2')
218
assert exists('sub1/sub2')
220
runcmd(['bzr', 'commit', '-m', 'rename nested subdirectories'])
223
runcmd('bzr move ../hello.txt .')
224
assert exists('./hello.txt')
225
runcmd(['bzr', 'commit', '-m', 'move to parent directory'])
228
runcmd('bzr move sub2/hello.txt .')
229
assert exists('hello.txt')
234
progress("all tests passed!")
236
sys.stderr.write('*' * 50 + '\n'
237
+ 'testbzr: tests failed\n'
238
+ 'see ' + LOGFILENAME + ' for more information\n'
240
logfile.write('tests failed!\n')
241
traceback.print_exc(None, logfile)