/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/tests/blackbox/test_selftest.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2006-09-16 01:57:02 UTC
  • mfrom: (2014.1.1 update-deprecated)
  • Revision ID: pqm@pqm.ubuntu.com-20060916015702-d6561b23f958bfdd
(jam) don't use deprecated pending_merges for 'bzr update'

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006-2010 Canonical Ltd
 
1
# Copyright (C) 2005 by 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 as published by
5
 
# the Free Software Foundation; either version 2 of the License, or
6
 
# (at your option) any later version.
 
4
# it under the terms of the GNU General Public License version 2 as published by
 
5
# the Free Software Foundation.
7
6
#
8
7
# This program is distributed in the hope that it will be useful,
9
8
# but WITHOUT ANY WARRANTY; without even the implied warranty of
12
11
#
13
12
# You should have received a copy of the GNU General Public License
14
13
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
14
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
15
 
17
16
"""UI tests for the test framework."""
18
17
 
 
18
import os
 
19
import signal
 
20
import sys
 
21
 
 
22
import bzrlib
19
23
from bzrlib import (
20
 
    benchmarks,
21
 
    tests,
 
24
    osutils,
22
25
    )
 
26
from bzrlib.errors import ParamikoNotPresent
23
27
from bzrlib.tests import (
24
 
    features,
25
 
    )
26
 
from bzrlib.transport import memory
27
 
 
28
 
class SelfTestPatch:
29
 
 
30
 
    def get_params_passed_to_core(self, cmdline):
31
 
        params = []
32
 
        def selftest(*args, **kwargs):
33
 
            """Capture the arguments selftest was run with."""
34
 
            params.append((args, kwargs))
35
 
            return True
36
 
        # Yes this prevents using threads to run the test suite in parallel,
37
 
        # however we don't have a clean dependency injector for commands, 
38
 
        # and even if we did - we'd still be testing that the glue is wired
39
 
        # up correctly. XXX: TODO: Solve this testing problem.
40
 
        original_selftest = tests.selftest
41
 
        tests.selftest = selftest
42
 
        try:
43
 
            self.run_bzr(cmdline)
44
 
            return params[0]
 
28
                          TestCase,
 
29
                          TestCaseInTempDir,
 
30
                          TestCaseWithTransport,
 
31
                          TestSkipped,
 
32
                          )
 
33
from bzrlib.tests.blackbox import ExternalBase
 
34
 
 
35
 
 
36
class TestOptions(TestCase):
 
37
 
 
38
    current_test = None
 
39
 
 
40
    def test_transport_set_to_sftp(self):
 
41
        # test the --transport option has taken effect from within the
 
42
        # test_transport test
 
43
        try:
 
44
            import bzrlib.transport.sftp
 
45
        except ParamikoNotPresent:
 
46
            raise TestSkipped("Paramiko not present")
 
47
        if TestOptions.current_test != "test_transport_set_to_sftp":
 
48
            return
 
49
        self.assertEqual(bzrlib.transport.sftp.SFTPAbsoluteServer,
 
50
                         bzrlib.tests.default_transport)
 
51
 
 
52
    def test_transport_set_to_memory(self):
 
53
        # test the --transport option has taken effect from within the
 
54
        # test_transport test
 
55
        import bzrlib.transport.memory
 
56
        if TestOptions.current_test != "test_transport_set_to_memory":
 
57
            return
 
58
        self.assertEqual(bzrlib.transport.memory.MemoryServer,
 
59
                         bzrlib.tests.default_transport)
 
60
 
 
61
    def test_transport(self):
 
62
        # test that --transport=sftp works
 
63
        try:
 
64
            import bzrlib.transport.sftp
 
65
        except ParamikoNotPresent:
 
66
            raise TestSkipped("Paramiko not present")
 
67
        old_transport = bzrlib.tests.default_transport
 
68
        old_root = TestCaseInTempDir.TEST_ROOT
 
69
        TestCaseInTempDir.TEST_ROOT = None
 
70
        try:
 
71
            TestOptions.current_test = "test_transport_set_to_sftp"
 
72
            stdout = self.capture('selftest --transport=sftp test_transport_set_to_sftp')
 
73
            
 
74
            self.assertContainsRe(stdout, 'Ran 1 test')
 
75
            self.assertEqual(old_transport, bzrlib.tests.default_transport)
 
76
 
 
77
            TestOptions.current_test = "test_transport_set_to_memory"
 
78
            stdout = self.capture('selftest --transport=memory test_transport_set_to_memory')
 
