/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to testbzr

  • Committer: Martin Pool
  • Date: 2005-05-05 02:18:07 UTC
  • Revision ID: mbp@sourcefrog.net-20050505021807-fe44665f08efca6e
todo

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
 
 
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("can't rename unversioned file")
 
163
    runcmd("bzr rename test.txt new-test.txt", 1)
 
164
 
 
165
    progress("adding a file")
 
166
 
 
167
    runcmd("bzr add test.txt")
 
168
    assert backtick("bzr unknowns") == ''
 
169
    assert backtick("bzr status --all") == "A       test.txt\n"
 
170
 
 
171
    progress("rename newly-added file")
 
172
    runcmd("bzr rename test.txt hello.txt")
 
173
    assert os.path.exists("hello.txt")
 
174
    assert not os.path.exists("test.txt")
 
175
 
 
176
    assert backtick("bzr revno") == '0\n'
 
177
 
 
178
    progress("add first revision")
 
179
    runcmd(["bzr", "commit", "-m", 'add first revision'])
 
180
 
 
181
    progress("more complex renames")
 
182
    os.mkdir("sub1")
 
183
    runcmd("bzr rename hello.txt sub1", 1)
 
184
    runcmd("bzr rename hello.txt sub1/hello.txt", 1)
 
185
    runcmd("bzr move hello.txt sub1", 1)
 
186
 
 
187
    runcmd("bzr add sub1")
 
188
    runcmd("bzr rename sub1 sub2")
 
189
    runcmd("bzr move hello.txt sub2")
 
190
 
 
191
    assert exists("sub2")
 
192
    assert exists("sub2/hello.txt")
 
193
    assert not exists("sub1")
 
194
    assert not exists("hello.txt")
 
195
 
 
196
    runcmd(['bzr', 'commit', '-m', 'commit with some things moved to subdirs'])
 
197
 
 
198
    mkdir("sub1")
 
199
    runcmd('bzr add sub1')
 
200
    runcmd('bzr move sub2/hello.txt sub1')
 
201
    assert not exists('sub2/hello.txt')
 
202
    assert exists('sub1/hello.txt')
 
203
    runcmd('bzr move sub2 sub1')
 
204
    assert not exists('sub2')
 
205
    assert exists('sub1/sub2')
 
206
 
 
207
    runcmd(['bzr', 'commit', '-m', 'rename nested subdirectories'])
 
208
 
 
209
    cd('sub1/sub2')
 
210
    runcmd('bzr move ../hello.txt .')
 
211
    assert exists('./hello.txt')
 
212
    runcmd(['bzr', 'commit', '-m', 'move to parent directory'])
 
213
    cd('..')
 
214
 
 
215
    runcmd('bzr move sub2/hello.txt .')
 
216
    assert exists('hello.txt')
 
217
    
 
218
    
 
219
    cd('..')
 
220
 
 
221
    progress("all tests passed!")
 
222
except Exception, e:
 
223
    sys.stderr.write('*' * 50 + '\n'
 
224
                     + 'testbzr: tests failed\n'
 
225
                     + 'see ' + LOGFILENAME + ' for more information\n'
 
226
                     + '*' * 50 + '\n')
 
227
    logfile.write('tests failed!\n')
 
228
    traceback.print_exc(None, logfile)
 
229
    sys.exit(1)