~bzr-pqm/bzr/bzr.dev

2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
1
# Copyright (C) 2005, 2007 Canonical Ltd
1534.4.25 by Robert Collins
Add a --transport parameter to the test suite to set the default transport to be used in the test suite.
2
#
3
# This program is free software; you can redistribute it and/or modify
2052.3.1 by John Arbash Meinel
Add tests to cleanup the copyright of all source files
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.
1534.4.25 by Robert Collins
Add a --transport parameter to the test suite to set the default transport to be used in the test suite.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
#
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1534.4.25 by Robert Collins
Add a --transport parameter to the test suite to set the default transport to be used in the test suite.
16
17
"""UI tests for the test framework."""
18
4165.1.1 by Robert Collins
Add builtin subunit support.
19
from cStringIO import StringIO
1963.1.1 by John Arbash Meinel
run_bzr_subprocess() can take an env_changes parameter
20
import os
2394.2.5 by Ian Clatworthy
list-only working, include test not
21
import re
1910.17.2 by Andrew Bennetts
Add start_bzr_subprocess and stop_bzr_subprocess to allow test code to continue
22
import signal
1692.3.3 by Robert Collins
Get run_bzr in tests to always assign a new, clean ui factory.
23
import sys
4165.1.1 by Robert Collins
Add builtin subunit support.
24
import unittest
1692.3.3 by Robert Collins
Get run_bzr in tests to always assign a new, clean ui factory.
25
1534.4.25 by Robert Collins
Add a --transport parameter to the test suite to set the default transport to be used in the test suite.
26
import bzrlib
1963.1.2 by John Arbash Meinel
Cleanups suggested by Martin, add test that env_changes can remove an env variable
27
from bzrlib import (
28
    osutils,
29
    )
2394.2.3 by Ian Clatworthy
Backed out test junk
30
from bzrlib.errors import ParamikoNotPresent
1534.4.25 by Robert Collins
Add a --transport parameter to the test suite to set the default transport to be used in the test suite.
31
from bzrlib.tests import (
4165.1.1 by Robert Collins
Add builtin subunit support.
32
                          SubUnitFeature,
1534.4.25 by Robert Collins
Add a --transport parameter to the test suite to set the default transport to be used in the test suite.
33
                          TestCase,
2172.4.3 by Alexander Belchenko
Change name of option to '--clean-output' and provide tests
34
                          TestCaseInTempDir,
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
35
                          TestCaseWithMemoryTransport,
1819.1.3 by Carl Friedrich Bolz
(lifeless, cfbolz): Add recording of benchmark results to the benchmark history
36
                          TestCaseWithTransport,
2294.4.4 by Vincent Ladeuil
Provide a better implementation for testing passwords.
37
                          TestUIFactory,
1534.4.25 by Robert Collins
Add a --transport parameter to the test suite to set the default transport to be used in the test suite.
38
                          TestSkipped,
39
                          )
1687.1.2 by Robert Collins
Add stdin parameter to run_bzr and run_bzr_captured.
40
from bzrlib.tests.blackbox import ExternalBase
1534.4.25 by Robert Collins
Add a --transport parameter to the test suite to set the default transport to be used in the test suite.
41
42
43
class TestOptions(TestCase):
44
45
    current_test = None
46
47
    def test_transport_set_to_sftp(self):
48
        # test the --transport option has taken effect from within the
49
        # test_transport test
1551.2.47 by abentley
Fixed test_selftest's use of sftp
50
        try:
51
            import bzrlib.transport.sftp
52
        except ParamikoNotPresent:
53
            raise TestSkipped("Paramiko not present")
1534.4.25 by Robert Collins
Add a --transport parameter to the test suite to set the default transport to be used in the test suite.
54
        if TestOptions.current_test != "test_transport_set_to_sftp":
55
            return
56
        self.assertEqual(bzrlib.transport.sftp.SFTPAbsoluteServer,
57
                         bzrlib.tests.default_transport)
58
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
59
    def test_transport_set_to_memory(self):
60
        # test the --transport option has taken effect from within the
61
        # test_transport test
62
        import bzrlib.transport.memory
63
        if TestOptions.current_test != "test_transport_set_to_memory":
64
            return
65
        self.assertEqual(bzrlib.transport.memory.MemoryServer,
66
                         bzrlib.tests.default_transport)
67
1534.4.25 by Robert Collins
Add a --transport parameter to the test suite to set the default transport to be used in the test suite.
68
    def test_transport(self):
69
        # test that --transport=sftp works
1551.2.47 by abentley
Fixed test_selftest's use of sftp
70
        try:
71
            import bzrlib.transport.sftp
72
        except ParamikoNotPresent:
73
            raise TestSkipped("Paramiko not present")
1534.4.25 by Robert Collins
Add a --transport parameter to the test suite to set the default transport to be used in the test suite.
74
        old_transport = bzrlib.tests.default_transport
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
75
        old_root = TestCaseWithMemoryTransport.TEST_ROOT
76
        TestCaseWithMemoryTransport.TEST_ROOT = None
1534.4.25 by Robert Collins
Add a --transport parameter to the test suite to set the default transport to be used in the test suite.
77
        try:
78
            TestOptions.current_test = "test_transport_set_to_sftp"
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
79
            stdout = self.run_bzr(
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
80
                'selftest --transport=sftp test_transport_set_to_sftp')[0]
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
81
            self.assertContainsRe(stdout, 'Ran 1 test')
