/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
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.
1
# Copyright (C) 2005 by Canonical Ltd
2
#
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License version 2 as published by
5
# the Free Software Foundation.
6
#
7
# This program is distributed in the hope that it will be useful,
8
# but WITHOUT ANY WARRANTY; without even the implied warranty of
9
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10
# GNU General Public License for more details.
11
#
12
# You should have received a copy of the GNU General Public License
13
# along with this program; if not, write to the Free Software
14
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
15
16
"""UI tests for the test framework."""
17
1963.1.1 by John Arbash Meinel
run_bzr_subprocess() can take an env_changes parameter
18
import os
1910.17.2 by Andrew Bennetts
Add start_bzr_subprocess and stop_bzr_subprocess to allow test code to continue
19
import signal
1692.3.3 by Robert Collins
Get run_bzr in tests to always assign a new, clean ui factory.
20
import sys
21
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.
22
import bzrlib
1963.1.2 by John Arbash Meinel
Cleanups suggested by Martin, add test that env_changes can remove an env variable
23
from bzrlib import (
24
    osutils,
25
    )
1551.2.47 by abentley
Fixed test_selftest's use of sftp
26
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.
27
from bzrlib.tests import (
28
                          TestCase,
29
                          TestCaseInTempDir,
1819.1.3 by Carl Friedrich Bolz
(lifeless, cfbolz): Add recording of benchmark results to the benchmark history
30
                          TestCaseWithTransport,
1534.4.25 by Robert Collins
Add a --transport parameter to the test suite to set the default transport to be used in the test suite.
31
                          TestSkipped,
32
                          )
1687.1.2 by Robert Collins
Add stdin parameter to run_bzr and run_bzr_captured.
33
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.
34
35
36
class TestOptions(TestCase):
37
38
    current_test = None
39
40
    def test_transport_set_to_sftp(self):
41
        # test the --transport option has taken effect from within the
42
        # test_transport test
1551.2.47 by abentley
Fixed test_selftest's use of sftp
43
        try:
44
            import bzrlib.transport.sftp
45
        except ParamikoNotPresent:
46
            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.
47
        if TestOptions.current_test != "test_transport_set_to_sftp":
48
            return
49
        self.assertEqual(bzrlib.transport.sftp.SFTPAbsoluteServer,
50
                         bzrlib.tests.default_transport)
51
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
52
    def test_transport_set_to_memory(self):
53
        # test the --transport option has taken effect from within the
54
        # test_transport test
55
        import bzrlib.transport.memory
56
        if TestOptions.current_test != "test_transport_set_to_memory":
57
            return
58
        self.assertEqual(bzrlib.transport.memory.MemoryServer,
59
                         bzrlib.tests.default_transport)
60
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.
61
    def test_transport(self):
62
        # test that --transport=sftp works
1551.2.47 by abentley
Fixed test_selftest's use of sftp
63
        try:
64
            import bzrlib.transport.sftp
65
        except ParamikoNotPresent:
66
            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.
67
        old_transport = bzrlib.tests.default_transport
68
        old_root = TestCaseInTempDir.TEST_ROOT
69
        TestCaseInTempDir.TEST_ROOT = None
70
        try:
71
            TestOptions.current_test = "test_transport_set_to_sftp"
72
            stdout = self.capture('selftest --transport=sftp test_transport_set_to_sftp')
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
73
            
74
            self.assertContainsRe(stdout, 'Ran 1 test')
75
            self.assertEqual(old_transport, bzrlib.tests.default_transport)
76
77
            TestOptions.current_test = "test_transport_set_to_memory"
78
            stdout = self.capture('selftest --transport=memory test_transport_set_to_memory')
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.
79
            self.assertContainsRe(stdout, 'Ran 1 test')
80
            self.assertEqual(old_transport, bzrlib.tests.default_transport)
81
        finally:
82
            bzrlib.tests.default_transport = old_transport
83
            TestOptions.current_test = None
84
            TestCaseInTempDir.TEST_ROOT = old_root
1687.1.2 by Robert Collins
Add stdin parameter to run_bzr and run_bzr_captured.
85
86
87
class TestRunBzr(ExternalBase):
88
1685.1.66 by Martin Pool
Update test that hooks run_bzr_captured
89
    def run_bzr_captured(self, argv, retcode=0, encoding=None, stdin=None):
1687.1.2 by Robert Collins
Add stdin parameter to run_bzr and run_bzr_captured.
90
        self.stdin = stdin
