~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/blackbox/test_selftest.py

  • Committer: Martin Pool
  • Date: 2005-05-02 04:24:33 UTC
  • Revision ID: mbp@sourcefrog.net-20050502042433-c825a7f7235f6b15
doc: notes on merge

Show diffs side-by-side

added added

removed removed

Lines of Context:
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
 
 
18
 
import os
19
 
import signal
20
 
import sys
21
 
 
22
 
import bzrlib
23
 
from bzrlib import (
24
 
    osutils,
25
 
    )
26
 
from bzrlib.errors import ParamikoNotPresent
27
 
from bzrlib.tests import (
28
 
                          TestCase,
29
 
                          TestCaseInTempDir,
30
 
                          TestCaseWithTransport,
31
 
                          TestSkipped,
32
 
                          )
33
 
from bzrlib.tests.blackbox import ExternalBase
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
43
 
        try:
44
 
            import bzrlib.transport.sftp
45
 
        except ParamikoNotPresent:
46
 
            raise TestSkipped("Paramiko not present")
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
 
 
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
 
 
61
 
    def test_transport(self):
62
 
        # test that --transport=sftp works
63
 
        try:
64
 
            import bzrlib.transport.sftp
65
 
        except ParamikoNotPresent:
66
 
            raise TestSkipped("Paramiko not present")
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')
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')
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
85
 
 
86
 
 
87
 
class TestRunBzr(ExternalBase):
88
 
 
89
 
    def run_bzr_captured(self, argv, retcode=0, encoding=None, stdin=None):
90
 
        self.stdin = stdin
91
 
 
92
 
    def test_stdin(self):
93
 
        # test that the stdin keyword to run_bzr is passed through to
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.
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
 
 
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
 
 
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
134
 
        self.factory_stdin = getattr(bzrlib.ui.ui_factory, "stdin", None)
135
 
        self.factory = bzrlib.ui.ui_factory
136
 
        stdout.write('foo\n')
137
 
        stderr.write('bar\n')
138
 
        return 0
139
 
 
140
 
    def test_stdin(self):
141
 
        # test that the stdin keyword to run_bzr_captured is passed through to
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. 
145
 
        self.run_bzr_captured(['foo', 'bar'], stdin='gam')
146
 
        self.assertEqual('gam', self.stdin.read())
147
 
        self.assertTrue(self.stdin is self.factory_stdin)
148
 
        self.run_bzr_captured(['foo', 'bar'], stdin='zippy')
149
 
        self.assertEqual('zippy', self.stdin.read())
150
 
        self.assertTrue(self.stdin is self.factory_stdin)
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)
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')
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')
179
 
 
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>'
189
 
                                          }, universal_newlines=True)
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>'
199
 
                                          }, universal_newlines=True)
200
 
        self.assertEqual('', err)
201
 
        self.assertEqual('Barry <bar@foo.com>\n', out)
202
 
        self.assertEqual(None, os.environ.get('BZR_EMAIL'))
203
 
 
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
213
 
            out, err = self.run_bzr_subprocess('whoami', universal_newlines=True)
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',
219
 
                                               env_changes={'BZR_EMAIL':None},
220
 
                                               universal_newlines=True)
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',
227
 
                           env_changes={'BZR_EMAIL':None, 'EMAIL':None},
228
 
                           universal_newlines=True)
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']
237
 
 
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',
242
 
                        env_changes={'NON_EXISTANT_ENV_VAR':None},
243
 
                        universal_newlines=True)
244
 
        self.assertEqual('it sure does!\n', out)
245
 
        self.assertEqual('', err)
246
 
 
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
 
        """
251
 
        process = self.start_bzr_subprocess(['--version'])
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
 
        """
259
 
        process = self.start_bzr_subprocess(['--versionn'])
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."""
266
 
        process = self.start_bzr_subprocess(['--versionn'])
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
 
        """
275
 
        process = self.start_bzr_subprocess(['--versionn'])
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
 
        """
283
 
        process = self.start_bzr_subprocess(['wait-until-signalled'],
284
 
                                            skip_if_plan_to_signal=True)
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
 
        
291
 
 
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')