/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
1540.3.22 by Martin Pool
[patch] Add TestCase.assertIsInstance
1
# Copyright (C) 2005, 2006 by Canonical Ltd
1185.51.1 by Martin Pool
Better message when failing to import a test suite.
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
1534.11.7 by Robert Collins
Test and correct the problem with nested test logs breaking further in-test logs.
16
"""Tests for the test framework."""
1185.51.1 by Martin Pool
Better message when failing to import a test suite.
17
18
import os
1707.2.1 by Robert Collins
'bzr selftest --benchmark' will run a new benchmarking selftest.
19
from StringIO import StringIO
1185.51.1 by Martin Pool
Better message when failing to import a test suite.
20
import sys
1185.33.95 by Martin Pool
New TestSkipped facility, and tests for it.
21
import unittest
1185.62.24 by John Arbash Meinel
Changing the exception that sftp.py throws when it can't find paramiko, so that the test suite can handle it.
22
import warnings
1185.51.1 by Martin Pool
Better message when failing to import a test suite.
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
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
25
from bzrlib.progress import _BaseProgressBar
1526.1.3 by Robert Collins
Merge from upstream.
26
from bzrlib.tests import (
27
                          _load_module_by_name,
1534.4.31 by Robert Collins
cleanedup test_outside_wt
28
                          ChrootedTestCase,
1526.1.3 by Robert Collins
Merge from upstream.
29
                          TestCase,
30
                          TestCaseInTempDir,
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
31
                          TestCaseWithTransport,
1526.1.3 by Robert Collins
Merge from upstream.
32
                          TestSkipped,
1707.2.1 by Robert Collins
'bzr selftest --benchmark' will run a new benchmarking selftest.
33
                          TestSuite,
1526.1.3 by Robert Collins
Merge from upstream.
34
                          TextTestRunner,
35
                          )
1185.62.24 by John Arbash Meinel
Changing the exception that sftp.py throws when it can't find paramiko, so that the test suite can handle it.
36
import bzrlib.errors as errors
1185.51.1 by Martin Pool
Better message when failing to import a test suite.
37
38
39
class SelftestTests(TestCase):
40
41
    def test_import_tests(self):
42
        mod = _load_module_by_name('bzrlib.tests.test_selftest')
43
        self.assertEqual(mod.SelftestTests, SelftestTests)
44
45
    def test_import_test_failure(self):
46
        self.assertRaises(ImportError,
47
                          _load_module_by_name,
48
                          'bzrlib.no-name-yet')
49
50
51
class MetaTestLog(TestCase):
1526.1.1 by Robert Collins
Run the test suite with no locale as well as the default locale. Also add a test for build_tree_shape to selftest.
52
1185.51.1 by Martin Pool
Better message when failing to import a test suite.
53
    def test_logging(self):
54
        """Test logs are captured when a test fails."""
55
        self.log('a test message')
56
        self._log_file.flush()
57
        self.assertContainsRe(self._get_log(), 'a test message\n')
1185.33.95 by Martin Pool
New TestSkipped facility, and tests for it.
58
59
1526.1.1 by Robert Collins
Run the test suite with no locale as well as the default locale. Also add a test for build_tree_shape to selftest.
60
class TestTreeShape(TestCaseInTempDir):
61
62
    def test_unicode_paths(self):
63
        filename = u'hell\u00d8'
1526.1.4 by Robert Collins
forgot my self.
64
        try:
65
            self.build_tree_contents([(filename, 'contents of hello')])
66
        except UnicodeEncodeError:
67
            raise TestSkipped("can't build unicode working tree in "
68
                "filesystem encoding %s" % sys.getfilesystemencoding())
1526.1.1 by Robert Collins
Run the test suite with no locale as well as the default locale. Also add a test for build_tree_shape to selftest.
69
        self.failUnlessExists(filename)
