~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to testbzr

  • Committer: Martin Pool
  • Date: 2005-05-03 08:13:15 UTC
  • Revision ID: mbp@sourcefrog.net-20050503081315-0a34aa107691c392
- Clarify return codes from command objects

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
#! /usr/bin/python
2
 
# -*- coding: utf-8 -*-
3
2
 
4
3
# Copyright (C) 2005 Canonical Ltd
5
4
 
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
19
18
 
20
 
print 'please use "bzr selftest" instead'
21
 
import sys
22
 
sys.exit(1)
23
 
 
 
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
 
 
29
TESTDIR = "testbzr.tmp"
 
30
 
 
31
LOGFILENAME = 'testbzr.log'
 
32
 
 
33
try:
 
34
    import shutil
 
35
    from subprocess import call, Popen, PIPE
 
36
except ImportError, e:
 
37
    sys.stderr.write("testbzr: sorry, this test suite requires modules from python2.4\n"
 
38
                     + '    ' + str(e))
 
39
    sys.exit(1)
 
40
 
 
41
 
 
42
class CommandFailed(Exception):
 
43
    pass
 
44
 
 
45
 
 
46
def formcmd(cmd):
 
47
    if isinstance(cmd, basestring):
 
48
        logfile.write('$ %s\n' % cmd)
 
49
        cmd = cmd.split()
 
50
    else:
 
51
        logfile.write('$ %r\n' % cmd)
 
52
 
 
53
    return cmd
 
54
 
 
55
 
 
56
def runcmd(cmd, retcode=0):
 
57
    """Run one command and check the return code.
 
58
 
 
59
    Returns a tuple of (stdout,stderr) strings.
 
60
 
 
61
    If a single string is based, it is split into words.
 
62
    For commands that are not simple space-separated words, please
 
63
    pass a list instead."""
 
64
    cmd = formcmd(cmd)
 
65
    log_linenumber()
 
66
    
 
67
    actual_retcode = call(cmd, stdout=logfile, stderr=logfile)
 
68
    
 
69
    if retcode != actual_retcode:
 
70
        raise CommandFailed("test failed: %r returned %d, expected %d"
 
71
                            % (cmd, actual_retcode, retcode))
 
72
 
 
73
 
 
74
 
 
75
def backtick(cmd, retcode=0):
 
76
    cmd = formcmd(cmd)
 
77
    log_linenumber()
 
78
    child = Popen(cmd, stdout=PIPE, stderr=logfile)
 
79
    outd, errd = child.communicate()
 
80
    logfile.write(outd)
 
81
    actual_retcode = child.wait()
 
82
 
 
83
    outd = outd.replace('\r', '')
 
84
    
 
85
    if retcode != actual_retcode:
 
86
        raise CommandFailed("test failed: %r returned %d, expected %d"
 
87
                            % (cmd, actual_retcode, retcode))
 
88
 
 
89
    return outd
 
90
 
 
91
 
 
92
 
 
93
def progress(msg):
 
94
    print '* ' + msg
 
95
    logfile.write('* '+ msg + '\n')
 
96
    log_linenumber()
 
97
 
 
98
 
 
99
def cd(dirname):
 
100
    logfile.write('$ cd %s\n' % dirname)
 
101
    os.chdir(dirname)
 
102
 
 
103
 
 
104
 
 
105
def log_linenumber():
 
106
    """Log the stack frame location two things up."""
 
107
    stack = traceback.extract_stack()[-3]
 
108
    logfile.write('   at %s:%d\n' % stack[:2])
 
109
 
 
110
 
 
111
# prepare an empty scratch directory
 
112
if os.path.exists(TESTDIR):
 
113
    shutil.rmtree(TESTDIR)
 
114
 
 
115
 
 
116
logfile = open(LOGFILENAME, 'wt', buffering=1)
 
117
 
 
118
 
 
119
try:
 
120
    runcmd(['mkdir', TESTDIR])
 
121
    cd(TESTDIR)
 
122
 
 
123
    progress("introductory commands")
 
124
    runcmd("bzr version")
 
125
    runcmd("bzr --version")
 
126
    runcmd("bzr help")
 
127
    runcmd("bzr --help")
 
128
 
 
129
    progress("user identity")
 
130
    # this should always identify something, if only "john@localhost"
 
131
    runcmd("bzr whoami")
 
132
    runcmd("bzr whoami --email")
 
133
    assert backtick("bzr whoami --email").count('@') == 1
 
134
 
 
135
    progress("invalid commands")
 
136
    runcmd("bzr pants", retcode=1)
 
137
    runcmd("bzr --pants off", retcode=1)
 
138
 
 
139
    progress("basic branch creation")
 
140
    runcmd(['mkdir', 'branch1'])
 
141
    cd('branch1')
 
142
    runcmd('bzr init')
 
143
 
 
144
    progress("status of new file")
 
145
    
 
146
    f = file('test.txt', 'wt')
 
147
    f.write('hello world!\n')
 
148
    f.close()
 
149
 
 
150
    out = backtick("bzr unknowns")
 
151
    assert out == 'test.txt\n'
 
152
 
 
153
    out = backtick("bzr status")
 
154
    assert out == '''?       test.txt\n'''
 
155
 
 
156
    out = backtick("bzr status --all")
 
157
    assert out == "?       test.txt\n"
 
158
 
 
159
    progress("can't rename unversioned file")
 
160
    runcmd("bzr rename test.txt new-test.txt", 1)
 
161
 
 
162
    progress("adding a file")
 
163
 
 
164
    runcmd("bzr add test.txt")
 
165
    assert backtick("bzr unknowns") == ''
 
166
    assert backtick("bzr status --all") == "A       test.txt\n"
 
167
 
 
168
    progress("rename newly-added file")
 
169
    runcmd("bzr rename test.txt hello.txt")
 
170
    assert os.path.exists("hello.txt")
 
171
    assert not os.path.exists("test.txt")
 
172
 
 
173
    assert backtick("bzr revno") == '0\n'
 
174
 
 
175
    cd('..')
 
176
 
 
177
    progress("all tests passed!")
 
178
except Exception, e:
 
179
    sys.stderr.write('*' * 50 + '\n'
 
180
                     + 'testbzr: tests failed\n'
 
181
                     + 'see ' + LOGFILENAME + ' for more information\n'
 
182
                     + '*' * 50 + '\n')
 
183
    logfile.write('tests failed!\n')
 
184
    traceback.print_exc(None, logfile)
 
185
    sys.exit(1)