~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

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

  • Committer: Patch Queue Manager
  • Date: 2011-09-22 14:12:18 UTC
  • mfrom: (6155.3.1 jam)
  • Revision ID: pqm@pqm.ubuntu.com-20110922141218-86s4uu6nqvourw4f
(jameinel) Cleanup comments bzrlib/smart/__init__.py (John A Meinel)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005 by Canonical Ltd
 
1
# Copyright (C) 2006-2010 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
 
# it under the terms of the GNU General Public License version 2 as published by
5
 
# the Free Software Foundation.
 
4
# it under the terms of the GNU General Public License as published by
 
5
# the Free Software Foundation; either version 2 of the License, or
 
6
# (at your option) any later version.
6
7
#
7
8
# This program is distributed in the hope that it will be useful,
8
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
12
#
12
13
# You should have received a copy of the GNU General Public License
13
14
# along with this program; if not, write to the Free Software
14
 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
15
16
 
16
17
"""UI tests for the test framework."""
17
18
 
18
 
import sys
 
19
import os
19
20
 
20
 
import bzrlib
21
 
from bzrlib.errors import ParamikoNotPresent
 
21
from bzrlib import (
 
22
    tests,
 
23
    )
22
24
from bzrlib.tests import (
23
 
                          TestCase,
24
 
                          TestCaseInTempDir,
25
 
                          TestSkipped,
26
 
                          )
27
 
from bzrlib.tests.blackbox import ExternalBase
28
 
 
29
 
 
30
 
class TestOptions(TestCase):
31
 
 
32
 
    current_test = None
 
25
    features,
 
26
    )
 
27
from bzrlib.transport import memory
 
28
 
 
29
class SelfTestPatch:
 
30
 
 
31
    def get_params_passed_to_core(self, cmdline):
 
32
        params = []
 
33
        def selftest(*args, **kwargs):
 
34
            """Capture the arguments selftest was run with."""
 
35
            params.append((args, kwargs))
 
36
            return True
 
37
        # Yes this prevents using threads to run the test suite in parallel,
 
38
        # however we don't have a clean dependency injector for commands, 
 
39
        # and even if we did - we'd still be testing that the glue is wired
 
40
        # up correctly. XXX: TODO: Solve this testing problem.
 
41
        original_selftest = tests.selftest
 
42
        tests.selftest = selftest
 
43
        try:
 
44
            self.run_bzr(cmdline)
 
45
            return params[0]
 
46
        finally:
 
47
            tests.selftest = original_selftest
 
48
 
 
49
 
 
50
class TestOptions(tests.TestCase, SelfTestPatch):
 
51
 
 
52
    def test_load_list(self):
 
53
        params = self.get_params_passed_to_core('selftest --load-list foo')
 
54
        self.assertEqual('foo', params[1]['load_list'])
33
55
 
34
56
    def test_transport_set_to_sftp(self):
35
 
        # test the --transport option has taken effect from within the
36
 
        # test_transport test
37
 
        try:
38
 
            import bzrlib.transport.sftp
39
 
        except ParamikoNotPresent:
40
 
            raise TestSkipped("Paramiko not present")
41
 
        if TestOptions.current_test != "test_transport_set_to_sftp":
42
 
            return
43
 
        self.assertEqual(bzrlib.transport.sftp.SFTPAbsoluteServer,
44
 
                         bzrlib.tests.default_transport)
 
57
        # Test that we can pass a transport to the selftest core - sftp
 
58
        # version.
 
59
        self.requireFeature(features.paramiko)
 
60
        from bzrlib.tests import stub_sftp
 
61
        params = self.get_params_passed_to_core('selftest --transport=sftp')
 
62
        self.assertEqual(stub_sftp.SFTPAbsoluteServer,
 
63
            params[1]["transport"])
45
64
 
46
65
    def test_transport_set_to_memory(self):
47
 
        # test the --transport option has taken effect from within the
48
 
        # test_transport test
49
 
        import bzrlib.transport.memory
50
 
        if TestOptions.current_test != "test_transport_set_to_memory":
51
 
            return
52
 
        self.assertEqual(bzrlib.transport.memory.MemoryServer,
53
 
                         bzrlib.tests.default_transport)
54
 
 
55
 
    def test_transport(self):
56
 
        # test that --transport=sftp works
57
 
        try:
58
 
            import bzrlib.transport.sftp
59
 
        except ParamikoNotPresent:
60
 
            raise TestSkipped("Paramiko not present")
61
 
        old_transport = bzrlib.tests.default_transport
62
 
        old_root = TestCaseInTempDir.TEST_ROOT
63
 
        TestCaseInTempDir.TEST_ROOT = None
