/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 bzrlib/selftest/blackbox.py

  • Committer: Robert Collins
  • Date: 2005-09-06 11:09:03 UTC
  • mfrom: (1178)
  • mto: (1185.1.10) (1092.3.1)
  • mto: This revision was merged to the branch mainline in revision 1390.
  • Revision ID: robertc@robertcollins.net-20050906110903-b6be7bd6102403cb
really merge mpool

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2005 by Canonical Ltd
 
2
# -*- coding: utf-8 -*-
 
3
 
 
4
# This program is free software; you can redistribute it and/or modify
 
5
# it under the terms of the GNU General Public License as published by
 
6
# the Free Software Foundation; either version 2 of the License, or
 
7
# (at your option) any later version.
 
8
 
 
9
# This program is distributed in the hope that it will be useful,
 
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
12
# GNU General Public License for more details.
 
13
 
 
14
# You should have received a copy of the GNU General Public License
 
15
# along with this program; if not, write to the Free Software
 
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
17
 
 
18
 
 
19
"""Black-box tests for bzr.
 
20
 
 
21
These check that it behaves properly when it's invoked through the regular
 
22
command-line interface.
 
23
 
 
24
This always reinvokes bzr through a new Python interpreter, which is a
 
25
bit inefficient but arguably tests in a way more representative of how
 
26
it's normally invoked.
 
27
"""
 
28
 
 
29
import sys
 
30
 
 
31
from bzrlib.selftest import TestCaseInTempDir, BzrTestBase
 
32
from bzrlib.branch import Branch
 
33
from bzrlib.commands import run_bzr
 
34
 
 
35
 
 
36
class ExternalBase(TestCaseInTempDir):
 
37
    def runbzr(self, args, retcode=0,backtick=False):
 
38
        if isinstance(args, basestring):
 
39
            args = args.split()
 
40
 
 
41
        if backtick:
 
42
            return self.backtick(['python', self.BZRPATH,] + args,
 
43
                           retcode=retcode)
 
44
        else:
 
45
            return self.runcmd(['python', self.BZRPATH,] + args,
 
46
                           retcode=retcode)
 
47
 
 
48
 
 
49
class TestCommands(ExternalBase):
 
50
 
 
51
    def test_help_commands(self):
 
52
        self.runbzr('--help')
 
53
        self.runbzr('help')
 
54
        self.runbzr('help commands')
 
55
        self.runbzr('help help')
 
56
        self.runbzr('commit -h')
 
57
 
 
58
    def test_init_branch(self):
 
59
        self.runbzr(['init'])
 
60
 
 
61
    def test_whoami(self):
 
62
        # this should always identify something, if only "john@localhost"
 
63
        self.runbzr("whoami")
 
64
        self.runbzr("whoami --email")
 
65
 
 
66
        self.assertEquals(self.runbzr("whoami --email",
 
67
                                      backtick=True).count('@'), 1)
 
68
        
 
69
    def test_whoami_branch(self):
 
70
        """branch specific user identity works."""
 
71
        self.runbzr('init')
 
72
        f = file('.bzr/email', 'wt')
 
73
        f.write('Branch Identity <branch@identi.ty>')
 
74
        f.close()
 
75
        whoami = self.runbzr("whoami",backtick=True)
 
76
        whoami_email = self.runbzr("whoami --email",backtick=True)
 
77
        self.assertTrue(whoami.startswith('Branch Identity <branch@identi.ty>'))
 
78
        self.assertTrue(whoami_email.startswith('branch@identi.ty'))
 
79
 
 
80
    def test_invalid_commands(self):
 
81
        self.runbzr("pants", retcode=1)
 
82
        self.runbzr("--pants off", retcode=1)
 
83
        self.runbzr("diff --message foo", retcode=1)
 
84
 
 
85
    def test_empty_commit(self):
 
86
        self.runbzr("init")
 
87
        self.build_tree(['hello.txt'])
 
88
        self.runbzr("commit -m empty", retcode=1)
 
89
        self.runbzr("add hello.txt")
 
90
        self.runbzr("commit -m added")
 
91
 
 
92
    def test_ignore_patterns(self):
 
93
        from bzrlib.branch import Branch
 
94
        
 
95
        b = Branch('.', init=True)
 
96
        self.assertEquals(list(b.unknowns()), [])
 
97
 
 
98
        file('foo.tmp', 'wt').write('tmp files are ignored')
 