1526.1.3 by Robert Collins
Merge from upstream.
70
71
1530.1.1 by Robert Collins
Minimal infrastructure to test TransportTestProviderAdapter.
72
class TestTransportProviderAdapter(TestCase):
1530.1.21 by Robert Collins
Review feedback fixes.
73
    """A group of tests that test the transport implementation adaption core.
74
1551.1.1 by Martin Pool
[merge] branch-formats branch, and reconcile changes
75
    This is a meta test that the tests are applied to all available 
76
    transports.
77
1530.1.21 by Robert Collins
Review feedback fixes.
78
    This will be generalised in the future which is why it is in this 
79
    test file even though it is specific to transport tests at the moment.
80
    """
1530.1.1 by Robert Collins
Minimal infrastructure to test TransportTestProviderAdapter.
81
1530.1.11 by Robert Collins
Push the transport permutations list into each transport module allowing for automatic testing of new modules that are registered as transports.
82
    def test_get_transport_permutations(self):
1530.1.21 by Robert Collins
Review feedback fixes.
83
        # this checks that we the module get_test_permutations call
84
        # is made by the adapter get_transport_test_permitations method.
1530.1.11 by Robert Collins
Push the transport permutations list into each transport module allowing for automatic testing of new modules that are registered as transports.
85
        class MockModule(object):
86
            def get_test_permutations(self):
87
                return sample_permutation
88
        sample_permutation = [(1,2), (3,4)]
89
        from bzrlib.transport import TransportTestProviderAdapter
90
        adapter = TransportTestProviderAdapter()
91
        self.assertEqual(sample_permutation,
92
                         adapter.get_transport_test_permutations(MockModule()))
93
94
    def test_adapter_checks_all_modules(self):
1530.1.21 by Robert Collins
Review feedback fixes.
95
        # this checks that the adapter returns as many permurtations as
96
        # there are in all the registered# transport modules for there
97
        # - we assume if this matches its probably doing the right thing
98
        # especially in combination with the tests for setting the right
99
        # classes below.
1530.1.11 by Robert Collins
Push the transport permutations list into each transport module allowing for automatic testing of new modules that are registered as transports.
100
        from bzrlib.transport import (TransportTestProviderAdapter,
101
                                      _get_transport_modules
102
                                      )
103
        modules = _get_transport_modules()
104
        permutation_count = 0
105
        for module in modules:
1185.62.24 by John Arbash Meinel
Changing the exception that sftp.py throws when it can't find paramiko, so that the test suite can handle it.
106
            try:
107
                permutation_count += len(reduce(getattr, 
108
                    (module + ".get_test_permutations").split('.')[1:],
109
                     __import__(module))())
110
            except errors.DependencyNotPresent:
111
                pass
1530.1.11 by Robert Collins
Push the transport permutations list into each transport module allowing for automatic testing of new modules that are registered as transports.
112
        input_test = TestTransportProviderAdapter(
113
            "test_adapter_sets_transport_class")
114
        adapter = TransportTestProviderAdapter()
115
        self.assertEqual(permutation_count,
116
                         len(list(iter(adapter.adapt(input_test)))))
117
1530.1.1 by Robert Collins
Minimal infrastructure to test TransportTestProviderAdapter.
118
    def test_adapter_sets_transport_class(self):
1540.3.21 by Martin Pool
Trim test for TestTransportProviderAdapter to be less dependent on
119
        # Check that the test adapter inserts a transport and server into the
120
        # generated test.
121
        #
122
        # This test used to know about all the possible transports and the
123
        # order they were returned but that seems overly brittle (mbp
124
        # 20060307)
1530.1.1 by Robert Collins
Minimal infrastructure to test TransportTestProviderAdapter.
125
        input_test = TestTransportProviderAdapter(
126
            "test_adapter_sets_transport_class")
1540.3.21 by Martin Pool
Trim test for TestTransportProviderAdapter to be less dependent on
127
        from bzrlib.transport import TransportTestProviderAdapter
1530.1.1 by Robert Collins
Minimal infrastructure to test TransportTestProviderAdapter.
128
        suite = TransportTestProviderAdapter().adapt(input_test)
1540.3.21 by Martin Pool
Trim test for TestTransportProviderAdapter to be less dependent on
129
        tests = list(iter(suite))
130
        self.assertTrue(len(tests) > 6)
131
        # there are at least that many builtin transports
132
        one_test = tests[0]
133
        self.assertTrue(issubclass(one_test.transport_class, 
134
                                   bzrlib.transport.Transport))