82
            self.assertEqual(old_transport, bzrlib.tests.default_transport)
83
84
            TestOptions.current_test = "test_transport_set_to_memory"
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
85
            stdout = self.run_bzr(
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
86
                'selftest --transport=memory test_transport_set_to_memory')[0]
1534.4.25 by Robert Collins
Add a --transport parameter to the test suite to set the default transport to be used in the test suite.
87
            self.assertContainsRe(stdout, 'Ran 1 test')
88
            self.assertEqual(old_transport, bzrlib.tests.default_transport)
89
        finally:
90
            bzrlib.tests.default_transport = old_transport
91
            TestOptions.current_test = None
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
92
            TestCaseWithMemoryTransport.TEST_ROOT = old_root
1687.1.2 by Robert Collins
Add stdin parameter to run_bzr and run_bzr_captured.
93
4165.1.1 by Robert Collins
Add builtin subunit support.
94
    def test_subunit(self):
95
        """Passing --subunit results in subunit output."""
96
        self.requireFeature(SubUnitFeature)
97
        from subunit import ProtocolTestCase
98
        stdout = self.run_bzr(
99
            'selftest --subunit --no-plugins '
100
            'tests.test_selftest.SelftestTests.test_import_tests')[0]
101
        stream = StringIO(str(stdout))
102
        test = ProtocolTestCase(stream)
103
        result = unittest.TestResult()
104
        test.run(result)
105
        # 1 to deal with the 'test:' noise at the start, and 1 for the one we
106
        # ran.
107
        self.assertEqual(2, result.testsRun)
108
1687.1.2 by Robert Collins
Add stdin parameter to run_bzr and run_bzr_captured.
109
110
class TestRunBzr(ExternalBase):
111
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
112
    def _run_bzr_core(self, argv, retcode=0, encoding=None, stdin=None,
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
113
                         working_dir=None):
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
114
        """Override _run_bzr_core to test how it is invoked by run_bzr.
2552.2.1 by Vincent Ladeuil
apply martin patch
115
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
116
        Attempts to run bzr from inside this class don't actually run it.
117
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
118
        We test how run_bzr actually invokes bzr in another location.
2027.5.3 by John Arbash Meinel
Add docstring to why run_bzr_captured is overridden
119
        Here we only need to test that it is run_bzr passes the right
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
120
        parameters to run_bzr.
2027.5.3 by John Arbash Meinel
Add docstring to why run_bzr_captured is overridden
121
        """
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
122
        self.argv = list(argv)
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
123
        self.retcode = retcode
124
        self.encoding = encoding
1687.1.2 by Robert Collins
Add stdin parameter to run_bzr and run_bzr_captured.
125
        self.stdin = stdin
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
126
        self.working_dir = working_dir
2292.1.28 by Marius Kruger
* NEWS
127
        return '', ''
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
128
129
    def test_encoding(self):
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
130
        """Test that run_bzr passes encoding to _run_bzr_core"""
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
131
        self.run_bzr('foo bar')
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
132
        self.assertEqual(None, self.encoding)
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
133
        self.assertEqual(['foo', 'bar'], self.argv)
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
134
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
135
        self.run_bzr('foo bar', encoding='baz')
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
136
        self.assertEqual('baz', self.encoding)
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
137
        self.assertEqual(['foo', 'bar'], self.argv)
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
138
139
    def test_retcode(self):
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
140
        """Test that run_bzr passes retcode to _run_bzr_core"""
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
141
        # Default is retcode == 0
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
142
        self.run_bzr('foo bar')
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
143
        self.assertEqual(0, self.retcode)
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
144
        self.assertEqual(['foo', 'bar'], self.argv)
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
145
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
146
        self.run_bzr('foo bar', retcode=1)
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
147
        self.assertEqual(1, self.retcode)
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
148
        self.assertEqual(['foo', 'bar'], self.argv)
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
149
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
150
        self.run_bzr('foo bar', retcode=None)
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
151
        self.assertEqual(None, self.retcode)
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
152
        self.assertEqual(['foo', 'bar'], self.argv)
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
153
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
154
        self.run_bzr(['foo', 'bar'], retcode=3)
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
155
        self.assertEqual(3, self.retcode)
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
156
        self.assertEqual(['foo', 'bar'], self.argv)
1687.1.2 by Robert Collins
Add stdin parameter to run_bzr and run_bzr_captured.
157
158
    def test_stdin(self):
159
        # test that the stdin keyword to run_bzr is passed through to
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
160
        # _run_bzr_core as-is. We do this by overriding
161
        # _run_bzr_core in this class, and then calling run_bzr,
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
162
        # which is a convenience function for _run_bzr_core, so
1687.1.15 by Robert Collins
Review comments.
163
        # should invoke it.
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
164
        self.run_bzr('foo bar', stdin='gam')
1687.1.2 by Robert Collins
Add stdin parameter to run_bzr and run_bzr_captured.
165
        self.assertEqual('gam', self.stdin)
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
166
        self.assertEqual(['foo', 'bar'], self.argv)
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
167
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
168
        self.run_bzr('foo bar', stdin='zippy')
