~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to testbzr

  • Committer: Martin Pool
  • Date: 2005-05-17 06:56:16 UTC
  • Revision ID: mbp@sourcefrog.net-20050517065616-6f23381d6184a8aa
- add space for un-merged patches

Show diffs side-by-side

added added

removed removed

Lines of Context:
22
22
This always runs bzr as an external process to try to catch bugs
23
23
related to argument processing, startup, etc.
24
24
 
 
25
usage:
 
26
 
 
27
    testbzr [-p PYTHON] [BZR]
 
28
 
 
29
By default this tests the copy of bzr found in the same directory as
 
30
testbzr, or the first one found on the $PATH.  A copy of bzr may be
 
31
given on the command line to override this, for example when applying
 
32
a new test suite to an old copy of bzr or vice versa.
 
33
 
 
34
testbzr normally invokes bzr using the same version of python as it
 
35
would normally use to run -- that is, the system default python,
 
36
unless that is older than 2.3.  The -p option allows specification of
 
37
a different Python interpreter, such as when testing that bzr still
 
38
works on python2.3.
 
39
 
25
40
This replaces the previous test.sh which was not very portable."""
26
41
 
27
 
import sys, os
 
42
import sys, os, traceback
 
43
from os import mkdir
 
44
from os.path import exists
 
45
 
 
46
TESTDIR = "testbzr.tmp"
 
47
 
 
48
OVERRIDE_PYTHON = None
 
49
 
 
50
LOGFILENAME = 'testbzr.log'
28
51
 
29
52
try:
30
53
    import shutil
31
 
    from subprocess import call, Popen
 
54
    from subprocess import call, Popen, PIPE
32
55
except ImportError, e:
33
56
    sys.stderr.write("testbzr: sorry, this test suite requires modules from python2.4\n"
34
57
                     + '    ' + str(e))
35
58
    sys.exit(1)
36
59
 
37
60
 
38
 
def runcmd(cmd):
39
 
    """run one command and check the output.
 
61
class CommandFailed(Exception):
 
62
    pass
 
63
 
 
64
 
 
65
def formcmd(cmd):
 
66
    if isinstance(cmd, basestring):
 
67
        cmd = cmd.split()
 
68
 
 
69
    if cmd[0] == 'bzr':
 
70
        cmd[0] = BZRPATH
 
71
        if OVERRIDE_PYTHON:
 
72
            cmd.insert(0, OVERRIDE_PYTHON)
 
73
 
 
74
    logfile.write('$ %r\n' % cmd)
 
75
    
 
76
    return cmd
 
77
 
 
78
 
 
79
def runcmd(cmd, retcode=0):
 
80
    """Run one command and check the return code.
 
81
 
 
82
    Returns a tuple of (stdout,stderr) strings.
40
83
 
41
84
    If a single string is based, it is split into words.
42
85
    For commands that are not simple space-separated words, please
43
86
    pass a list instead."""
44
 
    
45
 
    if isinstance(cmd, basestring):
46
 
        cmd = cmd.split()
47
 
    logfile.write('$ %r\n' % cmd)
48
 
    retcode = call(cmd, stdout=logfile, stderr=logfile)
49
 
    if retcode != 0:
50
 
        raise Exception("test failed: %r returned %r" % (cmd, retcode))
 
87
    cmd = formcmd(cmd)
 
88
    log_linenumber()
 
89
    
 
90
    actual_retcode = call(cmd, stdout=logfile, stderr=logfile)
 
91
    
 
92
    if retcode != actual_retcode:
 
93
        raise CommandFailed("test failed: %r returned %d, expected %d"
 
94
                            % (cmd, actual_retcode, retcode))
 
95
 
 
96
 
 
97
 
 
98
def backtick(cmd, retcode=0):
 
99
    cmd = formcmd(cmd)
 
100
    log_linenumber()
 
101
    child = Popen(cmd, stdout=PIPE, stderr=logfile)
 
102
    outd, errd = child.communicate()
 
103
    logfile.write(outd)
 
104
    actual_retcode = child.wait()
 
105
 
 
106
    outd = outd.replace('\r', '')
 
107
    
 
108
    if retcode != actual_retcode:
 
