~bzr-pqm/bzr/bzr.dev

2552.2.1 by Vincent Ladeuil
apply martin patch
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
                          )
2552.2.1 by Vincent Ladeuil
apply martin patch
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"
2552.2.1 by Vincent Ladeuil
apply martin patch
79
            stdout = self.run_bzr(
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"
2552.2.1 by Vincent Ladeuil
apply martin patch
85
            stdout = self.run_bzr(
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
2552.2.1 by Vincent Ladeuil
apply martin patch
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):
2552.2.1 by Vincent Ladeuil
apply martin patch
99
        """Override _run_bzr_core to test how it is invoked by run_bzr.
100
101
        Attempts to run bzr from inside this class don't actually run it.
102
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
2552.2.1 by Vincent Ladeuil
apply martin patch
105
        parameters to run_bzr.
2027.5.3 by John Arbash Meinel
Add docstring to why run_bzr_captured is overridden
106
        """
2552.2.1 by Vincent Ladeuil
apply martin patch
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):
2552.2.1 by Vincent Ladeuil
apply martin patch
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)
2552.2.1 by Vincent Ladeuil
apply martin patch
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):
2552.2.1 by Vincent Ladeuil
apply martin patch
123
        """Test that run_bzr passes encoding to _run_bzr_core"""
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)
2552.2.1 by Vincent Ladeuil
apply martin patch
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
2552.2.1 by Vincent Ladeuil
apply martin patch
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)
2552.2.1 by Vincent Ladeuil
apply martin patch
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):
2552.2.1 by Vincent Ladeuil
apply martin patch
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
2552.2.1 by Vincent Ladeuil
apply martin patch
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)
2552.2.1 by Vincent Ladeuil
apply martin patch
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
2552.2.1 by Vincent Ladeuil
apply martin patch
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)
2552.2.1 by Vincent Ladeuil
apply martin patch
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
2552.2.1 by Vincent Ladeuil
apply martin patch
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)
2552.2.1 by Vincent Ladeuil
apply martin patch
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
2552.2.1 by Vincent Ladeuil
apply martin patch
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)
2552.2.1 by Vincent Ladeuil
apply martin patch
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
2552.2.1 by Vincent Ladeuil
apply martin patch
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.
2552.2.1 by Vincent Ladeuil
apply martin patch
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)
2552.2.1 by Vincent Ladeuil
apply martin patch
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
2552.2.1 by Vincent Ladeuil
apply martin patch
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)
2552.2.1 by Vincent Ladeuil
apply martin patch
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):
2552.2.1 by Vincent Ladeuil
apply martin patch
166
        """Test that run_bzr passes working_dir to _run_bzr_core"""
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)
2552.2.1 by Vincent Ladeuil
apply martin patch
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
2552.2.1 by Vincent Ladeuil
apply martin patch
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)
2552.2.1 by Vincent Ladeuil
apply martin patch
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.1 by Vincent Ladeuil
apply martin patch
185
            out, err = self.run_bzr(['selftest', '--benchmark',
2552.2.2 by Vincent Ladeuil
Enforce run_bzr(string) where possible.
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):
2552.2.1 by Vincent Ladeuil
apply martin patch
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
2552.2.1 by Vincent Ladeuil
apply martin patch
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. 
2552.2.1 by Vincent Ladeuil
apply martin patch
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)
2552.2.1 by Vincent Ladeuil
apply martin patch
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):
2552.2.1 by Vincent Ladeuil
apply martin patch
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,
2552.2.1 by Vincent Ladeuil
apply martin patch
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
2552.2.1 by Vincent Ladeuil
apply martin patch
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
2552.2.1 by Vincent Ladeuil
apply martin patch
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
2552.2.1 by Vincent Ladeuil
apply martin patch
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
2552.2.1 by Vincent Ladeuil
apply martin patch
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
2552.2.1 by Vincent Ladeuil
apply martin patch
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,
436
                          process, retcode=0)
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):
2552.2.1 by Vincent Ladeuil
apply martin patch
464
        out, err = self.run_bzr_error(['^$'], ['rocks'], retcode=0)
2227.4.1 by v.ladeuil+lp at free
Fix #78026.
465
        self.assertEqual(out, 'It sure does!\n')
