~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to testbzr

  • Committer: Martin Pool
  • Date: 2005-06-20 03:29:21 UTC
  • Revision ID: mbp@sourcefrog.net-20050620032921-240d0ade23545055
- remove redundant precursor check

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
#! /usr/bin/python
 
2
# -*- coding: utf-8 -*-
2
3
 
3
4
# Copyright (C) 2005 Canonical Ltd
4
5
 
22
23
This always runs bzr as an external process to try to catch bugs
23
24
related to argument processing, startup, etc.
24
25
 
 
26
usage:
 
27
 
 
28
    testbzr [-p PYTHON] [BZR]
 
29
 
 
30
By default this tests the copy of bzr found in the same directory as
 
31
testbzr, or the first one found on the $PATH.  A copy of bzr may be
 
32
given on the command line to override this, for example when applying
 
33
a new test suite to an old copy of bzr or vice versa.
 
34
 
 
35
testbzr normally invokes bzr using the same version of python as it
 
36
would normally use to run -- that is, the system default python,
 
37
unless that is older than 2.3.  The -p option allows specification of
 
38
a different Python interpreter, such as when testing that bzr still
 
39
works on python2.3.
 
40
 
25
41
This replaces the previous test.sh which was not very portable."""
26
42
 
27
43
import sys, os, traceback
30
46
 
31
47
TESTDIR = "testbzr.tmp"
32
48
 
 
49
 
 
50
# we always invoke bzr as 'python bzr' (or e.g. 'python2.3 bzr')
 
51
# partly so as to cope if the bzr binary is not marked executable
 
52
OVERRIDE_PYTHON = 'python'
 
53
 
33
54
LOGFILENAME = 'testbzr.log'
34
55
 
35
56
try:
47
68
 
48
69
def formcmd(cmd):
49
70
    if isinstance(cmd, basestring):
50
 
        logfile.write('$ %s\n' % cmd)
51
71
        cmd = cmd.split()
52
 
    else:
53
 
        logfile.write('$ %r\n' % cmd)
54
72
 
55
73
    if cmd[0] == 'bzr':
56
74
        cmd[0] = BZRPATH
 
75
        if OVERRIDE_PYTHON:
 
76
            cmd.insert(0, OVERRIDE_PYTHON)
57
77
 
 
78
    logfile.write('$ %r\n' % cmd)
 
79
    
58
80
    return cmd
59
81
 
60
82
 
118
140
if os.path.exists(TESTDIR):
119
141
    shutil.rmtree(TESTDIR)
120
142
 
 
143
start_dir = os.getcwd()
 
144
 
121
145
 
122
146
logfile = open(LOGFILENAME, 'wt', buffering=1)
123
147
 
 
148
def test_plugins():
 
149
    """Run a test involving creating a plugin to load,
 
150
    and making sure it is seen properly.
 
151
    """
 
152
    mkdir('plugin_test')
 
153
    f = open(os.path.join('plugin_test', 'myplug.py'), 'wb')
 
154
    f.write("""import bzrlib, bzrlib.commands
 
155
class cmd_myplug(bzrlib.commands.Command):
 
156
    '''Just a simple test plugin.'''
 
157
    aliases = ['mplg']
 
158
    def run(self):
 
159
        print 'Hello from my plugin'
 
160
""")
 
161
    f.close()
 
162
 
 
163
    os.environ['BZRPLUGINPATH'] = os.path.abspath('plugin_test')
 
164
    help = backtick('bzr help commands')
 
165
    assert help.find('myplug') != -1
 
166
    assert help.find('Just a simple test plugin.') != -1
 
167
 
 
168
    
 
169
    assert backtick('bzr myplug') == 'Hello from my plugin\n'
 
170
    assert backtick('bzr mplg') == 'Hello from my plugin\n'
 
171
 
 
172
    f = open(os.path.join('plugin_test', 'override.py'), 'wb')
 
173
    f.write("""import bzrlib, bzrlib.commands
 
