/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-03 09:27:28 UTC
  • Revision ID: mbp@sourcefrog.net-20050503092728-64dce133ff53fd08
many more diffs

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
# prepare an empty scratch directory
 
114
if os.path.exists(TESTDIR):
 
115
    shutil.rmtree(TESTDIR)
 
116
 
 
117
 
 
118
logfile = open(LOGFILENAME, 'wt', buffering=1)
 
119
 
 
120
 
 
121
try:
 
122
    runcmd(['mkdir', TESTDIR])
 
123
    cd(TESTDIR)
 
124
 
 
125
    progress("introductory commands")
 
126
    runcmd("bzr version")
 
127
    runcmd("bzr --version")
 
128
    runcmd("bzr help")
 
129
    runcmd("bzr --help")
 
130
 
 
131
    progress("user identity")
 
132
    # this should always identify something, if only "john@localhost"
 
133
    runcmd("bzr whoami")
 
134
    runcmd("bzr whoami --email")
 
135
    assert backtick("bzr whoami --email").count('@') == 1
 
136
 
 
137
    progress("invalid commands")
 
138
    runcmd("bzr pants", retcode=1)
 
139
    runcmd("bzr --pants off", retcode=1)
 
140
 
 
141
    progress("basic branch creation")
 
142
    runcmd(['mkdir', 'branch1'])
 
143
    cd('branch1')
 
144
    runcmd('bzr init')
 
145
 
 
146
    progress("status of new file")
 
147
    
 
148
    f = file('test.txt', 'wt')
 
149
    f.write('hello world!\n')
 
150
    f.close()
 
151
 
 
152
    out = backtick("bzr unknowns")
 
153
    assert out == 'test.txt\n'
 
154
 
 
155
    out = backtick("bzr status")
 
156
    assert out == '''?       test.txt\n'''
 
157
 
 
158
    out = backtick("bzr status --all")
 
159
    assert out == "?       test.txt\n"
 
160
 
 
161
    progress("can't rename unversioned file")
 
162
    runcmd("bzr rename test.txt new-test.txt", 1)
 
163
 
 
164
    progress("adding a file")
 
165
 
 
166
    runcmd("bzr add test.txt")
 
167
    assert backtick("bzr unknowns") == ''
 
168
    assert backtick("bzr status --all") == "A       test.txt\n"
 
169
 
 
170
    progress("rename newly-added file")
 
171
    runcmd("bzr rename test.txt hello.txt")
 
172
    assert os.path.exists("hello.txt")
 
173
    assert not os.path.exists("test.txt")
 
174
 
 
175
    assert backtick("bzr revno") == '0\n'
 
176
 
 
177
    progress("add first revision")
 
178
    runcmd(["bzr", "commit", "-m", 'add first revision'])
 
179
 
 
180
    progress("more complex renames")
 
181
    os.mkdir("sub1")
 
182
    runcmd("bzr rename hello.txt sub1", 1)
 
183
    runcmd("bzr rename hello.txt sub1/hello.txt", 1)
 
184
    runcmd("bzr move hello.txt sub1", 1)
 
185
 
 
186
    runcmd("bzr add sub1")
 
187
    runcmd("bzr rename sub1 sub2")
 
188
    runcmd("bzr move hello.txt sub2")
 
189
 
 
190
    assert exists("sub2")
 
191
    assert exists("sub2/hello.txt")
 
192
    assert not exists("sub1")
 
193
    assert not exists("hello.txt")
 
194
 
 
195
    runcmd(['bzr', 'commit', '-m', 'commit with some things moved to subdirs'])
 
196
 
 
197
    mkdir("sub1")
 
198
    runcmd('bzr add sub1')
 
199
    runcmd('bzr move sub2/hello.txt sub1')
 
200
    assert not exists('sub2/hello.txt')
 
201
    assert exists('sub1/hello.txt')
 
202
    runcmd('bzr move sub2 sub1')
 
203
    assert not exists('sub2')
 
204
    assert exists('sub1/sub2')
 
205
 
 
206
    runcmd(['bzr', 'commit', '-m', 'rename nested subdirectories'])
 
207
 
 
208
    cd('sub1/sub2')
 
209
    runcmd('bzr move ../hello.txt .')
 
210
    assert exists('../hello.txt')
 
211
    runcmd(['bzr', 'commit', '-m', 'move to parent directory'])
 
212
    cd('..')
 
213
    
 
214
    cd('..')
 
215
 
 
216
    progress("all tests passed!")
 
217
except Exception, e:
 
218
    sys.stderr.write('*' * 50 + '\n'
 
219
                     + 'testbzr: tests failed\n'
 
220
                     + 'see ' + LOGFILENAME + ' for more information\n'
 
221
                     + '*' * 50 + '\n')
 
222
    logfile.write('tests failed!\n')
 
223
    traceback.print_exc(None, logfile)
 
224
    sys.exit(1)