~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to testbzr

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2008-10-31 04:39:04 UTC
  • mfrom: (3565.6.16 switch_nick)
  • Revision ID: pqm@pqm.ubuntu.com-20081031043904-52fnbfrloojemvcc
(mbp) branch nickname documentation

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)