91
92
    def test_stdin(self):
93
        # test that the stdin keyword to run_bzr is passed through to
1687.1.15 by Robert Collins
Review comments.
94
        # run_bzr_captured as-is. We do this by overriding
95
        # run_bzr_captured in this class, and then calling run_bzr,
96
        # which is a convenience function for run_bzr_captured, so 
97
        # should invoke it.
1687.1.2 by Robert Collins
Add stdin parameter to run_bzr and run_bzr_captured.
98
        self.run_bzr('foo', 'bar', stdin='gam')
99
        self.assertEqual('gam', self.stdin)
100
        self.run_bzr('foo', 'bar', stdin='zippy')
101
        self.assertEqual('zippy', self.stdin)
102
103
1819.1.3 by Carl Friedrich Bolz
(lifeless, cfbolz): Add recording of benchmark results to the benchmark history
104
class TestBenchmarkTests(TestCaseWithTransport):
105
106
    def test_benchmark_runs_benchmark_tests(self):
107
        """bzr selftest --benchmark should not run the default test suite."""
108
        # We test this by passing a regression test name to --benchmark, which
109
        # should result in 0 rests run.
110
        old_root = TestCaseInTempDir.TEST_ROOT
111
        try:
112
            TestCaseInTempDir.TEST_ROOT = None
113
            out, err = self.run_bzr('selftest', '--benchmark', 'workingtree_implementations')
114
        finally:
115
            TestCaseInTempDir.TEST_ROOT = old_root
116
        self.assertContainsRe(out, 'Ran 0 tests.*\n\nOK')
117
        self.assertEqual(
118
            'running tests...\ntests passed\n',
119
            err)
120
        benchfile = open(".perf_history", "rt")
121
        try:
122
            lines = benchfile.readlines()
123
        finally:
124
            benchfile.close()
125
        self.assertEqual(1, len(lines))
126
        self.assertContainsRe(lines[0], "--date [0-9.]+")
127
128
1687.1.2 by Robert Collins
Add stdin parameter to run_bzr and run_bzr_captured.
129
class TestRunBzrCaptured(ExternalBase):
130
131
    def apply_redirected(self, stdin=None, stdout=None, stderr=None,
132
                         a_callable=None, *args, **kwargs):
133
        self.stdin = stdin
1687.1.11 by Robert Collins
Teach TestCase.run_bzr_captured about the ui factories.
134
        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.
135
        self.factory = bzrlib.ui.ui_factory
136
        stdout.write('foo\n')
137
        stderr.write('bar\n')
1687.1.2 by Robert Collins
Add stdin parameter to run_bzr and run_bzr_captured.
138
        return 0
139
140
    def test_stdin(self):
141
        # test that the stdin keyword to run_bzr_captured is passed through to
1687.1.15 by Robert Collins
Review comments.
142
        # apply_redirected as a StringIO. We do this by overriding
143
        # apply_redirected in this class, and then calling run_bzr_captured,
144
        # which calls apply_redirected. 
1687.1.2 by Robert Collins
Add stdin parameter to run_bzr and run_bzr_captured.
145
        self.run_bzr_captured(['foo', 'bar'], stdin='gam')
146
        self.assertEqual('gam', self.stdin.read())
1687.1.11 by Robert Collins
Teach TestCase.run_bzr_captured about the ui factories.
147
        self.assertTrue(self.stdin is self.factory_stdin)
1687.1.2 by Robert Collins
Add stdin parameter to run_bzr and run_bzr_captured.
148
        self.run_bzr_captured(['foo', 'bar'], stdin='zippy')
149
        self.assertEqual('zippy', self.stdin.read())
1687.1.11 by Robert Collins
Teach TestCase.run_bzr_captured about the ui factories.
150
        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.
151
152
    def test_ui_factory(self):
153
        # each invocation of self.run_bzr_captured should get its own UI
154
        # factory, which is an instance of TestUIFactory, with stdout and
155
        # stderr attached to the stdout and stderr of the invoked
156
        # run_bzr_captured
157
        current_factory = bzrlib.ui.ui_factory
158
        self.run_bzr_captured(['foo'])
159
        self.failIf(current_factory is self.factory)
160
        self.assertNotEqual(sys.stdout, self.factory.stdout)
161
        self.assertNotEqual(sys.stderr, self.factory.stderr)