64
 
        try:
65
 
            TestOptions.current_test = "test_transport_set_to_sftp"
66
 
            stdout = self.capture('selftest --transport=sftp test_transport_set_to_sftp')
67
 
            
68
 
            self.assertContainsRe(stdout, 'Ran 1 test')
69
 
            self.assertEqual(old_transport, bzrlib.tests.default_transport)
70
 
 
71
 
            TestOptions.current_test = "test_transport_set_to_memory"
72
 
            stdout = self.capture('selftest --transport=memory test_transport_set_to_memory')
73
 
            self.assertContainsRe(stdout, 'Ran 1 test')
74
 
            self.assertEqual(old_transport, bzrlib.tests.default_transport)
 
66
        # Test that we can pass a transport to the selftest core - memory
 
67
        # version.
 
68
        params = self.get_params_passed_to_core('selftest --transport=memory')
 
69
        self.assertEqual(memory.MemoryServer, params[1]["transport"])
 
70
 
 
71
    def test_parameters_passed_to_core(self):
 
72
        params = self.get_params_passed_to_core('selftest --list-only')
 
73
        self.assertTrue("list_only" in params[1])
 
74
        params = self.get_params_passed_to_core('selftest --list-only selftest')
 
75
        self.assertTrue("list_only" in params[1])
 
76
        params = self.get_params_passed_to_core(['selftest', '--list-only',
 
77
            '--exclude', 'selftest'])
 
78
        self.assertTrue("list_only" in params[1])
 
79
        params = self.get_params_passed_to_core(['selftest', '--list-only',
 
80
            'selftest', '--randomize', 'now'])
 
81
        self.assertSubset(["list_only", "random_seed"], params[1])
 
82
 
 
83
    def test_starting_with(self):
 
84
        params = self.get_params_passed_to_core('selftest --starting-with foo')
 
85
        self.assertEqual(['foo'], params[1]['starting_with'])
 
86
 
 
87
    def test_starting_with_multiple_argument(self):
 
88
        params = self.get_params_passed_to_core(
 
89
            'selftest --starting-with foo --starting-with bar')
 
90
        self.assertEqual(['foo', 'bar'], params[1]['starting_with'])
 
91
 
 
92
    def test_subunit(self):
 
93
        self.requireFeature(features.subunit)
 
94
        params = self.get_params_passed_to_core('selftest --subunit')
 
95
        self.assertEqual(tests.SubUnitBzrRunner, params[1]['runner_class'])
 
96
 
 
97
    def _parse_test_list(self, lines, newlines_in_header=0):
 
98
        "Parse a list of lines into a tuple of 3 lists (header,body,footer)."
 
99
        in_header = newlines_in_header != 0
 
100
        in_footer = False
 
101
        header = []
 
102
        body = []
 
103
        footer = []
 
104
        header_newlines_found = 0
 
105
        for line in lines:
 
106
            if in_header:
 
107
                if line == '':
 
108
                    header_newlines_found += 1
 
109
                    if header_newlines_found >= newlines_in_header:
 
110
                        in_header = False
 
111
                        continue
 
112
                header.append(line)
 
113
            elif not in_footer:
 
114
                if line.startswith('-------'):
 
115
                    in_footer = True
 
116
                else:
 
117
                    body.append(line)
 
118
            else:
 
119
                footer.append(line)
 
120
        # If the last body line is blank, drop it off the list
 
121
        if len(body) > 0 and body[-1] == '':
 
122
            body.pop()
 
123
        return (header,body,footer)
 
124
 
 
125
    def test_list_only(self):
 
126
        # check that bzr selftest --list-only outputs no ui noise
 
127
        def selftest(*args, **kwargs):
 
128
            """Capture the arguments selftest was run with."""
 
129
            return True
 
130
        def outputs_nothing(cmdline):
 
131
            out,err = self.run_bzr(cmdline)
 
132
            (header,body,footer) = self._parse_test_list(out.splitlines())
 
133
            num_tests = len(body)
 
134
            self.assertLength(0, header)
 
135
            self.assertLength(0, footer)
 
136
            self.assertEqual('', err)
 
137
        # Yes this prevents using threads to run the test suite in parallel,
 
138
        # however we don't have a clean dependency injector for commands, 
 
139
        # and even if we did - we'd still be testing that the glue is wired
 
140
        # up correctly. XXX: TODO: Solve this testing problem.
 
141
        original_selftest = tests.selftest
 
142
        tests.selftest = selftest
 
143
        try:
 
144
            outputs_nothing('selftest --list-only')
 
145
            outputs_nothing('selftest --list-only selftest')
 