135
        self.assertTrue(issubclass(one_test.transport_server, 
136
                                   bzrlib.transport.Server))
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
137
138
139
class TestBranchProviderAdapter(TestCase):
140
    """A group of tests that test the branch implementation test adapter."""
141
142
    def test_adapted_tests(self):
143
        # check that constructor parameters are passed through to the adapted
144
        # test.
145
        from bzrlib.branch import BranchTestProviderAdapter
146
        input_test = TestBranchProviderAdapter(
147
            "test_adapted_tests")
148
        server1 = "a"
149
        server2 = "b"
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
150
        formats = [("c", "C"), ("d", "D")]
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
151
        adapter = BranchTestProviderAdapter(server1, server2, formats)
152
        suite = adapter.adapt(input_test)
153
        tests = list(iter(suite))
154
        self.assertEqual(2, len(tests))
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
155
        self.assertEqual(tests[0].branch_format, formats[0][0])
156
        self.assertEqual(tests[0].bzrdir_format, formats[0][1])
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
157
        self.assertEqual(tests[0].transport_server, server1)
158
        self.assertEqual(tests[0].transport_readonly_server, server2)
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
159
        self.assertEqual(tests[1].branch_format, formats[1][0])
160
        self.assertEqual(tests[1].bzrdir_format, formats[1][1])
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
161
        self.assertEqual(tests[1].transport_server, server1)
162
        self.assertEqual(tests[1].transport_readonly_server, server2)
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
163
164
1534.4.39 by Robert Collins
Basic BzrDir support.
165
class TestBzrDirProviderAdapter(TestCase):
166
    """A group of tests that test the bzr dir implementation test adapter."""
167
168
    def test_adapted_tests(self):
169
        # check that constructor parameters are passed through to the adapted
170
        # test.
171
        from bzrlib.bzrdir import BzrDirTestProviderAdapter
172
        input_test = TestBzrDirProviderAdapter(
173
            "test_adapted_tests")
174
        server1 = "a"
175
        server2 = "b"
176
        formats = ["c", "d"]
177
        adapter = BzrDirTestProviderAdapter(server1, server2, formats)
178
        suite = adapter.adapt(input_test)
179
        tests = list(iter(suite))
180
        self.assertEqual(2, len(tests))
181
        self.assertEqual(tests[0].bzrdir_format, formats[0])
182
        self.assertEqual(tests[0].transport_server, server1)
183
        self.assertEqual(tests[0].transport_readonly_server, server2)
184
        self.assertEqual(tests[1].bzrdir_format, formats[1])
185
        self.assertEqual(tests[1].transport_server, server1)
186
        self.assertEqual(tests[1].transport_readonly_server, server2)
187
188
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
189
class TestRepositoryProviderAdapter(TestCase):
190
    """A group of tests that test the repository implementation test adapter."""
191
192
    def test_adapted_tests(self):
193
        # check that constructor parameters are passed through to the adapted
194
        # test.
195
        from bzrlib.repository import RepositoryTestProviderAdapter
196
        input_test = TestRepositoryProviderAdapter(
197
            "test_adapted_tests")
198
        server1 = "a"
199
        server2 = "b"
200
        formats = [("c", "C"), ("d", "D")]
201
        adapter = RepositoryTestProviderAdapter(server1, server2, formats)
202
        suite = adapter.adapt(input_test)
203
        tests = list(iter(suite))
204
        self.assertEqual(2, len(tests))
205
        self.assertEqual(tests[0].bzrdir_format, formats[0][1])
206
        self.assertEqual(tests[0].repository_format, formats[0][0])
207
        self.assertEqual(tests[0].transport_server, server1)
208
        self.assertEqual(tests[0].transport_readonly_server, server2)
209
        self.assertEqual(tests[1].bzrdir_format, formats[1][1])
210
        self.assertEqual(tests[1].repository_format, formats[1][0])
211
        self.assertEqual(tests[1].transport_server, server1)
212
        self.assertEqual(tests[1].transport_readonly_server, server2)