79
            self.assertContainsRe(stdout, 'Ran 1 test')
 
80
            self.assertEqual(old_transport, bzrlib.tests.default_transport)
45
81
        finally:
46
 
            tests.selftest = original_selftest
47
 
 
48
 
 
49
 
class TestOptionsWritingToDisk(tests.TestCaseInTempDir, SelfTestPatch):
 
82
            bzrlib.tests.default_transport = old_transport
 
83
            TestOptions.current_test = None
 
84
            TestCaseInTempDir.TEST_ROOT = old_root
 
85
 
 
86
 
 
87
class TestRunBzr(ExternalBase):
 
88
 
 
89
    def run_bzr_captured(self, argv, retcode=0, encoding=None, stdin=None):
 
90
        self.stdin = stdin
 
91
 
 
92
    def test_stdin(self):
 
93
        # test that the stdin keyword to run_bzr is passed through to
 
94
        # run_bzr_captured as-is. We do this by overriding
 
95
        # run_bzr_captured in this class, and then calling run_bzr,
 
96
        # which is a convenience function for run_bzr_captured, so 
 
97
        # should invoke it.
 
98
        self.run_bzr('foo', 'bar', stdin='gam')
 
99
        self.assertEqual('gam', self.stdin)
 
100
        self.run_bzr('foo', 'bar', stdin='zippy')
 
101
        self.assertEqual('zippy', self.stdin)
 
102
 
 
103
 
 
104
class TestBenchmarkTests(TestCaseWithTransport):
50
105
 
51
106
    def test_benchmark_runs_benchmark_tests(self):
52
 
        """selftest --benchmark should change the suite factory."""
53
 
        params = self.get_params_passed_to_core('selftest --benchmark')
54
 
        self.assertEqual(benchmarks.test_suite,
55
 
            params[1]['test_suite_factory'])
56
 
        self.assertNotEqual(None, params[1]['bench_history'])
 
107
        """bzr selftest --benchmark should not run the default test suite."""
 
108
        # We test this by passing a regression test name to --benchmark, which
 
109
        # should result in 0 rests run.
 
110
        old_root = TestCaseInTempDir.TEST_ROOT
 
111
        try:
 
112
            TestCaseInTempDir.TEST_ROOT = None
 
113
            out, err = self.run_bzr('selftest', '--benchmark', 'workingtree_implementations')
 
114
        finally:
 
115
            TestCaseInTempDir.TEST_ROOT = old_root
 
116
        self.assertContainsRe(out, 'Ran 0 tests.*\n\nOK')
 
117
        self.assertEqual(
 
118
            'running tests...\ntests passed\n',
 
119
            err)
57
120
        benchfile = open(".perf_history", "rt")
58
121
        try:
59
122
            lines = benchfile.readlines()
60
123
        finally:
61
124
            benchfile.close()
62
 
        # Because we don't run the actual test code no output is made to the
63
 
        # file.
64
 
        self.assertEqual(0, len(lines))
65
 
 
66
 
 
67
 
class TestOptions(tests.TestCase, SelfTestPatch):
68
 
 
69
 
    def test_load_list(self):
70
 
        params = self.get_params_passed_to_core('selftest --load-list foo')
71
 
        self.assertEqual('foo', params[1]['load_list'])
72
 
 
73
 
    def test_transport_set_to_sftp(self):
74
 
        # Test that we can pass a transport to the selftest core - sftp
75
 
        # version.
76
 
        self.requireFeature(features.paramiko)
77
 
        from bzrlib.tests import stub_sftp
78
 
        params = self.get_params_passed_to_core('selftest --transport=sftp')
79
 
        self.assertEqual(stub_sftp.SFTPAbsoluteServer,
80
 
            params[1]["transport"])
81
 
 
82
 
    def test_transport_set_to_memory(self):
83
 
        # Test that we can pass a transport to the selftest core - memory
84
 
        # version.
85
 
        params = self.get_params_passed_to_core('selftest --transport=memory')
86
 
        self.assertEqual(memory.MemoryServer, params[1]["transport"])
87
 
 
88
 
    def test_parameters_passed_to_core(self):
89
 
        params = self.get_params_passed_to_core('selftest --list-only')
90
 
        self.assertTrue("list_only" in params[1])
91
 
        params = self.get_params_passed_to_core('selftest --list-only selftest')
92
 
        self.assertTrue("list_only" in params[1])
93
 
        params = self.get_params_passed_to_core(['selftest', '--list-only',
94
 
            '--exclude', 'selftest'])