146
            outputs_nothing(['selftest', '--list-only', '--exclude', 'selftest'])
75
147
        finally:
76
 
            bzrlib.tests.default_transport = old_transport
77
 
            TestOptions.current_test = None
78
 
            TestCaseInTempDir.TEST_ROOT = old_root
79
 
 
80
 
    def test_benchmark_runs_benchmark_tests(self):
81
 
        """bzr selftest --benchmark should not run the default test suite."""
82
 
        # We test this by passing a regression test name to --benchmark, which
83
 
        # should result in 0 rests run.
84
 
        out, err = self.run_bzr('selftest', '--benchmark', 'workingtree_implementations')
85
 
        self.assertContainsRe(out, 'Ran 0 tests.*\n\nOK')
86
 
        self.assertEqual(
87
 
            'running tests...\ntests passed\n',
88
 
            err)
89
 
        
90
 
 
91
 
class TestRunBzr(ExternalBase):
92
 
 
93
 
    def run_bzr_captured(self, argv, retcode=0, encoding=None, stdin=None):
94
 
        self.stdin = stdin
95
 
 
96
 
    def test_stdin(self):
97
 
        # test that the stdin keyword to run_bzr is passed through to
98
 
        # run_bzr_captured as-is. We do this by overriding
99
 
        # run_bzr_captured in this class, and then calling run_bzr,
100
 
        # which is a convenience function for run_bzr_captured, so 
101
 
        # should invoke it.
102
 
        self.run_bzr('foo', 'bar', stdin='gam')
103
 
        self.assertEqual('gam', self.stdin)
104
 
        self.run_bzr('foo', 'bar', stdin='zippy')
105
 
        self.assertEqual('zippy', self.stdin)
106
 
 
107
 
 
108
 
class TestRunBzrCaptured(ExternalBase):
109
 
 
110
 
    def apply_redirected(self, stdin=None, stdout=None, stderr=None,
111
 
                         a_callable=None, *args, **kwargs):
112
 
        self.stdin = stdin
113
 
        self.factory_stdin = getattr(bzrlib.ui.ui_factory, "stdin", None)
114
 
        self.factory = bzrlib.ui.ui_factory
115
 
        stdout.write('foo\n')
116
 
        stderr.write('bar\n')
117
 
        return 0
118
 
 
119
 
    def test_stdin(self):
120
 
        # test that the stdin keyword to run_bzr_captured is passed through to
121
 
        # apply_redirected as a StringIO. We do this by overriding
122
 
        # apply_redirected in this class, and then calling run_bzr_captured,
123
 
        # which calls apply_redirected. 
124
 
        self.run_bzr_captured(['foo', 'bar'], stdin='gam')
125
 
        self.assertEqual('gam', self.stdin.read())
126
 
        self.assertTrue(self.stdin is self.factory_stdin)
127
 
        self.run_bzr_captured(['foo', 'bar'], stdin='zippy')
128
 
        self.assertEqual('zippy', self.stdin.read())
129
 
        self.assertTrue(self.stdin is self.factory_stdin)
130
 
 
131
 
    def test_ui_factory(self):
132
 
        # each invocation of self.run_bzr_captured should get its own UI
133
 
        # factory, which is an instance of TestUIFactory, with stdout and
134
 
        # stderr attached to the stdout and stderr of the invoked
135
 
        # run_bzr_captured
136
 
        current_factory = bzrlib.ui.ui_factory
137
 
        self.run_bzr_captured(['foo'])
138
 
        self.failIf(current_factory is self.factory)
139
 
        self.assertNotEqual(sys.stdout, self.factory.stdout)
140
 
        self.assertNotEqual(sys.stderr, self.factory.stderr)
141
 
        self.assertEqual('foo\n', self.factory.stdout.getvalue())
142
 
        self.assertEqual('bar\n', self.factory.stderr.getvalue())
143
 
        self.assertIsInstance(self.factory, bzrlib.tests.blackbox.TestUIFactory)
 
148
            tests.selftest = original_selftest
 
149
 
 
150
    def test_lsprof_tests(self):
 
151
        params = self.get_params_passed_to_core('selftest --lsprof-tests')
 
152
        self.assertEqual(True, params[1]["lsprof_tests"])
 
153
 
 
154
    def test_parallel_fork_unsupported(self):
 
155
        if getattr(os, "fork", None) is not None:
 
156
            self.addCleanup(setattr, os, "fork", os.fork)
 
157
            del os.fork
 
158
        out, err = self.run_bzr(["selftest", "--parallel=fork", "-s", "bt.x"],
 
159
            retcode=3)
 
160
        self.assertIn("platform does not support fork", err)
 
161
        self.assertFalse(out)