~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

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

  • Committer: John Arbash Meinel
  • Date: 2006-09-20 14:51:03 UTC
  • mfrom: (0.8.23 version_info)
  • mto: This revision was merged to the branch mainline in revision 2028.
  • Revision ID: john@arbash-meinel.com-20060920145103-02725c6d6c886040
[merge] version-info plugin, and cleanup for layout in bzr

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')