~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/blackbox/test_selftest.py

  • Committer: John Arbash Meinel
  • Date: 2006-11-10 15:38:16 UTC
  • mto: This revision was merged to the branch mainline in revision 2129.
  • Revision ID: john@arbash-meinel.com-20061110153816-46acf76fc86a512b
use try/finally to clean up a nested progress bar during weave fetching

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2007 Canonical Ltd
 
1
# Copyright (C) 2005 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
17
17
"""UI tests for the test framework."""
18
18
 
19
19
import os
20
 
import re
21
20
import signal
22
21
import sys
23
22
 
28
27
from bzrlib.errors import ParamikoNotPresent
29
28
from bzrlib.tests import (
30
29
                          TestCase,
31
 
                          TestCaseInTempDir,
32
30
                          TestCaseWithMemoryTransport,
33
31
                          TestCaseWithTransport,
34
 
                          TestUIFactory,
35
32
                          TestSkipped,
36
33
                          )
37
 
from bzrlib.symbol_versioning import (
38
 
    zero_eighteen,
39
 
    )
40
34
from bzrlib.tests.blackbox import ExternalBase
41
35
 
42
36
 
76
70
        TestCaseWithMemoryTransport.TEST_ROOT = None
77
71
        try:
78
72
            TestOptions.current_test = "test_transport_set_to_sftp"
79
 
            stdout = self.run_bzr(
80
 
                'selftest --transport=sftp test_transport_set_to_sftp')[0]
 
73
            stdout = self.capture('selftest --transport=sftp test_transport_set_to_sftp')
 
74
            
81
75
            self.assertContainsRe(stdout, 'Ran 1 test')
82
76
            self.assertEqual(old_transport, bzrlib.tests.default_transport)
83
77
 
84
78
            TestOptions.current_test = "test_transport_set_to_memory"
85
 
            stdout = self.run_bzr(
86
 
                'selftest --transport=memory test_transport_set_to_memory')[0]
 
79
            stdout = self.capture('selftest --transport=memory test_transport_set_to_memory')
87
80
            self.assertContainsRe(stdout, 'Ran 1 test')
88
81
            self.assertEqual(old_transport, bzrlib.tests.default_transport)
89
82
        finally:
94
87
 
95
88
class TestRunBzr(ExternalBase):
96
89
 