99
        self.assertEquals(list(b.unknowns()), [])
 
100
        assert self.backtick('bzr unknowns') == ''
 
101
 
 
102
        file('foo.c', 'wt').write('int main() {}')
 
103
        self.assertEquals(list(b.unknowns()), ['foo.c'])
 
104
        assert self.backtick('bzr unknowns') == 'foo.c\n'
 
105
 
 
106
        self.runbzr(['add', 'foo.c'])
 
107
        assert self.backtick('bzr unknowns') == ''
 
108
 
 
109
        # 'ignore' works when creating the .bzignore file
 
110
        file('foo.blah', 'wt').write('blah')
 
111
        self.assertEquals(list(b.unknowns()), ['foo.blah'])
 
112
        self.runbzr('ignore *.blah')
 
113
        self.assertEquals(list(b.unknowns()), [])
 
114
        assert file('.bzrignore', 'rb').read() == '*.blah\n'
 
115
 
 
116
        # 'ignore' works when then .bzrignore file already exists
 
117
        file('garh', 'wt').write('garh')
 
118
        self.assertEquals(list(b.unknowns()), ['garh'])
 
119
        assert self.backtick('bzr unknowns') == 'garh\n'
 
120
        self.runbzr('ignore garh')
 
121
        self.assertEquals(list(b.unknowns()), [])
 
122
        assert file('.bzrignore', 'rb').read() == '*.blah\ngarh\n'
 
123
 
 
124
    def test_revert(self):
 
125
        import os
 
126
        self.runbzr('init')
 
127
 
 
128
        file('hello', 'wt').write('foo')
 
129
        self.runbzr('add hello')
 
130
        self.runbzr('commit -m setup hello')
 
131
 
 
132
        file('goodbye', 'wt').write('baz')
 
133
        self.runbzr('add goodbye')
 
134
        self.runbzr('commit -m setup goodbye')
 
135
        
 
136
        file('hello', 'wt').write('bar')
 
137
        file('goodbye', 'wt').write('qux')
 
138
        self.runbzr('revert hello')
 
139
        self.check_file_contents('hello', 'foo')
 
140
        self.check_file_contents('goodbye', 'qux')
 
141
        self.runbzr('revert')
 
142
        self.check_file_contents('goodbye', 'baz')
 
143
 
 
144
        os.mkdir('revertdir')
 
145
        self.runbzr('add revertdir')
 
146
        self.runbzr('commit -m f')
 
147
        os.rmdir('revertdir')
 
148
        self.runbzr('revert')
 
149
 
 
150
    def skipped_test_mv_modes(self):
 
151
        """Test two modes of operation for mv"""
 
152
        from bzrlib.branch import Branch
 
153
        b = Branch('.', init=True)
 
154
        self.build_tree(['a', 'c', 'subdir/'])
 
155
        self.run_bzr('mv', 'a', 'b')
 
156
        self.run_bzr('mv', 'b', 'subdir')
 
157
        self.run_bzr('mv', 'subdir/b', 'a')
 
158
        self.run_bzr('mv', 'a', 'b', 'subdir')
 
159
        self.run_bzr('mv', 'subdir/a', 'subdir/newa')
 
160
 
 
161
    def test_main_version(self):
 
162
        """Check output from version command and master option is reasonable"""
 
163
        # output is intentionally passed through to stdout so that we
 
164
        # can see the version being tested
 
165
        output = self.runbzr('version', backtick=1)
 
166
        self.log('bzr version output:')
 
167
        self.log(output)
 
168
        self.assert_(output.startswith('bzr (bazaar-ng) '))
 
169
        self.assertNotEqual(output.index('Canonical'), -1)
 
170
        # make sure --version is consistent
 
171
        tmp_output = self.runbzr('--version', backtick=1)
 
172
        self.log('bzr --version output:')
 
173
        self.log(tmp_output)
 
174
        self.assertEquals(output, tmp_output)
 
175
 
 
176
    def example_branch(test):
 
177
        test.runbzr('init')
 
178
        file('hello', 'wt').write('foo')
 
179
        test.runbzr('add hello')
 
180
        test.runbzr('commit -m setup hello')
 
181
        file('goodbye', 'wt').write('baz')
 
182
        test.runbzr('add goodbye')
 
183
        test.runbzr('commit -m setup goodbye')
 
184
 
 
185
    def test_revert(self):
 
