~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to testbzr

  • Committer: Robert Collins
  • Date: 2005-12-24 02:20:45 UTC
  • mto: (1185.50.57 bzr-jam-integration)
  • mto: This revision was merged to the branch mainline in revision 1550.
  • Revision ID: robertc@robertcollins.net-20051224022045-14efc8dfa0e1a4e9
Start tests for api usage.

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
 
    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
 
    runcmd("bzr diff --message foo", retcode=1)
142
 
 
143
 
    progress("basic branch creation")
144
 
    runcmd(['mkdir', 'branch1'])
145
 
    cd('branch1')
146
 
    runcmd('bzr init')
147
 
 
148
 
    progress("status of new file")
149
 
    
150
 
    f = file('test.txt', 'wt')
151
 
    f.write('hello world!\n')
152
 
    f.close()
153
 
 
154
 
    out = backtick("bzr unknowns")
155
 
    assert out == 'test.txt\n'
156
 
 
157
 
    out = backtick("bzr status")
158
 
    assert out == '''?       test.txt\n'''
159
 
 
160
 
    out = backtick("bzr status --all")
161
 
    assert out == "?       test.txt\n"
162
 
 
163
 
    progress("command aliases")
164
 
    out = backtick("bzr st --all")
165
 
    assert out == "?       test.txt\n"
166
 
    out = backtick("bzr stat")
167
 
    assert out == "?       test.txt\n"
168
 
 
169
 
    progress("command help")
170
 
    runcmd("bzr help st")
171
 
    runcmd("bzr help")
172
 
    runcmd("bzr help commands")
173
 
    runcmd("bzr help slartibartfast", 1)
174
 
 
175
 
    out = backtick("bzr help ci")
176
 
    out.index('aliases: ')
177
 
 
178
 
    progress("can't rename unversioned file")
179
 
    runcmd("bzr rename test.txt new-test.txt", 1)
180
 
 
181
 
    progress("adding a file")
182
 
 
183
 
    runcmd("bzr add test.txt")
184
 
    assert backtick("bzr unknowns") == ''
185
 
    assert backtick("bzr status --all") == "A       test.txt\n"
186
 
 
187
 
    progress("rename newly-added file")
188
 
    runcmd("bzr rename test.txt hello.txt")
189
 
    assert os.path.exists("hello.txt")
190
 
    assert not os.path.exists("test.txt")
191
 
 
192
 
    assert backtick("bzr revno") == '0\n'
193
 
 
194
 
    progress("add first revision")
195
 
    runcmd(["bzr", "commit", "-m", 'add first revision'])
196
 
 
197
 
    progress("more complex renames")
198
 
    os.mkdir("sub1")
199
 
    runcmd("bzr rename hello.txt sub1", 1)
200
 
    runcmd("bzr rename hello.txt sub1/hello.txt", 1)
201
 
    runcmd("bzr move hello.txt sub1", 1)
202
 
 
203
 
    runcmd("bzr add sub1")
204
 
    runcmd("bzr rename sub1 sub2")
205
 
    runcmd("bzr move hello.txt sub2")
206
 
 
207
 
    assert exists("sub2")
208
 
    assert exists("sub2/hello.txt")
209
 
    assert not exists("sub1")
210
 
    assert not exists("hello.txt")
211
 
 
212
 
    runcmd(['bzr', 'commit', '-m', 'commit with some things moved to subdirs'])
213
 
 
214
 
    mkdir("sub1")
215
 
    runcmd('bzr add sub1')
216
 
    runcmd('bzr move sub2/hello.txt sub1')
217
 
    assert not exists('sub2/hello.txt')
218
 
    assert exists('sub1/hello.txt')
219
 
    runcmd('bzr move sub2 sub1')
220
 
    assert not exists('sub2')
221
 
    assert exists('sub1/sub2')
222
 
 
223
 
    runcmd(['bzr', 'commit', '-m', 'rename nested subdirectories'])
224
 
 
225
 
    cd('sub1/sub2')
226
 
    runcmd('bzr move ../hello.txt .')
227
 
    assert exists('./hello.txt')
228
 
    runcmd(['bzr', 'commit', '-m', 'move to parent directory'])
229
 
    cd('..')
230
 
 
231
 
    runcmd('bzr move sub2/hello.txt .')
232
 
    assert exists('hello.txt')
233
 
 
234
 
    f = file('hello.txt', 'wt')
235
 
    f.write('some nice new content\n')
236
 
    f.close()
237
 
 
238
 
    f = file('msg.tmp', 'wt')
239
 
    f.write('this is my new commit\n')
240
 
    f.close()
241
 
 
242
 
    runcmd('bzr commit -F msg.tmp')
243
 
    
244
 
    cd('..')
245
 
 
246
 
    progress("all tests passed!")
247
 
except Exception, e:
248
 
    sys.stderr.write('*' * 50 + '\n'
249
 
                     + 'testbzr: tests failed\n'
250
 
                     + 'see ' + LOGFILENAME + ' for more information\n'
251
 
                     + '*' * 50 + '\n')
252
 
    logfile.write('tests failed!\n')
253
 
    traceback.print_exc(None, logfile)
254
 
    sys.exit(1)