~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to testbzr

  • Committer: Martin Pool
  • Date: 2005-05-05 02:59:39 UTC
  • Revision ID: mbp@sourcefrog.net-20050505025938-8399b9ca401a1176
- Split out help functions into bzrlib.help

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
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
    return cmd
 
56
 
 
57
 
 
58
def runcmd(cmd, retcode=0):
 
59
    """Run one command and check the return code.
 
60
 
 
61
    Returns a tuple of (stdout,stderr) strings.
 
62
 
 
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."""
 
66
    cmd = formcmd(cmd)
 
67
    log_linenumber()
 
68
    
 
69
    actual_retcode = call(cmd, stdout=logfile, stderr=logfile)
 
70
    
 
71
    if retcode != actual_retcode:
 
72
        raise CommandFailed("test failed: %r returned %d, expected %d"
 
73
                            % (cmd, actual_retcode, retcode))
 
74
 
 
75
 
 
76
 
 
77
def backtick(cmd, retcode=0):
 
78
    cmd = formcmd(cmd)
 
79
    log_linenumber()
 
80
    child = Popen(cmd, stdout=PIPE, stderr=logfile)
 
81
    outd, errd = child.communicate()
 
82
    logfile.write(outd)
 
83
    actual_retcode = child.wait()
 
84
 
 
85
    outd = outd.replace('\r', '')
 
86
    
 
87
    if retcode != actual_retcode:
 
88
        raise CommandFailed("test failed: %r returned %d, expected %d"
 
89
                            % (cmd, actual_retcode, retcode))
 
90
 
 
91
    return outd
 
92
 
 
93
 
 
94
 
 
95
def progress(msg):
 
96
    print '* ' + msg
 
97
    logfile.write('* '+ msg + '\n')
 
98
    log_linenumber()
 
99
 
 
100
 
 
101
def cd(dirname):
 
102
    logfile.write('$ cd %s\n' % dirname)
 
103
    os.chdir(dirname)
 
104
 
 
105
 
 
106
 
 
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])
 
111
 
 
112
 
 
113
 
 
114
# prepare an empty scratch directory
 
115
if os.path.exists(TESTDIR):
 
116
    shutil.rmtree(TESTDIR)
 
117
 
 
118
 
 
119
logfile = open(LOGFILENAME, 'wt', buffering=1)
 
120
 
 
121
 
 
122
try:
 
123
    runcmd(['mkdir', TESTDIR])
 
124
    cd(TESTDIR)
 
125
 
 
126
    progress("introductory commands")
 
127
    runcmd("bzr version")
 
128
    runcmd("bzr --version")
 
129
    runcmd("bzr help")
 
130
    runcmd("bzr --help")
 
131
 
 
132
    progress("user identity")
 
133
    # this should always identify something, if only "john@localhost"
 
134
    runcmd("bzr whoami")
 
135
    runcmd("bzr whoami --email")
 
136
    assert backtick("bzr whoami --email").count('@') == 1
 
137
 
 
138
    progress("invalid commands")
 
139
    runcmd("bzr pants", retcode=1)
 
140
    runcmd("bzr --pants off", retcode=1)
 
141
 
 
142
    progress("basic branch creation")
 
143
    runcmd(['mkdir', 'branch1'])
 
144
    cd('branch1')
 
145
    runcmd('bzr init')
 
146
 
 
147
    progress("status of new file")
 
148
    
 
149
    f = file('test.txt', 'wt')
 
150
    f.write('hello world!\n')
 
151
    f.close()
 
152
 
 
153
    out = backtick("bzr unknowns")
 
154
    assert out == 'test.txt\n'
 
155
 
 
156
    out = backtick("bzr status")
 
157
    assert out == '''?       test.txt\n'''
 
158
 
 
159
    out = backtick("bzr status --all")
 
160
    assert out == "?       test.txt\n"
 
161
 
 
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"
 
167
 
 
168
    progress("command help")
 
169
    runcmd("bzr help st")
 
170
    runcmd("bzr help")
 
171
    runcmd("bzr help commands")
 
172
    runcmd("bzr help ci")
 
173
    runcmd("bzr help slartibartfast", 1)    
 
174
 
 
175
    progress("can't rename unversioned file")
 
176
    runcmd("bzr rename test.txt new-test.txt", 1)
 
177
 
 
178
    progress("adding a file")
 
179
 
 
180
    runcmd("bzr add test.txt")
 
181
    assert backtick("bzr unknowns") == ''
 
182
    assert backtick("bzr status --all") == "A       test.txt\n"
 
183
 
 
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")
 
188
 
 
189
    assert backtick("bzr revno") == '0\n'
 
190
 
 
191
    progress("add first revision")
 
192
    runcmd(["bzr", "commit", "-m", 'add first revision'])
 
193
 
 
194
    progress("more complex renames")
 
195
    os.mkdir("sub1")
 
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)
 
199
 
 
200
    runcmd("bzr add sub1")
 
201
    runcmd("bzr rename sub1 sub2")
 
202
    runcmd("bzr move hello.txt sub2")
 
203
 
 
204
    assert exists("sub2")
 
205
    assert exists("sub2/hello.txt")
 
206
    assert not exists("sub1")
 
207
    assert not exists("hello.txt")
 
208
 
 
209
    runcmd(['bzr', 'commit', '-m', 'commit with some things moved to subdirs'])
 
210
 
 
211
    mkdir("sub1")
 
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')
 
219
 
 
220
    runcmd(['bzr', 'commit', '-m', 'rename nested subdirectories'])
 
221
 
 
222
    cd('sub1/sub2')
 
223
    runcmd('bzr move ../hello.txt .')
 
224
    assert exists('./hello.txt')
 
225
    runcmd(['bzr', 'commit', '-m', 'move to parent directory'])
 
226
    cd('..')
 
227
 
 
228
    runcmd('bzr move sub2/hello.txt .')
 
229
    assert exists('hello.txt')
 
230
    
 
231
    
 
232
    cd('..')
 
233
 
 
234
    progress("all tests passed!")
 
235
except Exception, e:
 
236
    sys.stderr.write('*' * 50 + '\n'
 
237
                     + 'testbzr: tests failed\n'
 
238
                     + 'see ' + LOGFILENAME + ' for more information\n'
 
239
                     + '*' * 50 + '\n')
 
240
    logfile.write('tests failed!\n')
 
241
    traceback.print_exc(None, logfile)
 
242
    sys.exit(1)