213
214
1534.1.29 by Robert Collins
Add a test environment for InterRepository objects, and remove the fetch corner case tests from test_repository.
215
class TestInterRepositoryProviderAdapter(TestCase):
216
    """A group of tests that test the InterRepository test adapter."""
217
218
    def test_adapted_tests(self):
219
        # check that constructor parameters are passed through to the adapted
220
        # test.
221
        from bzrlib.repository import InterRepositoryTestProviderAdapter
222
        input_test = TestInterRepositoryProviderAdapter(
223
            "test_adapted_tests")
224
        server1 = "a"
225
        server2 = "b"
1563.2.20 by Robert Collins
Add a revision store test adapter.
226
        formats = [(str, "C1", "C2"), (int, "D1", "D2")]
1534.1.29 by Robert Collins
Add a test environment for InterRepository objects, and remove the fetch corner case tests from test_repository.
227
        adapter = InterRepositoryTestProviderAdapter(server1, server2, formats)
228
        suite = adapter.adapt(input_test)
229
        tests = list(iter(suite))
230
        self.assertEqual(2, len(tests))
231
        self.assertEqual(tests[0].interrepo_class, formats[0][0])
232
        self.assertEqual(tests[0].repository_format, formats[0][1])
233
        self.assertEqual(tests[0].repository_format_to, formats[0][2])
234
        self.assertEqual(tests[0].transport_server, server1)
235
        self.assertEqual(tests[0].transport_readonly_server, server2)
1563.2.20 by Robert Collins
Add a revision store test adapter.
236
        self.assertEqual(tests[1].interrepo_class, formats[1][0])
1534.1.29 by Robert Collins
Add a test environment for InterRepository objects, and remove the fetch corner case tests from test_repository.
237
        self.assertEqual(tests[1].repository_format, formats[1][1])
238
        self.assertEqual(tests[1].repository_format_to, formats[1][2])
239
        self.assertEqual(tests[1].transport_server, server1)
240
        self.assertEqual(tests[1].transport_readonly_server, server2)
241
242
1563.2.12 by Robert Collins
Checkpointing: created InterObject to factor out common inter object worker code, added InterVersionedFile and tests to allow making join work between any versionedfile.
243
class TestInterVersionedFileProviderAdapter(TestCase):
244
    """A group of tests that test the InterVersionedFile test adapter."""
245
246
    def test_adapted_tests(self):
247
        # check that constructor parameters are passed through to the adapted
248
        # test.
249
        from bzrlib.versionedfile import InterVersionedFileTestProviderAdapter
250
        input_test = TestInterRepositoryProviderAdapter(
251
            "test_adapted_tests")
252
        server1 = "a"
253
        server2 = "b"
1563.2.20 by Robert Collins
Add a revision store test adapter.
254
        formats = [(str, "C1", "C2"), (int, "D1", "D2")]
1563.2.12 by Robert Collins
Checkpointing: created InterObject to factor out common inter object worker code, added InterVersionedFile and tests to allow making join work between any versionedfile.
255
        adapter = InterVersionedFileTestProviderAdapter(server1, server2, formats)
256
        suite = adapter.adapt(input_test)
257
        tests = list(iter(suite))
258
        self.assertEqual(2, len(tests))
259
        self.assertEqual(tests[0].interversionedfile_class, formats[0][0])
260
        self.assertEqual(tests[0].versionedfile_factory, formats[0][1])
261
        self.assertEqual(tests[0].versionedfile_factory_to, formats[0][2])
262
        self.assertEqual(tests[0].transport_server, server1)
263
        self.assertEqual(tests[0].transport_readonly_server, server2)
1563.2.20 by Robert Collins
Add a revision store test adapter.
264
        self.assertEqual(tests[1].interversionedfile_class, formats[1][0])
1563.2.12 by Robert Collins
Checkpointing: created InterObject to factor out common inter object worker code, added InterVersionedFile and tests to allow making join work between any versionedfile.
265
        self.assertEqual(tests[1].versionedfile_factory, formats[1][1])
266
        self.assertEqual(tests[1].versionedfile_factory_to, formats[1][2])
267
        self.assertEqual(tests[1].transport_server, server1)
268
        self.assertEqual(tests[1].transport_readonly_server, server2)