1687.1.2 by Robert Collins
Add stdin parameter to run_bzr and run_bzr_captured.
169
        self.assertEqual('zippy', self.stdin)
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
170
        self.assertEqual(['foo', 'bar'], self.argv)
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
171
172
    def test_working_dir(self):
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
173
        """Test that run_bzr passes working_dir to _run_bzr_core"""
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
174
        self.run_bzr('foo bar')
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
175
        self.assertEqual(None, self.working_dir)
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
176
        self.assertEqual(['foo', 'bar'], self.argv)
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
177
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
178
        self.run_bzr('foo bar', working_dir='baz')
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
179
        self.assertEqual('baz', self.working_dir)
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
180
        self.assertEqual(['foo', 'bar'], self.argv)
1687.1.2 by Robert Collins
Add stdin parameter to run_bzr and run_bzr_captured.
181
2665.1.1 by Michael Hudson
make run_bzr stricter about the keyword arguments it takes.
182
    def test_reject_extra_keyword_arguments(self):
183
        self.assertRaises(TypeError, self.run_bzr, "foo bar",
184
                          error_regex=['error message'])
185
1687.1.2 by Robert Collins
Add stdin parameter to run_bzr and run_bzr_captured.
186
1819.1.3 by Carl Friedrich Bolz
(lifeless, cfbolz): Add recording of benchmark results to the benchmark history
187
class TestBenchmarkTests(TestCaseWithTransport):
188
189
    def test_benchmark_runs_benchmark_tests(self):
190
        """bzr selftest --benchmark should not run the default test suite."""
191
        # We test this by passing a regression test name to --benchmark, which
3111.1.23 by Vincent Ladeuil
Make HTTP/1.1 the default implementation reveals one more bug.
192
        # should result in 0 tests run.
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
193
        old_root = TestCaseWithMemoryTransport.TEST_ROOT
1819.1.3 by Carl Friedrich Bolz
(lifeless, cfbolz): Add recording of benchmark results to the benchmark history
194
        try:
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
195
            TestCaseWithMemoryTransport.TEST_ROOT = None
