/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-28 09:35:50 UTC
  • mfrom: (1185.1.47)
  • Revision ID: robertc@robertcollins.net-20050928093550-3ca194dfaffc79f1
merge from integration

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