109
        raise CommandFailed("test failed: %r returned %d, expected %d"
 
110
                            % (cmd, actual_retcode, retcode))
 
111
 
 
112
    return outd
 
113
 
51
114
 
52
115
 
53
116
def progress(msg):
54
117
    print '* ' + msg
55
118
    logfile.write('* '+ msg + '\n')
56
 
 
57
 
 
58
 
TESTDIR = "bzr-test.tmp"
 
119
    log_linenumber()
 
120
 
 
121
 
 
122
def cd(dirname):
 
123
    logfile.write('$ cd %s\n' % dirname)
 
124
    os.chdir(dirname)
 
125
 
 
126
 
 
127
 
 
128
def log_linenumber():
 
129
    """Log the stack frame location two things up."""
 
130
    stack = traceback.extract_stack()[-3]
 
131
    logfile.write('   at %s:%d\n' % stack[:2])
 
132
 
 
133
 
59
134
 
60
135
# prepare an empty scratch directory
61
136
if os.path.exists(TESTDIR):
62
137
    shutil.rmtree(TESTDIR)
63
138
 
64
 
 
65
 
logfile = open('bzr-test.log', 'wt')
66
 
 
67
 
 
68
 
os.mkdir(TESTDIR)
69
 
os.chdir(TESTDIR)
70
 
 
71
 
 
72
 
progress("testing introductory commands")
73
 
runcmd("bzr version")
74
 
runcmd("bzr help")
75
 
runcmd("bzr --help")
76
 
 
77
 
progress("all tests passed!")
 
139
start_dir = os.getcwd()
 
140
 
 
141
 
 
142
logfile = open(LOGFILENAME, 'wt', buffering=1)
 
143
 
 
144
 
 
145
try:
 
146
    from getopt import getopt
 
147
    opts, args = getopt(sys.argv[1:], 'p:')
 
148
 
 
149
    for option, value in opts:
 
150
        if option == '-p':
 
151
            OVERRIDE_PYTHON = value
 
152
            
 
153
    
 
154
    mypath = os.path.abspath(sys.argv[0])
 
155
    print '%-30s %s' % ('running tests from', mypath)
 
156
 
 
157
    global BZRPATH
 
158
 
 
159
    if args:
 
160
        BZRPATH = args[1]
 
161
    else:
 
162
        BZRPATH = os.path.join(os.path.split(mypath)[0], 'bzr')
 
163
 
 
164
    print '%-30s %s' % ('against bzr', BZRPATH)
 
165
    print '%-30s %s' % ('in directory', os.getcwd())
 
166
    print '%-30s %s' % ('with python', (OVERRIDE_PYTHON or '(default)'))
 
167
    print
 
168
    print backtick([BZRPATH, 'version'])
 
169
    
 
170
    runcmd(['mkdir', TESTDIR])
 
171
    cd(TESTDIR)
 
172
    test_root = os.getcwd()
 
173
 
 
174
    progress("introductory commands")
 
175
    runcmd("bzr version")
 
176
    runcmd("bzr --version")
 
177
    runcmd("bzr help")
 
178
    runcmd("bzr --help")
 
179
 
 
180
    progress("internal tests")
 
181
    runcmd("bzr selftest")
 
182
 
 
183
    progress("user identity")
 
184
    # this should always identify something, if only "john@localhost"
 
185
    runcmd("bzr whoami")
 
186
    runcmd("bzr whoami --email")
 
187
    assert backtick("bzr whoami --email").count('@') == 1
 
188
 
 
189
    progress("invalid commands")
 
190
    runcmd("bzr pants", retcode=1)
 
191
    runcmd("bzr --pants off", retcode=1)
 
192
    runcmd("bzr diff --message foo", retcode=1)
 
193
 
 
194
    progress("basic branch creation")
 
195
    runcmd(['mkdir', 'branch1'])
 
196
    cd('branch1')
 
197
    runcmd('bzr init')
 
198
 
 
199
    assert backtick('bzr root')[:-1] == os.path.join(test_root, 'branch1')
 
200
 
 
201
    progress("status of new file")
 
202
    
 
203
    f = file('test.txt', 'wt')
 
