/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
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
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
17
"""UI tests for the test framework."""
18
1963.1.1 by John Arbash Meinel
run_bzr_subprocess() can take an env_changes parameter
19
import os
2394.2.5 by Ian Clatworthy
list-only working, include test not
20
import re
1910.17.2 by Andrew Bennetts
Add start_bzr_subprocess and stop_bzr_subprocess to allow test code to continue
21
import signal
1692.3.3 by Robert Collins
Get run_bzr in tests to always assign a new, clean ui factory.
22
import sys
23
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.
24
import bzrlib
1963.1.2 by John Arbash Meinel
Cleanups suggested by Martin, add test that env_changes can remove an env variable
25
from bzrlib import (
26
    osutils,
27
    )
2394.2.3 by Ian Clatworthy
Backed out test junk
28
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.
29
from bzrlib.tests import (
30
                          TestCase,
2172.4.3 by Alexander Belchenko
Change name of option to '--clean-output' and provide tests
31
                          TestCaseInTempDir,
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
32
                          TestCaseWithMemoryTransport,
1819.1.3 by Carl Friedrich Bolz
(lifeless, cfbolz): Add recording of benchmark results to the benchmark history
33
                          TestCaseWithTransport,
2294.4.4 by Vincent Ladeuil
Provide a better implementation for testing passwords.
34
                          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.
35
                          TestSkipped,
36
                          )
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
37
from bzrlib.symbol_versioning import (
38
    zero_eighteen,
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
94
95
class TestRunBzr(ExternalBase):
96
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
97
    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
98
                         working_dir=None):
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
99
        """Override _run_bzr_core to test how it is invoked by run_bzr.
2552.2.1 by Vincent Ladeuil
apply martin patch
100
2530.3.1 by Martin Pool
Cleanup old variations on run_bzr in the test suite
101
        Attempts to run bzr from inside this class don't actually run it.
102
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
103
        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
104
        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
105
        parameters to run_bzr.
2027.5.3 by John Arbash Meinel
Add docstring to why run_bzr_captured is overridden
106
        """
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
107
        self.argv = list(argv)
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
108
        self.retcode = retcode
109
        self.encoding = encoding
1687.1.2 by Robert Collins
Add stdin parameter to run_bzr and run_bzr_captured.
110
        self.stdin = stdin
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
111
        self.working_dir = working_dir
2292.1.28 by Marius Kruger
* NEWS
112
        return '', ''
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
113
114
    def test_args(self):
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
115
        """Test that run_bzr passes args correctly to _run_bzr_core"""
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
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)
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
120
        self.assertEqual(['arg1', 'arg2', 'arg3'], self.argv)
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
121
122
    def test_encoding(self):
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
123
        """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
124
        self.run_bzr('foo bar')
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
125
        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
126
        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
127
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
128
        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
129
        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
130
        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
131
132
    def test_retcode(self):
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
133
        """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
134
        # Default is retcode == 0
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')
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
136
        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
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
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
139
        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
140
        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
141
        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
142
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
143
        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
144
        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
145
        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
146
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
147
        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
148
        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
149
        self.assertEqual(['foo', 'bar'], self.argv)
1687.1.2 by Robert Collins
Add stdin parameter to run_bzr and run_bzr_captured.
150
151
    def test_stdin(self):
152
        # 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
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 
1687.1.15 by Robert Collins
Review comments.
156
        # should invoke it.
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
157
        self.run_bzr('foo bar', stdin='gam')
1687.1.2 by Robert Collins
Add stdin parameter to run_bzr and run_bzr_captured.
158
        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
159
        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
160
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
161
        self.run_bzr('foo bar', stdin='zippy')
1687.1.2 by Robert Collins
Add stdin parameter to run_bzr and run_bzr_captured.
162
        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
163
        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