2552.2.4 by Vincent Ladeuil
Merge bzr.dev and resolve conflits. (good use case for an enhanced merge
196
            out, err = self.run_bzr('selftest --benchmark'
197
                                    ' workingtree_implementations')
1819.1.3 by Carl Friedrich Bolz
(lifeless, cfbolz): Add recording of benchmark results to the benchmark history
198
        finally:
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
199
            TestCaseWithMemoryTransport.TEST_ROOT = old_root
1819.1.3 by Carl Friedrich Bolz
(lifeless, cfbolz): Add recording of benchmark results to the benchmark history
200
        self.assertContainsRe(out, 'Ran 0 tests.*\n\nOK')
201
        self.assertEqual(
2095.4.1 by Martin Pool
Better progress bars during tests
202
            'tests passed\n',
1819.1.3 by Carl Friedrich Bolz
(lifeless, cfbolz): Add recording of benchmark results to the benchmark history
203
            err)
204
        benchfile = open(".perf_history", "rt")
205
        try:
206
            lines = benchfile.readlines()
207
        finally:
208
            benchfile.close()
209
        self.assertEqual(1, len(lines))
210
        self.assertContainsRe(lines[0], "--date [0-9.]+")
211
212
1687.1.2 by Robert Collins
Add stdin parameter to run_bzr and run_bzr_captured.
213
class TestRunBzrCaptured(ExternalBase):
214
215
    def apply_redirected(self, stdin=None, stdout=None, stderr=None,
216
                         a_callable=None, *args, **kwargs):
217
        self.stdin = stdin
1687.1.11 by Robert Collins
Teach TestCase.run_bzr_captured about the ui factories.
218
        self.factory_stdin = getattr(bzrlib.ui.ui_factory, "stdin", None)
1692.3.3 by Robert Collins
Get run_bzr in tests to always assign a new, clean ui factory.
219
        self.factory = bzrlib.ui.ui_factory
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
220
        self.working_dir = osutils.getcwd()
1692.3.3 by Robert Collins
Get run_bzr in tests to always assign a new, clean ui factory.
221
        stdout.write('foo\n')
222
        stderr.write('bar\n')
1687.1.2 by Robert Collins
Add stdin parameter to run_bzr and run_bzr_captured.
223
        return 0
224
225
    def test_stdin(self):
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
226
        # test that the stdin keyword to _run_bzr_core is passed through to
1687.1.15 by Robert Collins
Review comments.
227
        # apply_redirected as a StringIO. We do this by overriding
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
228
        # apply_redirected in this class, and then calling _run_bzr_core,
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
229
        # which calls apply_redirected.
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
230
        self.run_bzr(['foo', 'bar'], stdin='gam')
1687.1.2 by Robert Collins
Add stdin parameter to run_bzr and run_bzr_captured.
231
        self.assertEqual('gam', self.stdin.read())
1687.1.11 by Robert Collins
Teach TestCase.run_bzr_captured about the ui factories.
232
        self.assertTrue(self.stdin is self.factory_stdin)
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
233
        self.run_bzr(['foo', 'bar'], stdin='zippy')
1687.1.2 by Robert Collins
Add stdin parameter to run_bzr and run_bzr_captured.
234
        self.assertEqual('zippy', self.stdin.read())
1687.1.11 by Robert Collins
Teach TestCase.run_bzr_captured about the ui factories.
235
        self.assertTrue(self.stdin is self.factory_stdin)
1692.3.3 by Robert Collins
Get run_bzr in tests to always assign a new, clean ui factory.
236
237
    def test_ui_factory(self):
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
238
        # each invocation of self.run_bzr should get its
2294.4.4 by Vincent Ladeuil
Provide a better implementation for testing passwords.
239
        # own UI factory, which is an instance of TestUIFactory,
240
        # with stdin, stdout and stderr attached to the stdin,
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
241
        # stdout and stderr of the invoked run_bzr
1692.3.3 by Robert Collins
Get run_bzr in tests to always assign a new, clean ui factory.
242
        current_factory = bzrlib.ui.ui_factory
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
243
        self.run_bzr(['foo'])
1692.3.3 by Robert Collins
Get run_bzr in tests to always assign a new, clean ui factory.
244
        self.failIf(current_factory is self.factory)
245
        self.assertNotEqual(sys.stdout, self.factory.stdout)
246
        self.assertNotEqual(sys.stderr, self.factory.stderr)
247
        self.assertEqual('foo\n', self.factory.stdout.getvalue())
248
        self.assertEqual('bar\n', self.factory.stderr.getvalue())
2294.4.4 by Vincent Ladeuil
Provide a better implementation for testing passwords.
249
        self.assertIsInstance(self.factory, TestUIFactory)
1871.1.1 by Robert Collins
Relocate bzrlib selftest external output tests to bzrlib/tests/blackbox/test_selftest.py.
250
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
251
    def test_working_dir(self):
252
        self.build_tree(['one/', 'two/'])
253
        cwd = osutils.getcwd()
254
255
        # Default is to work in the current directory
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
256
        self.run_bzr(['foo', 'bar'])
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
257
        self.assertEqual(cwd, self.working_dir)
258
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
259
        self.run_bzr(['foo', 'bar'], working_dir=None)
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
260
        self.assertEqual(cwd, self.working_dir)
261
2027.5.2 by John Arbash Meinel
add tests that the working directory is preserved, cleanup run_bzr_subprocess
262
        # The function should be run in the alternative directory
263
        # but afterwards the current working dir shouldn't be changed
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
264
        self.run_bzr(['foo', 'bar'], working_dir='one')
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
265
        self.assertNotEqual(cwd, self.working_dir)
266
        self.assertEndsWith(self.working_dir, 'one')
2027.5.2 by John Arbash Meinel
add tests that the working directory is preserved, cleanup run_bzr_subprocess
267
        self.assertEqual(cwd, osutils.getcwd())
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
268
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
269
        self.run_bzr(['foo', 'bar'], working_dir='two')
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
270
        self.assertNotEqual(cwd, self.working_dir)
271
        self.assertEndsWith(self.working_dir, 'two')
2027.5.2 by John Arbash Meinel
add tests that the working directory is preserved, cleanup run_bzr_subprocess
272
        self.assertEqual(cwd, osutils.getcwd())
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
273
274
275
class TestRunBzrSubprocess(TestCaseWithTransport):
276
1871.1.1 by Robert Collins
Relocate bzrlib selftest external output tests to bzrlib/tests/blackbox/test_selftest.py.
277
    def test_run_bzr_subprocess(self):
3565.2.1 by Christophe Troestler
(trivial) Corrected typos.
278
        """The run_bzr_helper_external command behaves nicely."""
1871.1.1 by Robert Collins
Relocate bzrlib selftest external output tests to bzrlib/tests/blackbox/test_selftest.py.
279
        result = self.run_bzr_subprocess('--version')
2665.4.1 by Aaron Bentley
teach run_bzr_subprocess to accept either a list of strings or a string
280
        result = self.run_bzr_subprocess(['--version'])
1871.1.1 by Robert Collins
Relocate bzrlib selftest external output tests to bzrlib/tests/blackbox/test_selftest.py.
281
        result = self.run_bzr_subprocess('--version', retcode=None)
282
        self.assertContainsRe(result[0], 'is free software')
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
283
        self.assertRaises(AssertionError, self.run_bzr_subprocess,
1871.1.1 by Robert Collins
Relocate bzrlib selftest external output tests to bzrlib/tests/blackbox/test_selftest.py.
284
                          '--versionn')
285
        result = self.run_bzr_subprocess('--versionn', retcode=3)
286
        result = self.run_bzr_subprocess('--versionn', retcode=None)
287
        self.assertContainsRe(result[1], 'unknown command')
2665.4.2 by Aaron Bentley
Update from review
288
        err = self.run_bzr_subprocess(['merge', '--merge-type',
289
                                      'magic merge'], retcode=3)[1]
2221.4.15 by Aaron Bentley
Use RegistryOption for merge type
290
        self.assertContainsRe(err, 'Bad value "magic merge" for option'
291
                              ' "merge-type"')
1871.1.1 by Robert Collins
Relocate bzrlib selftest external output tests to bzrlib/tests/blackbox/test_selftest.py.
292
1963.1.1 by John Arbash Meinel
run_bzr_subprocess() can take an env_changes parameter
293
    def test_run_bzr_subprocess_env(self):
294
        """run_bzr_subprocess can set environment variables in the child only.
295
296
        These changes should not change the running process, only the child.
297
        """
298
        # The test suite should unset this variable
299
        self.assertEqual(None, os.environ.get('BZR_EMAIL'))
300
        out, err = self.run_bzr_subprocess('whoami', env_changes={
301
                                            'BZR_EMAIL':'Joe Foo <joe@foo.com>'
1963.1.11 by John Arbash Meinel
Add a universal_newlines flag to run_bzr_subprocess, so we can be line-ending independent for tests
302
                                          }, universal_newlines=True)
1963.1.1 by John Arbash Meinel
run_bzr_subprocess() can take an env_changes parameter
303
        self.assertEqual('', err)
304
        self.assertEqual('Joe Foo <joe@foo.com>\n', out)
305
        # And it should not be modified
306
        self.assertEqual(None, os.environ.get('BZR_EMAIL'))
307
308
        # Do it again with a different address, just to make sure
309
        # it is actually changing
310
        out, err = self.run_bzr_subprocess('whoami', env_changes={
311
                                            'BZR_EMAIL':'Barry <bar@foo.com>'
1963.1.11 by John Arbash Meinel
Add a universal_newlines flag to run_bzr_subprocess, so we can be line-ending independent for tests
312
                                          }, universal_newlines=True)
1963.1.1 by John Arbash Meinel
run_bzr_subprocess() can take an env_changes parameter
313
        self.assertEqual('', err)
314
        self.assertEqual('Barry <bar@foo.com>\n', out)
315
        self.assertEqual(None, os.environ.get('BZR_EMAIL'))
316
1963.1.2 by John Arbash Meinel
Cleanups suggested by Martin, add test that env_changes can remove an env variable
317
    def test_run_bzr_subprocess_env_del(self):
318
        """run_bzr_subprocess can remove environment variables too."""
319
        # Create a random email, so we are sure this won't collide
320
        rand_bzr_email = 'John Doe <jdoe@%s.com>' % (osutils.rand_chars(20),)
321
        rand_email = 'Jane Doe <jdoe@%s.com>' % (osutils.rand_chars(20),)
322
        os.environ['BZR_EMAIL'] = rand_bzr_email
323
        os.environ['EMAIL'] = rand_email
324
        try:
325
            # By default, the child will inherit the current env setting
1963.1.11 by John Arbash Meinel
Add a universal_newlines flag to run_bzr_subprocess, so we can be line-ending independent for tests
326
            out, err = self.run_bzr_subprocess('whoami', universal_newlines=True)
1963.1.2 by John Arbash Meinel
Cleanups suggested by Martin, add test that env_changes can remove an env variable
327
            self.assertEqual('', err)
328
            self.assertEqual(rand_bzr_email + '\n', out)
329
330
            # Now that BZR_EMAIL is not set, it should fall back to EMAIL
331
            out, err = self.run_bzr_subprocess('whoami',
1963.1.11 by John Arbash Meinel
Add a universal_newlines flag to run_bzr_subprocess, so we can be line-ending independent for tests
332
                                               env_changes={'BZR_EMAIL':None},
333
                                               universal_newlines=True)
1963.1.2 by John Arbash Meinel
Cleanups suggested by Martin, add test that env_changes can remove an env variable
334
            self.assertEqual('', err)
335
            self.assertEqual(rand_email + '\n', out)
336
337
            # This switches back to the default email guessing logic
338
            # Which shouldn't match either of the above addresses
339
            out, err = self.run_bzr_subprocess('whoami',
1963.1.11 by John Arbash Meinel
Add a universal_newlines flag to run_bzr_subprocess, so we can be line-ending independent for tests
340
                           env_changes={'BZR_EMAIL':None, 'EMAIL':None},
341
                           universal_newlines=True)
1963.1.2 by John Arbash Meinel
Cleanups suggested by Martin, add test that env_changes can remove an env variable
342
343
            self.assertEqual('', err)
344
            self.assertNotEqual(rand_bzr_email + '\n', out)
345
            self.assertNotEqual(rand_email + '\n', out)
346
        finally:
347
            # TestCase cleans up BZR_EMAIL, and EMAIL at startup
348
            del os.environ['BZR_EMAIL']
349
            del os.environ['EMAIL']
1871.1.1 by Robert Collins
Relocate bzrlib selftest external output tests to bzrlib/tests/blackbox/test_selftest.py.
350
1963.1.4 by John Arbash Meinel
env_changes={} should be safe to remove variables that aren't there
351
    def test_run_bzr_subprocess_env_del_missing(self):
352
        """run_bzr_subprocess won't fail if deleting a nonexistant env var"""
353
        self.failIf('NON_EXISTANT_ENV_VAR' in os.environ)
354
        out, err = self.run_bzr_subprocess('rocks',
1963.1.11 by John Arbash Meinel
Add a universal_newlines flag to run_bzr_subprocess, so we can be line-ending independent for tests
355
                        env_changes={'NON_EXISTANT_ENV_VAR':None},
356
                        universal_newlines=True)
2227.4.1 by v.ladeuil+lp at free
Fix #78026.
357
        self.assertEqual('It sure does!\n', out)
1963.1.11 by John Arbash Meinel
Add a universal_newlines flag to run_bzr_subprocess, so we can be line-ending independent for tests
358
        self.assertEqual('', err)
1963.1.4 by John Arbash Meinel
env_changes={} should be safe to remove variables that aren't there
359
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
360
    def test_run_bzr_subprocess_working_dir(self):
2027.5.2 by John Arbash Meinel
add tests that the working directory is preserved, cleanup run_bzr_subprocess
361
        """Test that we can specify the working dir for the child"""
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
362
        cwd = osutils.getcwd()
363
364
        self.make_branch_and_tree('.')
365
        self.make_branch_and_tree('one')
366
        self.make_branch_and_tree('two')
367
2027.5.2 by John Arbash Meinel
add tests that the working directory is preserved, cleanup run_bzr_subprocess
368
        def get_root(**kwargs):
369
            """Spawn a process to get the 'root' of the tree.
370
371
            You can pass in arbitrary new arguments. This just makes
372
            sure that the returned path doesn't have trailing whitespace.
373
            """
374
            return self.run_bzr_subprocess('root', **kwargs)[0].rstrip()
375
376
        self.assertEqual(cwd, get_root())
377
        self.assertEqual(cwd, get_root(working_dir=None))
378
        # Has our path changed?
379
        self.assertEqual(cwd, osutils.getcwd())
380
381
        dir1 = get_root(working_dir='one')
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
382
        self.assertEndsWith(dir1, 'one')
2027.5.2 by John Arbash Meinel
add tests that the working directory is preserved, cleanup run_bzr_subprocess
383
        self.assertEqual(cwd, osutils.getcwd())
384
385
        dir2 = get_root(working_dir='two')
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
386
        self.assertEndsWith(dir2, 'two')
2027.5.2 by John Arbash Meinel
add tests that the working directory is preserved, cleanup run_bzr_subprocess
387
        self.assertEqual(cwd, osutils.getcwd())
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
388
389
2067.2.2 by John Arbash Meinel
Review comments from Robert
390
class _DontSpawnProcess(Exception):
391
    """A simple exception which just allows us to skip unnecessary steps"""
392
393
394
class TestRunBzrSubprocessCommands(TestCaseWithTransport):
395
396
    def _popen(self, *args, **kwargs):
397
        """Record the command that is run, so that we can ensure it is correct"""
398
        self._popen_args = args
399
        self._popen_kwargs = kwargs
400
        raise _DontSpawnProcess()
401
402
    def test_run_bzr_subprocess_no_plugins(self):
2665.4.1 by Aaron Bentley
teach run_bzr_subprocess to accept either a list of strings or a string
403
        self.assertRaises(_DontSpawnProcess, self.run_bzr_subprocess, '')
2067.2.2 by John Arbash Meinel
Review comments from Robert
404
        command = self._popen_args[0]
405
        self.assertEqual(sys.executable, command[0])
406
        self.assertEqual(self.get_bzr_path(), command[1])
407
        self.assertEqual(['--no-plugins'], command[2:])
408
409
    def test_allow_plugins(self):
2067.2.4 by John Arbash Meinel
fixup one test
410
        self.assertRaises(_DontSpawnProcess,
2665.4.1 by Aaron Bentley
teach run_bzr_subprocess to accept either a list of strings or a string
411
                          self.run_bzr_subprocess, '', allow_plugins=True)
2067.2.2 by John Arbash Meinel
Review comments from Robert
412
        command = self._popen_args[0]
413
        self.assertEqual([], command[2:])
414
415
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
416
class TestBzrSubprocess(TestCaseWithTransport):
417
1910.17.2 by Andrew Bennetts
Add start_bzr_subprocess and stop_bzr_subprocess to allow test code to continue
418
    def test_start_and_stop_bzr_subprocess(self):
419
        """We can start and perform other test actions while that process is
420
        still alive.
421
        """
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
422
        process = self.start_bzr_subprocess(['--version'])
1910.17.2 by Andrew Bennetts
Add start_bzr_subprocess and stop_bzr_subprocess to allow test code to continue
423
        result = self.finish_bzr_subprocess(process)
424
        self.assertContainsRe(result[0], 'is free software')
425
        self.assertEqual('', result[1])
426
427
    def test_start_and_stop_bzr_subprocess_with_error(self):
428
        """finish_bzr_subprocess allows specification of the desired exit code.
429
        """
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
430
        process = self.start_bzr_subprocess(['--versionn'])
1910.17.2 by Andrew Bennetts
Add start_bzr_subprocess and stop_bzr_subprocess to allow test code to continue
431
        result = self.finish_bzr_subprocess(process, retcode=3)
432
        self.assertEqual('', result[0])
433
        self.assertContainsRe(result[1], 'unknown command')
434
435
    def test_start_and_stop_bzr_subprocess_ignoring_retcode(self):
436
        """finish_bzr_subprocess allows the exit code to be ignored."""
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
437
        process = self.start_bzr_subprocess(['--versionn'])
1910.17.2 by Andrew Bennetts
Add start_bzr_subprocess and stop_bzr_subprocess to allow test code to continue
438
        result = self.finish_bzr_subprocess(process, retcode=None)
439
        self.assertEqual('', result[0])
440
        self.assertContainsRe(result[1], 'unknown command')
441
442
    def test_start_and_stop_bzr_subprocess_with_unexpected_retcode(self):
443
        """finish_bzr_subprocess raises self.failureException if the retcode is
444
        not the expected one.
445
        """
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
446
        process = self.start_bzr_subprocess(['--versionn'])
1910.17.2 by Andrew Bennetts
Add start_bzr_subprocess and stop_bzr_subprocess to allow test code to continue
447
        self.assertRaises(self.failureException, self.finish_bzr_subprocess,
2581.1.2 by Martin Pool
Remove unnecessary retcode=0 to run_bzr calls
448
                          process)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
449
1910.17.2 by Andrew Bennetts
Add start_bzr_subprocess and stop_bzr_subprocess to allow test code to continue
450
    def test_start_and_stop_bzr_subprocess_send_signal(self):
451
        """finish_bzr_subprocess raises self.failureException if the retcode is
452
        not the expected one.
453
        """
1910.17.9 by Andrew Bennetts
Add skip_if_plan_to_signal flag to start_bzr_subprocess.
454
        process = self.start_bzr_subprocess(['wait-until-signalled'],
455
                                            skip_if_plan_to_signal=True)
1910.17.2 by Andrew Bennetts
Add start_bzr_subprocess and stop_bzr_subprocess to allow test code to continue
456
        self.assertEqual('running\n', process.stdout.readline())
457
        result = self.finish_bzr_subprocess(process, send_signal=signal.SIGINT,
458
                                            retcode=3)
459
        self.assertEqual('', result[0])
460
        self.assertEqual('bzr: interrupted\n', result[1])
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
461
462
    def test_start_and_stop_working_dir(self):
463
        cwd = osutils.getcwd()
464
465
        self.make_branch_and_tree('one')
466
467
        process = self.start_bzr_subprocess(['root'], working_dir='one')
2156.1.1 by v.ladeuil+lp at free
Make the test compatible with windows.
468
        result = self.finish_bzr_subprocess(process, universal_newlines=True)
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
469
        self.assertEndsWith(result[0], 'one\n')
470
        self.assertEqual('', result[1])
2156.1.1 by v.ladeuil+lp at free
Make the test compatible with windows.
471
1963.1.4 by John Arbash Meinel
env_changes={} should be safe to remove variables that aren't there
472
1871.1.1 by Robert Collins
Relocate bzrlib selftest external output tests to bzrlib/tests/blackbox/test_selftest.py.
473
class TestRunBzrError(ExternalBase):
474
475
    def test_run_bzr_error(self):
2581.1.3 by Martin Pool
Revert over-eager cleanup of test_run_bzr_error
476
        # retcode=0 is specially needed here because run_bzr_error expects
477
        # an error (oddly enough) but we want to test the case of not
478
        # actually getting one
479
        out, err = self.run_bzr_error(['^$'], ['rocks'], retcode=0)
2227.4.1 by v.ladeuil+lp at free
Fix #78026.
480
        self.assertEqual(out, 'It sure does!\n')
2581.1.3 by Martin Pool
Revert over-eager cleanup of test_run_bzr_error
481
        # now test actually getting an error
482
        out, err = self.run_bzr_error(
483
                ["bzr: ERROR: foobarbaz is not versioned"],
484
                ['file-id', 'foobarbaz'])
2172.4.3 by Alexander Belchenko
Change name of option to '--clean-output' and provide tests
485
486
2394.2.6 by Ian Clatworthy
completed blackbox tests
487
class TestSelftestListOnly(TestCase):
2394.2.5 by Ian Clatworthy
list-only working, include test not
488
489
    @staticmethod
2394.2.6 by Ian Clatworthy
completed blackbox tests
490
    def _parse_test_list(lines, newlines_in_header=1):
2394.2.5 by Ian Clatworthy
list-only working, include test not
491
        "Parse a list of lines into a tuple of 3 lists (header,body,footer)."
492
        in_header = True
493
        in_footer = False
494
        header = []
495
        body = []
2394.2.6 by Ian Clatworthy
completed blackbox tests
496
        footer = []
2687.3.1 by Martin Pool
Revert selftest header to just two lines, but still show the bzrlib and python versions
497
        header_newlines_found = 0
2394.2.5 by Ian Clatworthy
list-only working, include test not
498
        for line in lines:
499
            if in_header:
500
                if line == '':
2394.2.6 by Ian Clatworthy
completed blackbox tests
501
                    header_newlines_found += 1
502
                    if header_newlines_found >= newlines_in_header:
503
                        in_header = False
504
                        continue
505
                header.append(line)
2394.2.5 by Ian Clatworthy
list-only working, include test not
506
            elif not in_footer:
507
                if line.startswith('-------'):
508
                    in_footer = True
509
                else:
510
                    body.append(line)
511
            else:
512
                footer.append(line)
513
        # If the last body line is blank, drop it off the list
514
        if len(body) > 0 and body[-1] == '':
2687.3.1 by Martin Pool
Revert selftest header to just two lines, but still show the bzrlib and python versions
515
            body.pop()
2394.2.5 by Ian Clatworthy
list-only working, include test not
516
        return (header,body,footer)
517
518
    def test_list_only(self):
519
        # check that bzr selftest --list-only works correctly
2552.2.2 by Vincent Ladeuil
Enforce run_bzr(string) where possible.
520
        out,err = self.run_bzr('selftest selftest --list-only')
2394.2.6 by Ian Clatworthy
completed blackbox tests
521
        self.assertEndsWith(err, 'tests passed\n')
2394.2.5 by Ian Clatworthy
list-only working, include test not
522
        (header,body,footer) = self._parse_test_list(out.splitlines())
2394.2.8 by Ian Clatworthy
incorporate feedback from jam
523
        num_tests = len(body)
524
        self.assertContainsRe(footer[0], 'Listed %s tests in' % num_tests)
2394.2.5 by Ian Clatworthy
list-only working, include test not
525
2394.2.6 by Ian Clatworthy
completed blackbox tests
526
    def test_list_only_filtered(self):
527
        # check that a filtered --list-only works, both include and exclude
2552.2.2 by Vincent Ladeuil
Enforce run_bzr(string) where possible.
528
        out_all,err_all = self.run_bzr('selftest --list-only')
2394.2.5 by Ian Clatworthy
list-only working, include test not
529
        tests_all = self._parse_test_list(out_all.splitlines())[1]
2552.2.2 by Vincent Ladeuil
Enforce run_bzr(string) where possible.
530
        out_incl,err_incl = self.run_bzr('selftest --list-only selftest')
2394.2.6 by Ian Clatworthy
completed blackbox tests
531
        tests_incl = self._parse_test_list(out_incl.splitlines())[1]
532
        self.assertSubset(tests_incl, tests_all)
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
533
        out_excl,err_excl = self.run_bzr(['selftest', '--list-only',
2552.2.2 by Vincent Ladeuil
Enforce run_bzr(string) where possible.
534
                                          '--exclude', 'selftest'])
2394.2.6 by Ian Clatworthy
completed blackbox tests
535
        tests_excl = self._parse_test_list(out_excl.splitlines())[1]
536
        self.assertSubset(tests_excl, tests_all)
537
        set_incl = set(tests_incl)
538
        set_excl = set(tests_excl)
539
        intersection = set_incl.intersection(set_excl)
540
        self.assertEquals(0, len(intersection))
541
        self.assertEquals(len(tests_all), len(tests_incl) + len(tests_excl))
542
543
    def test_list_only_random(self):
544
        # check that --randomize works correctly
2552.2.2 by Vincent Ladeuil
Enforce run_bzr(string) where possible.
545
        out_all,err_all = self.run_bzr('selftest --list-only selftest')
2394.2.6 by Ian Clatworthy
completed blackbox tests
546
        tests_all = self._parse_test_list(out_all.splitlines())[1]
2477.1.6 by Martin Pool
doc
547
        # XXX: It looks like there are some orders for generating tests that
548
        # fail as of 20070504 - maybe because of import order dependencies.
549
        # So unfortunately this will rarely intermittently fail at the moment.
550
        # -- mbp 20070504
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
551
        out_rand,err_rand = self.run_bzr(['selftest', '--list-only',
2552.2.2 by Vincent Ladeuil
Enforce run_bzr(string) where possible.
552
                                          'selftest', '--randomize', 'now'])
2394.2.6 by Ian Clatworthy
completed blackbox tests
553
        (header_rand,tests_rand,dummy) = self._parse_test_list(
554
            out_rand.splitlines(), 2)
2687.3.1 by Martin Pool
Revert selftest header to just two lines, but still show the bzrlib and python versions
555
        # XXX: The following line asserts that the randomized order is not the
556
        # same as the default order.  It is just possible that they'll get
557
        # randomized into the same order and this will falsely fail, but
558
        # that's very unlikely in practice because there are thousands of
559
        # tests.
2394.2.6 by Ian Clatworthy
completed blackbox tests
560
        self.assertNotEqual(tests_all, tests_rand)
561
        self.assertEqual(sorted(tests_all), sorted(tests_rand))
562
        # Check that the seed can be reused to get the exact same order
563
        seed_re = re.compile('Randomizing test order using seed (\w+)')
564
        match_obj = seed_re.search(header_rand[-1])
565
        seed = match_obj.group(1)
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
566
        out_rand2,err_rand2 = self.run_bzr(['selftest', '--list-only',
2552.2.2 by Vincent Ladeuil
Enforce run_bzr(string) where possible.
567
                                            'selftest', '--randomize', seed])
2394.2.6 by Ian Clatworthy
completed blackbox tests
568
        (header_rand2,tests_rand2,dummy) = self._parse_test_list(
569
            out_rand2.splitlines(), 2)
570
        self.assertEqual(tests_rand, tests_rand2)
2394.2.5 by Ian Clatworthy
list-only working, include test not
571
3193.1.8 by Vincent Ladeuil
Add '--load-list' option to selftest.
572
573
class TestSelftestWithIdList(TestCaseInTempDir):
574
575
    def test_load_list(self):
576
        # We don't want to call selftest for the whole suite, so we start with
577
        # a reduced list.
578
        test_list_fname = 'test.list'
579
        fl = open(test_list_fname, 'wt')
580
        fl.write('%s\n' % self.id())
581
        fl.close()
582
        out, err = self.run_bzr(
583
            ['selftest', '--load-list', test_list_fname, '--list'])
584
        self.assertContainsRe(out, "Listed 1 test in")
585
586
    def test_load_unknown(self):
587
        out, err = self.run_bzr('selftest --load-list I_do_not_exist ',
588
                                retcode=3)
3302.11.2 by Vincent Ladeuil
selftest now accepts --starting-ith <id> to load and execute only a module|class|test* reduced suite.
589
590
591
class TestSelftestStartingWith(TestCase):
592
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
593
    def test_starting_with_single_argument(self):
3302.11.2 by Vincent Ladeuil
selftest now accepts --starting-ith <id> to load and execute only a module|class|test* reduced suite.
594
        out, err = self.run_bzr(
595
            ['selftest', '--starting-with', self.id(), '--list'])
596
        self.assertContainsRe(out, "Listed 1 test in")
3302.11.5 by Vincent Ladeuil
Fixed as per John's review. Also added a NEWS entry.
597
        self.assertContainsRe(out, self.id())
3302.11.2 by Vincent Ladeuil
selftest now accepts --starting-ith <id> to load and execute only a module|class|test* reduced suite.
598
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
599
    def test_starting_with_multiple_argument(self):
600
        out, err = self.run_bzr(
601
            ['selftest',
602
             '--starting-with', self.id(),
603
             '--starting-with', 'bzrlib.tests.test_sampler',
604
             '--list'])
605
        self.assertContainsRe(out, "Listed 2 tests in")
606
        self.assertContainsRe(out, self.id())
607
        self.assertContainsRe(out, 'bzrlib.tests.test_sampler')