204
    f.write('hello world!\n')
 
205
    f.close()
 
206
 
 
207
    out = backtick("bzr unknowns")
 
208
    assert out == 'test.txt\n'
 
209
 
 
210
    out = backtick("bzr status")
 
211
    assert out == 'unknown:\n  test.txt\n'
 
212
 
 
213
    out = backtick("bzr status --all")
 
214
    assert out == "unknown:\n  test.txt\n"
 
215
 
 
216
    out = backtick("bzr status test.txt --all")
 
217
    assert out == "unknown:\n  test.txt\n"
 
218
 
 
219
    f = file('test2.txt', 'wt')
 
220
    f.write('goodbye cruel world...\n')
 
221
    f.close()
 
222
 
 
223
    out = backtick("bzr status test.txt")
 
224
    assert out == "unknown:\n  test.txt\n"
 
225
 
 
226
    out = backtick("bzr status")
 
227
    assert out == ("unknown:\n"
 
228
                   "  test.txt\n"
 
229
                   "  test2.txt\n")
 
230
 
 
231
    os.unlink('test2.txt')
 
232
 
 
233
    progress("command aliases")
 
234
    out = backtick("bzr st --all")
 
235
    assert out == ("unknown:\n"
 
236
                   "  test.txt\n")
 
237
    
 
238
    out = backtick("bzr stat")
 
239
    assert out == ("unknown:\n"
 
240
                   "  test.txt\n")
 
241
 
 
242
    progress("command help")
 
243
    runcmd("bzr help st")
 
244
    runcmd("bzr help")
 
245
    runcmd("bzr help commands")
 
246
    runcmd("bzr help slartibartfast", 1)
 
247
 
 
248
    out = backtick("bzr help ci")
 
249
    out.index('aliases: ')
 
250
 
 
251
    progress("can't rename unversioned file")
 
252
    runcmd("bzr rename test.txt new-test.txt", 1)
 
253
 
 
254
    progress("adding a file")
 
255
 
 
256
    runcmd("bzr add test.txt")
 
257
    assert backtick("bzr unknowns") == ''
 
258
    assert backtick("bzr status --all") == ("added:\n"
 
259
                                            "  test.txt\n")
 
260
 
 
261
    progress("rename newly-added file")
 
262
    runcmd("bzr rename test.txt hello.txt")
 
263
    assert os.path.exists("hello.txt")
 
264
    assert not os.path.exists("test.txt")
 
265
 
 
266
    assert backtick("bzr revno") == '0\n'
 
267
 
 
268
    progress("add first revision")
 
269
    runcmd(["bzr", "commit", "-m", 'add first revision'])
 
270
 
 
271
    progress("more complex renames")
 
272
    os.mkdir("sub1")
 
273
    runcmd("bzr rename hello.txt sub1", 1)
 
274
    runcmd("bzr rename hello.txt sub1/hello.txt", 1)
 
275
    runcmd("bzr move hello.txt sub1", 1)
 
276
 
 
277
    runcmd("bzr add sub1")
 
278
    runcmd("bzr rename sub1 sub2")
 
279
    runcmd("bzr move hello.txt sub2")
 
280
    assert backtick("bzr relpath sub2/hello.txt") == "sub2/hello.txt\n"
 
281
 
 
282
    assert exists("sub2")
 
283
    assert exists("sub2/hello.txt")
 
284
    assert not exists("sub1")
 
285
    assert not exists("hello.txt")
 
286
 
 
287
    runcmd(['bzr', 'commit', '-m', 'commit with some things moved to subdirs'])
 
288
 
 
289
    mkdir("sub1")
 
290
    runcmd('bzr add sub1')
 
291
    runcmd('bzr move sub2/hello.txt sub1')
 
292
    assert not exists('sub2/hello.txt')
 
293
    assert exists('sub1/hello.txt')
 
294
    runcmd('bzr move sub2 sub1')
 
295
    assert not exists('sub2')
 
296
    assert exists('sub1/sub2')
 
297
 
 
298
    runcmd(['bzr', 'commit', '-m', 'rename nested subdirectories'])
 
299
 
 
300
    cd('sub1/sub2')
 