97
 
    def _run_bzr_core(self, argv, retcode=0, encoding=None, stdin=None,
 
90
    def run_bzr_captured(self, argv, retcode=0, encoding=None, stdin=None,
98
91
                         working_dir=None):
99
 
        """Override _run_bzr_core to test how it is invoked by run_bzr.
100
 
 
101
 
        Attempts to run bzr from inside this class don't actually run it.
102
 
 
103
 
        We test how run_bzr actually invokes bzr in another location.
 
92
        """Override run_bzr_captured to test how it is invoked by run_bzr.
 
93
 
 
94
        We test how run_bzr_captured actually invokes bzr in another location.
104
95
        Here we only need to test that it is run_bzr passes the right
105
 
        parameters to run_bzr.
 
96
        parameters to run_bzr_captured.
106
97
        """
107
 
        self.argv = list(argv)
 
98
        self.argv = argv
108
99
        self.retcode = retcode
109
100
        self.encoding = encoding
110
101
        self.stdin = stdin
111
102
        self.working_dir = working_dir
112
 
        return '', ''
113
103
 
114
104
    def test_args(self):
115
 
        """Test that run_bzr passes args correctly to _run_bzr_core"""
116
 
        self.callDeprecated(
117
 
                ['passing varargs to run_bzr was deprecated in version 0.18.'],
118
 
                self.run_bzr,
119
 
                'arg1', 'arg2', 'arg3', retcode=1)
120
 
        self.assertEqual(['arg1', 'arg2', 'arg3'], self.argv)
 
105
        """Test that run_bzr passes args correctly to run_bzr_captured"""
 
106
        self.run_bzr('arg1', 'arg2', 'arg3', retcode=1)
 
107
        self.assertEqual(('arg1', 'arg2', 'arg3'), self.argv)
121
108
 
122
109
    def test_encoding(self):
123
 
        """Test that run_bzr passes encoding to _run_bzr_core"""
124
 
        self.run_bzr('foo bar')
 
110
        """Test that run_bzr passes encoding to run_bzr_captured"""
 
111
        self.run_bzr('foo', 'bar')
125
112
        self.assertEqual(None, self.encoding)
126
 
        self.assertEqual(['foo', 'bar'], self.argv)
 
113
        self.assertEqual(('foo', 'bar'), self.argv)
127
114
 
128
 
        self.run_bzr('foo bar', encoding='baz')
 
115
        self.run_bzr('foo', 'bar', encoding='baz')
129
116
        self.assertEqual('baz', self.encoding)
130
 
        self.assertEqual(['foo', 'bar'], self.argv)
 
117
        self.assertEqual(('foo', 'bar'), self.argv)
131
118
 
132
119
    def test_retcode(self):
133
 
        """Test that run_bzr passes retcode to _run_bzr_core"""
 
120
        """Test that run_bzr passes retcode to run_bzr_captured"""
134
121
        # Default is retcode == 0
135
 
        self.run_bzr('foo bar')
 
122
        self.run_bzr('foo', 'bar')
136
123
        self.assertEqual(0, self.retcode)
137
 
        self.assertEqual(['foo', 'bar'], self.argv)
 
124
        self.assertEqual(('foo', 'bar'), self.argv)
138
125
 
139
 
        self.run_bzr('foo bar', retcode=1)
 
126
        self.run_bzr('foo', 'bar', retcode=1)
140
127
        self.assertEqual(1, self.retcode)
141
 
        self.assertEqual(['foo', 'bar'], self.argv)
 
128
        self.assertEqual(('foo', 'bar'), self.argv)
142
129
 
143
 
        self.run_bzr('foo bar', retcode=None)
 
130
        self.run_bzr('foo', 'bar', retcode=None)
144
131
        self.assertEqual(None, self.retcode)
145
 
        self.assertEqual(['foo', 'bar'], self.argv)
 
132
        self.assertEqual(('foo', 'bar'), self.argv)
146
133
 
147
 
        self.run_bzr(['foo', 'bar'], retcode=3)
 
134
        self.run_bzr('foo', 'bar', retcode=3)
148
135
        self.assertEqual(3, self.retcode)
149
 
        self.assertEqual(['foo', 'bar'], self.argv)
 
136
        self.assertEqual(('foo', 'bar'), self.argv)
150
137
 
151
138
    def test_stdin(self):
152
139
        # test that the stdin keyword to run_bzr is passed through to
153
 
        # _run_bzr_core as-is. We do this by overriding
154
 
        # _run_bzr_core in this class, and then calling run_bzr,
155
 
        # which is a convenience function for _run_bzr_core, so 
 
140
        # run_bzr_captured as-is. We do this by overriding
 
141
        # run_bzr_captured in this class, and then calling run_bzr,
 
142
        # which is a convenience function for run_bzr_captured, so 
156
143
        # should invoke it.
157
 
        self.run_bzr('foo bar', stdin='gam')
 
144
        self.run_bzr('foo', 'bar', stdin='gam')
158
145
        self.assertEqual('gam', self.stdin)
159
 
        self.assertEqual(['foo', 'bar'], self.argv)
 
146
        self.assertEqual(('foo', 'bar'), self.argv)
160
147
 
161
 
        self.run_bzr('foo bar', stdin='zippy')
 
148
        self.run_bzr('foo', 'bar', stdin='zippy')
162
149
        self.assertEqual('zippy', self.stdin)
163
 
        self.assertEqual(['foo', 'bar'], self.argv)
 
150
        self.assertEqual(('foo', 'bar'), self.argv)
164
151
 
165
152
    def test_working_dir(self):
166
 
        """Test that run_bzr passes working_dir to _run_bzr_core"""
167
 
        self.run_bzr('foo bar')
 
153
        """Test that run_bzr passes working_dir to run_bzr_captured"""
 
154
        self.run_bzr('foo', 'bar')
168
155
        self.assertEqual(None, self.working_dir)
169
 
        self.assertEqual(['foo', 'bar'], self.argv)
 
156
        self.assertEqual(('foo', 'bar'), self.argv)
170
157
 
171
 
        self.run_bzr('foo bar', working_dir='baz')
 
158
        self.run_bzr('foo', 'bar', working_dir='baz')
172
159
        self.assertEqual('baz', self.working_dir)
173
 
        self.assertEqual(['foo', 'bar'], self.argv)
 
160
        self.assertEqual(('foo', 'bar'), self.argv)
174
161
 
175
162
 
176
163
class TestBenchmarkTests(TestCaseWithTransport):
182
169
        old_root = TestCaseWithMemoryTransport.TEST_ROOT
183
170
        try:
184
171
            TestCaseWithMemoryTransport.TEST_ROOT = None
185
 
            out, err = self.run_bzr('selftest --benchmark'
186
 
                                    ' workingtree_implementations')
 
172
            out, err = self.run_bzr('selftest', '--benchmark', 'workingtree_implementations')
187
173
        finally:
188
174
            TestCaseWithMemoryTransport.TEST_ROOT = old_root
189
175
        self.assertContainsRe(out, 'Ran 0 tests.*\n\nOK')
212
198
        return 0
213
199
 
214
200
    def test_stdin(self):
215
 
        # test that the stdin keyword to _run_bzr_core is passed through to
 
201
        # test that the stdin keyword to run_bzr_captured is passed through to
216
202
        # apply_redirected as a StringIO. We do this by overriding
217
 
        # apply_redirected in this class, and then calling _run_bzr_core,
 
203
        # apply_redirected in this class, and then calling run_bzr_captured,
218
204
        # which calls apply_redirected. 
219
 
        self.run_bzr(['foo', 'bar'], stdin='gam')
 
205
        self.run_bzr_captured(['foo', 'bar'], stdin='gam')
220
206
        self.assertEqual('gam', self.stdin.read())
221
207
        self.assertTrue(self.stdin is self.factory_stdin)
222
 
        self.run_bzr(['foo', 'bar'], stdin='zippy')
 
208
        self.run_bzr_captured(['foo', 'bar'], stdin='zippy')
223
209
        self.assertEqual('zippy', self.stdin.read())
224
210
        self.assertTrue(self.stdin is self.factory_stdin)
225
211
 
226
212
    def test_ui_factory(self):
227
 
        # each invocation of self.run_bzr should get its
228
 
        # own UI factory, which is an instance of TestUIFactory,
229
 
        # with stdin, stdout and stderr attached to the stdin,
230
 
        # stdout and stderr of the invoked run_bzr
 
213
        # each invocation of self.run_bzr_captured should get its own UI
 
214
        # factory, which is an instance of TestUIFactory, with stdout and
 
215
        # stderr attached to the stdout and stderr of the invoked
 
216
        # run_bzr_captured
231
217
        current_factory = bzrlib.ui.ui_factory
232
 
        self.run_bzr(['foo'])
 
218
        self.run_bzr_captured(['foo'])
233
219
        self.failIf(current_factory is self.factory)
234
220
        self.assertNotEqual(sys.stdout, self.factory.stdout)
235
221
        self.assertNotEqual(sys.stderr, self.factory.stderr)
236
222
        self.assertEqual('foo\n', self.factory.stdout.getvalue())
237
223
        self.assertEqual('bar\n', self.factory.stderr.getvalue())
238
 
        self.assertIsInstance(self.factory, TestUIFactory)
 
224
        self.assertIsInstance(self.factory, bzrlib.tests.blackbox.TestUIFactory)
239
225
 
240
226
    def test_working_dir(self):
241
227
        self.build_tree(['one/', 'two/'])
242
228
        cwd = osutils.getcwd()
243
229
 
244
230
        # Default is to work in the current directory
245
 
        self.run_bzr(['foo', 'bar'])
 
231
        self.run_bzr_captured(['foo', 'bar'])
246
232
        self.assertEqual(cwd, self.working_dir)
247
233
 
248
 
        self.run_bzr(['foo', 'bar'], working_dir=None)
 
234
        self.run_bzr_captured(['foo', 'bar'], working_dir=None)
249
235
        self.assertEqual(cwd, self.working_dir)
250
236
 
251
237
        # The function should be run in the alternative directory
252
238
        # but afterwards the current working dir shouldn't be changed
253
 
        self.run_bzr(['foo', 'bar'], working_dir='one')
 
239
        self.run_bzr_captured(['foo', 'bar'], working_dir='one')
254
240
        self.assertNotEqual(cwd, self.working_dir)
255
241
        self.assertEndsWith(self.working_dir, 'one')
256
242
        self.assertEqual(cwd, osutils.getcwd())
257
243
 
258
 
        self.run_bzr(['foo', 'bar'], working_dir='two')
 
244
        self.run_bzr_captured(['foo', 'bar'], working_dir='two')
259
245
        self.assertNotEqual(cwd, self.working_dir)
260
246
        self.assertEndsWith(self.working_dir, 'two')
261
247
        self.assertEqual(cwd, osutils.getcwd())
275
261
        self.assertContainsRe(result[1], 'unknown command')
276
262
        err = self.run_bzr_subprocess('merge', '--merge-type', 'magic merge', 
277
263
                                      retcode=3)[1]
278
 
        self.assertContainsRe(err, 'Bad value "magic merge" for option'
279
 
                              ' "merge-type"')
 
264
        self.assertContainsRe(err, 'No known merge type magic merge')
280
265
 
281
266
    def test_run_bzr_subprocess_env(self):
282
267
        """run_bzr_subprocess can set environment variables in the child only.
342
327
        out, err = self.run_bzr_subprocess('rocks',
343
328
                        env_changes={'NON_EXISTANT_ENV_VAR':None},
344
329
                        universal_newlines=True)
345
 
        self.assertEqual('It sure does!\n', out)
 
330
        self.assertEqual('it sure does!\n', out)
346
331
        self.assertEqual('', err)
347
332
 
348
333
    def test_run_bzr_subprocess_working_dir(self):
433
418
        """
434
419
        process = self.start_bzr_subprocess(['--versionn'])
435
420
        self.assertRaises(self.failureException, self.finish_bzr_subprocess,
436
 
                          process)
 
421
                          process, retcode=0)
437
422
        
438
423
    def test_start_and_stop_bzr_subprocess_send_signal(self):
439
424
        """finish_bzr_subprocess raises self.failureException if the retcode is
453
438
        self.make_branch_and_tree('one')
454
439
 
455
440
        process = self.start_bzr_subprocess(['root'], working_dir='one')
456
 
        result = self.finish_bzr_subprocess(process, universal_newlines=True)
 
441
        result = self.finish_bzr_subprocess(process)
457
442
        self.assertEndsWith(result[0], 'one\n')
458
443
        self.assertEqual('', result[1])
459
 
 
 
444
        
460
445
 
461
446
class TestRunBzrError(ExternalBase):
462
447
 
463
448
    def test_run_bzr_error(self):
464
 
        # retcode=0 is specially needed here because run_bzr_error expects
465
 
        # an error (oddly enough) but we want to test the case of not
466
 
        # actually getting one
467
 
        out, err = self.run_bzr_error(['^$'], ['rocks'], retcode=0)
468
 
        self.assertEqual(out, 'It sure does!\n')
469
 
        # now test actually getting an error
470
 
        out, err = self.run_bzr_error(
471
 
                ["bzr: ERROR: foobarbaz is not versioned"],
472
 
                ['file-id', 'foobarbaz'])
473
 
 
474
 
 
475
 
class TestSelftestCleanOutput(TestCaseInTempDir):
476
 
 
477
 
    def test_clean_output(self):
478
 
        # check that 'bzr selftest --clean-output' works correct
479
 
        dirs = ('test0000.tmp', 'test0001.tmp', 'bzrlib', 'tests')
480
 
        files = ('bzr', 'setup.py', 'test9999.tmp')
481
 
        for i in dirs:
482
 
            os.mkdir(i)
483
 
        for i in files:
484
 
            f = file(i, 'wb')
485
 
            f.write('content of ')
486
 
            f.write(i)
487
 
            f.close()
488
 
 
489
 
        root = os.getcwdu()
490
 
        before = os.listdir(root)
491
 
        before.sort()
492
 
        self.assertEquals(['bzr','bzrlib','setup.py',
493
 
                           'test0000.tmp','test0001.tmp',
494
 
                           'test9999.tmp','tests'],
495
 
                           before)
496
 
 
497
 
        out, err = self.run_bzr('selftest --clean-output',
498
 
                                working_dir=root)
499
 
 
500
 
        self.assertEquals(['delete directory: test0000.tmp',
501
 
                          'delete directory: test0001.tmp'],
502
 
                          sorted(out.splitlines()))
503
 
        self.assertEquals('', err)
504
 
 
505
 
        after = os.listdir(root)
506
 
        after.sort()
507
 
        self.assertEquals(['bzr','bzrlib','setup.py',
508
 
                           'test9999.tmp','tests'],
509
 
                           after)
510
 
 
511
 
 
512
 
class TestSelftestListOnly(TestCase):
513
 
 
514
 
    @staticmethod
515
 
    def _parse_test_list(lines, newlines_in_header=1):
516
 
        "Parse a list of lines into a tuple of 3 lists (header,body,footer)."
517
 
 
518
 
        in_header = True
519
 
        in_footer = False
520
 
        header = []
521
 
        body = []
522
 
        footer = []
523
 
        header_newlines_found = 0 
524
 
        for line in lines:
525
 
            if in_header:
526
 
                if line == '':
527
 
                    header_newlines_found += 1
528
 
                    if header_newlines_found >= newlines_in_header:
529
 
                        in_header = False
530
 
                        continue
531
 
                header.append(line)
532
 
            elif not in_footer:
533
 
                if line.startswith('-------'):
534
 
                    in_footer = True
535
 
                else:
536
 
                    body.append(line)
537
 
            else:
538
 
                footer.append(line)
539
 
        # If the last body line is blank, drop it off the list
540
 
        if len(body) > 0 and body[-1] == '':
541
 
            body.pop()                
542
 
        return (header,body,footer)
543
 
 
544
 
    def test_list_only(self):
545
 
        # check that bzr selftest --list-only works correctly
546
 
        out,err = self.run_bzr('selftest selftest --list-only')
547
 
        self.assertEndsWith(err, 'tests passed\n')
548
 
        (header,body,footer) = self._parse_test_list(out.splitlines())
549
 
        num_tests = len(body)
550
 
        self.assertContainsRe(footer[0], 'Listed %s tests in' % num_tests)
551
 
 
552
 
    def test_list_only_filtered(self):
553
 
        # check that a filtered --list-only works, both include and exclude
554
 
        out_all,err_all = self.run_bzr('selftest --list-only')
555
 
        tests_all = self._parse_test_list(out_all.splitlines())[1]
556
 
        out_incl,err_incl = self.run_bzr('selftest --list-only selftest')
557
 
        tests_incl = self._parse_test_list(out_incl.splitlines())[1]
558
 
        self.assertSubset(tests_incl, tests_all)
559
 
        out_excl,err_excl = self.run_bzr(['selftest', '--list-only',
560
 
                                          '--exclude', 'selftest'])
561
 
        tests_excl = self._parse_test_list(out_excl.splitlines())[1]
562
 
        self.assertSubset(tests_excl, tests_all)
563
 
        set_incl = set(tests_incl)
564
 
        set_excl = set(tests_excl)
565
 
        intersection = set_incl.intersection(set_excl)
566
 
        self.assertEquals(0, len(intersection))
567
 
        self.assertEquals(len(tests_all), len(tests_incl) + len(tests_excl))
568
 
 
569
 
    def test_list_only_random(self):
570
 
        # check that --randomize works correctly
571
 
        out_all,err_all = self.run_bzr('selftest --list-only selftest')
572
 
        tests_all = self._parse_test_list(out_all.splitlines())[1]
573
 
        # XXX: It looks like there are some orders for generating tests that
574
 
        # fail as of 20070504 - maybe because of import order dependencies.
575
 
        # So unfortunately this will rarely intermittently fail at the moment.
576
 
        # -- mbp 20070504
577
 
        out_rand,err_rand = self.run_bzr(['selftest', '--list-only',
578
 
                                          'selftest', '--randomize', 'now'])
579
 
        (header_rand,tests_rand,dummy) = self._parse_test_list(
580
 
            out_rand.splitlines(), 2)
581
 
        self.assertNotEqual(tests_all, tests_rand)
582
 
        self.assertEqual(sorted(tests_all), sorted(tests_rand))
583
 
        # Check that the seed can be reused to get the exact same order
584
 
        seed_re = re.compile('Randomizing test order using seed (\w+)')
585
 
        match_obj = seed_re.search(header_rand[-1])
586
 
        seed = match_obj.group(1)
587
 
        out_rand2,err_rand2 = self.run_bzr(['selftest', '--list-only',
588
 
                                            'selftest', '--randomize', seed])
589
 
        (header_rand2,tests_rand2,dummy) = self._parse_test_list(
590
 
            out_rand2.splitlines(), 2)
591
 
        self.assertEqual(tests_rand, tests_rand2)
592
 
 
 
449
        out, err = self.run_bzr_error(['^$'], 'rocks', retcode=0)
 
450
        self.assertEqual(out, 'it sure does!\n')
 
451
 
 
452
        out, err = self.run_bzr_error(["bzr: ERROR: foobarbaz is not versioned"],
 
453
                                      'file-id', 'foobarbaz')