269
270
1563.2.20 by Robert Collins
Add a revision store test adapter.
271
class TestRevisionStoreProviderAdapter(TestCase):
272
    """A group of tests that test the RevisionStore test adapter."""
273
274
    def test_adapted_tests(self):
275
        # check that constructor parameters are passed through to the adapted
276
        # test.
277
        from bzrlib.store.revision import RevisionStoreTestProviderAdapter
278
        input_test = TestRevisionStoreProviderAdapter(
279
            "test_adapted_tests")
280
        # revision stores need a store factory - i.e. RevisionKnit
281
        #, a readonly and rw transport 
282
        # transport servers:
283
        server1 = "a"
284
        server2 = "b"
285
        store_factories = ["c", "d"]
286
        adapter = RevisionStoreTestProviderAdapter(server1, server2, store_factories)
287
        suite = adapter.adapt(input_test)
288
        tests = list(iter(suite))
289
        self.assertEqual(2, len(tests))
290
        self.assertEqual(tests[0].store_factory, store_factories[0][0])
291
        self.assertEqual(tests[0].transport_server, server1)
292
        self.assertEqual(tests[0].transport_readonly_server, server2)
293
        self.assertEqual(tests[1].store_factory, store_factories[1][0])
294
        self.assertEqual(tests[1].transport_server, server1)
295
        self.assertEqual(tests[1].transport_readonly_server, server2)
296
297
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
298
class TestWorkingTreeProviderAdapter(TestCase):
299
    """A group of tests that test the workingtree implementation test adapter."""
300
301
    def test_adapted_tests(self):
302
        # check that constructor parameters are passed through to the adapted
303
        # test.
304
        from bzrlib.workingtree import WorkingTreeTestProviderAdapter
305
        input_test = TestWorkingTreeProviderAdapter(
306
            "test_adapted_tests")
307
        server1 = "a"
308
        server2 = "b"
309
        formats = [("c", "C"), ("d", "D")]
310
        adapter = WorkingTreeTestProviderAdapter(server1, server2, formats)
311
        suite = adapter.adapt(input_test)
312
        tests = list(iter(suite))
313
        self.assertEqual(2, len(tests))
314
        self.assertEqual(tests[0].workingtree_format, formats[0][0])
315
        self.assertEqual(tests[0].bzrdir_format, formats[0][1])
316
        self.assertEqual(tests[0].transport_server, server1)
317
        self.assertEqual(tests[0].transport_readonly_server, server2)
318
        self.assertEqual(tests[1].workingtree_format, formats[1][0])
319
        self.assertEqual(tests[1].bzrdir_format, formats[1][1])
320
        self.assertEqual(tests[1].transport_server, server1)
321
        self.assertEqual(tests[1].transport_readonly_server, server2)
322
323
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
324
class TestTestCaseWithTransport(TestCaseWithTransport):
325
    """Tests for the convenience functions TestCaseWithTransport introduces."""
326
327
    def test_get_readonly_url_none(self):
328
        from bzrlib.transport import get_transport
329
        from bzrlib.transport.memory import MemoryServer
330
        from bzrlib.transport.readonly import ReadonlyTransportDecorator
331
        self.transport_server = MemoryServer
332
        self.transport_readonly_server = None
333
        # calling get_readonly_transport() constructs a decorator on the url
334
        # for the server
335
        url = self.get_readonly_url()
1534.4.11 by Robert Collins
Convert test_open_containing from being a Remote test to being the more accurate Chrooted test.
336
        url2 = self.get_readonly_url('foo/bar')
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
337
        t = get_transport(url)
1534.4.11 by Robert Collins
Convert test_open_containing from being a Remote test to being the more accurate Chrooted test.
338
        t2 = get_transport(url2)
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
339
        self.failUnless(isinstance(t, ReadonlyTransportDecorator))
1534.4.11 by Robert Collins
Convert test_open_containing from being a Remote test to being the more accurate Chrooted test.
340
        self.failUnless(isinstance(t2, ReadonlyTransportDecorator))
341
        self.assertEqual(t2.base[:-1], t.abspath('foo/bar'))
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
342
343
    def test_get_readonly_url_http(self):
