/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: Aaron Bentley
  • Date: 2005-09-21 23:13:57 UTC
  • mto: (1185.1.37)
  • mto: This revision was merged to the branch mainline in revision 1390.
  • Revision ID: aaron.bentley@utoronto.ca-20050921231357-2b7d37869d81c975
Fixed branch -r

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
from cStringIO import StringIO
 
30
import sys
 
31
import os
 
32
 
 
33
from bzrlib.selftest import TestCaseInTempDir, BzrTestBase
 
34
from bzrlib.branch import Branch
 
35
 
 
36
 
 
37
class ExternalBase(TestCaseInTempDir):
 
38
 
 
39
    def runbzr(self, args, retcode=0, backtick=False):
 
40
        if isinstance(args, basestring):
 
41
            args = args.split()
 
42
 
 
43
        if backtick:
 
44
            return self.run_bzr_captured(args, retcode=retcode)[0]
 
45
        else:
 
46
            return self.run_bzr_captured(args, 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
        bzr_email = os.environ.get('BZREMAIL')
 
76
        if bzr_email is not None:
 
77
            del os.environ['BZREMAIL']
 
78
        whoami = self.runbzr("whoami",backtick=True)
 
79
        whoami_email = self.runbzr("whoami --email",backtick=True)
 
80
        self.assertTrue(whoami.startswith('Branch Identity <branch@identi.ty>'))
 
81
        self.assertTrue(whoami_email.startswith('branch@identi.ty'))
 
82
        # Verify that the environment variable overrides the value 
 
83
        # in the file
 
84
        os.environ['BZREMAIL'] = 'Different ID <other@environ.ment>'
 
85
        whoami = self.runbzr("whoami",backtick=True)
 
86
        whoami_email = self.runbzr("whoami --email",backtick=True)
 
87
        self.assertTrue(whoami.startswith('Different ID <other@environ.ment>'))
 
88
        self.assertTrue(whoami_email.startswith('other@environ.ment'))
 
89
        if bzr_email is not None:
 
90
            os.environ['BZREMAIL'] = bzr_email
 
91
 
 
92
    def test_invalid_commands(self):
 
93
        self.runbzr("pants", retcode=1)
 
94
        self.runbzr("--pants off", retcode=1)
 
95
        self.runbzr("diff --message foo", retcode=1)
 
96
 
 
97
    def test_empty_commit(self):
 
98
        self.runbzr("init")
 
99
        self.build_tree(['hello.txt'])
 
100
        self.runbzr("commit -m empty", retcode=1)
 
101
        self.runbzr("add hello.txt")
 
102
        self.runbzr("commit -m added")
 
103
 
 
104
    def test_ignore_patterns(self):
 
105
        from bzrlib.branch import Branch
 
106
        
 
107
        b = Branch.initialize('.')
 
108
        self.assertEquals(list(b.unknowns()), [])
 
109
 
 
110
        file('foo.tmp', 'wt').write('tmp files are ignored')
 
111
        self.assertEquals(list(b.unknowns()), [])
 
112
        assert self.capture('unknowns') == ''
 
113
 
 
114
        file('foo.c', 'wt').write('int main() {}')
 
115
        self.assertEquals(list(b.unknowns()), ['foo.c'])
 
116
        assert self.capture('unknowns') == 'foo.c\n'
 
117
 
 
118
        self.runbzr(['add', 'foo.c'])
 
119
        assert self.capture('unknowns') == ''
 
120
 
 
121
        # 'ignore' works when creating the .bzignore file
 
122
        file('foo.blah', 'wt').write('blah')
 
123
        self.assertEquals(list(b.unknowns()), ['foo.blah'])
 
124
        self.runbzr('ignore *.blah')
 
125
        self.assertEquals(list(b.unknowns()), [])
 
126
        assert file('.bzrignore', 'rb').read() == '*.blah\n'
 
127
 
 
128
        # 'ignore' works when then .bzrignore file already exists
 
129
        file('garh', 'wt').write('garh')
 
130
        self.assertEquals(list(b.unknowns()), ['garh'])
 
131
        assert self.capture('unknowns') == 'garh\n'
 
132
        self.runbzr('ignore garh')
 
133
        self.assertEquals(list(b.unknowns()), [])
 
134
        assert file('.bzrignore', 'rb').read() == '*.blah\ngarh\n'
 
135
 
 
136
    def test_revert(self):
 
137
        self.runbzr('init')
 
138
 
 
139
        file('hello', 'wt').write('foo')
 
140
        self.runbzr('add hello')
 
141
        self.runbzr('commit -m setup hello')
 
142
 
 
143
        file('goodbye', 'wt').write('baz')
 
144
        self.runbzr('add goodbye')
 
145
        self.runbzr('commit -m setup goodbye')
 
146
        
 
147
        file('hello', 'wt').write('bar')
 
148
        file('goodbye', 'wt').write('qux')
 
149
        self.runbzr('revert hello')
 
150
        self.check_file_contents('hello', 'foo')
 
151
        self.check_file_contents('goodbye', 'qux')
 
152
        self.runbzr('revert')
 
153
        self.check_file_contents('goodbye', 'baz')
 
154
 
 
155
        os.mkdir('revertdir')
 
156
        self.runbzr('add revertdir')
 
157
        self.runbzr('commit -m f')
 
158
        os.rmdir('revertdir')
 
159
        self.runbzr('revert')
 
160
 
 
161
        file('hello', 'wt').write('xyz')
 
162
        self.runbzr('commit -m xyz hello')
 
163
        self.runbzr('revert -r 1 hello')
 
164
        self.check_file_contents('hello', 'foo')
 
165
        self.runbzr('revert hello')
 
166
        self.check_file_contents('hello', 'xyz')
 
167
 
 
168
    def test_mv_modes(self):
 
169
        """Test two modes of operation for mv"""
 
170
        from bzrlib.branch import Branch
 
171
        b = Branch.initialize('.')
 
172
        self.build_tree(['a', 'c', 'subdir/'])
 
173
        self.run_bzr_captured(['add', self.test_dir])
 
174
        self.run_bzr_captured(['mv', 'a', 'b'])
 
175
        self.run_bzr_captured(['mv', 'b', 'subdir'])
 
176
        self.run_bzr_captured(['mv', 'subdir/b', 'a'])
 
177
        self.run_bzr_captured(['mv', 'a', 'c', 'subdir'])
 
178
        self.run_bzr_captured(['mv', 'subdir/a', 'subdir/newa'])
 
179
 
 
180
 
 
181
    def test_main_version(self):
 
182
        """Check output from version command and master option is reasonable"""
 
183
        # output is intentionally passed through to stdout so that we
 
184
        # can see the version being tested
 
185
        output = self.runbzr('version', backtick=1)
 
186
        self.log('bzr version output:')
 
187
        self.log(output)
 
188
        self.assert_(output.startswith('bzr (bazaar-ng) '))
 
189
        self.assertNotEqual(output.index('Canonical'), -1)
 
190
        # make sure --version is consistent
 
191
        tmp_output = self.runbzr('--version', backtick=1)
 
192
        self.log('bzr --version output:')
 
193
        self.log(tmp_output)
 
194
        self.assertEquals(output, tmp_output)
 
195
 
 
196
    def example_branch(test):
 
197
        test.runbzr('init')
 
198
        file('hello', 'wt').write('foo')
 
199
        test.runbzr('add hello')
 
200
        test.runbzr('commit -m setup hello')
 
201
        file('goodbye', 'wt').write('baz')
 
202
        test.runbzr('add goodbye')
 
203
        test.runbzr('commit -m setup goodbye')
 
204
 
 
205
    def test_diff(self):
 
206
        self.example_branch()
 
207
        file('hello', 'wt').write('hello world!')
 
208
        self.runbzr('commit -m fixing hello')
 
209
        output = self.runbzr('diff -r 2..3', backtick=1)
 
210
        self.assert_('\n+hello world!' in output)
 
211
        output = self.runbzr('diff -r last:3..last:1', backtick=1)
 
212
        self.assert_('\n+baz' in output)
 
213
 
 
214
    def test_diff(self):
 
215
        self.example_branch()
 
216
        file('hello', 'wt').write('hello world!')
 
217
        self.runbzr('commit -m fixing hello')
 
218
        output = self.runbzr('diff -r 2..3', backtick=1)
 
219
        self.assert_('\n+hello world!' in output)
 
220
        output = self.runbzr('diff -r last:3..last:1', backtick=1)
 
221
        self.assert_('\n+baz' in output)
 
222
 
 
223
    def test_branch(self):
 
224
        """Branch from one branch to another."""
 
225
        os.mkdir('a')
 
226
        os.chdir('a')
 
227
        self.example_branch()
 
228
        os.chdir('..')
 
229
        self.runbzr('branch a b')
 
230
        self.runbzr('branch a c -r 1')
 
231
 
 
232
    def test_merge(self):
 
233
        from bzrlib.branch import Branch
 
234
        
 
235
        os.mkdir('a')
 
236
        os.chdir('a')
 
237
        self.example_branch()
 
238
        os.chdir('..')
 
239
        self.runbzr('branch a b')
 
240
        os.chdir('b')
 
241
        file('goodbye', 'wt').write('quux')
 
242
        self.runbzr(['commit',  '-m',  "more u's are always good"])
 
243
 
 
244
        os.chdir('../a')
 
245
        file('hello', 'wt').write('quuux')
 
246
        # We can't merge when there are in-tree changes
 
247
        self.runbzr('merge ../b', retcode=1)
 
248
        self.runbzr(['commit', '-m', "Like an epidemic of u's"])
 
249
        self.runbzr('merge ../b')
 
250
        self.check_file_contents('goodbye', 'quux')
 
251
        # Merging a branch pulls its revision into the tree
 
252
        a = Branch.open('.')
 
253
        b = Branch.open('../b')
 
254
        a.get_revision_xml(b.last_patch())
 
255
        self.log('pending merges: %s', a.pending_merges())
 
256
        #        assert a.pending_merges() == [b.last_patch()], "Assertion %s %s" \
 
257
        #        % (a.pending_merges(), b.last_patch())
 
258
 
 
259
    def test_pull(self):
 
260
        """Pull changes from one branch to another."""
 
261
        os.mkdir('a')
 
262
        os.chdir('a')
 
263
 
 
264
        self.example_branch()
 
265
        self.runbzr('pull', retcode=1)
 
266
        self.runbzr('missing', retcode=1)
 
267
        self.runbzr('missing .')
 
268
        self.runbzr('missing')
 
269
        self.runbzr('pull')
 
270
        self.runbzr('pull /', retcode=1)
 
271
        self.runbzr('pull')
 
272
 
 
273
        os.chdir('..')
 
274
        self.runbzr('branch a b')
 
275
        os.chdir('b')
 
276
        self.runbzr('pull')
 
277
        self.runbzr('commit -m blah --unchanged')
 
278
        os.chdir('../a')
 
279
        a = Branch.open('.')
 
280
        b = Branch.open('../b')
 
281
        assert a.revision_history() == b.revision_history()[:-1]
 
282
        self.runbzr('pull ../b')
 
283
        assert a.revision_history() == b.revision_history()
 
284
        self.runbzr('commit -m blah2 --unchanged')
 
285
        os.chdir('../b')
 
286
        self.runbzr('commit -m blah3 --unchanged')
 
287
        self.runbzr('pull ../a', retcode=1)
 
288
        os.chdir('../a')
 
289
        self.runbzr('merge ../b')
 
290
        self.runbzr('commit -m blah4 --unchanged')
 
291
        os.chdir('../b')
 
292
        self.runbzr('pull ../a')
 
293
        assert a.revision_history()[-1] == b.revision_history()[-1]
 
294
        
 
295
    def test_add_reports(self):
 
296
        """add command prints the names of added files."""
 
297
        b = Branch.initialize('.')
 
298
        self.build_tree(['top.txt', 'dir/', 'dir/sub.txt'])
 
299
        out = self.run_bzr_captured(['add'], retcode = 0)[0]
 
300
        # the ordering is not defined at the moment
 
301
        results = sorted(out.rstrip('\n').split('\n'))
 
302
        self.assertEquals(['added dir',
 
303
                           'added dir/sub.txt',
 
304
                           'added top.txt',],
 
305
                          results)
 
306
 
 
307
    def test_unknown_command(self):
 
308
        """Handling of unknown command."""
 
309
        out, err = self.run_bzr_captured(['fluffy-badger'],
 
310
                                         retcode=1)
 
311
        self.assertEquals(out, '')
 
312
        err.index('unknown command')
 
313
        
 
314
 
 
315
 
 
316
class OldTests(ExternalBase):
 
317
    """old tests moved from ./testbzr."""
 
318
 
 
319
    def test_bzr(self):
 
320
        from os import chdir, mkdir
 
321
        from os.path import exists
 
322
 
 
323
        runbzr = self.runbzr
 
324
        capture = self.capture
 
325
        progress = self.log
 
326
 
 
327
        progress("basic branch creation")
 
328
        mkdir('branch1')
 
329
        chdir('branch1')
 
330
        runbzr('init')
 
331
 
 
332
        self.assertEquals(capture('root').rstrip(),
 
333
                          os.path.join(self.test_dir, 'branch1'))
 
334
 
 
335
        progress("status of new file")
 
336
 
 
337
        f = file('test.txt', 'wt')
 
338
        f.write('hello world!\n')
 
339
        f.close()
 
340
 
 
341
        self.assertEquals(capture('unknowns'), 'test.txt\n')
 
342
 
 
343
        out = capture("status")
 
344
        assert out == 'unknown:\n  test.txt\n'
 
345
 
 
346
        out = capture("status --all")
 
347
        assert out == "unknown:\n  test.txt\n"
 
348
 
 
349
        out = capture("status test.txt --all")
 
350
        assert out == "unknown:\n  test.txt\n"
 
351
 
 
352
        f = file('test2.txt', 'wt')
 
353
        f.write('goodbye cruel world...\n')
 
354
        f.close()
 
355
 
 
356
        out = capture("status test.txt")
 
357
        assert out == "unknown:\n  test.txt\n"
 
358
 
 
359
        out = capture("status")
 
360
        assert out == ("unknown:\n"
 
361
                       "  test.txt\n"
 
362
                       "  test2.txt\n")
 
363
 
 
364
        os.unlink('test2.txt')
 
365
 
 
366
        progress("command aliases")
 
367
        out = capture("st --all")
 
368
        assert out == ("unknown:\n"
 
369
                       "  test.txt\n")
 
370
 
 
371
        out = capture("stat")
 
372
        assert out == ("unknown:\n"
 
373
                       "  test.txt\n")
 
374
 
 
375
        progress("command help")
 
376
        runbzr("help st")
 
377
        runbzr("help")
 
378
        runbzr("help commands")
 
379
        runbzr("help slartibartfast", 1)
 
380
 
 
381
        out = capture("help ci")
 
382
        out.index('aliases: ')
 
383
 
 
384
        progress("can't rename unversioned file")
 
385
        runbzr("rename test.txt new-test.txt", 1)
 
386
 
 
387
        progress("adding a file")
 
388
 
 
389
        runbzr("add test.txt")
 
390
        assert capture("unknowns") == ''
 
391
        assert capture("status --all") == ("added:\n"
 
392
                                                "  test.txt\n")
 
393
 
 
394
        progress("rename newly-added file")
 
395
        runbzr("rename test.txt hello.txt")
 
396
        assert os.path.exists("hello.txt")
 
397
        assert not os.path.exists("test.txt")
 
398
 
 
399
        assert capture("revno") == '0\n'
 
400
 
 
401
        progress("add first revision")
 
402
        runbzr(['commit', '-m', 'add first revision'])
 
403
 
 
404
        progress("more complex renames")
 
405
        os.mkdir("sub1")
 
406
        runbzr("rename hello.txt sub1", 1)
 
407
        runbzr("rename hello.txt sub1/hello.txt", 1)
 
408
        runbzr("move hello.txt sub1", 1)
 
409
 
 
410
        runbzr("add sub1")
 
411
        runbzr("rename sub1 sub2")
 
412
        runbzr("move hello.txt sub2")
 
413
        assert capture("relpath sub2/hello.txt") == os.path.join("sub2", "hello.txt\n")
 
414
 
 
415
        assert exists("sub2")
 
416
        assert exists("sub2/hello.txt")
 
417
        assert not exists("sub1")
 
418
        assert not exists("hello.txt")
 
419
 
 
420
        runbzr(['commit', '-m', 'commit with some things moved to subdirs'])
 
421
 
 
422
        mkdir("sub1")
 
423
        runbzr('add sub1')
 
424
        runbzr('move sub2/hello.txt sub1')
 
425
        assert not exists('sub2/hello.txt')
 
426
        assert exists('sub1/hello.txt')
 
427
        runbzr('move sub2 sub1')
 
428
        assert not exists('sub2')
 
429
        assert exists('sub1/sub2')
 
430
 
 
431
        runbzr(['commit', '-m', 'rename nested subdirectories'])
 
432
 
 
433
        chdir('sub1/sub2')
 
434
        self.assertEquals(capture('root')[:-1],
 
435
                          os.path.join(self.test_dir, 'branch1'))
 
436
        runbzr('move ../hello.txt .')
 
437
        assert exists('./hello.txt')
 
438
        self.assertEquals(capture('relpath hello.txt'),
 
439
                          os.path.join('sub1', 'sub2', 'hello.txt') + '\n')
 
440
        assert capture('relpath ../../sub1/sub2/hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
 
441
        runbzr(['commit', '-m', 'move to parent directory'])
 
442
        chdir('..')
 
443
        assert capture('relpath sub2/hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
 
444
 
 
445
        runbzr('move sub2/hello.txt .')
 
446
        assert exists('hello.txt')
 
447
 
 
448
        f = file('hello.txt', 'wt')
 
449
        f.write('some nice new content\n')
 
450
        f.close()
 
451
 
 
452
        f = file('msg.tmp', 'wt')
 
453
        f.write('this is my new commit\n')
 
454
        f.close()
 
455
 
 
456
        runbzr('commit -F msg.tmp')
 
457
 
 
458
        assert capture('revno') == '5\n'
 
459
        runbzr('export -r 5 export-5.tmp')
 
460
        runbzr('export export.tmp')
 
461
 
 
462
        runbzr('log')
 
463
        runbzr('log -v')
 
464
        runbzr('log -v --forward')
 
465
        runbzr('log -m', retcode=1)
 
466
        log_out = capture('log -m commit')
 
467
        assert "this is my new commit" in log_out
 
468
        assert "rename nested" not in log_out
 
469
        assert 'revision-id' not in log_out
 
470
        assert 'revision-id' in capture('log --show-ids -m commit')
 
471
 
 
472
 
 
473
        progress("file with spaces in name")
 
474
        mkdir('sub directory')
 
475
        file('sub directory/file with spaces ', 'wt').write('see how this works\n')
 
476
        runbzr('add .')
 
477
        runbzr('diff')
 
478
        runbzr('commit -m add-spaces')
 
479
        runbzr('check')
 
480
 
 
481
        runbzr('log')
 
482
        runbzr('log --forward')
 
483
 
 
484
        runbzr('info')
 
485