~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/selftest/blackbox.py

  • Committer: Aaron Bentley
  • Date: 2005-09-19 02:52:24 UTC
  • mto: (1185.1.29)
  • mto: This revision was merged to the branch mainline in revision 1390.
  • Revision ID: aaron.bentley@utoronto.ca-20050919025224-1cc3c70640086e09
TODO re tests

Show diffs side-by-side

added added

removed removed

Lines of Context:
26
26
it's normally invoked.
27
27
"""
28
28
 
29
 
from cStringIO import StringIO
30
 
import os
31
 
import shutil
32
29
import sys
33
30
import os
34
31
 
35
32
from bzrlib.selftest import TestCaseInTempDir, BzrTestBase
36
33
from bzrlib.branch import Branch
37
 
from bzrlib.osutils import has_symlinks
 
34
from bzrlib.commands import run_bzr
38
35
 
39
36
 
40
37
class ExternalBase(TestCaseInTempDir):
41
 
 
42
38
    def runbzr(self, args, retcode=0, backtick=False):
43
39
        if isinstance(args, basestring):
44
40
            args = args.split()
75
71
        f = file('.bzr/email', 'wt')
76
72
        f.write('Branch Identity <branch@identi.ty>')
77
73
        f.close()
78
 
        bzr_email = os.environ.get('BZREMAIL')
79
 
        if bzr_email is not None:
80
 
            del os.environ['BZREMAIL']
81
74
        whoami = self.runbzr("whoami",backtick=True)
82
75
        whoami_email = self.runbzr("whoami --email",backtick=True)
83
76
        self.assertTrue(whoami.startswith('Branch Identity <branch@identi.ty>'))
84
77
        self.assertTrue(whoami_email.startswith('branch@identi.ty'))
85
 
        # Verify that the environment variable overrides the value 
86
 
        # in the file
87
 
        os.environ['BZREMAIL'] = 'Different ID <other@environ.ment>'
88
 
        whoami = self.runbzr("whoami",backtick=True)
89
 
        whoami_email = self.runbzr("whoami --email",backtick=True)
90
 
        self.assertTrue(whoami.startswith('Different ID <other@environ.ment>'))
91
 
        self.assertTrue(whoami_email.startswith('other@environ.ment'))
92
 
        if bzr_email is not None:
93
 
            os.environ['BZREMAIL'] = bzr_email
94
78
 
95
79
    def test_invalid_commands(self):
96
80
        self.runbzr("pants", retcode=1)
126
110
        self.assertEquals(list(b.unknowns()), ['foo.blah'])
127
111
        self.runbzr('ignore *.blah')
128
112
        self.assertEquals(list(b.unknowns()), [])
129
 
        assert file('.bzrignore', 'rU').read() == '*.blah\n'
 
113
        assert file('.bzrignore', 'rb').read() == '*.blah\n'
130
114
 
131
115
        # 'ignore' works when then .bzrignore file already exists
132
116
        file('garh', 'wt').write('garh')
134
118
        assert self.capture('unknowns') == 'garh\n'
135
119
        self.runbzr('ignore garh')
136
120
        self.assertEquals(list(b.unknowns()), [])
137
 
        assert file('.bzrignore', 'rU').read() == '*.blah\ngarh\n'
 
121
        assert file('.bzrignore', 'rb').read() == '*.blah\ngarh\n'
138
122
 
139
123
    def test_revert(self):
140
124
        self.runbzr('init')
146
130
        file('goodbye', 'wt').write('baz')
147
131
        self.runbzr('add goodbye')
148
132
        self.runbzr('commit -m setup goodbye')
149
 
 
 
133
        
150
134
        file('hello', 'wt').write('bar')
151
135
        file('goodbye', 'wt').write('qux')
152
136
        self.runbzr('revert hello')
161
145
        os.rmdir('revertdir')
162
146
        self.runbzr('revert')
163
147
 
164
 
        os.symlink('/unlikely/to/exist', 'symlink')
165
 
        self.runbzr('add symlink')
166
 
        self.runbzr('commit -m f')
167
 
        os.unlink('symlink')
168
 
        self.runbzr('revert')
169
 
        
170
 
        file('hello', 'wt').write('xyz')
171
 
        self.runbzr('commit -m xyz hello')
172
 
        self.runbzr('revert -r 1 hello')
173
 
        self.check_file_contents('hello', 'foo')
174
 
        self.runbzr('revert hello')
175
 
        self.check_file_contents('hello', 'xyz')
176
 
        os.chdir('revertdir')
177
 
        self.runbzr('revert')
178
 
        os.chdir('..')
179
 
 
180
 
 
181
148
    def test_mv_modes(self):
182
149
        """Test two modes of operation for mv"""
183
150
        from bzrlib.branch import Branch
184
151
        b = Branch.initialize('.')
185
152
        self.build_tree(['a', 'c', 'subdir/'])
186
 
        self.run_bzr_captured(['add', self.test_dir])
187
 
        self.run_bzr_captured(['mv', 'a', 'b'])
188
 
        self.run_bzr_captured(['mv', 'b', 'subdir'])
189
 
        self.run_bzr_captured(['mv', 'subdir/b', 'a'])
190
 
        self.run_bzr_captured(['mv', 'a', 'c', 'subdir'])
191
 
        self.run_bzr_captured(['mv', 'subdir/a', 'subdir/newa'])
 
153
        self.run_bzr('add', self.test_dir)
 
154
        self.run_bzr('mv', 'a', 'b')
 
155
        self.run_bzr('mv', 'b', 'subdir')
 
156
        self.run_bzr('mv', 'subdir/b', 'a')
 
157
        self.run_bzr('mv', 'a', 'c', 'subdir')
 
158
        self.run_bzr('mv', 'subdir/a', 'subdir/newa')
192
159
 
193
160
 
194
161
    def test_main_version(self):
215
182
        test.runbzr('add goodbye')
216
183
        test.runbzr('commit -m setup goodbye')
217
184
 
218
 
    def test_export(self):
219
 
        os.mkdir('branch')
220
 
        os.chdir('branch')
221
 
        self.example_branch()
222
 
        self.runbzr('export ../latest')
223
 
        self.assertEqual(file('../latest/goodbye', 'rt').read(), 'baz')
224
 
        self.runbzr('export ../first -r 1')
225
 
        assert not os.path.exists('../first/goodbye')
226
 
        self.assertEqual(file('../first/hello', 'rt').read(), 'foo')
227
 
        self.runbzr('export ../first.gz -r 1')
228
 
        self.assertEqual(file('../first.gz/hello', 'rt').read(), 'foo')
229
 
        self.runbzr('export ../first.bz2 -r 1')
230
 
        self.assertEqual(file('../first.bz2/hello', 'rt').read(), 'foo')
231
 
        self.runbzr('export ../first.tar -r 1')
232
 
        assert os.path.isfile('../first.tar')
233
 
        from tarfile import TarFile
234
 
        tf = TarFile('../first.tar')
235
 
        assert 'first/hello' in tf.getnames(), tf.getnames()
236
 
        self.assertEqual(tf.extractfile('first/hello').read(), 'foo')
237
 
        self.runbzr('export ../first.tar.gz -r 1')
238
 
        assert os.path.isfile('../first.tar.gz')
239
 
        self.runbzr('export ../first.tbz2 -r 1')
240
 
        assert os.path.isfile('../first.tbz2')
241
 
        self.runbzr('export ../first.tar.bz2 -r 1')
242
 
        assert os.path.isfile('../first.tar.bz2')
243
 
        self.runbzr('export ../first.tar.tbz2 -r 1')
244
 
        assert os.path.isfile('../first.tar.tbz2')
245
 
        from bz2 import BZ2File
246
 
        tf = TarFile('../first.tar.tbz2', 
247
 
                     fileobj=BZ2File('../first.tar.tbz2', 'r'))
248
 
        assert 'first.tar/hello' in tf.getnames(), tf.getnames()
249
 
        self.assertEqual(tf.extractfile('first.tar/hello').read(), 'foo')
250
 
        self.runbzr('export ../first2.tar -r 1 --root pizza')
251
 
        tf = TarFile('../first2.tar')
252
 
        assert 'pizza/hello' in tf.getnames(), tf.getnames()
253
 
 
254
 
    def test_diff(self):
255
 
        self.example_branch()
256
 
        file('hello', 'wt').write('hello world!')
257
 
        self.runbzr('commit -m fixing hello')
258
 
        output = self.runbzr('diff -r 2..3', backtick=1)
259
 
        self.assert_('\n+hello world!' in output)
260
 
        output = self.runbzr('diff -r last:3..last:1', backtick=1)
261
 
        self.assert_('\n+baz' in output)
262
 
 
263
 
    def test_branch(self):
264
 
        """Branch from one branch to another."""
265
 
        os.mkdir('a')
266
 
        os.chdir('a')
267
 
        self.example_branch()
268
 
        os.chdir('..')
269
 
        self.runbzr('branch a b')
270
 
        self.runbzr('branch a c -r 1')
271
 
        os.chdir('b')
272
 
        self.runbzr('commit -m foo --unchanged')
273
 
        os.chdir('..')
274
 
        # naughty - abstraction violations RBC 20050928  
275
 
        print "test_branch used to delete the stores, how is this meant to work ?"
276
 
        #shutil.rmtree('a/.bzr/revision-store')
277
 
        #shutil.rmtree('a/.bzr/inventory-store', ignore_errors=True)
278
 
        #shutil.rmtree('a/.bzr/text-store', ignore_errors=True)
279
 
        self.runbzr('branch a d --basis b')
 
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')
280
194
 
281
195
    def test_merge(self):
282
196
        from bzrlib.branch import Branch
300
214
        # Merging a branch pulls its revision into the tree
301
215
        a = Branch.open('.')
302
216
        b = Branch.open('../b')
303
 
        a.get_revision_xml(b.last_revision())
 
217
        a.get_revision_xml(b.last_patch())
304
218
        self.log('pending merges: %s', a.pending_merges())
305
 
        #        assert a.pending_merges() == [b.last_revision()], "Assertion %s %s" \
306
 
        #        % (a.pending_merges(), b.last_revision())
307
 
 
308
 
    def test_merge_with_missing_file(self):
309
 
        """Merge handles missing file conflicts"""
310
 
        os.mkdir('a')
311
 
        os.chdir('a')
312
 
        os.mkdir('sub')
313
 
        print >> file('sub/a.txt', 'wb'), "hello"
314
 
        print >> file('b.txt', 'wb'), "hello"
315
 
        print >> file('sub/c.txt', 'wb'), "hello"
316
 
        self.runbzr('init')
317
 
        self.runbzr('add')
318
 
        self.runbzr(('commit', '-m', 'added a'))
319
 
        self.runbzr('branch . ../b')
320
 
        print >> file('sub/a.txt', 'ab'), "there"
321
 
        print >> file('b.txt', 'ab'), "there"
322
 
        print >> file('sub/c.txt', 'ab'), "there"
323
 
        self.runbzr(('commit', '-m', 'Added there'))
324
 
        os.unlink('sub/a.txt')
325
 
        os.unlink('sub/c.txt')
326
 
        os.rmdir('sub')
327
 
        os.unlink('b.txt')
328
 
        self.runbzr(('commit', '-m', 'Removed a.txt'))
329
 
        os.chdir('../b')
330
 
        print >> file('sub/a.txt', 'ab'), "something"
331
 
        print >> file('b.txt', 'ab'), "something"
332
 
        print >> file('sub/c.txt', 'ab'), "something"
333
 
        self.runbzr(('commit', '-m', 'Modified a.txt'))
334
 
        self.runbzr('merge ../a/')
335
 
        assert os.path.exists('sub/a.txt.THIS')
336
 
        assert os.path.exists('sub/a.txt.BASE')
337
 
        os.chdir('../a')
338
 
        self.runbzr('merge ../b/')
339
 
        assert os.path.exists('sub/a.txt.OTHER')
340
 
        assert os.path.exists('sub/a.txt.BASE')
 
219
        #        assert a.pending_merges() == [b.last_patch()], "Assertion %s %s" \
 
220
        #        % (a.pending_merges(), b.last_patch())
341
221
 
342
222
    def test_pull(self):
343
223
        """Pull changes from one branch to another."""
357
237
        self.runbzr('branch a b')
358
238
        os.chdir('b')
359
239
        self.runbzr('pull')
360
 
        os.mkdir('subdir')
361
 
        self.runbzr('add subdir')
362
240
        self.runbzr('commit -m blah --unchanged')
363
241
        os.chdir('../a')
364
242
        a = Branch.open('.')
370
248
        os.chdir('../b')
371
249
        self.runbzr('commit -m blah3 --unchanged')
372
250
        self.runbzr('pull ../a', retcode=1)
373
 
        print "DECIDE IF PULL CAN CONVERGE, blackbox.py"
374
 
        return
375
251
        os.chdir('../a')
376
252
        self.runbzr('merge ../b')
377
253
        self.runbzr('commit -m blah4 --unchanged')
378
 
        os.chdir('../b/subdir')
379
 
        self.runbzr('pull ../../a')
 
254
        os.chdir('../b')
 
255
        self.runbzr('pull ../a')
380
256
        assert a.revision_history()[-1] == b.revision_history()[-1]
381
 
        self.runbzr('commit -m blah5 --unchanged')
382
 
        self.runbzr('commit -m blah6 --unchanged')
383
 
        os.chdir('..')
384
 
        self.runbzr('pull ../a')
385
 
        os.chdir('../a')
386
 
        self.runbzr('commit -m blah7 --unchanged')
387
 
        self.runbzr('merge ../b')
388
 
        self.runbzr('commit -m blah8 --unchanged')
389
 
        self.runbzr('pull ../b')
390
 
        self.runbzr('pull ../b')
391
257
        
 
258
 
392
259
    def test_add_reports(self):
393
260
        """add command prints the names of added files."""
394
261
        b = Branch.initialize('.')
395
262
        self.build_tree(['top.txt', 'dir/', 'dir/sub.txt'])
396
 
        out = self.run_bzr_captured(['add'], retcode = 0)[0]
 
263
 
 
264
        from cStringIO import StringIO
 
265
        out = StringIO()
 
266
 
 
267
        ret = self.apply_redirected(None, out, None,
 
268
                                    run_bzr,
 
269
                                    ['add'])
 
270
        self.assertEquals(ret, 0)
 
271
 
397
272
        # the ordering is not defined at the moment
398
 
        results = sorted(out.rstrip('\n').split('\n'))
 
273
        results = sorted(out.getvalue().rstrip('\n').split('\n'))
399
274
        self.assertEquals(['added dir',
400
 
                           'added dir'+os.sep+'sub.txt',
 
275
                           'added dir/sub.txt',
401
276
                           'added top.txt',],
402
277
                          results)
403
278
 
409
284
        err.index('unknown command')
410
285
        
411
286
 
412
 
def listdir_sorted(dir):
413
 
    L = os.listdir(dir)
414
 
    L.sort()
415
 
    return L
416
 
 
417
287
 
418
288
class OldTests(ExternalBase):
419
289
    """old tests moved from ./testbzr."""
585
455
 
586
456
        runbzr('info')
587
457
 
588
 
        if has_symlinks():
589
 
            progress("symlinks")
590
 
            mkdir('symlinks')
591
 
            chdir('symlinks')
592
 
            runbzr('init')
593
 
            os.symlink("NOWHERE1", "link1")
594
 
            runbzr('add link1')
595
 
            assert self.capture('unknowns') == ''
596
 
            runbzr(['commit', '-m', '1: added symlink link1'])
597
 
    
598
 
            mkdir('d1')
599
 
            runbzr('add d1')
600
 
            assert self.capture('unknowns') == ''
601
 
            os.symlink("NOWHERE2", "d1/link2")
602
 
            assert self.capture('unknowns') == 'd1/link2\n'
603
 
            # is d1/link2 found when adding d1
604
 
            runbzr('add d1')
605
 
            assert self.capture('unknowns') == ''
606
 
            os.symlink("NOWHERE3", "d1/link3")
607
 
            assert self.capture('unknowns') == 'd1/link3\n'
608
 
            runbzr(['commit', '-m', '2: added dir, symlink'])
609
 
    
610
 
            runbzr('rename d1 d2')
611
 
            runbzr('move d2/link2 .')
612
 
            runbzr('move link1 d2')
613
 
            assert os.readlink("./link2") == "NOWHERE2"
614
 
            assert os.readlink("d2/link1") == "NOWHERE1"
615
 
            runbzr('add d2/link3')
616
 
            runbzr('diff')
617
 
            runbzr(['commit', '-m', '3: rename of dir, move symlinks, add link3'])
618
 
    
619
 
            os.unlink("link2")
620
 
            os.symlink("TARGET 2", "link2")
621
 
            os.unlink("d2/link1")
622
 
            os.symlink("TARGET 1", "d2/link1")
623
 
            runbzr('diff')
624
 
            assert self.capture("relpath d2/link1") == "d2/link1\n"
625
 
            runbzr(['commit', '-m', '4: retarget of two links'])
626
 
    
627
 
            runbzr('remove d2/link1')
628
 
            assert self.capture('unknowns') == 'd2/link1\n'
629
 
            runbzr(['commit', '-m', '5: remove d2/link1'])
630
 
    
631
 
            os.mkdir("d1")
632
 
            runbzr('add d1')
633
 
            runbzr('rename d2/link3 d1/link3new')
634
 
            assert self.capture('unknowns') == 'd2/link1\n'
635
 
            runbzr(['commit', '-m', '6: remove d2/link1, move/rename link3'])
636
 
            
637
 
            runbzr(['check'])
638
 
            
639
 
            runbzr(['export', '-r', '1', 'exp1.tmp'])
640
 
            chdir("exp1.tmp")
641
 
            assert listdir_sorted(".") == [ "link1" ]
642
 
            assert os.readlink("link1") == "NOWHERE1"
643
 
            chdir("..")
644
 
            
645
 
            runbzr(['export', '-r', '2', 'exp2.tmp'])
646
 
            chdir("exp2.tmp")
647
 
            assert listdir_sorted(".") == [ "d1", "link1" ]
648
 
            chdir("..")
649
 
            
650
 
            runbzr(['export', '-r', '3', 'exp3.tmp'])
651
 
            chdir("exp3.tmp")
652
 
            assert listdir_sorted(".") == [ "d2", "link2" ]
653
 
            assert listdir_sorted("d2") == [ "link1", "link3" ]
654
 
            assert os.readlink("d2/link1") == "NOWHERE1"
655
 
            assert os.readlink("link2")    == "NOWHERE2"
656
 
            chdir("..")
657
 
            
658
 
            runbzr(['export', '-r', '4', 'exp4.tmp'])
659
 
            chdir("exp4.tmp")
660
 
            assert listdir_sorted(".") == [ "d2", "link2" ]
661
 
            assert os.readlink("d2/link1") == "TARGET 1"
662
 
            assert os.readlink("link2")    == "TARGET 2"
663
 
            assert listdir_sorted("d2") == [ "link1", "link3" ]
664
 
            chdir("..")
665
 
            
666
 
            runbzr(['export', '-r', '5', 'exp5.tmp'])
667
 
            chdir("exp5.tmp")
668
 
            assert listdir_sorted(".") == [ "d2", "link2" ]
669
 
            assert os.path.islink("link2")
670
 
            assert listdir_sorted("d2")== [ "link3" ]
671
 
            chdir("..")
672
 
            
673
 
            runbzr(['export', '-r', '6', 'exp6.tmp'])
674
 
            chdir("exp6.tmp")
675
 
            assert listdir_sorted(".") == [ "d1", "d2", "link2" ]
676
 
            assert listdir_sorted("d1") == [ "link3new" ]
677
 
            assert listdir_sorted("d2") == []
678
 
            assert os.readlink("d1/link3new") == "NOWHERE3"
679
 
            chdir("..")
680
 
        else:
681
 
            progress("skipping symlink tests")
682