~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to testbzr

  • Committer: Martin Pool
  • Date: 2005-05-09 04:38:31 UTC
  • Revision ID: mbp@sourcefrog.net-20050509043831-d45f7832b7d4d5b0
- better message when refusing to add symlinks (from mpe)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#! /usr/bin/python
 
2
 
 
3
# Copyright (C) 2005 Canonical Ltd
 
4
 
 
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.
 
9
 
 
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.
 
14
 
 
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
 
18
 
 
19
 
 
20
"""External black-box test for bzr.
 
21
 
 
22
This always runs bzr as an external process to try to catch bugs
 
23
related to argument processing, startup, etc.
 
24
 
 
25
This replaces the previous test.sh which was not very portable."""
 
26
 
 
27
import sys, os, traceback
 
28
from os import mkdir
 
29
from os.path import exists
 
30
 
 
31
TESTDIR = "testbzr.tmp"
 
32
 
 
33
LOGFILENAME = 'testbzr.log'
 
34
 
 
35
try:
 
36
    import shutil
 
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"
 
40
                     + '    ' + str(e))
 
41
    sys.exit(1)
 
42
 
 
43
 
 
44
class CommandFailed(Exception):
 
45
    pass
 
46
 
 
47
 
 
48
def formcmd(cmd):
 
49
    if isinstance(cmd, basestring):
 
50
        logfile.write('$ %s\n' % cmd)
 
51
        cmd = cmd.split()
 
52
    else:
 
53
        logfile.write('$ %r\n' % cmd)
 
54
 
 
55
    if cmd[0] == 'bzr':
 
56
        cmd[0] = BZRPATH
 
57
 
 
58
    return cmd
 
59
 
 
60
 
 
61
def runcmd(cmd, retcode=0):
 
62
    """Run one command and check the return code.
 
63
 
 
64
    Returns a tuple of (stdout,stderr) strings.
 
65
 
 
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."""
 
69
    cmd = formcmd(cmd)
 
70
    log_linenumber()
 
71
    
 
72
    actual_retcode = call(cmd, stdout=logfile, stderr=logfile)
 
73
    
 
74
    if retcode != actual_retcode:
 
75
        raise CommandFailed("test failed: %r returned %d, expected %d"
 
76
                            % (cmd, actual_retcode, retcode))
 
77
 
 
78
 
 
79
 
 
80
def backtick(cmd, retcode=0):
 
81
    cmd = formcmd(cmd)
 
82
    log_linenumber()
 
83
    child = Popen(cmd, stdout=PIPE, stderr=logfile)
 
84
    outd, errd = child.communicate()
 
85
    logfile.write(outd)
 
86
    actual_retcode = child.wait()
 
87
 
 
88
    outd = outd.replace('\r', '')
 
89
    
 
90
    if retcode != actual_retcode:
 
91
        raise CommandFailed("test failed: %r returned %d, expected %d"
 
92
                            % (cmd, actual_retcode, retcode))
 
93
 
 
94
    return outd
 
95
 
 
96
 
 
97
 
 
98
def progress(msg):
 
99
    print '* ' + msg
 
100
    logfile.write('* '+ msg + '\n')
 
101
    log_linenumber()
 
102
 
 
103
 
 
104
def cd(dirname):
 
105
    logfile.write('$ cd %s\n' % dirname)
 
106
    os.chdir(dirname)
 
107
 
 
108
 
 
109
 
 
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])
 
114
 
 
115
 
 
116
 
 
117
# prepare an empty scratch directory
 
118
if os.path.exists(TESTDIR):
 
119
    shutil.rmtree(TESTDIR)
 
120
 
 
121
 
 
122
logfile = open(LOGFILENAME, 'wt', buffering=1)
 
123
 
 
124
 
 
125
try:
 
126
    mypath = os.path.abspath(sys.argv[0])
 
127
    print 'running tests from', mypath
 
128
 
 
129
    global BZRPATH
 
130
 
 
131
    if len(sys.argv) > 1:
 
132
        BZRPATH = sys.argv[1]
 
133
    else:
 
134
        BZRPATH = os.path.join(os.path.split(mypath)[0], 'bzr')
 
135
 
 
136
    print 'against bzr', BZRPATH
 
137
    print
 
138
    print backtick([BZRPATH, 'version'])
 
139
    
 
140
    runcmd(['mkdir', TESTDIR])
 
141
    cd(TESTDIR)
 
142
 
 
143
    progress("introductory commands")
 
144
    runcmd("bzr version")
 
145
    runcmd("bzr --version")
 
146
    runcmd("bzr help")
 
147
    runcmd("bzr --help")
 
148
 
 
149
    progress("internal tests")
 