95
 
        self.assertTrue("list_only" in params[1])
96
 
        params = self.get_params_passed_to_core(['selftest', '--list-only',
97
 
            'selftest', '--randomize', 'now'])
98
 
        self.assertSubset(["list_only", "random_seed"], params[1])
99
 
 
100
 
    def test_starting_with(self):
101
 
        params = self.get_params_passed_to_core('selftest --starting-with foo')
102
 
        self.assertEqual(['foo'], params[1]['starting_with'])
103
 
 
104
 
    def test_starting_with_multiple_argument(self):
105
 
        params = self.get_params_passed_to_core(
106
 
            'selftest --starting-with foo --starting-with bar')
107
 
        self.assertEqual(['foo', 'bar'], params[1]['starting_with'])
108
 
 
109
 
    def test_subunit(self):
110
 
        self.requireFeature(features.subunit)
111
 
        params = self.get_params_passed_to_core('selftest --subunit')
112
 
        self.assertEqual(tests.SubUnitBzrRunner, params[1]['runner_class'])
113
 
 
114
 
    def _parse_test_list(self, lines, newlines_in_header=0):
115
 
        "Parse a list of lines into a tuple of 3 lists (header,body,footer)."
116
 
        in_header = newlines_in_header != 0
117
 
        in_footer = False
118
 
        header = []
119
 
        body = []
120
 
        footer = []
121
 
        header_newlines_found = 0
122
 
        for line in lines:
123
 
            if in_header:
124
 
                if line == '':
125
 
                    header_newlines_found += 1
126
 
                    if header_newlines_found >= newlines_in_header:
127
 
                        in_header = False
128
 
                        continue
129
 
                header.append(line)
130
 
            elif not in_footer:
131
 
                if line.startswith('-------'):
132
 
                    in_footer = True
133
 
                else:
134
 
                    body.append(line)
135
 
            else:
136
 
                footer.append(line)
137
 
        # If the last body line is blank, drop it off the list
138
 
        if len(body) > 0 and body[-1] == '':
139
 
            body.pop()
140
 
        return (header,body,footer)
141
 
 
142
 
    def test_list_only(self):
143
 
        # check that bzr selftest --list-only outputs no ui noise
144
 
        def selftest(*args, **kwargs):
145
 
            """Capture the arguments selftest was run with."""
146
 
            return True
147
 
        def outputs_nothing(cmdline):
148
 
            out,err = self.run_bzr(cmdline)
149
 
            (header,body,footer) = self._parse_test_list(out.splitlines())
150
 
            num_tests = len(body)
151
 
            self.assertLength(0, header)
152
 
            self.assertLength(0, footer)
153
 
            self.assertEqual('', err)
154
 
        # Yes this prevents using threads to run the test suite in parallel,
155
 
        # however we don't have a clean dependency injector for commands, 
156
 
        # and even if we did - we'd still be testing that the glue is wired
157
 
        # up correctly. XXX: TODO: Solve this testing problem.
158
 
        original_selftest = tests.selftest
159
 
        tests.selftest = selftest
 
125
        self.assertEqual(1, len(lines))
 
126
        self.assertContainsRe(lines[0], "--date [0-9.]+")
 
127
 
 
128
 
 
129
class TestRunBzrCaptured(ExternalBase):
 
130
 
 
131
    def apply_redirected(self, stdin=None, stdout=None, stderr=None,
 
132
                         a_callable=None, *args, **kwargs):
 
133
        self.stdin = stdin
 
134
        self.factory_stdin = getattr(bzrlib.ui.ui_factory, "stdin", None)
 
135
        self.factory = bzrlib.ui.ui_factory
 
136
        stdout.write('foo\n')
 
137
        stderr.write('bar\n')
 
138
        return 0
 
139
 
 
140
    def test_stdin(self):
 
141
        # test that the stdin keyword to run_bzr_captured is passed through to
 
142
        # apply_redirected as a StringIO. We do this by overriding
 
143
        # apply_redirected in this class, and then calling run_bzr_captured,
 
144
        # which calls apply_redirected. 
 
145
        self.run_bzr_captured(['foo', 'bar'], stdin='gam')
 
146
        self.assertEqual('gam', self.stdin.read())
 
147
        self.assertTrue(self.stdin is self.factory_stdin)
 
148
        self.run_bzr_captured(['foo', 'bar'], stdin='zippy')
 
149
        self.assertEqual('zippy', self.stdin.read())
 
150
        self.assertTrue(self.stdin is self.factory_stdin)
 
151
 
 
152
    def test_ui_factory(self):
 