164
165
    def test_working_dir(self):
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
166
        """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
167
        self.run_bzr('foo bar')
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
168
        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
169
        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
170
2530.3.3 by Martin Pool
Clean up some callers that use varargs syntax for run_bzr, but don't
171
        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
172
        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
173
        self.assertEqual(['foo', 'bar'], self.argv)
1687.1.2 by Robert Collins
Add stdin parameter to run_bzr and run_bzr_captured.
174
2665.1.1 by Michael Hudson
make run_bzr stricter about the keyword arguments it takes.
175
    def test_reject_extra_keyword_arguments(self):
176
        self.assertRaises(TypeError, self.run_bzr, "foo bar",
177
                          error_regex=['error message'])
178
1687.1.2 by Robert Collins
Add stdin parameter to run_bzr and run_bzr_captured.
179
1819.1.3 by Carl Friedrich Bolz
(lifeless, cfbolz): Add recording of benchmark results to the benchmark history
180
class TestBenchmarkTests(TestCaseWithTransport):
181
182
    def test_benchmark_runs_benchmark_tests(self):
183
        """bzr selftest --benchmark should not run the default test suite."""
184
        # We test this by passing a regression test name to --benchmark, which
185
        # should result in 0 rests run.
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
186
        old_root = TestCaseWithMemoryTransport.TEST_ROOT
1819.1.3 by Carl Friedrich Bolz
(lifeless, cfbolz): Add recording of benchmark results to the benchmark history
187
        try:
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
188
            TestCaseWithMemoryTransport.TEST_ROOT = None
2552.2.4 by Vincent Ladeuil
Merge bzr.dev and resolve conflits. (good use case for an enhanced merge
189
            out, err = self.run_bzr('selftest --benchmark'
190
                                    ' workingtree_implementations')
1819.1.3 by Carl Friedrich Bolz
(lifeless, cfbolz): Add recording of benchmark results to the benchmark history
191
        finally:
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
192
            TestCaseWithMemoryTransport.TEST_ROOT = old_root
1819.1.3 by Carl Friedrich Bolz
(lifeless, cfbolz): Add recording of benchmark results to the benchmark history
193
        self.assertContainsRe(out, 'Ran 0 tests.*\n\nOK')
194
        self.assertEqual(
2095.4.1 by Martin Pool
Better progress bars during tests
195
            'tests passed\n',
1819.1.3 by Carl Friedrich Bolz
(lifeless, cfbolz): Add recording of benchmark results to the benchmark history
196
            err)
197
        benchfile = open(".perf_history", "rt")
198
        try:
199
            lines = benchfile.readlines()
200
        finally:
201
            benchfile.close()
202
        self.assertEqual(1, len(lines))
203
        self.assertContainsRe(lines[0], "--date [0-9.]+")
204
205
1687.1.2 by Robert Collins
Add stdin parameter to run_bzr and run_bzr_captured.
206
class TestRunBzrCaptured(ExternalBase):
207
208
    def apply_redirected(self, stdin=None, stdout=None, stderr=None,
209
                         a_callable=None, *args, **kwargs):
210
        self.stdin = stdin
1687.1.11 by Robert Collins
Teach TestCase.run_bzr_captured about the ui factories.
211
        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.
212
        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
213
        self.working_dir = osutils.getcwd()
1692.3.3 by Robert Collins
Get run_bzr in tests to always assign a new, clean ui factory.
214
        stdout.write('foo\n')
215
        stderr.write('bar\n')
1687.1.2 by Robert Collins
Add stdin parameter to run_bzr and run_bzr_captured.
216
        return 0
217
218
    def test_stdin(self):
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
219
        # test that the stdin keyword to _run_bzr_core is passed through to
1687.1.15 by Robert Collins
Review comments.
220
        # 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
221
        # apply_redirected in this class, and then calling _run_bzr_core,
1687.1.15 by Robert Collins
Review comments.
222
        # which calls apply_redirected. 
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
223
        self.run_bzr(['foo', 'bar'], stdin='gam')
1687.1.2 by Robert Collins
Add stdin parameter to run_bzr and run_bzr_captured.
224
        self.assertEqual('gam', self.stdin.read())
1687.1.11 by Robert Collins
Teach TestCase.run_bzr_captured about the ui factories.
225
        self.assertTrue(self.stdin is self.factory_stdin)
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
226
        self.run_bzr(['foo', 'bar'], stdin='zippy')
1687.1.2 by Robert Collins
Add stdin parameter to run_bzr and run_bzr_captured.
227
        self.assertEqual('zippy', self.stdin.read())
1687.1.11 by Robert Collins
Teach TestCase.run_bzr_captured about the ui factories.
228
        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.
229
230
    def test_ui_factory(self):
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
231
        # each invocation of self.run_bzr should get its
2294.4.4 by Vincent Ladeuil
Provide a better implementation for testing passwords.
232
        # own UI factory, which is an instance of TestUIFactory,
233
        # 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
234
        # 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.
235
        current_factory = bzrlib.ui.ui_factory
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
236
        self.run_bzr(['foo'])
1692.3.3 by Robert Collins
Get run_bzr in tests to always assign a new, clean ui factory.
237
        self.failIf(current_factory is self.factory)
238
        self.assertNotEqual(sys.stdout, self.factory.stdout)
239
        self.assertNotEqual(sys.stderr, self.factory.stderr)
240
        self.assertEqual('foo\n', self.factory.stdout.getvalue())
241
        self.assertEqual('bar\n', self.factory.stderr.getvalue())
2294.4.4 by Vincent Ladeuil
Provide a better implementation for testing passwords.
242
        self.assertIsInstance(self.factory, TestUIFactory)
1871.1.1 by Robert Collins
Relocate bzrlib selftest external output tests to bzrlib/tests/blackbox/test_selftest.py.
243
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
244
    def test_working_dir(self):
245
        self.build_tree(['one/', 'two/'])
246
        cwd = osutils.getcwd()
247
248
        # Default is to work in the current directory
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
249
        self.run_bzr(['foo', 'bar'])
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
250
        self.assertEqual(cwd, self.working_dir)
251
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
252
        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
253
        self.assertEqual(cwd, self.working_dir)
254
2027.5.2 by John Arbash Meinel
add tests that the working directory is preserved, cleanup run_bzr_subprocess
255
        # The function should be run in the alternative directory
256
        # 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
257
        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
258
        self.assertNotEqual(cwd, self.working_dir)
259
        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
260
        self.assertEqual(cwd, osutils.getcwd())
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
261
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
262
        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
263
        self.assertNotEqual(cwd, self.working_dir)
264
        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
265
        self.assertEqual(cwd, osutils.getcwd())
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
266
267
268
class TestRunBzrSubprocess(TestCaseWithTransport):
269
1871.1.1 by Robert Collins
Relocate bzrlib selftest external output tests to bzrlib/tests/blackbox/test_selftest.py.
270
    def test_run_bzr_subprocess(self):
271
        """The run_bzr_helper_external comand behaves nicely."""
272
        result = self.run_bzr_subprocess('--version')
273
        result = self.run_bzr_subprocess('--version', retcode=None)
274
        self.assertContainsRe(result[0], 'is free software')
275
        self.assertRaises(AssertionError, self.run_bzr_subprocess, 
276
                          '--versionn')
277
        result = self.run_bzr_subprocess('--versionn', retcode=3)
278
        result = self.run_bzr_subprocess('--versionn', retcode=None)
279
        self.assertContainsRe(result[1], 'unknown command')
1857.1.20 by Aaron Bentley
Strip out all the EnumOption stuff
280
        err = self.run_bzr_subprocess('merge', '--merge-type', 'magic merge', 
281
                                      retcode=3)[1]
2221.4.15 by Aaron Bentley
Use RegistryOption for merge type
282
        self.assertContainsRe(err, 'Bad value "magic merge" for option'
283
                              ' "merge-type"')
1871.1.1 by Robert Collins
Relocate bzrlib selftest external output tests to bzrlib/tests/blackbox/test_selftest.py.
284
1963.1.1 by John Arbash Meinel
run_bzr_subprocess() can take an env_changes parameter
285
    def test_run_bzr_subprocess_env(self):
286
        """run_bzr_subprocess can set environment variables in the child only.