150
    runcmd("bzr selftest")
 
151
 
 
152
    progress("user identity")
 
153
    # this should always identify something, if only "john@localhost"
 
154
    runcmd("bzr whoami")
 
155
    runcmd("bzr whoami --email")
 
156
    assert backtick("bzr whoami --email").count('@') == 1
 
157
 
 
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)
 
162
 
 
163
    progress("basic branch creation")
 
164
    runcmd(['mkdir', 'branch1'])
 
165
    cd('branch1')
 
166
    runcmd('bzr init')
 
167
 
 
168
    progress("status of new file")
 
169
    
 
170
    f = file('test.txt', 'wt')
 
171
    f.write('hello world!\n')
 
172
    f.close()
 
173
 
 
174
    out = backtick("bzr unknowns")
 
175
    assert out == 'test.txt\n'
 
176
 
 
177
    out = backtick("bzr status")
 
178
    assert out == '''?       test.txt\n'''
 
179
 
 
180
    out = backtick("bzr status --all")
 
181
    assert out == "?       test.txt\n"
 
182
 
 
183
    out = backtick("bzr status test.txt --all")
 
184
    assert out == "?       test.txt\n"
 
185
 
 
186
    f = file('test2.txt', 'wt')
 
187
    f.write('goodbye cruel world...\n')
 
188
    f.close()
 
189
 
 
190
    out = backtick("bzr status test.txt")
 
191
    assert out == "?       test.txt\n"
 
192
 
 
193
    out = backtick("bzr status")
 
194
    assert out == "?       test.txt\n" \
 
195
                + "?       test2.txt\n"
 
196
 
 
197
    os.unlink('test2.txt')
 
198
 
 
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"
 
204
 
 
205
    progress("command help")
 
206
    runcmd("bzr help st")
 
207
    runcmd("bzr help")
 
208
    runcmd("bzr help commands")
 
209
    runcmd("bzr help slartibartfast", 1)
 
210
 
 
211
    out = backtick("bzr help ci")
 
212
    out.index('aliases: ')
 
213
 
 
214
    progress("can't rename unversioned file")
 
215
    runcmd("bzr rename test.txt new-test.txt", 1)
 
216
 
 
217
    progress("adding a file")
 
218
 
 
219
    runcmd("bzr add test.txt")
 
220
    assert backtick("bzr unknowns") == ''
 
221
    assert backtick("bzr status --all") == "A       test.txt\n"
 
222
 
 
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")
 
227
 
 
228
    assert backtick("bzr revno") == '0\n'
 
229
 
 
230
    progress("add first revision")
 
231
    runcmd(["bzr", "commit", "-m", 'add first revision'])
 
232
 
 
233
    progress("more complex renames")
 
234
    os.mkdir("sub1")
 
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)
 
238
 
 
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"
 
243
 
 
244
    assert exists("sub2")
 
245
    assert exists("sub2/hello.txt")
 
246
    assert not exists("sub1")
 
247
    assert not exists("hello.txt")
 
248
 
 
249
    runcmd(['bzr', 'commit', '-m', 'commit with some things moved to subdirs'])
 
250
 
 
251
    mkdir("sub1")
 
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')
 
259
 
 
260
    runcmd(['bzr', 'commit', '-m', 'rename nested subdirectories'])
 
261
 
 
262
    cd('sub1/sub2')
 
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'])
 
268
    cd('..')
 
269
    assert backtick('bzr relpath sub2/hello.txt') == 'sub1/sub2/hello.txt\n'
 
270
 
 
271
    runcmd('bzr move sub2/hello.txt .')
 
272
    assert exists('hello.txt')
 
273
 
 
274
    f = file('hello.txt', 'wt')
 
275
    f.write('some nice new content\n')
 
276
    f.close()
 
277
 
 
278
    f = file('msg.tmp', 'wt')
 
279
    f.write('this is my new commit\n')
 
280
    f.close()
 
281
 
 
282
    runcmd('bzr commit -F msg.tmp')
 
283
 
 
284
    assert backtick('bzr revno') == '5\n'
 
285
    runcmd('bzr export -r 5 export-5.tmp')
 
286
    runcmd('bzr export export.tmp')
 
287
    
 
288
    cd('..')
 
289
 
 
290
    progress("all tests passed!")
 
291
except Exception, e:
 
292
    sys.stderr.write('*' * 50 + '\n'
 
293
                     + 'testbzr: tests failed\n'
 
294
                     + 'see ' + LOGFILENAME + ' for more information\n'
 
295
                     + '*' * 50 + '\n')
 
296
    logfile.write('tests failed!\n')
 
297
    traceback.print_exc(None, logfile)
 
298
    sys.exit(1)