162
        self.assertEqual('foo\n', self.factory.stdout.getvalue())
163
        self.assertEqual('bar\n', self.factory.stderr.getvalue())
164
        self.assertIsInstance(self.factory, bzrlib.tests.blackbox.TestUIFactory)
1871.1.1 by Robert Collins
Relocate bzrlib selftest external output tests to bzrlib/tests/blackbox/test_selftest.py.
165
166
    def test_run_bzr_subprocess(self):
167
        """The run_bzr_helper_external comand behaves nicely."""
168
        result = self.run_bzr_subprocess('--version')
169
        result = self.run_bzr_subprocess('--version', retcode=None)
170
        self.assertContainsRe(result[0], 'is free software')
171
        self.assertRaises(AssertionError, self.run_bzr_subprocess, 
172
                          '--versionn')
173
        result = self.run_bzr_subprocess('--versionn', retcode=3)
174
        result = self.run_bzr_subprocess('--versionn', retcode=None)
175
        self.assertContainsRe(result[1], 'unknown command')
1857.1.20 by Aaron Bentley
Strip out all the EnumOption stuff
176
        err = self.run_bzr_subprocess('merge', '--merge-type', 'magic merge', 
177
                                      retcode=3)[1]
178
        self.assertContainsRe(err, 'No known merge type magic merge')
1871.1.1 by Robert Collins
Relocate bzrlib selftest external output tests to bzrlib/tests/blackbox/test_selftest.py.
179
1963.1.1 by John Arbash Meinel
run_bzr_subprocess() can take an env_changes parameter
180
    def test_run_bzr_subprocess_env(self):
181
        """run_bzr_subprocess can set environment variables in the child only.
182
183
        These changes should not change the running process, only the child.
184
        """
185
        # The test suite should unset this variable
186
        self.assertEqual(None, os.environ.get('BZR_EMAIL'))
187
        out, err = self.run_bzr_subprocess('whoami', env_changes={
188
                                            'BZR_EMAIL':'Joe Foo <joe@foo.com>'
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
189
                                          }, universal_newlines=True)
1963.1.1 by John Arbash Meinel
run_bzr_subprocess() can take an env_changes parameter
190
        self.assertEqual('', err)
191
        self.assertEqual('Joe Foo <joe@foo.com>\n', out)
192
        # And it should not be modified
193
        self.assertEqual(None, os.environ.get('BZR_EMAIL'))
194
195
        # Do it again with a different address, just to make sure
196
        # it is actually changing
197
        out, err = self.run_bzr_subprocess('whoami', env_changes={
198
                                            'BZR_EMAIL':'Barry <bar@foo.com>'
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
199
                                          }, universal_newlines=True)
1963.1.1 by John Arbash Meinel
run_bzr_subprocess() can take an env_changes parameter
200
        self.assertEqual('', err)
201
        self.assertEqual('Barry <bar@foo.com>\n', out)
202
        self.assertEqual(None, os.environ.get('BZR_EMAIL'))
203
1963.1.2 by John Arbash Meinel
Cleanups suggested by Martin, add test that env_changes can remove an env variable
204
    def test_run_bzr_subprocess_env_del(self):
205
        """run_bzr_subprocess can remove environment variables too."""
206
        # Create a random email, so we are sure this won't collide
207
        rand_bzr_email = 'John Doe <jdoe@%s.com>' % (osutils.rand_chars(20),)
208
        rand_email = 'Jane Doe <jdoe@%s.com>' % (osutils.rand_chars(20),)
209
        os.environ['BZR_EMAIL'] = rand_bzr_email
210
        os.environ['EMAIL'] = rand_email
211
        try:
212
            # 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
213
            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
214
            self.assertEqual('', err)
215
            self.assertEqual(rand_bzr_email + '\n', out)
216
217
            # Now that BZR_EMAIL is not set, it should fall back to EMAIL
218
            out, err = self.run_bzr_subprocess('whoami',
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
219
                                               env_changes={'BZR_EMAIL':None},
220
                                               universal_newlines=True)
1963.1.2 by John Arbash Meinel
Cleanups suggested by Martin, add test that env_changes can remove an env variable
221
            self.assertEqual('', err)
222
            self.assertEqual(rand_email + '\n', out)
223
224
            # This switches back to the default email guessing logic
225
            # Which shouldn't match either of the above addresses
226
            out, err = self.run_bzr_subprocess('whoami',
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
227
                           env_changes={'BZR_EMAIL':None, 'EMAIL':None},
228
                           universal_newlines=True)