186
        self.example_branch()
 
187
        file('hello', 'wt').write('bar')
 
188
        file('goodbye', 'wt').write('qux')
 
189
        self.runbzr('revert hello')
 
190
        self.check_file_contents('hello', 'foo')
 
191
        self.check_file_contents('goodbye', 'qux')
 
192
        self.runbzr('revert')
 
193
        self.check_file_contents('goodbye', 'baz')
 
194
 
 
195
    def test_merge(self):
 
196
        from bzrlib.branch import Branch
 
197
        import os
 
198
        
 
199
        os.mkdir('a')
 
200
        os.chdir('a')
 
201
        self.example_branch()
 
202
        os.chdir('..')
 
203
        self.runbzr('branch a b')
 
204
        os.chdir('b')
 
205
        file('goodbye', 'wt').write('quux')
 
206
        self.runbzr(['commit',  '-m',  "more u's are always good"])
 
207
 
 
208
        os.chdir('../a')
 
209
        file('hello', 'wt').write('quuux')
 
210
        # We can't merge when there are in-tree changes
 
211
        self.runbzr('merge ../b', retcode=1)
 
212
        self.runbzr(['commit', '-m', "Like an epidemic of u's"])
 
213
        self.runbzr('merge ../b')
 
214
        self.check_file_contents('goodbye', 'quux')
 
215
        # Merging a branch pulls its revision into the tree
 
216
        a = Branch('.')
 
217
        b = Branch('../b')
 
218
        a.get_revision_xml(b.last_patch())
 
219
        print "Pending: %s" % a.pending_merges()
 
220
#        assert a.pending_merges() == [b.last_patch()], "Assertion %s %s" \
 
221
#        % (a.pending_merges(), b.last_patch())
 
222
 
 
223
class OldTests(ExternalBase):
 
224
    """old tests moved from ./testbzr."""
 
225
 
 
226
    def test_bzr(self):
 
227
        from os import chdir, mkdir
 
228
        from os.path import exists
 
229
        import os
 
230
 
 
231
        runbzr = self.runbzr
 
232
        backtick = self.backtick
 
233
        progress = self.log
 
234
 
 
235
        progress("basic branch creation")
 
236
        mkdir('branch1')
 
237
        chdir('branch1')
 
238
        runbzr('init')
 
239
 
 
240
        self.assertEquals(backtick('bzr root').rstrip(),
 
241
                          os.path.join(self.test_dir, 'branch1'))
 
242
 
 
243
        progress("status of new file")
 
244
 
 
245
        f = file('test.txt', 'wt')
 
246
        f.write('hello world!\n')
 
247
        f.close()
 
248
 
 
249
        out = backtick("bzr unknowns")
 
250
        self.assertEquals(out, 'test.txt\n')
 
251
 
 
252
        out = backtick("bzr status")
 
253
        assert out == 'unknown:\n  test.txt\n'
 
254
 
 
255
        out = backtick("bzr status --all")
 
256
        assert out == "unknown:\n  test.txt\n"
 
257
 
 
258
        out = backtick("bzr status test.txt --all")
 
259
        assert out == "unknown:\n  test.txt\n"
 
260
 
 
261
        f = file('test2.txt', 'wt')
 
262
        f.write('goodbye cruel world...\n')
 
263
        f.close()
 
264
 
 
265
        out = backtick("bzr status test.txt")
 
266
        assert out == "unknown:\n  test.txt\n"
 
267
 
 
268
        out = backtick("bzr status")
 
269
        assert out == ("unknown:\n"
 
270
                       "  test.txt\n"
 
271
                       "  test2.txt\n")
 
272
 
 
273
        os.unlink('test2.txt')
 
274
 
 
275
        progress("command aliases")
 
276
        out = backtick("bzr st --all")
 
277
        assert out == ("unknown:\n"
 
278
                       "  test.txt\n")
 
279
 
 
280
        out = backtick("bzr stat")
 
281
        assert out == ("unknown:\n"
 
282
                       "  test.txt\n")
 
283
 
 
284
        progress("command help")
 
285
        runbzr("help st")
 
286
        runbzr("help")
 
287
        runbzr("help commands")
 
288
        runbzr("help slartibartfast", 1)
 
289
 
 
290
        out = backtick("bzr help ci")
 
291
        out.index('aliases: ')
 
292
 
 
293
        progress("can't rename unversioned file")
 