301
    assert backtick('bzr root')[:-1] == os.path.join(test_root, 'branch1')
 
302
    runcmd('bzr move ../hello.txt .')
 
303
    assert exists('./hello.txt')
 
304
    assert backtick('bzr relpath hello.txt') == 'sub1/sub2/hello.txt\n'
 
305
    assert backtick('bzr relpath ../../sub1/sub2/hello.txt') == 'sub1/sub2/hello.txt\n'
 
306
    runcmd(['bzr', 'commit', '-m', 'move to parent directory'])
 
307
    cd('..')
 
308
    assert backtick('bzr relpath sub2/hello.txt') == 'sub1/sub2/hello.txt\n'
 
309
 
 
310
    runcmd('bzr move sub2/hello.txt .')
 
311
    assert exists('hello.txt')
 
312
 
 
313
    f = file('hello.txt', 'wt')
 
314
    f.write('some nice new content\n')
 
315
    f.close()
 
316
 
 
317
    f = file('msg.tmp', 'wt')
 
318
    f.write('this is my new commit\n')
 
319
    f.close()
 
320
 
 
321
    runcmd('bzr commit -F msg.tmp')
 
322
 
 
323
    assert backtick('bzr revno') == '5\n'
 
324
    runcmd('bzr export -r 5 export-5.tmp')
 
325
    runcmd('bzr export export.tmp')
 
326
 
 
327
    runcmd('bzr log')
 
328
    runcmd('bzr log -v')
 
329
 
 
330
 
 
331
 
 
332
    progress("file with spaces in name")
 
333
    mkdir('sub directory')
 
334
    file('sub directory/file with spaces ', 'wt').write('see how this works\n')
 
335
    runcmd('bzr add .')
 
336
    runcmd('bzr diff')
 
337
    runcmd('bzr commit -m add-spaces')
 
338
    runcmd('bzr check')
 
339
 
 
340
    
 
341
    
 
342
    
 
343
    cd('..')
 
344
    cd('..')
 
345
 
 
346
    progress('ignore patterns')
 
347
    mkdir('ignorebranch')
 
348
    cd('ignorebranch')
 
349
    runcmd('bzr init')
 
350
    assert backtick('bzr unknowns') == ''
 
351
 
 
352
    file('foo.tmp', 'wt').write('tmp files are ignored')
 
353
    assert backtick('bzr unknowns') == ''
 
354
 
 
355
    file('foo.c', 'wt').write('int main() {}')
 
356
    assert backtick('bzr unknowns') == 'foo.c\n'
 
357
    runcmd('bzr add foo.c')
 
358
    assert backtick('bzr unknowns') == ''
 
359
 
 
360
    # 'ignore' works when creating the .bzignore file
 
361
    file('foo.blah', 'wt').write('blah')
 
362
    assert backtick('bzr unknowns') == 'foo.blah\n'
 
363
    runcmd('bzr ignore *.blah')
 
364
    assert backtick('bzr unknowns') == ''
 
365
    assert file('.bzrignore', 'rb').read() == '*.blah\n'
 
366
 
 
367
    # 'ignore' works when then .bzrignore file already exists
 
368
    file('garh', 'wt').write('garh')
 
369
    assert backtick('bzr unknowns') == 'garh\n'
 
370
    runcmd('bzr ignore garh')
 
371
    assert backtick('bzr unknowns') == ''
 
372
    assert file('.bzrignore', 'rb').read() == '*.blah\ngarh\n'
 
373
 
 
374
 
 
375
 
 
376
    progress("all tests passed!")
 
377
except Exception, e:
 
378
    sys.stderr.write('*' * 50 + '\n'
 
379
                     + 'testbzr: tests failed\n'
 
380
                     + 'see ' + LOGFILENAME + ' for more information\n'
 
381
                     + '*' * 50 + '\n')
 
382
    logfile.write('tests failed!\n')
 
383
    traceback.print_exc(None, logfile)
 
384
    logfile.close()
 
385
 
 
386
    sys.stdout.writelines(file(os.path.join(start_dir, LOGFILENAME), 'rt').readlines()[-50:])
 
387
    
 
388
    sys.exit(1)
 
389