1963.1.2 by John Arbash Meinel
Cleanups suggested by Martin, add test that env_changes can remove an env variable
229
230
            self.assertEqual('', err)
231
            self.assertNotEqual(rand_bzr_email + '\n', out)
232
            self.assertNotEqual(rand_email + '\n', out)
233
        finally:
234
            # TestCase cleans up BZR_EMAIL, and EMAIL at startup
235
            del os.environ['BZR_EMAIL']
236
            del os.environ['EMAIL']
1871.1.1 by Robert Collins
Relocate bzrlib selftest external output tests to bzrlib/tests/blackbox/test_selftest.py.
237
1963.1.4 by John Arbash Meinel
env_changes={} should be safe to remove variables that aren't there
238
    def test_run_bzr_subprocess_env_del_missing(self):
239
        """run_bzr_subprocess won't fail if deleting a nonexistant env var"""
240
        self.failIf('NON_EXISTANT_ENV_VAR' in os.environ)
241
        out, err = self.run_bzr_subprocess('rocks',
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
242
                        env_changes={'NON_EXISTANT_ENV_VAR':None},
243
                        universal_newlines=True)
244
        self.assertEqual('it sure does!\n', out)
245
        self.assertEqual('', err)
1963.1.4 by John Arbash Meinel
env_changes={} should be safe to remove variables that aren't there
246
1910.17.2 by Andrew Bennetts
Add start_bzr_subprocess and stop_bzr_subprocess to allow test code to continue
247
    def test_start_and_stop_bzr_subprocess(self):
248
        """We can start and perform other test actions while that process is
249
        still alive.
250
        """
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
251
        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
252
        result = self.finish_bzr_subprocess(process)
253
        self.assertContainsRe(result[0], 'is free software')
254
        self.assertEqual('', result[1])
255
256
    def test_start_and_stop_bzr_subprocess_with_error(self):
257
        """finish_bzr_subprocess allows specification of the desired exit code.
258
        """
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
259
        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
260
        result = self.finish_bzr_subprocess(process, retcode=3)
261
        self.assertEqual('', result[0])
262
        self.assertContainsRe(result[1], 'unknown command')
263
264
    def test_start_and_stop_bzr_subprocess_ignoring_retcode(self):
265
        """finish_bzr_subprocess allows the exit code to be ignored."""
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
266
        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
267
        result = self.finish_bzr_subprocess(process, retcode=None)
268
        self.assertEqual('', result[0])
269
        self.assertContainsRe(result[1], 'unknown command')
270
271
    def test_start_and_stop_bzr_subprocess_with_unexpected_retcode(self):
272
        """finish_bzr_subprocess raises self.failureException if the retcode is
273
        not the expected one.
274
        """
1910.17.8 by Andrew Bennetts
Refactor run_bzr_subprocess to use start_bzr_subprocess and finish_bzr_subprocess.
275
        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
276
        self.assertRaises(self.failureException, self.finish_bzr_subprocess,
277
                          process, retcode=0)
278
        
279
    def test_start_and_stop_bzr_subprocess_send_signal(self):
280
        """finish_bzr_subprocess raises self.failureException if the retcode is
281
        not the expected one.
282
        """
1910.17.9 by Andrew Bennetts
Add skip_if_plan_to_signal flag to start_bzr_subprocess.
283
        process = self.start_bzr_subprocess(['wait-until-signalled'],
284
                                            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
285
        self.assertEqual('running\n', process.stdout.readline())
286
        result = self.finish_bzr_subprocess(process, send_signal=signal.SIGINT,
287
                                            retcode=3)
288
        self.assertEqual('', result[0])
289
        self.assertEqual('bzr: interrupted\n', result[1])
290
        
1963.1.4 by John Arbash Meinel
env_changes={} should be safe to remove variables that aren't there
291
1871.1.1 by Robert Collins
Relocate bzrlib selftest external output tests to bzrlib/tests/blackbox/test_selftest.py.
292
class TestRunBzrError(ExternalBase):
293
294
    def test_run_bzr_error(self):
295
        out, err = self.run_bzr_error(['^$'], 'rocks', retcode=0)
296
        self.assertEqual(out, 'it sure does!\n')
297
298
        out, err = self.run_bzr_error(["'foobarbaz' is not a versioned file"],
299
                                      'file-id', 'foobarbaz')