294
        runbzr("rename test.txt new-test.txt", 1)
 
295
 
 
296
        progress("adding a file")
 
297
 
 
298
        runbzr("add test.txt")
 
299
        assert backtick("bzr unknowns") == ''
 
300
        assert backtick("bzr status --all") == ("added:\n"
 
301
                                                "  test.txt\n")
 
302
 
 
303
        progress("rename newly-added file")
 
304
        runbzr("rename test.txt hello.txt")
 
305
        assert os.path.exists("hello.txt")
 
306
        assert not os.path.exists("test.txt")
 
307
 
 
308
        assert backtick("bzr revno") == '0\n'
 
309
 
 
310
        progress("add first revision")
 
311
        runbzr(['commit', '-m', 'add first revision'])
 
312
 
 
313
        progress("more complex renames")
 
314
        os.mkdir("sub1")
 
315
        runbzr("rename hello.txt sub1", 1)
 
316
        runbzr("rename hello.txt sub1/hello.txt", 1)
 
317
        runbzr("move hello.txt sub1", 1)
 
318
 
 
319
        runbzr("add sub1")
 
320
        runbzr("rename sub1 sub2")
 
321
        runbzr("move hello.txt sub2")
 
322
        assert backtick("bzr relpath sub2/hello.txt") == os.path.join("sub2", "hello.txt\n")
 
323
 
 
324
        assert exists("sub2")
 
325
        assert exists("sub2/hello.txt")
 
326
        assert not exists("sub1")
 
327
        assert not exists("hello.txt")
 
328
 
 
329
        runbzr(['commit', '-m', 'commit with some things moved to subdirs'])
 
330
 
 
331
        mkdir("sub1")
 
332
        runbzr('add sub1')
 
333
        runbzr('move sub2/hello.txt sub1')
 
334
        assert not exists('sub2/hello.txt')
 
335
        assert exists('sub1/hello.txt')
 
336
        runbzr('move sub2 sub1')
 
337
        assert not exists('sub2')
 
338
        assert exists('sub1/sub2')
 
339
 
 
340
        runbzr(['commit', '-m', 'rename nested subdirectories'])
 
341
 
 
342
        chdir('sub1/sub2')
 
343
        self.assertEquals(backtick('bzr root')[:-1],
 
344
                          os.path.join(self.test_dir, 'branch1'))
 
345
        runbzr('move ../hello.txt .')
 
346
        assert exists('./hello.txt')
 
347
        assert backtick('bzr relpath hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
 
348
        assert backtick('bzr relpath ../../sub1/sub2/hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
 
349
        runbzr(['commit', '-m', 'move to parent directory'])
 
350
        chdir('..')
 
351
        assert backtick('bzr relpath sub2/hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
 
352
 
 
353
        runbzr('move sub2/hello.txt .')
 
354
        assert exists('hello.txt')
 
355
 
 
356
        f = file('hello.txt', 'wt')
 
357
        f.write('some nice new content\n')
 
358
        f.close()
 
359
 
 
360
        f = file('msg.tmp', 'wt')
 
361
        f.write('this is my new commit\n')
 
362
        f.close()
 
363
 
 
364
        runbzr('commit -F msg.tmp')
 
365
 
 
366
        assert backtick('bzr revno') == '5\n'
 
367
        runbzr('export -r 5 export-5.tmp')
 
368
        runbzr('export export.tmp')
 
369
 
 
370
        runbzr('log')
 
371
        runbzr('log -v')
 
372
        runbzr('log -v --forward')
 
373
        runbzr('log -m', retcode=1)
 
374
        log_out = backtick('bzr log -m commit')
 
375
        assert "this is my new commit" in log_out
 
376
        assert "rename nested" not in log_out
 
377
        assert 'revision-id' not in log_out
 
378
        assert 'revision-id' in backtick('bzr log --show-ids -m commit')
 
379
 
 
380
 
 
381
        progress("file with spaces in name")
 
382
        mkdir('sub directory')
 
383
        file('sub directory/file with spaces ', 'wt').write('see how this works\n')
 
384
        runbzr('add .')
 
385
        runbzr('diff')
 
386
        runbzr('commit -m add-spaces')
 
387
        runbzr('check')
 
388
 
 
389
        runbzr('log')
 
390
        runbzr('log --forward')
 
391
 
 
392
        runbzr('info')
 
393