1871.1.1 by Robert Collins
Relocate bzrlib selftest external output tests to bzrlib/tests/blackbox/test_selftest.py.
466
2067.3.1 by Martin Pool
Clean up BzrNewError, other exception classes and users.
467
        out, err = self.run_bzr_error(["bzr: ERROR: foobarbaz is not versioned"],
2552.2.1 by Vincent Ladeuil
apply martin patch
468
                                      ['file-id', 'foobarbaz'])
2172.4.3 by Alexander Belchenko
Change name of option to '--clean-output' and provide tests
469
470
471
class TestSelftestCleanOutput(TestCaseInTempDir):
472
473
    def test_clean_output(self):
474
        # check that 'bzr selftest --clean-output' works correct
475
        dirs = ('test0000.tmp', 'test0001.tmp', 'bzrlib', 'tests')
476
        files = ('bzr', 'setup.py', 'test9999.tmp')
477
        for i in dirs:
478
            os.mkdir(i)
479
        for i in files:
480
            f = file(i, 'wb')
481
            f.write('content of ')
482
            f.write(i)
483
            f.close()
484
485
        root = os.getcwdu()
486
        before = os.listdir(root)
2172.4.5 by Alexander Belchenko
Small fix: output of os.listdir() should be sorted manually
487
        before.sort()
2172.4.3 by Alexander Belchenko
Change name of option to '--clean-output' and provide tests
488
        self.assertEquals(['bzr','bzrlib','setup.py',
489
                           'test0000.tmp','test0001.tmp',
490
                           'test9999.tmp','tests'],
491
                           before)
492
2552.2.2 by Vincent Ladeuil
Enforce run_bzr(string) where possible.
493
        out, err = self.run_bzr('selftest --clean-output',
494
                                working_dir=root)
2172.4.3 by Alexander Belchenko
Change name of option to '--clean-output' and provide tests
495
2193.1.1 by Martin Pool
test_clean_output: don't depend on directories being cleaned up in order.
496
        self.assertEquals(['delete directory: test0000.tmp',
497
                          'delete directory: test0001.tmp'],
498
                          sorted(out.splitlines()))
2172.4.3 by Alexander Belchenko
Change name of option to '--clean-output' and provide tests
499
        self.assertEquals('', err)
500
501
        after = os.listdir(root)
2172.4.5 by Alexander Belchenko
Small fix: output of os.listdir() should be sorted manually
502
        after.sort()
2172.4.3 by Alexander Belchenko
Change name of option to '--clean-output' and provide tests
503
        self.assertEquals(['bzr','bzrlib','setup.py',
504
                           'test9999.tmp','tests'],
505
                           after)
2394.2.5 by Ian Clatworthy
list-only working, include test not
506
507
2394.2.6 by Ian Clatworthy
completed blackbox tests
508
class TestSelftestListOnly(TestCase):
2394.2.5 by Ian Clatworthy
list-only working, include test not
509
510
    @staticmethod
2394.2.6 by Ian Clatworthy
completed blackbox tests
511
    def _parse_test_list(lines, newlines_in_header=1):
2394.2.5 by Ian Clatworthy
list-only working, include test not
512
        "Parse a list of lines into a tuple of 3 lists (header,body,footer)."
513
514
        in_header = True
515
        in_footer = False
516
        header = []
517
        body = []
2394.2.6 by Ian Clatworthy
completed blackbox tests
518
        footer = []
519
        header_newlines_found = 0 
2394.2.5 by Ian Clatworthy
list-only working, include test not
520
        for line in lines:
521
            if in_header:
522
                if line == '':
2394.2.6 by Ian Clatworthy
completed blackbox tests
523
                    header_newlines_found += 1
524
                    if header_newlines_found >= newlines_in_header:
525
                        in_header = False
526
                        continue
527
                header.append(line)
2394.2.5 by Ian Clatworthy
list-only working, include test not
528
            elif not in_footer:
529
                if line.startswith('-------'):
530
                    in_footer = True
531
                else:
532
                    body.append(line)
533
            else:
534
                footer.append(line)
535
        # If the last body line is blank, drop it off the list
536
        if len(body) > 0 and body[-1] == '':
537
            body.pop()                
538
        return (header,body,footer)
539
540
    def test_list_only(self):
541
        # check that bzr selftest --list-only works correctly
2552.2.2 by Vincent Ladeuil
Enforce run_bzr(string) where possible.
542
        out,err = self.run_bzr('selftest selftest --list-only')