287
288
        These changes should not change the running process, only the child.
289
        """
290
        # The test suite should unset this variable
291
        self.assertEqual(None, os.environ.get('BZR_EMAIL'))
292
        out, err = self.run_bzr_subprocess('whoami', env_changes={
293
                                            '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
294
                                          }, universal_newlines=True)
1963.1.1 by John Arbash Meinel
run_bzr_subprocess() can take an env_changes parameter
295
        self.assertEqual('', err)
296
        self.assertEqual('Joe Foo <joe@foo.com>\n', out)
297
        # And it should not be modified
298
        self.assertEqual(None, os.environ.get('BZR_EMAIL'))
299
300
        # Do it again with a different address, just to make sure
301
        # it is actually changing
302
        out, err = self.run_bzr_subprocess('whoami', env_changes={
303
                                            '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
304
                                          }, universal_newlines=True)
1963.1.1 by John Arbash Meinel
run_bzr_subprocess() can take an env_changes parameter
305
        self.assertEqual('', err)
306
        self.assertEqual('Barry <bar@foo.com>\n', out)
307
        self.assertEqual(None, os.environ.get('BZR_EMAIL'))
308
1963.1.2 by John Arbash Meinel
Cleanups suggested by Martin, add test that env_changes can remove an env variable
309
    def test_run_bzr_subprocess_env_del(self):
310
        """run_bzr_subprocess can remove environment variables too."""
311
        # Create a random email, so we are sure this won't collide
312
        rand_bzr_email = 'John Doe <jdoe@%s.com>' % (osutils.rand_chars(20),)
313
        rand_email = 'Jane Doe <jdoe@%s.com>' % (osutils.rand_chars(20),)
314
        os.environ['BZR_EMAIL'] = rand_bzr_email
315
        os.environ['EMAIL'] = rand_email
316
        try:
317
            # 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
318
            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
319
            self.assertEqual('', err)
320
            self.assertEqual(rand_bzr_email + '\n', out)
321
322
            # Now that BZR_EMAIL is not set, it should fall back to EMAIL
323
            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
324
                                               env_changes={'BZR_EMAIL':None},
325
                                               universal_newlines=True)
1963.1.2 by John Arbash Meinel
Cleanups suggested by Martin, add test that env_changes can remove an env variable
326
            self.assertEqual('', err)
327
            self.assertEqual(rand_email + '\n', out)
328
329
            # This switches back to the default email guessing logic
330
            # Which shouldn't match either of the above addresses
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, '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
335
            self.assertEqual('', err)
336
            self.assertNotEqual(rand_bzr_email + '\n', out)
337
            self.assertNotEqual(rand_email + '\n', out)
338
        finally:
339
            # TestCase cleans up BZR_EMAIL, and EMAIL at startup
340
            del os.environ['BZR_EMAIL']
341
            del os.environ['EMAIL']
1871.1.1 by Robert Collins
Relocate bzrlib selftest external output tests to bzrlib/tests/blackbox/test_selftest.py.
342
1963.1.4 by John Arbash Meinel
env_changes={} should be safe to remove variables that aren't there
343
    def test_run_bzr_subprocess_env_del_missing(self):
344
        """run_bzr_subprocess won't fail if deleting a nonexistant env var"""