174
class cmd_commit(bzrlib.commands.cmd_commit):
 
175
    '''Commit changes into a new revision.'''
 
176
    def run(self, *args, **kwargs):
 
177
        print "I'm sorry dave, you can't do that"
 
178
 
 
179
class cmd_help(bzrlib.commands.cmd_help):
 
180
    '''Show help on a command or other topic.'''
 
181
    def run(self, *args, **kwargs):
 
182
        print "You have been overridden"
 
183
        bzrlib.commands.cmd_help.run(self, *args, **kwargs)
 
184
 
 
185
""")
 
186
    f.close()
 
187
 
 
188
    newhelp = backtick('bzr help commands')
 
189
    assert newhelp.startswith('You have been overridden\n')
 
190
    # We added a line, but the rest should work
 
191
    assert newhelp[25:] == help
 
192
 
 
193
    assert backtick('bzr commit -m test') == "I'm sorry dave, you can't do that\n"
 
194
    
 
195
    shutil.rmtree('plugin_test')
124
196
 
125
197
try:
 
198
    from getopt import getopt
 
199
    opts, args = getopt(sys.argv[1:], 'p:')
 
200
 
 
201
    for option, value in opts:
 
202
        if option == '-p':
 
203
            OVERRIDE_PYTHON = value
 
204
            
 
205
    
126
206
    mypath = os.path.abspath(sys.argv[0])
127
207
    print '%-30s %s' % ('running tests from', mypath)
128
208
 
129
209
    global BZRPATH
130
210
 
131
 
    if len(sys.argv) > 1:
132
 
        BZRPATH = sys.argv[1]
 
211
    if args:
 
212
        BZRPATH = args[0]
133
213
    else:
134
214
        BZRPATH = os.path.join(os.path.split(mypath)[0], 'bzr')
135
215
 
136
216
    print '%-30s %s' % ('against bzr', BZRPATH)
137
217
    print '%-30s %s' % ('in directory', os.getcwd())
 
218
    print '%-30s %s' % ('with python', (OVERRIDE_PYTHON or '(default)'))
138
219
    print
139
 
    print backtick([BZRPATH, 'version'])
 
220
    print backtick('bzr version')
140
221
    
141
222
    runcmd(['mkdir', TESTDIR])
142
223
    cd(TESTDIR)
179
260
    assert out == 'test.txt\n'
180
261
 
181
262
    out = backtick("bzr status")
182
 
    assert out == '''?       test.txt\n'''
 
263
    assert out == 'unknown:\n  test.txt\n'
183
264
 
184
265
    out = backtick("bzr status --all")
185
 
    assert out == "?       test.txt\n"
 
266
    assert out == "unknown:\n  test.txt\n"
186
267
 
187
268
    out = backtick("bzr status test.txt --all")
188
 
    assert out == "?       test.txt\n"
 
269
    assert out == "unknown:\n  test.txt\n"
189
270
 
190
271
    f = file('test2.txt', 'wt')
191
272
    f.write('goodbye cruel world...\n')
192
273
    f.close()
193
274
 
194
275
    out = backtick("bzr status test.txt")
195
 
    assert out == "?       test.txt\n"
 
276
    assert out == "unknown:\n  test.txt\n"
196
277
 
197
278
    out = backtick("bzr status")
198
 
    assert out == "?       test.txt\n" \
199
 
                + "?       test2.txt\n"
 
279
    assert out == ("unknown:\n"
 
280
                   "  test.txt\n"
 
281
                   "  test2.txt\n")
200
282
 
201
283
    os.unlink('test2.txt')
202
284
 
203
285
    progress("command aliases")
204
286
    out = backtick("bzr st --all")
205
 
    assert out == "?       test.txt\n"
 
287
    assert out == ("unknown:\n"
 
288
                   "  test.txt\n")
 
289
    
206
290
    out = backtick("bzr stat")
207
 
    assert out == "?       test.txt\n"
 
291
    assert out == ("unknown:\n"
 
292
                   "  test.txt\n")
208
293
 
209
294
    progress("command help")
210
295
    runcmd("bzr help st")
222
307
 
223
308
    runcmd("bzr add test.txt")
224
309
    assert backtick("bzr unknowns") == ''
225
 
    assert backtick("bzr status --all") == "A       test.txt\n"
 
310
    assert backtick("bzr status --all") == ("added:\n"
 
311
                                            "  test.txt\n")
226
312
 
227
313
    progress("rename newly-added file")
228
314
    runcmd("bzr rename test.txt hello.txt")
243
329
    runcmd("bzr add sub1")
244
330
    runcmd("bzr rename sub1 sub2")
245
331
    runcmd("bzr move hello.txt sub2")
246
 
    assert backtick("bzr relpath sub2/hello.txt") == "sub2/hello.txt\n"
 
332
    assert backtick("bzr relpath sub2/hello.txt") == os.path.join("sub2", "hello.txt\n")
247
333
 
248
334
    assert exists("sub2")
249
335
    assert exists("sub2/hello.txt")
267
353
    assert backtick('bzr root')[:-1] == os.path.join(test_root, 'branch1')
268
354
    runcmd('bzr move ../hello.txt .')
269
355
    assert exists('./hello.txt')
270
 
    assert backtick('bzr relpath hello.txt') == 'sub1/sub2/hello.txt\n'
271
 
    assert backtick('bzr relpath ../../sub1/sub2/hello.txt') == 'sub1/sub2/hello.txt\n'
 
356
    assert backtick('bzr relpath hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
 
357
    assert backtick('bzr relpath ../../sub1/sub2/hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
272
358
    runcmd(['bzr', 'commit', '-m', 'move to parent directory'])
273
359
    cd('..')
274
 
    assert backtick('bzr relpath sub2/hello.txt') == 'sub1/sub2/hello.txt\n'
 
360
    assert backtick('bzr relpath sub2/hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
275
361
 
276
362
    runcmd('bzr move sub2/hello.txt .')
277
363
    assert exists('hello.txt')
292
378
 
293
379
    runcmd('bzr log')
294
380
    runcmd('bzr log -v')
 
381
 
 
382
 
 
383
 
 
384
    progress("file with spaces in name")
 
385
    mkdir('sub directory')
 
386
    file('sub directory/file with spaces ', 'wt').write('see how this works\n')
 
387
    runcmd('bzr add .')
 
388
    runcmd('bzr diff')
 
389
    runcmd('bzr commit -m add-spaces')
 
390
    runcmd('bzr check')
 
391
 
 
392
    runcmd('bzr log')
 
393
    runcmd('bzr log --forward')
 
394
 
 
395
    runcmd('bzr info')
 
396
 
 
397
 
295
398
    
296
 
    cd('..')
 
399
 
 
400
 
 
401
 
 
402
    cd('..')
 
403
    cd('..')
 
404
    progress('branch')
 
405
    # Can't create a branch if it already exists
 
406
    runcmd('bzr branch branch1', retcode=1)
 
407
    # Can't create a branch if its parent doesn't exist
 
408
    runcmd('bzr branch /unlikely/to/exist', retcode=1)
 
409
    runcmd('bzr branch branch1 branch2')
 
410
 
 
411
    progress("pull")
 
412
    cd('branch1')
 
413
    runcmd('bzr pull', retcode=1)
 
414
    runcmd('bzr pull ../branch2')
 
415
    cd('.bzr')
 
416
    runcmd('bzr pull')
 
417
    runcmd('bzr commit -m empty')
 
418
    runcmd('bzr pull')
 
419
    cd('../../branch2')
 
420
    runcmd('bzr pull')
 
421
    runcmd('bzr commit -m empty')
 
422
    cd('../branch1')
 
423
    runcmd('bzr commit -m empty')
 
424
    runcmd('bzr pull', retcode=1)
 
425
    cd ('..')
 
426
 
 
427
    progress('status after remove')
 
428
    mkdir('status-after-remove')
 
429
    # see mail from William Dodé, 2005-05-25
 
430
    # $ bzr init; touch a; bzr add a; bzr commit -m "add a"
 
431
    #     * looking for changes...
 
432
    #     added a
 
433
    #     * commited r1
 
434
    #     $ bzr remove a
 
435
    #     $ bzr status
 
436
    #     bzr: local variable 'kind' referenced before assignment
 
437
    #     at /vrac/python/bazaar-ng/bzrlib/diff.py:286 in compare_trees()
 
438
    #     see ~/.bzr.log for debug information
 
439
    cd('status-after-remove')
 
440
    runcmd('bzr init')
 
441
    file('a', 'w').write('foo')
 
442
    runcmd('bzr add a')
 
443
    runcmd(['bzr', 'commit', '-m', 'add a'])
 
444
    runcmd('bzr remove a')
 
445
    runcmd('bzr status')
 
446
 
297
447
    cd('..')
298
448
 
299
449
    progress('ignore patterns')
310
460
    runcmd('bzr add foo.c')
311
461
    assert backtick('bzr unknowns') == ''
312
462
 
 
463
    # 'ignore' works when creating the .bzignore file
313
464
    file('foo.blah', 'wt').write('blah')
314
465
    assert backtick('bzr unknowns') == 'foo.blah\n'
315
466
    runcmd('bzr ignore *.blah')
316
467
    assert backtick('bzr unknowns') == ''
317
 
    assert file('.bzrignore', 'rt').read() == '*.blah\n'
318
 
 
 
468
    assert file('.bzrignore', 'rb').read() == '*.blah\n'
 
469
 
 
470
    # 'ignore' works when then .bzrignore file already exists
 
471
    file('garh', 'wt').write('garh')
 
472
    assert backtick('bzr unknowns') == 'garh\n'
 
473
    runcmd('bzr ignore garh')
 
474
    assert backtick('bzr unknowns') == ''
 
475
    assert file('.bzrignore', 'rb').read() == '*.blah\ngarh\n'
 
476
 
 
477
    cd('..')
 
478
 
 
479
 
 
480
 
 
481
 
 
482
    progress("recursive and non-recursive add")
 
483
    mkdir('no-recurse')
 
484
    cd('no-recurse')
 
485
    runcmd('bzr init')
 
486
    mkdir('foo')
 
487
    fp = os.path.join('foo', 'test.txt')
 
488
    f = file(fp, 'w')
 
489
    f.write('hello!\n')
 
490
    f.close()
 
491
    runcmd('bzr add --no-recurse foo')
 
492
    runcmd('bzr file-id foo')
 
493
    runcmd('bzr file-id ' + fp, 1)      # not versioned yet
 
494
    runcmd('bzr commit -m add-dir-only')
 
495
 
 
496
    runcmd('bzr file-id ' + fp, 1)      # still not versioned 
 
497
 
 
498
    runcmd('bzr add foo')
 
499
    runcmd('bzr file-id ' + fp)
 
500
    runcmd('bzr commit -m add-sub-file')
 
501
    
 
502
    cd('..')
 
503
 
 
504
 
 
505
 
 
506
 
 
507
    # Run any function in this 
 
508
    g = globals()
 
509
    funcs = g.keys()
 
510
    funcs.sort()
 
511
    for k in funcs:
 
512
        if k.startswith('test_') and callable(g[k]):
 
513
            progress(k[5:].replace('_', ' '))
 
514
            g[k]()
319
515
 
320
516
    progress("all tests passed!")
321
517
except Exception, e:
325
521
                     + '*' * 50 + '\n')
326
522
    logfile.write('tests failed!\n')
327
523
    traceback.print_exc(None, logfile)
 
524
    logfile.close()
 
525
 
 
526
    sys.stdout.writelines(file(os.path.join(start_dir, LOGFILENAME), 'rt').readlines()[-50:])
 
527
    
328
528
    sys.exit(1)
 
529