153
        # each invocation of self.run_bzr_captured should get its own UI
 
154
        # factory, which is an instance of TestUIFactory, with stdout and
 
155
        # stderr attached to the stdout and stderr of the invoked
 
156
        # run_bzr_captured
 
157
        current_factory = bzrlib.ui.ui_factory
 
158
        self.run_bzr_captured(['foo'])
 
159
        self.failIf(current_factory is self.factory)
 
160
        self.assertNotEqual(sys.stdout, self.factory.stdout)
 
161
        self.assertNotEqual(sys.stderr, self.factory.stderr)
 
162
        self.assertEqual('foo\n', self.factory.stdout.getvalue())
 
163
        self.assertEqual('bar\n', self.factory.stderr.getvalue())
 
164
        self.assertIsInstance(self.factory, bzrlib.tests.blackbox.TestUIFactory)
 
165
 
 
166
    def test_run_bzr_subprocess(self):
 
167
        """The run_bzr_helper_external comand behaves nicely."""
 
168
        result = self.run_bzr_subprocess('--version')
 
169
        result = self.run_bzr_subprocess('--version', retcode=None)
 
170
        self.assertContainsRe(result[0], 'is free software')
 
171
        self.assertRaises(AssertionError, self.run_bzr_subprocess, 
 
172
                          '--versionn')
 
173
        result = self.run_bzr_subprocess('--versionn', retcode=3)
 
174
        result = self.run_bzr_subprocess('--versionn', retcode=None)
 
175
        self.assertContainsRe(result[1], 'unknown command')
 
176
        err = self.run_bzr_subprocess('merge', '--merge-type', 'magic merge', 
 
177
                                      retcode=3)[1]
 
178
        self.assertContainsRe(err, 'No known merge type magic merge')
 
179
 
 
180
    def test_run_bzr_subprocess_env(self):
 
181
        """run_bzr_subprocess can set environment variables in the child only.
 
182
 
 
183
        These changes should not change the running process, only the child.
 
184
        """
 
185
        # The test suite should unset this variable
 
186
        self.assertEqual(None, os.environ.get('BZR_EMAIL'))
 
187
        out, err = self.run_bzr_subprocess('whoami', env_changes={
 
188
                                            'BZR_EMAIL':'Joe Foo <joe@foo.com>'
 
189
                                          }, universal_newlines=True)
 
190
        self.assertEqual('', err)
 
191
        self.assertEqual('Joe Foo <joe@foo.com>\n', out)
 
192
        # And it should not be modified
 
193
        self.assertEqual(None, os.environ.get('BZR_EMAIL'))
 
194
 
 
195
        # Do it again with a different address, just to make sure
 
196
        # it is actually changing
 
197
        out, err = self.run_bzr_subprocess('whoami', env_changes={
 
198
                                            'BZR_EMAIL':'Barry <bar@foo.com>'
 
199
                                          }, universal_newlines=True)
 
200
        self.assertEqual('', err)
 
201
        self.assertEqual('Barry <bar@foo.com>\n', out)
 
202
        self.assertEqual(None, os.environ.get('BZR_EMAIL'))
 
203
 
 
204
    def test_run_bzr_subprocess_env_del(self):
 
205
        """run_bzr_subprocess can remove environment variables too."""
 
206
        # Create a random email, so we are sure this won't collide
 
207
        rand_bzr_email = 'John Doe <jdoe@%s.com>' % (osutils.rand_chars(20),)
 
208
        rand_email = 'Jane Doe <jdoe@%s.com>' % (osutils.rand_chars(20),)
 
209
        os.environ['BZR_EMAIL'] = rand_bzr_email
 
210
        os.environ['EMAIL'] = rand_email
160
211
        try:
161
 
            outputs_nothing('selftest --list-only')
162
 
            outputs_nothing('selftest --list-only selftest')
163
 
            outputs_nothing(['selftest', '--list-only', '--exclude', 'selftest'])
 
212
            # By default, the child will inherit the current env setting
 
213
            out, err = self.run_bzr_subprocess('whoami', universal_newlines=True)
 
214
            self.assertEqual('', err)
 
215
            self.assertEqual(rand_bzr_email + '\n', out)
 
216
 
 
217
            # Now that BZR_EMAIL is not set, it should fall back to EMAIL
 
218
            out, err = self.run_bzr_subprocess('whoami',
 
219
                                               env_changes={'BZR_EMAIL':None},
 
220
                                               universal_newlines=True)
 
221
            self.assertEqual('', err)
 