345
        self.failIf('NON_EXISTANT_ENV_VAR' in os.environ)
346
        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
347
                        env_changes={'NON_EXISTANT_ENV_VAR':None},
348
                        universal_newlines=True)
2227.4.1 by v.ladeuil+lp at free
Fix #78026.
349
        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
350
        self.assertEqual('', err)
1963.1.4 by John Arbash Meinel
env_changes={} should be safe to remove variables that aren't there
351
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
352
    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
353
        """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
354
        cwd = osutils.getcwd()
355
356
        self.make_branch_and_tree('.')
357
        self.make_branch_and_tree('one')
358
        self.make_branch_and_tree('two')
359
2027.5.2 by John Arbash Meinel
add tests that the working directory is preserved, cleanup run_bzr_subprocess
360
        def get_root(**kwargs):
361
            """Spawn a process to get the 'root' of the tree.
362
363
            You can pass in arbitrary new arguments. This just makes
364
            sure that the returned path doesn't have trailing whitespace.
365
            """
366
            return self.run_bzr_subprocess('root', **kwargs)[0].rstrip()
367
368
        self.assertEqual(cwd, get_root())
369
        self.assertEqual(cwd, get_root(working_dir=None))
370
        # Has our path changed?
371
        self.assertEqual(cwd, osutils.getcwd())
372
373
        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
374
        self.assertEndsWith(dir1, 'one')
2027.5.2 by John Arbash Meinel
add tests that the working directory is preserved, cleanup run_bzr_subprocess
375
        self.assertEqual(cwd, osutils.getcwd())
376
377
        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
378
        self.assertEndsWith(dir2, 'two')
2027.5.2 by John Arbash Meinel
add tests that the working directory is preserved, cleanup run_bzr_subprocess
379
        self.assertEqual(cwd, osutils.getcwd())
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
380
381
2067.2.2 by John Arbash Meinel
Review comments from Robert
382
class _DontSpawnProcess(Exception):
383
    """A simple exception which just allows us to skip unnecessary steps"""
384
385
386
class TestRunBzrSubprocessCommands(TestCaseWithTransport):
387
388
    def _popen(self, *args, **kwargs):
389
        """Record the command that is run, so that we can ensure it is correct"""
390
        self._popen_args = args
391
        self._popen_kwargs = kwargs
392
        raise _DontSpawnProcess()
393
394
    def test_run_bzr_subprocess_no_plugins(self):
395
        self.assertRaises(_DontSpawnProcess, self.run_bzr_subprocess)
396
        command = self._popen_args[0]
397
        self.assertEqual(sys.executable, command[0])
398
        self.assertEqual(self.get_bzr_path(), command[1])
399
        self.assertEqual(['--no-plugins'], command[2:])
400
401
    def test_allow_plugins(self):
2067.2.4 by John Arbash Meinel
fixup one test
402
        self.assertRaises(_DontSpawnProcess,
403
                          self.run_bzr_subprocess, allow_plugins=True)
2067.2.2 by John Arbash Meinel
Review comments from Robert
404
        command = self._popen_args[0]
405
        self.assertEqual([], command[2:])
406
407
2027.5.1 by John Arbash Meinel
Add working_dir=XX to run_bzr_* functions, and clean up tests
408
class TestBzrSubprocess(TestCaseWithTransport):
409
1910.17.2 by Andrew Bennetts
Add start_bzr_subprocess and stop_bzr_subprocess to allow test code to continue
410
    def test_start_and_stop_bzr_subprocess(self):
411
        """We can start and perform other test actions while that process is