344
        from bzrlib.transport import get_transport
345
        from bzrlib.transport.local import LocalRelpathServer
1540.3.6 by Martin Pool
[merge] update from bzr.dev
346
        from bzrlib.transport.http import HttpServer, HttpTransportBase
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
347
        self.transport_server = LocalRelpathServer
348
        self.transport_readonly_server = HttpServer
349
        # calling get_readonly_transport() gives us a HTTP server instance.
350
        url = self.get_readonly_url()
1534.4.11 by Robert Collins
Convert test_open_containing from being a Remote test to being the more accurate Chrooted test.
351
        url2 = self.get_readonly_url('foo/bar')
1540.3.6 by Martin Pool
[merge] update from bzr.dev
352
        # the transport returned may be any HttpTransportBase subclass
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
353
        t = get_transport(url)
1534.4.11 by Robert Collins
Convert test_open_containing from being a Remote test to being the more accurate Chrooted test.
354
        t2 = get_transport(url2)
1540.3.6 by Martin Pool
[merge] update from bzr.dev
355
        self.failUnless(isinstance(t, HttpTransportBase))
356
        self.failUnless(isinstance(t2, HttpTransportBase))
1534.4.11 by Robert Collins
Convert test_open_containing from being a Remote test to being the more accurate Chrooted test.
357
        self.assertEqual(t2.base[:-1], t.abspath('foo/bar'))
1534.4.31 by Robert Collins
cleanedup test_outside_wt
358
1553.5.68 by Martin Pool
Add new TestCaseWithTransport.assertIsDirectory() and tests
359
    def test_is_directory(self):
360
        """Test assertIsDirectory assertion"""
361
        t = self.get_transport()
362
        self.build_tree(['a_dir/', 'a_file'], transport=t)
363
        self.assertIsDirectory('a_dir', t)
364
        self.assertRaises(AssertionError, self.assertIsDirectory, 'a_file', t)
365
        self.assertRaises(AssertionError, self.assertIsDirectory, 'not_here', t)
1534.4.31 by Robert Collins
cleanedup test_outside_wt
366
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
367
1534.4.31 by Robert Collins
cleanedup test_outside_wt
368
class TestChrootedTest(ChrootedTestCase):
369
370
    def test_root_is_root(self):
371
        from bzrlib.transport import get_transport
372
        t = get_transport(self.get_readonly_url())
373
        url = t.base
374
        self.assertEqual(url, t.clone('..').base)
1540.3.22 by Martin Pool
[patch] Add TestCase.assertIsInstance
375
376
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
377
class MockProgress(_BaseProgressBar):
378
    """Progress-bar standin that records calls.
379
380
    Useful for testing pb using code.
381
    """
382
383
    def __init__(self):
384
        _BaseProgressBar.__init__(self)
385
        self.calls = []
386
387
    def tick(self):
388
        self.calls.append(('tick',))
389
390
    def update(self, msg=None, current=None, total=None):
391
        self.calls.append(('update', msg, current, total))
392
393
    def clear(self):
394
        self.calls.append(('clear',))
395
396
397
class TestResult(TestCase):
398
399
    def test_progress_bar_style_quiet(self):
400
        # test using a progress bar.
401
        dummy_test = TestResult('test_progress_bar_style_quiet')
402
        dummy_error = (Exception, None, [])
403
        mypb = MockProgress()
404
        mypb.update('Running tests', 0, 4)
405
        last_calls = mypb.calls[:]
406
        result = bzrlib.tests._MyResult(self._log_file,
407
                                        descriptions=0,
408
                                        verbosity=1,
409
                                        pb=mypb)
410
        self.assertEqual(last_calls, mypb.calls)
411
412
        # an error 
413
        result.startTest(dummy_test)
1534.11.3 by Robert Collins
Show test names and status in the progress bar.
414
        # starting a test prints the test name
415
        self.assertEqual(last_calls + [('update', '...tyle_quiet', 0, None)], mypb.calls)
416
        last_calls = mypb.calls[:]
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
417
        result.addError(dummy_test, dummy_error)