2394.2.6 by Ian Clatworthy
completed blackbox tests
543
        self.assertEndsWith(err, 'tests passed\n')
2394.2.5 by Ian Clatworthy
list-only working, include test not
544
        (header,body,footer) = self._parse_test_list(out.splitlines())
2394.2.8 by Ian Clatworthy
incorporate feedback from jam
545
        num_tests = len(body)
546
        self.assertContainsRe(footer[0], 'Listed %s tests in' % num_tests)
2394.2.5 by Ian Clatworthy
list-only working, include test not
547
2394.2.6 by Ian Clatworthy
completed blackbox tests
548
    def test_list_only_filtered(self):
549
        # check that a filtered --list-only works, both include and exclude
2552.2.2 by Vincent Ladeuil
Enforce run_bzr(string) where possible.
550
        out_all,err_all = self.run_bzr('selftest --list-only')
2394.2.5 by Ian Clatworthy
list-only working, include test not
551
        tests_all = self._parse_test_list(out_all.splitlines())[1]
2552.2.2 by Vincent Ladeuil
Enforce run_bzr(string) where possible.
552
        out_incl,err_incl = self.run_bzr('selftest --list-only selftest')
2394.2.6 by Ian Clatworthy
completed blackbox tests
553
        tests_incl = self._parse_test_list(out_incl.splitlines())[1]
554
        self.assertSubset(tests_incl, tests_all)
2552.2.1 by Vincent Ladeuil
apply martin patch
555
        out_excl,err_excl = self.run_bzr(['selftest', '--list-only',
2552.2.2 by Vincent Ladeuil
Enforce run_bzr(string) where possible.
556
                                          '--exclude', 'selftest'])
2394.2.6 by Ian Clatworthy
completed blackbox tests
557
        tests_excl = self._parse_test_list(out_excl.splitlines())[1]
558
        self.assertSubset(tests_excl, tests_all)
559
        set_incl = set(tests_incl)
560
        set_excl = set(tests_excl)
561
        intersection = set_incl.intersection(set_excl)
562
        self.assertEquals(0, len(intersection))
563
        self.assertEquals(len(tests_all), len(tests_incl) + len(tests_excl))
564
565
    def test_list_only_random(self):
566
        # check that --randomize works correctly
2552.2.2 by Vincent Ladeuil
Enforce run_bzr(string) where possible.
567
        out_all,err_all = self.run_bzr('selftest --list-only selftest')
2394.2.6 by Ian Clatworthy
completed blackbox tests
568
        tests_all = self._parse_test_list(out_all.splitlines())[1]
2477.1.6 by Martin Pool
doc
569
        # XXX: It looks like there are some orders for generating tests that
570
        # fail as of 20070504 - maybe because of import order dependencies.
571
        # So unfortunately this will rarely intermittently fail at the moment.
572
        # -- mbp 20070504
2552.2.1 by Vincent Ladeuil
apply martin patch
573
        out_rand,err_rand = self.run_bzr(['selftest', '--list-only',
2552.2.2 by Vincent Ladeuil
Enforce run_bzr(string) where possible.
574
                                          'selftest', '--randomize', 'now'])
2394.2.6 by Ian Clatworthy
completed blackbox tests
575
        (header_rand,tests_rand,dummy) = self._parse_test_list(
576
            out_rand.splitlines(), 2)
577
        self.assertNotEqual(tests_all, tests_rand)
578
        self.assertEqual(sorted(tests_all), sorted(tests_rand))
579
        # Check that the seed can be reused to get the exact same order
580
        seed_re = re.compile('Randomizing test order using seed (\w+)')
581
        match_obj = seed_re.search(header_rand[-1])
582
        seed = match_obj.group(1)
2552.2.1 by Vincent Ladeuil
apply martin patch
583
        out_rand2,err_rand2 = self.run_bzr(['selftest', '--list-only',
2552.2.2 by Vincent Ladeuil
Enforce run_bzr(string) where possible.
584
                                            'selftest', '--randomize', seed])
2394.2.6 by Ian Clatworthy
completed blackbox tests
585
        (header_rand2,tests_rand2,dummy) = self._parse_test_list(
586
            out_rand2.splitlines(), 2)
587
        self.assertEqual(tests_rand, tests_rand2)
2394.2.5 by Ian Clatworthy
list-only working, include test not
588