412
        still alive.
413
        """
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
414
        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
415
        result = self.finish_bzr_subprocess(process)
416
        self.assertContainsRe(result[0], 'is free software')
417
        self.assertEqual('', result[1])
418
419
    def test_start_and_stop_bzr_subprocess_with_error(self):
420
        """finish_bzr_subprocess allows specification of the desired exit code.
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(['--versionn'])
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, retcode=3)
424
        self.assertEqual('', result[0])
425
        self.assertContainsRe(result[1], 'unknown command')
426
427
    def test_start_and_stop_bzr_subprocess_ignoring_retcode(self):
428
        """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.
429
        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
430
        result = self.finish_bzr_subprocess(process, retcode=None)
431
        self.assertEqual('', result[0])
432
        self.assertContainsRe(result[1], 'unknown command')
433
434
    def test_start_and_stop_bzr_subprocess_with_unexpected_retcode(self):
435
        """finish_bzr_subprocess raises self.failureException if the retcode is
436
        not the expected one.
437
        """
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
438
        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
439
        self.assertRaises(self.failureException, self.finish_bzr_subprocess,
2581.1.2 by Martin Pool
Remove unnecessary retcode=0 to run_bzr calls
440
                          process)
1910.17.2 by Andrew Bennetts
Add start_bzr_subprocess and stop_bzr_subprocess to allow test code to continue
441
        
442
    def test_start_and_stop_bzr_subprocess_send_signal(self):
443
        """finish_bzr_subprocess raises self.failureException if the retcode is
444
        not the expected one.