222
            self.assertEqual(rand_email + '\n', out)
 
223
 
 
224
            # This switches back to the default email guessing logic
 
225
            # Which shouldn't match either of the above addresses
 
226
            out, err = self.run_bzr_subprocess('whoami',
 
227
                           env_changes={'BZR_EMAIL':None, 'EMAIL':None},
 
228
                           universal_newlines=True)
 
229
 
 
230
            self.assertEqual('', err)
 
231
            self.assertNotEqual(rand_bzr_email + '\n', out)
 
232
            self.assertNotEqual(rand_email + '\n', out)
164
233
        finally:
165
 
            tests.selftest = original_selftest
166
 
 
167
 
    def test_lsprof_tests(self):
168
 
        params = self.get_params_passed_to_core('selftest --lsprof-tests')
169
 
        self.assertEqual(True, params[1]["lsprof_tests"])
 
234
            # TestCase cleans up BZR_EMAIL, and EMAIL at startup
 
235
            del os.environ['BZR_EMAIL']
 
236
            del os.environ['EMAIL']
 
237
 
 
238
    def test_run_bzr_subprocess_env_del_missing(self):
 
239
        """run_bzr_subprocess won't fail if deleting a nonexistant env var"""
 
240
        self.failIf('NON_EXISTANT_ENV_VAR' in os.environ)
 
241
        out, err = self.run_bzr_subprocess('rocks',
 
242
                        env_changes={'NON_EXISTANT_ENV_VAR':None},
 
243
                        universal_newlines=True)
 
244
        self.assertEqual('it sure does!\n', out)
 
245
        self.assertEqual('', err)
 
246
 
 
247
    def test_start_and_stop_bzr_subprocess(self):
 
248
        """We can start and perform other test actions while that process is
 
249
        still alive.
 
250
        """
 
251
        process = self.start_bzr_subprocess(['--version'])
 
252
        result = self.finish_bzr_subprocess(process)
 
253
        self.assertContainsRe(result[0], 'is free software')
 
254
        self.assertEqual('', result[1])
 
255
 
 
256
    def test_start_and_stop_bzr_subprocess_with_error(self):
 
257
        """finish_bzr_subprocess allows specification of the desired exit code.
 
258
        """
 
259
        process = self.start_bzr_subprocess(['--versionn'])
 
260
        result = self.finish_bzr_subprocess(process, retcode=3)
 
261
        self.assertEqual('', result[0])
 
262
        self.assertContainsRe(result[1], 'unknown command')
 
263
 
 
264
    def test_start_and_stop_bzr_subprocess_ignoring_retcode(self):
 
265
        """finish_bzr_subprocess allows the exit code to be ignored."""
 
266
        process = self.start_bzr_subprocess(['--versionn'])
 
267
        result = self.finish_bzr_subprocess(process, retcode=None)
 
268
        self.assertEqual('', result[0])
 
269
        self.assertContainsRe(result[1], 'unknown command')
 
270
 
 
271
    def test_start_and_stop_bzr_subprocess_with_unexpected_retcode(self):
 
272
        """finish_bzr_subprocess raises self.failureException if the retcode is
 
273
        not the expected one.
 
274
        """
 
275
        process = self.start_bzr_subprocess(['--versionn'])
 
276
        self.assertRaises(self.failureException, self.finish_bzr_subprocess,
 
277
                          process, retcode=0)
 
278
        
 
279
    def test_start_and_stop_bzr_subprocess_send_signal(self):
 
280
        """finish_bzr_subprocess raises self.failureException if the retcode is
 
281
        not the expected one.
 
282
        """
 
283
        process = self.start_bzr_subprocess(['wait-until-signalled'],
 
284
                                            skip_if_plan_to_signal=True)
 
285
        self.assertEqual('running\n', process.stdout.readline())
 
286
        result = self.finish_bzr_subprocess(process, send_signal=signal.SIGINT,
 
287
                                            retcode=3)
 
288
        self.assertEqual('', result[0])
 
289
        self.assertEqual('bzr: interrupted\n', result[1])
 
290
        
 
291
 
 
292
class TestRunBzrError(ExternalBase):
 
293
 
 
294
    def test_run_bzr_error(self):
 
295
        out, err = self.run_bzr_error(['^$'], 'rocks', retcode=0)
 
296
        self.assertEqual(out, 'it sure does!\n')
 
297
 
 
298
        out, err = self.run_bzr_error(["'foobarbaz' is not a versioned file"],
 
299
                                      'file-id', 'foobarbaz')