1534.11.3 by Robert Collins
Show test names and status in the progress bar.
418
        self.assertEqual(last_calls + [('update', 'ERROR        ', 1, None)], mypb.calls)
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
419
        last_calls = mypb.calls[:]
420
421
        # a failure
422
        result.startTest(dummy_test)
1534.11.3 by Robert Collins
Show test names and status in the progress bar.
423
        self.assertEqual(last_calls + [('update', '...tyle_quiet', 1, None)], mypb.calls)
424
        last_calls = mypb.calls[:]
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
425
        result.addFailure(dummy_test, dummy_error)
1534.11.3 by Robert Collins
Show test names and status in the progress bar.
426
        self.assertEqual(last_calls + [('update', 'FAIL         ', 2, None)], mypb.calls)
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
427
        last_calls = mypb.calls[:]
428
429
        # a success
430
        result.startTest(dummy_test)
1534.11.3 by Robert Collins
Show test names and status in the progress bar.
431
        self.assertEqual(last_calls + [('update', '...tyle_quiet', 2, None)], mypb.calls)
432
        last_calls = mypb.calls[:]
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
433
        result.addSuccess(dummy_test)
1534.11.3 by Robert Collins
Show test names and status in the progress bar.
434
        self.assertEqual(last_calls + [('update', 'OK           ', 3, None)], mypb.calls)
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
435
        last_calls = mypb.calls[:]
436
437
        # a skip
438
        result.startTest(dummy_test)
1534.11.3 by Robert Collins
Show test names and status in the progress bar.
439
        self.assertEqual(last_calls + [('update', '...tyle_quiet', 3, None)], mypb.calls)
440
        last_calls = mypb.calls[:]
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
441
        result.addSkipped(dummy_test, dummy_error)
1534.11.3 by Robert Collins
Show test names and status in the progress bar.
442
        self.assertEqual(last_calls + [('update', 'SKIP         ', 4, None)], mypb.calls)
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
443
        last_calls = mypb.calls[:]
444
445
446
class TestRunner(TestCase):
447
448
    def dummy_test(self):
449
        pass
450
1534.11.7 by Robert Collins
Test and correct the problem with nested test logs breaking further in-test logs.
451
    def run_test_runner(self, testrunner, test):
452
        """Run suite in testrunner, saving global state and restoring it.
453
454
        This current saves and restores:
455
        TestCaseInTempDir.TEST_ROOT
456
        
457
        There should be no tests in this file that use bzrlib.tests.TextTestRunner
458
        without using this convenience method, because of our use of global state.
459
        """
460
        old_root = TestCaseInTempDir.TEST_ROOT
461
        try:
462
            TestCaseInTempDir.TEST_ROOT = None
463
            return testrunner.run(test)
464
        finally:
465
            TestCaseInTempDir.TEST_ROOT = old_root
466
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
467
    def test_accepts_and_uses_pb_parameter(self):
468
        test = TestRunner('dummy_test')
469
        mypb = MockProgress()
470
        self.assertEqual([], mypb.calls)
1534.11.7 by Robert Collins
Test and correct the problem with nested test logs breaking further in-test logs.
471
        runner = TextTestRunner(stream=self._log_file, pb=mypb)
472
        result = self.run_test_runner(runner, test)
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
473
        self.assertEqual(1, result.testsRun)
474
        self.assertEqual(('update', 'Running tests', 0, 1), mypb.calls[0])
1534.11.3 by Robert Collins
Show test names and status in the progress bar.
475
        self.assertEqual(('update', '...dummy_test', 0, None), mypb.calls[1])
476
        self.assertEqual(('update', 'OK           ', 1, None), mypb.calls[2])
477
        self.assertEqual(('update', 'Cleaning up', 0, 1), mypb.calls[3])
478
        self.assertEqual(('clear',), mypb.calls[4])
479
        self.assertEqual(5, len(mypb.calls))
1534.11.4 by Robert Collins
Merge from mainline.
480
1534.11.7 by Robert Collins
Test and correct the problem with nested test logs breaking further in-test logs.
481
    def test_skipped_test(self):
482
        # run a test that is skipped, and check the suite as a whole still
483
        # succeeds.
484
        # skipping_test must be hidden in here so it's not run as a real test