445
        """
1910.17.9 by Andrew Bennetts
Add skip_if_plan_to_signal flag to start_bzr_subprocess.
446
        process = self.start_bzr_subprocess(['wait-until-signalled'],
447
                                            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
448
        self.assertEqual('running\n', process.stdout.readline())
449
        result = self.finish_bzr_subprocess(process, send_signal=signal.SIGINT,
450
                                            retcode=3)
451
        self.assertEqual('', result[0])
452
        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
453
454
    def test_start_and_stop_working_dir(self):
455
        cwd = osutils.getcwd()
456
457
        self.make_branch_and_tree('one')
458
459
        process = self.start_bzr_subprocess(['root'], working_dir='one')
2156.1.1 by v.ladeuil+lp at free
Make the test compatible with windows.
460
        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
461
        self.assertEndsWith(result[0], 'one\n')
462
        self.assertEqual('', result[1])
2156.1.1 by v.ladeuil+lp at free
Make the test compatible with windows.
463
1963.1.4 by John Arbash Meinel
env_changes={} should be safe to remove variables that aren't there
464
1871.1.1 by Robert Collins
Relocate bzrlib selftest external output tests to bzrlib/tests/blackbox/test_selftest.py.
465
class TestRunBzrError(ExternalBase):
466
467
    def test_run_bzr_error(self):
2581.1.3 by Martin Pool
Revert over-eager cleanup of test_run_bzr_error
468
        # retcode=0 is specially needed here because run_bzr_error expects
469
        # an error (oddly enough) but we want to test the case of not
470
        # actually getting one
471
        out, err = self.run_bzr_error(['^$'], ['rocks'], retcode=0)
2227.4.1 by v.ladeuil+lp at free
Fix #78026.
472
        self.assertEqual(out, 'It sure does!\n')
2581.1.3 by Martin Pool
Revert over-eager cleanup of test_run_bzr_error
473
        # now test actually getting an error
474
        out, err = self.run_bzr_error(
475
                ["bzr: ERROR: foobarbaz is not versioned"],
476
                ['file-id', 'foobarbaz'])
2172.4.3 by Alexander Belchenko
Change name of option to '--clean-output' and provide tests
477
478
2394.2.6 by Ian Clatworthy
completed blackbox tests
479
class TestSelftestListOnly(TestCase):
2394.2.5 by Ian Clatworthy
list-only working, include test not
480
481
    @staticmethod
2394.2.6 by Ian Clatworthy
completed blackbox tests
482
    def _parse_test_list(lines, newlines_in_header=1):
2394.2.5 by Ian Clatworthy
list-only working, include test not
483
        "Parse a list of lines into a tuple of 3 lists (header,body,footer)."
484
485
        in_header = True
486
        in_footer = False
487
        header = []
488
        body = []
2394.2.6 by Ian Clatworthy
completed blackbox tests
489
        footer = []
490
        header_newlines_found = 0 
2394.2.5 by Ian Clatworthy
list-only working, include test not
491
        for line in lines:
492
            if in_header:
493
                if line == '':
2394.2.6 by Ian Clatworthy
completed blackbox tests
494
                    header_newlines_found += 1
495
                    if header_newlines_found >= newlines_in_header:
496
                        in_header = False
497
                        continue
498
                header.append(line)
2394.2.5 by Ian Clatworthy
list-only working, include test not
499
            elif not in_footer:
500
                if line.startswith('-------'):
501
                    in_footer = True
502
                else:
503
                    body.append(line)
504
            else:
505
                footer.append(line)
506
        # If the last body line is blank, drop it off the list
507
        if len(body) > 0 and body[-1] == '':
508
            body.pop()                
509
        return (header,body,footer)
510
511
    def test_list_only(self):
512
        # check that bzr selftest --list-only works correctly
2552.2.2 by Vincent Ladeuil
Enforce run_bzr(string) where possible.
513
        out,err = self.run_bzr('selftest selftest --list-only')
2394.2.6 by Ian Clatworthy
completed blackbox tests
514
        self.assertEndsWith(err, 'tests passed\n')
2394.2.5 by Ian Clatworthy
list-only working, include test not
515
        (header,body,footer) = self._parse_test_list(out.splitlines())
2394.2.8 by Ian Clatworthy
incorporate feedback from jam
516
        num_tests = len(body)
517
        self.assertContainsRe(footer[0], 'Listed %s tests in' % num_tests)
2394.2.5 by Ian Clatworthy
list-only working, include test not
518
2394.2.6 by Ian Clatworthy
completed blackbox tests
519
    def test_list_only_filtered(self):
520
        # check that a filtered --list-only works, both include and exclude
2552.2.2 by Vincent Ladeuil
Enforce run_bzr(string) where possible.
521
        out_all,err_all = self.run_bzr('selftest --list-only')
2394.2.5 by Ian Clatworthy
list-only working, include test not
522
        tests_all = self._parse_test_list(out_all.splitlines())[1]
2552.2.2 by Vincent Ladeuil
Enforce run_bzr(string) where possible.
523
        out_incl,err_incl = self.run_bzr('selftest --list-only selftest')
2394.2.6 by Ian Clatworthy
completed blackbox tests
524
        tests_incl = self._parse_test_list(out_incl.splitlines())[1]
525
        self.assertSubset(tests_incl, tests_all)
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
526
        out_excl,err_excl = self.run_bzr(['selftest', '--list-only',
2552.2.2 by Vincent Ladeuil
Enforce run_bzr(string) where possible.
527
                                          '--exclude', 'selftest'])
2394.2.6 by Ian Clatworthy
completed blackbox tests
528
        tests_excl = self._parse_test_list(out_excl.splitlines())[1]
529
        self.assertSubset(tests_excl, tests_all)
530
        set_incl = set(tests_incl)
531
        set_excl = set(tests_excl)
532
        intersection = set_incl.intersection(set_excl)
533
        self.assertEquals(0, len(intersection))
534
        self.assertEquals(len(tests_all), len(tests_incl) + len(tests_excl))
535
536
    def test_list_only_random(self):
537
        # check that --randomize works correctly
2552.2.2 by Vincent Ladeuil
Enforce run_bzr(string) where possible.
538
        out_all,err_all = self.run_bzr('selftest --list-only selftest')
2394.2.6 by Ian Clatworthy
completed blackbox tests
539
        tests_all = self._parse_test_list(out_all.splitlines())[1]
2477.1.6 by Martin Pool
doc
540
        # XXX: It looks like there are some orders for generating tests that
541
        # fail as of 20070504 - maybe because of import order dependencies.
542
        # So unfortunately this will rarely intermittently fail at the moment.
543
        # -- mbp 20070504
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
544
        out_rand,err_rand = self.run_bzr(['selftest', '--list-only',
2552.2.2 by Vincent Ladeuil
Enforce run_bzr(string) where possible.
545
                                          'selftest', '--randomize', 'now'])
2394.2.6 by Ian Clatworthy
completed blackbox tests
546
        (header_rand,tests_rand,dummy) = self._parse_test_list(
547
            out_rand.splitlines(), 2)
548
        self.assertNotEqual(tests_all, tests_rand)
549
        self.assertEqual(sorted(tests_all), sorted(tests_rand))
550
        # Check that the seed can be reused to get the exact same order
551
        seed_re = re.compile('Randomizing test order using seed (\w+)')
552
        match_obj = seed_re.search(header_rand[-1])
553
        seed = match_obj.group(1)
2530.3.4 by Martin Pool
Deprecate run_bzr_captured in favour of just run_bzr
554
        out_rand2,err_rand2 = self.run_bzr(['selftest', '--list-only',
2552.2.2 by Vincent Ladeuil
Enforce run_bzr(string) where possible.
555
                                            'selftest', '--randomize', seed])
2394.2.6 by Ian Clatworthy
completed blackbox tests
556
        (header_rand2,tests_rand2,dummy) = self._parse_test_list(
557
            out_rand2.splitlines(), 2)
558
        self.assertEqual(tests_rand, tests_rand2)
2394.2.5 by Ian Clatworthy
list-only working, include test not
559