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