485
        def skipping_test():
486
            raise TestSkipped('test intentionally skipped')
487
        runner = TextTestRunner(stream=self._log_file, keep_output=True)
488
        test = unittest.FunctionTestCase(skipping_test)
489
        result = self.run_test_runner(runner, test)
490
        self.assertTrue(result.wasSuccessful())
491
492
493
class TestTestCase(TestCase):
494
    """Tests that test the core bzrlib TestCase."""
495
496
    def inner_test(self):
497
        # the inner child test
498
        note("inner_test")
499
500
    def outer_child(self):
501
        # the outer child test
502
        note("outer_start")
503
        self.inner_test = TestTestCase("inner_child")
504
        result = bzrlib.tests._MyResult(self._log_file,
505
                                        descriptions=0,
506
                                        verbosity=1)
507
        self.inner_test.run(result)
508
        note("outer finish")
509
510
    def test_trace_nesting(self):
511
        # this tests that each test case nests its trace facility correctly.
512
        # we do this by running a test case manually. That test case (A)
513
        # should setup a new log, log content to it, setup a child case (B),
514
        # which should log independently, then case (A) should log a trailer
515
        # and return.
516
        # we do two nested children so that we can verify the state of the 
517
        # logs after the outer child finishes is correct, which a bad clean
518
        # up routine in tearDown might trigger a fault in our test with only
519
        # one child, we should instead see the bad result inside our test with
520
        # the two children.
521
        # the outer child test
522
        original_trace = bzrlib.trace._trace_file
523
        outer_test = TestTestCase("outer_child")
524
        result = bzrlib.tests._MyResult(self._log_file,
525
                                        descriptions=0,
526
                                        verbosity=1)
527
        outer_test.run(result)
528
        self.assertEqual(original_trace, bzrlib.trace._trace_file)
529
        
1534.11.4 by Robert Collins
Merge from mainline.
530
1540.3.22 by Martin Pool
[patch] Add TestCase.assertIsInstance
531
class TestExtraAssertions(TestCase):
532
    """Tests for new test assertions in bzrlib test suite"""
533
534
    def test_assert_isinstance(self):
535
        self.assertIsInstance(2, int)
536
        self.assertIsInstance(u'', basestring)
537
        self.assertRaises(AssertionError, self.assertIsInstance, None, int)
538
        self.assertRaises(AssertionError, self.assertIsInstance, 23.3, int)
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
539
1692.3.1 by Robert Collins
Fix push to work with just a branch, no need for a working tree.
540
    def test_assertEndsWith(self):
541
        self.assertEndsWith('foo', 'oo')
542
        self.assertRaises(AssertionError, self.assertEndsWith, 'o', 'oo')
543
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
544
545
class TestConvenienceMakers(TestCaseWithTransport):
546
    """Test for the make_* convenience functions."""
547
548
    def test_make_branch_and_tree_with_format(self):
549
        # we should be able to supply a format to make_branch_and_tree
550
        self.make_branch_and_tree('a', format=bzrlib.bzrdir.BzrDirMetaFormat1())
551
        self.make_branch_and_tree('b', format=bzrlib.bzrdir.BzrDirFormat6())
552
        self.assertIsInstance(bzrlib.bzrdir.BzrDir.open('a')._format,
553
                              bzrlib.bzrdir.BzrDirMetaFormat1)
554
        self.assertIsInstance(bzrlib.bzrdir.BzrDir.open('b')._format,
555
                              bzrlib.bzrdir.BzrDirFormat6)
1707.2.1 by Robert Collins
'bzr selftest --benchmark' will run a new benchmarking selftest.
556
557
558
class TestSelftest(TestCase):
559
    """Tests of bzrlib.tests.selftest."""
560
561
    def test_selftest_benchmark_parameter_invokes_test_suite__benchmark__(self):
562
        factory_called = []
563
        def factory():
564
            factory_called.append(True)
565
            return TestSuite()
566
        out = StringIO()
567
        err = StringIO()
568
        self.apply_redirected(out, err, None, bzrlib.tests.selftest, 
569
            test_suite_factory=factory)
570
        self.assertEqual([True], factory_called)