/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
4988.10.3 by John Arbash Meinel
Merge bzr.dev 5007, resolve conflict, update NEWS
1
# Copyright (C) 2005-2010 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
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.
1185.51.1 by Martin Pool
Better message when failing to import a 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
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1185.51.1 by Martin Pool
Better message when failing to import a test suite.
16
1534.11.7 by Robert Collins
Test and correct the problem with nested test logs breaking further in-test logs.
17
"""Tests for the test framework."""
1185.51.1 by Martin Pool
Better message when failing to import a test suite.
18
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
19
from cStringIO import StringIO
4794.1.6 by Robert Collins
Add a details object to bzr tests containing the test log. May currently result in failures show the log twice (but will now show the log in --subunit mode [which includes --parallel]).
20
from doctest import ELLIPSIS
1185.51.1 by Martin Pool
Better message when failing to import a test suite.
21
import os
4636.2.4 by Robert Collins
Move selftest internals tests out of blackbox test space - they are not testing our selftest command line.
22
import signal
1185.51.1 by Martin Pool
Better message when failing to import a test suite.
23
import sys
5412.1.3 by Martin
Add tests for test case thread leak detection
24
import threading
1707.2.3 by Robert Collins
Add a setBenchmarkTime method to the bzrlib test result allowing introduction of granular benchmarking. (Robert Collins, Martin Pool).
25
import time
1185.33.95 by Martin Pool
New TestSkipped facility, and tests for it.
26
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.
27
import warnings
1185.51.1 by Martin Pool
Better message when failing to import a test suite.
28
5495.1.1 by Andrew Bennetts
Remove unused definition of ForwardingResult, and switch all code to use the testtools name for it. Also remove a few unused imports.
29
from testtools import (
30
    ExtendedToOriginalDecorator,
31
    MultiTestResult,
32
    )
5050.33.2 by Andrew Bennetts
More robust fix for TestCase cloning, this time with tests.
33
from testtools.content import Content
4794.1.6 by Robert Collins
Add a details object to bzr tests containing the test log. May currently result in failures show the log twice (but will now show the log in --subunit mode [which includes --parallel]).
34
from testtools.content_type import ContentType
35
from testtools.matchers import (
36
    DocTestMatches,
37
    Equals,
38
    )
4794.1.2 by Robert Collins
First cut at testtools support: rename, remove TestCase.run() and change testcase tests to not assume the same instance runs (for cleaner testing at this point).
39
import testtools.tests.helpers
40
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
import bzrlib
1986.4.9 by Robert Collins
``TestCase.make_branch_and_memory_tree`` now takes a format
42
from bzrlib import (
3567.4.12 by John Arbash Meinel
Expose the branch building framework to the test suite.
43
    branchbuilder,
1986.4.9 by Robert Collins
``TestCase.make_branch_and_memory_tree`` now takes a format
44
    bzrdir,
3331.4.1 by Robert Collins
* -Dlock when passed to the selftest (e.g. ``bzr -Dlock selftest``) will
45
    debug,
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
46
    errors,
3331.4.1 by Robert Collins
* -Dlock when passed to the selftest (e.g. ``bzr -Dlock selftest``) will
47
    lockdir,
1986.4.9 by Robert Collins
``TestCase.make_branch_and_memory_tree`` now takes a format
48
    memorytree,
49
    osutils,
3543.1.4 by Martin Pool
test_formats_to_scenarios uses real format objects
50
    remote,
1986.4.9 by Robert Collins
``TestCase.make_branch_and_memory_tree`` now takes a format
51
    repository,
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
52
    symbol_versioning,
3193.1.1 by Vincent Ladeuil
Helper to filter test suite building by module when loading a list.
53
    tests,
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
54
    transport,
3543.1.8 by Martin Pool
Update more scenario tests to use real format objects.
55
    workingtree,
1986.4.9 by Robert Collins
``TestCase.make_branch_and_memory_tree`` now takes a format
56
    )
3543.1.4 by Martin Pool
test_formats_to_scenarios uses real format objects
57
from bzrlib.repofmt import (
4599.4.16 by Robert Collins
Update test_selftest for the 2a default format change.
58
    groupcompress_repo,
3543.1.4 by Martin Pool
test_formats_to_scenarios uses real format objects
59
    pack_repo,
60
    weaverepo,
61
    )
2696.1.1 by Martin Pool
Remove things deprecated in 0.11 and earlier
62
from bzrlib.symbol_versioning import (
3948.3.1 by Martin Pool
Remove old static deprecation template strings, and update style of their tests
63
    deprecated_function,
64
    deprecated_in,
65
    deprecated_method,
3128.1.2 by Vincent Ladeuil
Tweak as per review feedback: s/randomise.*/randomize&/, 0.92 -> 1.0.
66
    )
1526.1.3 by Robert Collins
Merge from upstream.
67
from bzrlib.tests import (
4913.2.17 by John Arbash Meinel
Found another paramiko dependent
68
    features,
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
69
    test_lsprof,
5017.3.24 by Vincent Ladeuil
selftest -s bt.test_selftest passing
70
    test_server,
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
71
    test_sftp_transport,
72
    TestUtil,
73
    )
5387.2.4 by John Arbash Meinel
Add tests for when we should and shouldn't get a 'log' in the details.
74
from bzrlib.trace import note, mutter
5017.3.24 by Vincent Ladeuil
selftest -s bt.test_selftest passing
75
from bzrlib.transport import memory
1951.1.1 by Andrew Bennetts
Make test_bench_history and _get_bzr_source_tree tolerant of UnknownFormatError for the bzr workingtree.
76
from bzrlib.version import _get_bzr_source_tree
1185.51.1 by Martin Pool
Better message when failing to import a test suite.
77
78
3302.7.1 by Vincent Ladeuil
Extract _test_ids helper for reuse by other test classes.
79
def _test_ids(test_suite):
80
    """Get the ids for the tests in a test suite."""
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
81
    return [t.id() for t in tests.iter_suite_tests(test_suite)]
82
83
84
class SelftestTests(tests.TestCase):
1185.51.1 by Martin Pool
Better message when failing to import a test suite.
85
86
    def test_import_tests(self):
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
87
        mod = TestUtil._load_module_by_name('bzrlib.tests.test_selftest')
1185.51.1 by Martin Pool
Better message when failing to import a test suite.
88
        self.assertEqual(mod.SelftestTests, SelftestTests)
89
90
    def test_import_test_failure(self):
91
        self.assertRaises(ImportError,
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
92
                          TestUtil._load_module_by_name,
1185.51.1 by Martin Pool
Better message when failing to import a test suite.
93
                          'bzrlib.no-name-yet')
94
4794.1.6 by Robert Collins
Add a details object to bzr tests containing the test log. May currently result in failures show the log twice (but will now show the log in --subunit mode [which includes --parallel]).
95
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
96
class MetaTestLog(tests.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.
97
1185.51.1 by Martin Pool
Better message when failing to import a test suite.
98
    def test_logging(self):
99
        """Test logs are captured when a test fails."""
100
        self.log('a test message')
4794.1.6 by Robert Collins
Add a details object to bzr tests containing the test log. May currently result in failures show the log twice (but will now show the log in --subunit mode [which includes --parallel]).
101
        details = self.getDetails()
102
        log = details['log']
103
        self.assertThat(log.content_type, Equals(ContentType(
104
            "text", "plain", {"charset": "utf8"})))
4794.1.15 by Robert Collins
Review feedback.
105
        self.assertThat(u"".join(log.iter_text()), Equals(self.get_log()))
106
        self.assertThat(self.get_log(),
4794.1.6 by Robert Collins
Add a details object to bzr tests containing the test log. May currently result in failures show the log twice (but will now show the log in --subunit mode [which includes --parallel]).
107
            DocTestMatches(u"...a test message\n", ELLIPSIS))
1185.33.95 by Martin Pool
New TestSkipped facility, and tests for it.
108
109
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
110
class TestUnicodeFilename(tests.TestCase):
3287.20.2 by John Arbash Meinel
Raise a clear error about the offending filename when there is a filename with bad characters.
111
112
    def test_probe_passes(self):
113
        """UnicodeFilename._probe passes."""
114
        # We can't test much more than that because the behaviour depends
115
        # on the platform.
116
        tests.UnicodeFilename._probe()
117
118
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
119
class TestTreeShape(tests.TestCaseInTempDir):
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.
120
121
    def test_unicode_paths(self):
3287.20.2 by John Arbash Meinel
Raise a clear error about the offending filename when there is a filename with bad characters.
122
        self.requireFeature(tests.UnicodeFilename)
123
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.
124
        filename = u'hell\u00d8'
3287.20.2 by John Arbash Meinel
Raise a clear error about the offending filename when there is a filename with bad characters.
125
        self.build_tree_contents([(filename, 'contents of hello')])
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.
126
        self.failUnlessExists(filename)
1526.1.3 by Robert Collins
Merge from upstream.
127
128
5404.2.1 by John Arbash Meinel
Fix bug #627438 by restoring TestSuite and TestLoader.
129
class TestClassesAvailable(tests.TestCase):
130
    """As a convenience we expose Test* classes from bzrlib.tests"""
131
132
    def test_test_case(self):
133
        from bzrlib.tests import TestCase
134
135
    def test_test_loader(self):
136
        from bzrlib.tests import TestLoader
137
138
    def test_test_suite(self):
139
        from bzrlib.tests import TestSuite
140
141
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
142
class TestTransportScenarios(tests.TestCase):
1530.1.21 by Robert Collins
Review feedback fixes.
143
    """A group of tests that test the transport implementation adaption core.
144
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
145
    This is a meta test that the tests are applied to all available
1551.1.1 by Martin Pool
[merge] branch-formats branch, and reconcile changes
146
    transports.
147
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
148
    This will be generalised in the future which is why it is in this
1530.1.21 by Robert Collins
Review feedback fixes.
149
    test file even though it is specific to transport tests at the moment.
150
    """
1530.1.1 by Robert Collins
Minimal infrastructure to test TransportTestProviderAdapter.
151
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.
152
    def test_get_transport_permutations(self):
3455.1.1 by Vincent Ladeuil
Fix typos in comments.
153
        # this checks that get_test_permutations defined by the module is
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
154
        # called by the get_transport_test_permutations function.
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.
155
        class MockModule(object):
156
            def get_test_permutations(self):
157
                return sample_permutation
158
        sample_permutation = [(1,2), (3,4)]
4523.1.5 by Vincent Ladeuil
Fixed as asked in review.
159
        from bzrlib.tests.per_transport import get_transport_test_permutations
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.
160
        self.assertEqual(sample_permutation,
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
161
                         get_transport_test_permutations(MockModule()))
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.
162
4476.3.4 by Andrew Bennetts
Network serialisation, and most tests passing with InterDifferingSerializer commented out.
163
    def test_scenarios_include_all_modules(self):
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
164
        # this checks that the scenario generator returns as many permutations
165
        # as there are in all the registered transport modules - we assume if
166
        # this matches its probably doing the right thing especially in
167
        # combination with the tests for setting the right classes below.
4523.1.5 by Vincent Ladeuil
Fixed as asked in review.
168
        from bzrlib.tests.per_transport import transport_test_permutations
2553.2.5 by Robert Collins
And overhaul TransportTestProviderAdapter too.
169
        from bzrlib.transport import _get_transport_modules
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.
170
        modules = _get_transport_modules()
171
        permutation_count = 0
172
        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.
173
            try:
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
174
                permutation_count += len(reduce(getattr,
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.
175
                    (module + ".get_test_permutations").split('.')[1:],
176
                     __import__(module))())
177
            except errors.DependencyNotPresent:
178
                pass
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
179
        scenarios = transport_test_permutations()
180
        self.assertEqual(permutation_count, len(scenarios))
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.
181
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
182
    def test_scenarios_include_transport_class(self):
1540.3.21 by Martin Pool
Trim test for TestTransportProviderAdapter to be less dependent on
183
        # This test used to know about all the possible transports and the
184
        # order they were returned but that seems overly brittle (mbp
185
        # 20060307)
4523.1.5 by Vincent Ladeuil
Fixed as asked in review.
186
        from bzrlib.tests.per_transport import transport_test_permutations
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
187
        scenarios = transport_test_permutations()
1540.3.21 by Martin Pool
Trim test for TestTransportProviderAdapter to be less dependent on
188
        # there are at least that many builtin transports
2553.2.5 by Robert Collins
And overhaul TransportTestProviderAdapter too.
189
        self.assertTrue(len(scenarios) > 6)
190
        one_scenario = scenarios[0]
191
        self.assertIsInstance(one_scenario[0], str)
192
        self.assertTrue(issubclass(one_scenario[1]["transport_class"],
1540.3.21 by Martin Pool
Trim test for TestTransportProviderAdapter to be less dependent on
193
                                   bzrlib.transport.Transport))
2553.2.5 by Robert Collins
And overhaul TransportTestProviderAdapter too.
194
        self.assertTrue(issubclass(one_scenario[1]["transport_server"],
1540.3.21 by Martin Pool
Trim test for TestTransportProviderAdapter to be less dependent on
195
                                   bzrlib.transport.Server))
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
196
197
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
198
class TestBranchScenarios(tests.TestCase):
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
199
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
200
    def test_scenarios(self):
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
201
        # check that constructor parameters are passed through to the adapted
202
        # test.
4523.1.1 by Martin Pool
Rename tests.branch_implementations to per_branch
203
        from bzrlib.tests.per_branch import make_scenarios
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
204
        server1 = "a"
205
        server2 = "b"
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
206
        formats = [("c", "C"), ("d", "D")]
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
207
        scenarios = make_scenarios(server1, server2, formats)
208
        self.assertEqual(2, len(scenarios))
2553.2.6 by Robert Collins
And overhaul BranchTestProviderAdapter too.
209
        self.assertEqual([
210
            ('str',
211
             {'branch_format': 'c',
212
              'bzrdir_format': 'C',
213
              'transport_readonly_server': 'b',
214
              'transport_server': 'a'}),
215
            ('str',
216
             {'branch_format': 'd',
217
              'bzrdir_format': 'D',
218
              'transport_readonly_server': 'b',
219
              'transport_server': 'a'})],
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
220
            scenarios)
221
222
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
223
class TestBzrDirScenarios(tests.TestCase):
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
224
225
    def test_scenarios(self):
1534.4.39 by Robert Collins
Basic BzrDir support.
226
        # check that constructor parameters are passed through to the adapted
227
        # test.
5363.2.2 by Jelmer Vernooij
Rename per_bzrdir => per_controldir.
228
        from bzrlib.tests.per_controldir import make_scenarios
2018.5.42 by Robert Collins
Various hopefully improvements, but wsgi is broken, handing over to spiv :).
229
        vfs_factory = "v"
1534.4.39 by Robert Collins
Basic BzrDir support.
230
        server1 = "a"
231
        server2 = "b"
232
        formats = ["c", "d"]
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
233
        scenarios = make_scenarios(vfs_factory, server1, server2, formats)
2553.2.7 by Robert Collins
And overhaul BzrDirTestProviderAdapter too.
234
        self.assertEqual([
235
            ('str',
236
             {'bzrdir_format': 'c',
237
              'transport_readonly_server': 'b',
238
              'transport_server': 'a',
239
              'vfs_transport_factory': 'v'}),
240
            ('str',
241
             {'bzrdir_format': 'd',
242
              'transport_readonly_server': 'b',
243
              'transport_server': 'a',
244
              'vfs_transport_factory': 'v'})],
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
245
            scenarios)
246
247
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
248
class TestRepositoryScenarios(tests.TestCase):
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
249
2553.2.1 by Robert Collins
Overhaul RepositoryTestAdapter to be cleaner and more modular.
250
    def test_formats_to_scenarios(self):
3689.1.3 by John Arbash Meinel
Track down other tests that used repository_implementations.
251
        from bzrlib.tests.per_repository import formats_to_scenarios
3543.1.4 by Martin Pool
test_formats_to_scenarios uses real format objects
252
        formats = [("(c)", remote.RemoteRepositoryFormat()),
253
                   ("(d)", repository.format_registry.get(
4599.4.16 by Robert Collins
Update test_selftest for the 2a default format change.
254
                    'Bazaar repository format 2a (needs bzr 1.16 or later)\n'))]
3221.10.5 by Robert Collins
Update repository parameterisation tests to match refactoring.
255
        no_vfs_scenarios = formats_to_scenarios(formats, "server", "readonly",
256
            None)
257
        vfs_scenarios = formats_to_scenarios(formats, "server", "readonly",
258
            vfs_transport_factory="vfs")
3543.1.4 by Martin Pool
test_formats_to_scenarios uses real format objects
259
        # no_vfs generate scenarios without vfs_transport_factory
4599.4.16 by Robert Collins
Update test_selftest for the 2a default format change.
260
        expected = [
3543.1.4 by Martin Pool
test_formats_to_scenarios uses real format objects
261
            ('RemoteRepositoryFormat(c)',
262
             {'bzrdir_format': remote.RemoteBzrDirFormat(),
263
              'repository_format': remote.RemoteRepositoryFormat(),
2553.2.1 by Robert Collins
Overhaul RepositoryTestAdapter to be cleaner and more modular.
264
              'transport_readonly_server': 'readonly',
265
              'transport_server': 'server'}),
4599.4.16 by Robert Collins
Update test_selftest for the 2a default format change.
266
            ('RepositoryFormat2a(d)',
3543.1.4 by Martin Pool
test_formats_to_scenarios uses real format objects
267
             {'bzrdir_format': bzrdir.BzrDirMetaFormat1(),
4599.4.16 by Robert Collins
Update test_selftest for the 2a default format change.
268
              'repository_format': groupcompress_repo.RepositoryFormat2a(),
2553.2.1 by Robert Collins
Overhaul RepositoryTestAdapter to be cleaner and more modular.
269
              'transport_readonly_server': 'readonly',
4599.4.16 by Robert Collins
Update test_selftest for the 2a default format change.
270
              'transport_server': 'server'})]
271
        self.assertEqual(expected, no_vfs_scenarios)
2553.2.1 by Robert Collins
Overhaul RepositoryTestAdapter to be cleaner and more modular.
272
        self.assertEqual([
3543.1.4 by Martin Pool
test_formats_to_scenarios uses real format objects
273
            ('RemoteRepositoryFormat(c)',
274
             {'bzrdir_format': remote.RemoteBzrDirFormat(),
275
              'repository_format': remote.RemoteRepositoryFormat(),
2553.2.1 by Robert Collins
Overhaul RepositoryTestAdapter to be cleaner and more modular.
276
              'transport_readonly_server': 'readonly',
277
              'transport_server': 'server',
278
              'vfs_transport_factory': 'vfs'}),
4599.4.16 by Robert Collins
Update test_selftest for the 2a default format change.
279
            ('RepositoryFormat2a(d)',
3543.1.4 by Martin Pool
test_formats_to_scenarios uses real format objects
280
             {'bzrdir_format': bzrdir.BzrDirMetaFormat1(),
4599.4.16 by Robert Collins
Update test_selftest for the 2a default format change.
281
              'repository_format': groupcompress_repo.RepositoryFormat2a(),
2553.2.1 by Robert Collins
Overhaul RepositoryTestAdapter to be cleaner and more modular.
282
              'transport_readonly_server': 'readonly',
283
              'transport_server': 'server',
284
              'vfs_transport_factory': 'vfs'})],
3221.10.5 by Robert Collins
Update repository parameterisation tests to match refactoring.
285
            vfs_scenarios)
2553.2.1 by Robert Collins
Overhaul RepositoryTestAdapter to be cleaner and more modular.
286
2553.2.3 by Robert Collins
Split out the common test scenario support from the repository implementation specific code.
287
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
288
class TestTestScenarioApplication(tests.TestCase):
2553.2.3 by Robert Collins
Split out the common test scenario support from the repository implementation specific code.
289
    """Tests for the test adaption facilities."""
290
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
291
    def test_apply_scenario(self):
292
        from bzrlib.tests import apply_scenario
293
        input_test = TestTestScenarioApplication("test_apply_scenario")
2553.2.1 by Robert Collins
Overhaul RepositoryTestAdapter to be cleaner and more modular.
294
        # setup two adapted tests
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
295
        adapted_test1 = apply_scenario(input_test,
2553.2.1 by Robert Collins
Overhaul RepositoryTestAdapter to be cleaner and more modular.
296
            ("new id",
297
            {"bzrdir_format":"bzr_format",
298
             "repository_format":"repo_fmt",
299
             "transport_server":"transport_server",
300
             "transport_readonly_server":"readonly-server"}))
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
301
        adapted_test2 = apply_scenario(input_test,
2553.2.1 by Robert Collins
Overhaul RepositoryTestAdapter to be cleaner and more modular.
302
            ("new id 2", {"bzrdir_format":None}))
303
        # input_test should have been altered.
304
        self.assertRaises(AttributeError, getattr, input_test, "bzrdir_format")
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
305
        # the new tests are mutually incompatible, ensuring it has
2553.2.1 by Robert Collins
Overhaul RepositoryTestAdapter to be cleaner and more modular.
306
        # made new ones, and unspecified elements in the scenario
307
        # should not have been altered.
308
        self.assertEqual("bzr_format", adapted_test1.bzrdir_format)
309
        self.assertEqual("repo_fmt", adapted_test1.repository_format)
310
        self.assertEqual("transport_server", adapted_test1.transport_server)
311
        self.assertEqual("readonly-server",
312
            adapted_test1.transport_readonly_server)
313
        self.assertEqual(
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
314
            "bzrlib.tests.test_selftest.TestTestScenarioApplication."
315
            "test_apply_scenario(new id)",
2553.2.1 by Robert Collins
Overhaul RepositoryTestAdapter to be cleaner and more modular.
316
            adapted_test1.id())
317
        self.assertEqual(None, adapted_test2.bzrdir_format)
318
        self.assertEqual(
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
319
            "bzrlib.tests.test_selftest.TestTestScenarioApplication."
320
            "test_apply_scenario(new id 2)",
2553.2.1 by Robert Collins
Overhaul RepositoryTestAdapter to be cleaner and more modular.
321
            adapted_test2.id())
2018.5.64 by Robert Collins
Allow Repository tests to be backed onto a specific VFS as needed.
322
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
323
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
324
class TestInterRepositoryScenarios(tests.TestCase):
1534.1.29 by Robert Collins
Add a test environment for InterRepository objects, and remove the fetch corner case tests from test_repository.
325
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
326
    def test_scenarios(self):
1534.1.29 by Robert Collins
Add a test environment for InterRepository objects, and remove the fetch corner case tests from test_repository.
327
        # check that constructor parameters are passed through to the adapted
328
        # test.
4523.1.5 by Vincent Ladeuil
Fixed as asked in review.
329
        from bzrlib.tests.per_interrepository import make_scenarios
1534.1.29 by Robert Collins
Add a test environment for InterRepository objects, and remove the fetch corner case tests from test_repository.
330
        server1 = "a"
331
        server2 = "b"
5050.32.2 by Andrew Bennetts
Fix test_selftest.TestInterRepositoryScenarios to expect the extra_setup field in the format tuples.
332
        formats = [("C0", "C1", "C2", "C3"), ("D0", "D1", "D2", "D3")]
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
333
        scenarios = make_scenarios(server1, server2, formats)
2553.2.4 by Robert Collins
Treat InterRepositoryTestProviderAdapter like RepositoryTestProviderAdapter
334
        self.assertEqual([
4476.3.85 by Andrew Bennetts
Update TestInterRepositoryScenarios.test_scenarios for change to per_interrepo make_scenarios.
335
            ('C0,str,str',
4476.3.4 by Andrew Bennetts
Network serialisation, and most tests passing with InterDifferingSerializer commented out.
336
             {'repository_format': 'C1',
2553.2.4 by Robert Collins
Treat InterRepositoryTestProviderAdapter like RepositoryTestProviderAdapter
337
              'repository_format_to': 'C2',
338
              'transport_readonly_server': 'b',
5050.32.2 by Andrew Bennetts
Fix test_selftest.TestInterRepositoryScenarios to expect the extra_setup field in the format tuples.
339
              'transport_server': 'a',
340
              'extra_setup': 'C3'}),
4476.3.85 by Andrew Bennetts
Update TestInterRepositoryScenarios.test_scenarios for change to per_interrepo make_scenarios.
341
            ('D0,str,str',
4476.3.4 by Andrew Bennetts
Network serialisation, and most tests passing with InterDifferingSerializer commented out.
342
             {'repository_format': 'D1',
2553.2.4 by Robert Collins
Treat InterRepositoryTestProviderAdapter like RepositoryTestProviderAdapter
343
              'repository_format_to': 'D2',
344
              'transport_readonly_server': 'b',
5050.32.2 by Andrew Bennetts
Fix test_selftest.TestInterRepositoryScenarios to expect the extra_setup field in the format tuples.
345
              'transport_server': 'a',
346
              'extra_setup': 'D3'})],
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
347
            scenarios)
348
349
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
350
class TestWorkingTreeScenarios(tests.TestCase):
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
351
2553.2.10 by Robert Collins
And overhaul WorkingTreeTestProviderAdapter too.
352
    def test_scenarios(self):
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
353
        # check that constructor parameters are passed through to the adapted
354
        # test.
4523.1.5 by Vincent Ladeuil
Fixed as asked in review.
355
        from bzrlib.tests.per_workingtree import make_scenarios
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
356
        server1 = "a"
357
        server2 = "b"
3543.1.8 by Martin Pool
Update more scenario tests to use real format objects.
358
        formats = [workingtree.WorkingTreeFormat2(),
359
                   workingtree.WorkingTreeFormat3(),]
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
360
        scenarios = make_scenarios(server1, server2, formats)
2553.2.10 by Robert Collins
And overhaul WorkingTreeTestProviderAdapter too.
361
        self.assertEqual([
3543.1.8 by Martin Pool
Update more scenario tests to use real format objects.
362
            ('WorkingTreeFormat2',
363
             {'bzrdir_format': formats[0]._matchingbzrdir,
364
              'transport_readonly_server': 'b',
365
              'transport_server': 'a',
366
              'workingtree_format': formats[0]}),
367
            ('WorkingTreeFormat3',
368
             {'bzrdir_format': formats[1]._matchingbzrdir,
369
              'transport_readonly_server': 'b',
370
              'transport_server': 'a',
371
              'workingtree_format': formats[1]})],
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
372
            scenarios)
373
374
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
375
class TestTreeScenarios(tests.TestCase):
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
376
377
    def test_scenarios(self):
378
        # the tree implementation scenario generator is meant to setup one
379
        # instance for each working tree format, and one additional instance
380
        # that will use the default wt format, but create a revision tree for
381
        # the tests.  this means that the wt ones should have the
382
        # workingtree_to_test_tree attribute set to 'return_parameter' and the
383
        # revision one set to revision_tree_from_workingtree.
1852.6.1 by Robert Collins
Start tree implementation tests.
384
4523.1.4 by Martin Pool
Rename remaining *_implementations tests
385
        from bzrlib.tests.per_tree import (
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
386
            _dirstate_tree_from_workingtree,
387
            make_scenarios,
388
            preview_tree_pre,
389
            preview_tree_post,
1852.6.1 by Robert Collins
Start tree implementation tests.
390
            return_parameter,
391
            revision_tree_from_workingtree
392
            )
393
        server1 = "a"
394
        server2 = "b"
3543.1.8 by Martin Pool
Update more scenario tests to use real format objects.
395
        formats = [workingtree.WorkingTreeFormat2(),
396
                   workingtree.WorkingTreeFormat3(),]
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
397
        scenarios = make_scenarios(server1, server2, formats)
398
        self.assertEqual(7, len(scenarios))
399
        default_wt_format = workingtree.WorkingTreeFormat4._default_format
400
        wt4_format = workingtree.WorkingTreeFormat4()
401
        wt5_format = workingtree.WorkingTreeFormat5()
402
        expected_scenarios = [
403
            ('WorkingTreeFormat2',
404
             {'bzrdir_format': formats[0]._matchingbzrdir,
405
              'transport_readonly_server': 'b',
406
              'transport_server': 'a',
407
              'workingtree_format': formats[0],
408
              '_workingtree_to_test_tree': return_parameter,
409
              }),
410
            ('WorkingTreeFormat3',
411
             {'bzrdir_format': formats[1]._matchingbzrdir,
412
              'transport_readonly_server': 'b',
413
              'transport_server': 'a',
414
              'workingtree_format': formats[1],
415
              '_workingtree_to_test_tree': return_parameter,
416
             }),
417
            ('RevisionTree',
418
             {'_workingtree_to_test_tree': revision_tree_from_workingtree,
419
              'bzrdir_format': default_wt_format._matchingbzrdir,
420
              'transport_readonly_server': 'b',
421
              'transport_server': 'a',
422
              'workingtree_format': default_wt_format,
423
             }),
424
            ('DirStateRevisionTree,WT4',
425
             {'_workingtree_to_test_tree': _dirstate_tree_from_workingtree,
426
              'bzrdir_format': wt4_format._matchingbzrdir,
427
              'transport_readonly_server': 'b',
428
              'transport_server': 'a',
429
              'workingtree_format': wt4_format,
430
             }),
431
            ('DirStateRevisionTree,WT5',
432
             {'_workingtree_to_test_tree': _dirstate_tree_from_workingtree,
433
              'bzrdir_format': wt5_format._matchingbzrdir,
434
              'transport_readonly_server': 'b',
435
              'transport_server': 'a',
436
              'workingtree_format': wt5_format,
437
             }),
438
            ('PreviewTree',
439
             {'_workingtree_to_test_tree': preview_tree_pre,
440
              'bzrdir_format': default_wt_format._matchingbzrdir,
441
              'transport_readonly_server': 'b',
442
              'transport_server': 'a',
443
              'workingtree_format': default_wt_format}),
444
            ('PreviewTreePost',
445
             {'_workingtree_to_test_tree': preview_tree_post,
446
              'bzrdir_format': default_wt_format._matchingbzrdir,
447
              'transport_readonly_server': 'b',
448
              'transport_server': 'a',
449
              'workingtree_format': default_wt_format}),
450
             ]
451
        self.assertEqual(expected_scenarios, scenarios)
452
453
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
454
class TestInterTreeScenarios(tests.TestCase):
1852.8.3 by Robert Collins
Implement an InterTreeTestProvider and a trivial test_compare test case.
455
    """A group of tests that test the InterTreeTestAdapter."""
456
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
457
    def test_scenarios(self):
1852.8.3 by Robert Collins
Implement an InterTreeTestProvider and a trivial test_compare test case.
458
        # check that constructor parameters are passed through to the adapted
459
        # test.
460
        # for InterTree tests we want the machinery to bring up two trees in
461
        # each instance: the base one, and the one we are interacting with.
462
        # because each optimiser can be direction specific, we need to test
463
        # each optimiser in its chosen direction.
464
        # unlike the TestProviderAdapter we dont want to automatically add a
3128.1.3 by Vincent Ladeuil
Since we are there s/parameteris.*/parameteriz&/.
465
        # parameterized one for WorkingTree - the optimisers will tell us what
1852.8.3 by Robert Collins
Implement an InterTreeTestProvider and a trivial test_compare test case.
466
        # ones to add.
4523.1.4 by Martin Pool
Rename remaining *_implementations tests
467
        from bzrlib.tests.per_tree import (
1852.8.3 by Robert Collins
Implement an InterTreeTestProvider and a trivial test_compare test case.
468
            return_parameter,
469
            revision_tree_from_workingtree
470
            )
4523.1.4 by Martin Pool
Rename remaining *_implementations tests
471
        from bzrlib.tests.per_intertree import (
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
472
            make_scenarios,
1852.8.3 by Robert Collins
Implement an InterTreeTestProvider and a trivial test_compare test case.
473
            )
474
        from bzrlib.workingtree import WorkingTreeFormat2, WorkingTreeFormat3
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
475
        input_test = TestInterTreeScenarios(
476
            "test_scenarios")
1852.8.3 by Robert Collins
Implement an InterTreeTestProvider and a trivial test_compare test case.
477
        server1 = "a"
478
        server2 = "b"
479
        format1 = WorkingTreeFormat2()
480
        format2 = WorkingTreeFormat3()
3696.4.19 by Robert Collins
Update missed test for InterTree test generation.
481
        formats = [("1", str, format1, format2, "converter1"),
482
            ("2", int, format2, format1, "converter2")]
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
483
        scenarios = make_scenarios(server1, server2, formats)
484
        self.assertEqual(2, len(scenarios))
485
        expected_scenarios = [
486
            ("1", {
487
                "bzrdir_format": format1._matchingbzrdir,
488
                "intertree_class": formats[0][1],
489
                "workingtree_format": formats[0][2],
490
                "workingtree_format_to": formats[0][3],
491
                "mutable_trees_to_test_trees": formats[0][4],
492
                "_workingtree_to_test_tree": return_parameter,
493
                "transport_server": server1,
494
                "transport_readonly_server": server2,
495
                }),
496
            ("2", {
497
                "bzrdir_format": format2._matchingbzrdir,
498
                "intertree_class": formats[1][1],
499
                "workingtree_format": formats[1][2],
500
                "workingtree_format_to": formats[1][3],
501
                "mutable_trees_to_test_trees": formats[1][4],
502
                "_workingtree_to_test_tree": return_parameter,
503
                "transport_server": server1,
504
                "transport_readonly_server": server2,
505
                }),
506
            ]
507
        self.assertEqual(scenarios, expected_scenarios)
1852.8.3 by Robert Collins
Implement an InterTreeTestProvider and a trivial test_compare test case.
508
1987.1.1 by John Arbash Meinel
Update the test suite to put HOME in a different directory
509
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
510
class TestTestCaseInTempDir(tests.TestCaseInTempDir):
1987.1.1 by John Arbash Meinel
Update the test suite to put HOME in a different directory
511
512
    def test_home_is_not_working(self):
513
        self.assertNotEqual(self.test_dir, self.test_home_dir)
514
        cwd = osutils.getcwd()
2823.1.4 by Vincent Ladeuil
Use assertIsSameRealPath to avoid OSX aliasing (specifically /tmp
515
        self.assertIsSameRealPath(self.test_dir, cwd)
516
        self.assertIsSameRealPath(self.test_home_dir, os.environ['HOME'])
1987.1.1 by John Arbash Meinel
Update the test suite to put HOME in a different directory
517
3709.3.2 by Robert Collins
Race-free stat-fingerprint updating during commit via a new method get_file_with_stat.
518
    def test_assertEqualStat_equal(self):
519
        from bzrlib.tests.test_dirstate import _FakeStat
520
        self.build_tree(["foo"])
521
        real = os.lstat("foo")
522
        fake = _FakeStat(real.st_size, real.st_mtime, real.st_ctime,
523
            real.st_dev, real.st_ino, real.st_mode)
524
        self.assertEqualStat(real, fake)
525
526
    def test_assertEqualStat_notequal(self):
4789.26.10 by John Arbash Meinel
If the filesystem has low resolution build_tree(['a', 'b'])
527
        self.build_tree(["foo", "longname"])
3709.3.2 by Robert Collins
Race-free stat-fingerprint updating during commit via a new method get_file_with_stat.
528
        self.assertRaises(AssertionError, self.assertEqualStat,
4789.26.10 by John Arbash Meinel
If the filesystem has low resolution build_tree(['a', 'b'])
529
            os.lstat("foo"), os.lstat("longname"))
3709.3.2 by Robert Collins
Race-free stat-fingerprint updating during commit via a new method get_file_with_stat.
530
1987.1.1 by John Arbash Meinel
Update the test suite to put HOME in a different directory
531
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
532
class TestTestCaseWithMemoryTransport(tests.TestCaseWithMemoryTransport):
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
533
534
    def test_home_is_non_existant_dir_under_root(self):
535
        """The test_home_dir for TestCaseWithMemoryTransport is missing.
536
537
        This is because TestCaseWithMemoryTransport is for tests that do not
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
538
        need any disk resources: they should be hooked into bzrlib in such a
539
        way that no global settings are being changed by the test (only a
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
540
        few tests should need to do that), and having a missing dir as home is
541
        an effective way to ensure that this is the case.
542
        """
2823.1.4 by Vincent Ladeuil
Use assertIsSameRealPath to avoid OSX aliasing (specifically /tmp
543
        self.assertIsSameRealPath(
544
            self.TEST_ROOT + "/MemoryTransportMissingHomeDir",
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
545
            self.test_home_dir)
2823.1.4 by Vincent Ladeuil
Use assertIsSameRealPath to avoid OSX aliasing (specifically /tmp
546
        self.assertIsSameRealPath(self.test_home_dir, os.environ['HOME'])
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
547
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
548
    def test_cwd_is_TEST_ROOT(self):
2823.1.4 by Vincent Ladeuil
Use assertIsSameRealPath to avoid OSX aliasing (specifically /tmp
549
        self.assertIsSameRealPath(self.test_dir, self.TEST_ROOT)
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
550
        cwd = osutils.getcwd()
2823.1.4 by Vincent Ladeuil
Use assertIsSameRealPath to avoid OSX aliasing (specifically /tmp
551
        self.assertIsSameRealPath(self.test_dir, cwd)
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
552
4815.2.3 by Michael Hudson
add test
553
    def test_BZR_HOME_and_HOME_are_bytestrings(self):
554
        """The $BZR_HOME and $HOME environment variables should not be unicode.
4815.2.5 by Michael Hudson
NEWS, comment in test
555
4815.2.6 by Michael Hudson
final tweak
556
        See https://bugs.launchpad.net/bzr/+bug/464174
4815.2.3 by Michael Hudson
add test
557
        """
558
        self.assertIsInstance(os.environ['BZR_HOME'], str)
559
        self.assertIsInstance(os.environ['HOME'], str)
560
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
561
    def test_make_branch_and_memory_tree(self):
562
        """In TestCaseWithMemoryTransport we should not make the branch on disk.
563
564
        This is hard to comprehensively robustly test, so we settle for making
565
        a branch and checking no directory was created at its relpath.
566
        """
567
        tree = self.make_branch_and_memory_tree('dir')
2227.2.2 by v.ladeuil+lp at free
Cleanup.
568
        # Guard against regression into MemoryTransport leaking
569
        # files to disk instead of keeping them in memory.
570
        self.failIf(osutils.lexists('dir'))
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
571
        self.assertIsInstance(tree, memorytree.MemoryTree)
572
1986.4.9 by Robert Collins
``TestCase.make_branch_and_memory_tree`` now takes a format
573
    def test_make_branch_and_memory_tree_with_format(self):
574
        """make_branch_and_memory_tree should accept a format option."""
575
        format = bzrdir.BzrDirMetaFormat1()
2241.1.4 by Martin Pool
Moved old weave-based repository formats into bzrlib.repofmt.weaverepo.
576
        format.repository_format = weaverepo.RepositoryFormat7()
1986.4.9 by Robert Collins
``TestCase.make_branch_and_memory_tree`` now takes a format
577
        tree = self.make_branch_and_memory_tree('dir', format=format)
2227.2.2 by v.ladeuil+lp at free
Cleanup.
578
        # Guard against regression into MemoryTransport leaking
579
        # files to disk instead of keeping them in memory.
580
        self.failIf(osutils.lexists('dir'))
1986.4.9 by Robert Collins
``TestCase.make_branch_and_memory_tree`` now takes a format
581
        self.assertIsInstance(tree, memorytree.MemoryTree)
582
        self.assertEqual(format.repository_format.__class__,
583
            tree.branch.repository._format.__class__)
584
3567.4.12 by John Arbash Meinel
Expose the branch building framework to the test suite.
585
    def test_make_branch_builder(self):
586
        builder = self.make_branch_builder('dir')
587
        self.assertIsInstance(builder, branchbuilder.BranchBuilder)
588
        # Guard against regression into MemoryTransport leaking
589
        # files to disk instead of keeping them in memory.
590
        self.failIf(osutils.lexists('dir'))
591
592
    def test_make_branch_builder_with_format(self):
3567.4.18 by John Arbash Meinel
Apply the review changes from Martin to the exact patch he approved.
593
        # Use a repo layout that doesn't conform to a 'named' layout, to ensure
594
        # that the format objects are used.
3567.4.12 by John Arbash Meinel
Expose the branch building framework to the test suite.
595
        format = bzrdir.BzrDirMetaFormat1()
3567.4.18 by John Arbash Meinel
Apply the review changes from Martin to the exact patch he approved.
596
        repo_format = weaverepo.RepositoryFormat7()
597
        format.repository_format = repo_format
3567.4.12 by John Arbash Meinel
Expose the branch building framework to the test suite.
598
        builder = self.make_branch_builder('dir', format=format)
599
        the_branch = builder.get_branch()
600
        # Guard against regression into MemoryTransport leaking
601
        # files to disk instead of keeping them in memory.
602
        self.failIf(osutils.lexists('dir'))
603
        self.assertEqual(format.repository_format.__class__,
604
                         the_branch.repository._format.__class__)
3567.4.18 by John Arbash Meinel
Apply the review changes from Martin to the exact patch he approved.
605
        self.assertEqual(repo_format.get_format_string(),
606
                         self.get_transport().get_bytes(
607
                            'dir/.bzr/repository/format'))
3567.4.12 by John Arbash Meinel
Expose the branch building framework to the test suite.
608
609
    def test_make_branch_builder_with_format_name(self):
610
        builder = self.make_branch_builder('dir', format='knit')
611
        the_branch = builder.get_branch()
612
        # Guard against regression into MemoryTransport leaking
613
        # files to disk instead of keeping them in memory.
614
        self.failIf(osutils.lexists('dir'))
615
        dir_format = bzrdir.format_registry.make_bzrdir('knit')
616
        self.assertEqual(dir_format.repository_format.__class__,
617
                         the_branch.repository._format.__class__)
3567.4.18 by John Arbash Meinel
Apply the review changes from Martin to the exact patch he approved.
618
        self.assertEqual('Bazaar-NG Knit Repository Format 1',
619
                         self.get_transport().get_bytes(
620
                            'dir/.bzr/repository/format'))
3567.4.12 by John Arbash Meinel
Expose the branch building framework to the test suite.
621
3331.4.1 by Robert Collins
* -Dlock when passed to the selftest (e.g. ``bzr -Dlock selftest``) will
622
    def test_dangling_locks_cause_failures(self):
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
623
        class TestDanglingLock(tests.TestCaseWithMemoryTransport):
3331.4.1 by Robert Collins
* -Dlock when passed to the selftest (e.g. ``bzr -Dlock selftest``) will
624
            def test_function(self):
625
                t = self.get_transport('.')
626
                l = lockdir.LockDir(t, 'lock')
627
                l.create()
628
                l.attempt_lock()
629
        test = TestDanglingLock('test_function')
4314.2.1 by Robert Collins
Update lock debugging support patch.
630
        result = test.run()
5223.2.1 by Robert Collins
Selftest was failing with testtools 0.9.3, which caused an
631
        total_failures = result.errors + result.failures
4523.4.12 by John Arbash Meinel
Update the test_selftest tests so that they pass again.
632
        if self._lock_check_thorough:
4797.70.1 by Vincent Ladeuil
Skip chmodbits dependent tests when running as root
633
            self.assertEqual(1, len(total_failures))
4523.4.12 by John Arbash Meinel
Update the test_selftest tests so that they pass again.
634
        else:
635
            # When _lock_check_thorough is disabled, then we don't trigger a
636
            # failure
4797.70.1 by Vincent Ladeuil
Skip chmodbits dependent tests when running as root
637
            self.assertEqual(0, len(total_failures))
3331.4.1 by Robert Collins
* -Dlock when passed to the selftest (e.g. ``bzr -Dlock selftest``) will
638
1986.2.3 by Robert Collins
New test base class TestCaseWithMemoryTransport offers memory-only
639
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
640
class TestTestCaseWithTransport(tests.TestCaseWithTransport):
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
641
    """Tests for the convenience functions TestCaseWithTransport introduces."""
642
643
    def test_get_readonly_url_none(self):
644
        from bzrlib.transport.readonly import ReadonlyTransportDecorator
5017.3.45 by Vincent Ladeuil
Move MemoryServer back into bzrlib.transport.memory as it's needed as soon as a MemoryTransport is used. Add a NEWS entry.
645
        self.vfs_transport_factory = memory.MemoryServer
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
646
        self.transport_readonly_server = None
647
        # calling get_readonly_transport() constructs a decorator on the url
648
        # for the server
649
        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.
650
        url2 = self.get_readonly_url('foo/bar')
5273.1.7 by Vincent Ladeuil
No more use of the get_transport imported *symbol*, all uses are through
651
        t = transport.get_transport(url)
652
        t2 = transport.get_transport(url2)
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
653
        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.
654
        self.failUnless(isinstance(t2, ReadonlyTransportDecorator))
655
        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.
656
657
    def test_get_readonly_url_http(self):
2929.3.7 by Vincent Ladeuil
Rename bzrlib/test/HttpServer.py to bzrlib/tests/http_server.py and fix uses.
658
        from bzrlib.tests.http_server import HttpServer
2004.1.25 by v.ladeuil+lp at free
Shuffle http related test code. Hopefully it ends up at the right place :)
659
        from bzrlib.transport.http import HttpTransportBase
5017.3.24 by Vincent Ladeuil
selftest -s bt.test_selftest passing
660
        self.transport_server = test_server.LocalURLServer
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
661
        self.transport_readonly_server = HttpServer
662
        # calling get_readonly_transport() gives us a HTTP server instance.
663
        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.
664
        url2 = self.get_readonly_url('foo/bar')
1540.3.6 by Martin Pool
[merge] update from bzr.dev
665
        # the transport returned may be any HttpTransportBase subclass
5273.1.7 by Vincent Ladeuil
No more use of the get_transport imported *symbol*, all uses are through
666
        t = transport.get_transport(url)
667
        t2 = transport.get_transport(url2)
1540.3.6 by Martin Pool
[merge] update from bzr.dev
668
        self.failUnless(isinstance(t, HttpTransportBase))
669
        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.
670
        self.assertEqual(t2.base[:-1], t.abspath('foo/bar'))
1534.4.31 by Robert Collins
cleanedup test_outside_wt
671
1553.5.68 by Martin Pool
Add new TestCaseWithTransport.assertIsDirectory() and tests
672
    def test_is_directory(self):
673
        """Test assertIsDirectory assertion"""
674
        t = self.get_transport()
675
        self.build_tree(['a_dir/', 'a_file'], transport=t)
676
        self.assertIsDirectory('a_dir', t)
677
        self.assertRaises(AssertionError, self.assertIsDirectory, 'a_file', t)
678
        self.assertRaises(AssertionError, self.assertIsDirectory, 'not_here', t)
1534.4.31 by Robert Collins
cleanedup test_outside_wt
679
3567.4.13 by John Arbash Meinel
Test that make_branch_builder works on a real filesystem.
680
    def test_make_branch_builder(self):
681
        builder = self.make_branch_builder('dir')
682
        rev_id = builder.build_commit()
683
        self.failUnlessExists('dir')
684
        a_dir = bzrdir.BzrDir.open('dir')
685
        self.assertRaises(errors.NoWorkingTree, a_dir.open_workingtree)
686
        a_branch = a_dir.open_branch()
687
        builder_branch = builder.get_branch()
688
        self.assertEqual(a_branch.base, builder_branch.base)
689
        self.assertEqual((1, rev_id), builder_branch.last_revision_info())
690
        self.assertEqual((1, rev_id), a_branch.last_revision_info())
691
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
692
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
693
class TestTestCaseTransports(tests.TestCaseWithTransport):
1910.13.1 by Andrew Bennetts
Make make_bzrdir preserve the transport.
694
695
    def setUp(self):
696
        super(TestTestCaseTransports, self).setUp()
5017.3.45 by Vincent Ladeuil
Move MemoryServer back into bzrlib.transport.memory as it's needed as soon as a MemoryTransport is used. Add a NEWS entry.
697
        self.vfs_transport_factory = memory.MemoryServer
1910.13.1 by Andrew Bennetts
Make make_bzrdir preserve the transport.
698
699
    def test_make_bzrdir_preserves_transport(self):
700
        t = self.get_transport()
701
        result_bzrdir = self.make_bzrdir('subdir')
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
702
        self.assertIsInstance(result_bzrdir.transport,
5017.3.24 by Vincent Ladeuil
selftest -s bt.test_selftest passing
703
                              memory.MemoryTransport)
1910.13.1 by Andrew Bennetts
Make make_bzrdir preserve the transport.
704
        # should not be on disk, should only be in memory
705
        self.failIfExists('subdir')
706
707
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
708
class TestChrootedTest(tests.ChrootedTestCase):
1534.4.31 by Robert Collins
cleanedup test_outside_wt
709
710
    def test_root_is_root(self):
5273.1.7 by Vincent Ladeuil
No more use of the get_transport imported *symbol*, all uses are through
711
        t = transport.get_transport(self.get_readonly_url())
1534.4.31 by Robert Collins
cleanedup test_outside_wt
712
        url = t.base
713
        self.assertEqual(url, t.clone('..').base)
1540.3.22 by Martin Pool
[patch] Add TestCase.assertIsInstance
714
715
4641.3.3 by Robert Collins
Enable --lsprof-tests on bzr selftest.
716
class TestProfileResult(tests.TestCase):
717
718
    def test_profiles_tests(self):
4641.3.5 by Robert Collins
Properly guard LSProf using tests.
719
        self.requireFeature(test_lsprof.LSProfFeature)
4794.1.2 by Robert Collins
First cut at testtools support: rename, remove TestCase.run() and change testcase tests to not assume the same instance runs (for cleaner testing at this point).
720
        terminal = testtools.tests.helpers.ExtendedTestResult()
4641.3.3 by Robert Collins
Enable --lsprof-tests on bzr selftest.
721
        result = tests.ProfileResult(terminal)
722
        class Sample(tests.TestCase):
723
            def a(self):
724
                self.sample_function()
725
            def sample_function(self):
726
                pass
727
        test = Sample("a")
728
        test.run(result)
4794.1.2 by Robert Collins
First cut at testtools support: rename, remove TestCase.run() and change testcase tests to not assume the same instance runs (for cleaner testing at this point).
729
        case = terminal._events[0][1]
730
        self.assertLength(1, case._benchcalls)
4641.3.3 by Robert Collins
Enable --lsprof-tests on bzr selftest.
731
        # We must be able to unpack it as the test reporting code wants
4794.1.2 by Robert Collins
First cut at testtools support: rename, remove TestCase.run() and change testcase tests to not assume the same instance runs (for cleaner testing at this point).
732
        (_, _, _), stats = case._benchcalls[0]
4641.3.3 by Robert Collins
Enable --lsprof-tests on bzr selftest.
733
        self.assertTrue(callable(stats.pprint))
734
735
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
736
class TestTestResult(tests.TestCase):
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
737
2695.1.3 by Martin Pool
Fix up selftest tests for new extractBenchmarkTime behaviour; remove many unneeded calls to it
738
    def check_timing(self, test_case, expected_re):
2095.4.1 by Martin Pool
Better progress bars during tests
739
        result = bzrlib.tests.TextTestResult(self._log_file,
2695.1.3 by Martin Pool
Fix up selftest tests for new extractBenchmarkTime behaviour; remove many unneeded calls to it
740
                descriptions=0,
741
                verbosity=1,
742
                )
4794.1.2 by Robert Collins
First cut at testtools support: rename, remove TestCase.run() and change testcase tests to not assume the same instance runs (for cleaner testing at this point).
743
        capture = testtools.tests.helpers.ExtendedTestResult()
744
        test_case.run(MultiTestResult(result, capture))
745
        run_case = capture._events[0][1]
746
        timed_string = result._testTimeString(run_case)
2695.1.3 by Martin Pool
Fix up selftest tests for new extractBenchmarkTime behaviour; remove many unneeded calls to it
747
        self.assertContainsRe(timed_string, expected_re)
748
749
    def test_test_reporting(self):
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
750
        class ShortDelayTestCase(tests.TestCase):
2695.1.3 by Martin Pool
Fix up selftest tests for new extractBenchmarkTime behaviour; remove many unneeded calls to it
751
            def test_short_delay(self):
752
                time.sleep(0.003)
753
            def test_short_benchmark(self):
754
                self.time(time.sleep, 0.003)
755
        self.check_timing(ShortDelayTestCase('test_short_delay'),
756
                          r"^ +[0-9]+ms$")
4536.5.3 by Martin Pool
Correction to selftest test for benchmark time display
757
        # if a benchmark time is given, we now show just that time followed by
758
        # a star
2695.1.3 by Martin Pool
Fix up selftest tests for new extractBenchmarkTime behaviour; remove many unneeded calls to it
759
        self.check_timing(ShortDelayTestCase('test_short_benchmark'),
4536.5.3 by Martin Pool
Correction to selftest test for benchmark time display
760
                          r"^ +[0-9]+ms\*$")
1707.2.3 by Robert Collins
Add a setBenchmarkTime method to the bzrlib test result allowing introduction of granular benchmarking. (Robert Collins, Martin Pool).
761
2695.1.3 by Martin Pool
Fix up selftest tests for new extractBenchmarkTime behaviour; remove many unneeded calls to it
762
    def test_unittest_reporting_unittest_class(self):
763
        # getting the time from a non-bzrlib test works ok
764
        class ShortDelayTestCase(unittest.TestCase):
765
            def test_short_delay(self):
766
                time.sleep(0.003)
767
        self.check_timing(ShortDelayTestCase('test_short_delay'),
768
                          r"^ +[0-9]+ms$")
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
769
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
770
    def _patch_get_bzr_source_tree(self):
771
        # Reading from the actual source tree breaks isolation, but we don't
772
        # want to assume that thats *all* that would happen.
4985.1.5 by Vincent Ladeuil
Deploying the new overrideAttr facility further reduces the complexity
773
        self.overrideAttr(bzrlib.version, '_get_bzr_source_tree', lambda: None)
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
774
1819.1.1 by Carl Friedrich Bolz
(lifeless, cfbolz, hpk): Give the test result object an optional benchmark
775
    def test_assigned_benchmark_file_stores_date(self):
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
776
        self._patch_get_bzr_source_tree()
1819.1.1 by Carl Friedrich Bolz
(lifeless, cfbolz, hpk): Give the test result object an optional benchmark
777
        output = StringIO()
2095.4.1 by Martin Pool
Better progress bars during tests
778
        result = bzrlib.tests.TextTestResult(self._log_file,
1819.1.1 by Carl Friedrich Bolz
(lifeless, cfbolz, hpk): Give the test result object an optional benchmark
779
                                        descriptions=0,
780
                                        verbosity=1,
781
                                        bench_history=output
782
                                        )
783
        output_string = output.getvalue()
1819.1.4 by Jan Balster
save the revison id for every benchmark run in .perf-history
784
        # if you are wondering about the regexp please read the comment in
785
        # test_bench_history (bzrlib.tests.test_selftest.TestRunner)
1951.1.2 by Andrew Bennetts
Relax test_assigned_benchmark_file_stores_date's regexp the same way we relaxed test_bench_history's.
786
        # XXX: what comment?  -- Andrew Bennetts
787
        self.assertContainsRe(output_string, "--date [0-9.]+")
1819.1.3 by Carl Friedrich Bolz
(lifeless, cfbolz): Add recording of benchmark results to the benchmark history
788
789
    def test_benchhistory_records_test_times(self):
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
790
        self._patch_get_bzr_source_tree()
1819.1.3 by Carl Friedrich Bolz
(lifeless, cfbolz): Add recording of benchmark results to the benchmark history
791
        result_stream = StringIO()
2095.4.1 by Martin Pool
Better progress bars during tests
792
        result = bzrlib.tests.TextTestResult(
1819.1.3 by Carl Friedrich Bolz
(lifeless, cfbolz): Add recording of benchmark results to the benchmark history
793
            self._log_file,
794
            descriptions=0,
795
            verbosity=1,
796
            bench_history=result_stream
797
            )
798
799
        # we want profile a call and check that its test duration is recorded
800
        # make a new test instance that when run will generate a benchmark
801
        example_test_case = TestTestResult("_time_hello_world_encoding")
802
        # execute the test, which should succeed and record times
803
        example_test_case.run(result)
804
        lines = result_stream.getvalue().splitlines()
805
        self.assertEqual(2, len(lines))
806
        self.assertContainsRe(lines[1],
807
            " *[0-9]+ms bzrlib.tests.test_selftest.TestTestResult"
808
            "._time_hello_world_encoding")
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
809
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
810
    def _time_hello_world_encoding(self):
811
        """Profile two sleep calls
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
812
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
813
        This is used to exercise the test framework.
814
        """
815
        self.time(unicode, 'hello', errors='replace')
816
        self.time(unicode, 'world', errors='replace')
817
818
    def test_lsprofiling(self):
819
        """Verbose test result prints lsprof statistics from test cases."""
1551.15.28 by Aaron Bentley
Improve Feature usage style w/ lsprof
820
        self.requireFeature(test_lsprof.LSProfFeature)
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
821
        result_stream = StringIO()
2095.4.1 by Martin Pool
Better progress bars during tests
822
        result = bzrlib.tests.VerboseTestResult(
5340.6.1 by Martin
Avoid Python 2.7 unittest incompatibilites
823
            result_stream,
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
824
            descriptions=0,
825
            verbosity=2,
826
            )
827
        # we want profile a call of some sort and check it is output by
828
        # addSuccess. We dont care about addError or addFailure as they
829
        # are not that interesting for performance tuning.
830
        # make a new test instance that when run will generate a profile
831
        example_test_case = TestTestResult("_time_hello_world_encoding")
832
        example_test_case._gather_lsprof_in_benchmarks = True
833
        # execute the test, which should succeed and record profiles
834
        example_test_case.run(result)
835
        # lsprofile_something()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
836
        # if this worked we want
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
837
        # LSProf output for <built in function unicode> (['hello'], {'errors': 'replace'})
838
        #    CallCount    Recursive    Total(ms)   Inline(ms) module:lineno(function)
839
        # (the lsprof header)
840
        # ... an arbitrary number of lines
841
        # and the function call which is time.sleep.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
842
        #           1        0            ???         ???       ???(sleep)
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
843
        # and then repeated but with 'world', rather than 'hello'.
844
        # this should appear in the output stream of our test result.
1831.2.1 by Martin Pool
[trivial] Simplify & fix up lsprof blackbox test
845
        output = result_stream.getvalue()
846
        self.assertContainsRe(output,
847
            r"LSProf output for <type 'unicode'>\(\('hello',\), {'errors': 'replace'}\)")
848
        self.assertContainsRe(output,
849
            r" *CallCount *Recursive *Total\(ms\) *Inline\(ms\) *module:lineno\(function\)\n")
850
        self.assertContainsRe(output,
851
            r"( +1 +0 +0\.\d+ +0\.\d+ +<method 'disable' of '_lsprof\.Profiler' objects>\n)?")
852
        self.assertContainsRe(output,
853
            r"LSProf output for <type 'unicode'>\(\('world',\), {'errors': 'replace'}\)\n")
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
854
5445.1.1 by Martin
Use times from testtools for individual test case timings
855
    def test_uses_time_from_testtools(self):
856
        """Test case timings in verbose results should use testtools times"""
857
        import datetime
858
        class TimeAddedVerboseTestResult(tests.VerboseTestResult):
859
            def startTest(self, test):
860
                self.time(datetime.datetime.utcfromtimestamp(1.145))
861
                super(TimeAddedVerboseTestResult, self).startTest(test)
862
            def addSuccess(self, test):
863
                self.time(datetime.datetime.utcfromtimestamp(51.147))
864
                super(TimeAddedVerboseTestResult, self).addSuccess(test)
865
            def report_tests_starting(self): pass
866
        sio = StringIO()
867
        self.get_passing_test().run(TimeAddedVerboseTestResult(sio, 0, 2))
868
        self.assertEndsWith(sio.getvalue(), "OK    50002ms\n")
869
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
870
    def test_known_failure(self):
871
        """A KnownFailure being raised should trigger several result actions."""
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
872
        class InstrumentedTestResult(tests.ExtendedTestResult):
4650.1.6 by Robert Collins
Fix interface skew between bzr selftest and python unittest - use stopTestRun not done to end test runs.
873
            def stopTestRun(self): pass
5412.1.4 by Martin
Fix errors on three selftest tests by splitting report_tests_starting out of startTests
874
            def report_tests_starting(self): pass
4794.1.15 by Robert Collins
Review feedback.
875
            def report_known_failure(self, test, err=None, details=None):
876
                self._call = test, 'known failure'
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
877
        result = InstrumentedTestResult(None, None, None, None)
4780.1.4 by Robert Collins
Switch reporting of KnownFailure to be Python2.7 compatible.
878
        class Test(tests.TestCase):
879
            def test_function(self):
880
                raise tests.KnownFailure('failed!')
881
        test = Test("test_function")
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
882
        test.run(result)
883
        # it should invoke 'report_known_failure'.
884
        self.assertEqual(2, len(result._call))
4794.1.2 by Robert Collins
First cut at testtools support: rename, remove TestCase.run() and change testcase tests to not assume the same instance runs (for cleaner testing at this point).
885
        self.assertEqual(test.id(), result._call[0].id())
4794.1.15 by Robert Collins
Review feedback.
886
        self.assertEqual('known failure', result._call[1])
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
887
        # we dont introspec the traceback, if the rest is ok, it would be
888
        # exceptional for it not to be.
889
        # it should update the known_failure_count on the object.
890
        self.assertEqual(1, result.known_failure_count)
891
        # the result should be successful.
892
        self.assertTrue(result.wasSuccessful())
893
894
    def test_verbose_report_known_failure(self):
895
        # verbose test output formatting
896
        result_stream = StringIO()
897
        result = bzrlib.tests.VerboseTestResult(
5340.6.1 by Martin
Avoid Python 2.7 unittest incompatibilites
898
            result_stream,
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
899
            descriptions=0,
900
            verbosity=2,
901
            )
902
        test = self.get_passing_test()
903
        result.startTest(test)
904
        prefix = len(result_stream.getvalue())
905
        # the err parameter has the shape:
906
        # (class, exception object, traceback)
907
        # KnownFailures dont get their tracebacks shown though, so we
908
        # can skip that.
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
909
        err = (tests.KnownFailure, tests.KnownFailure('foo'), None)
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
910
        result.report_known_failure(test, err)
911
        output = result_stream.getvalue()[prefix:]
912
        lines = output.splitlines()
2418.3.1 by John Arbash Meinel
Remove timing dependencies from the selftest tests.
913
        self.assertContainsRe(lines[0], r'XFAIL *\d+ms$')
5340.6.1 by Martin
Avoid Python 2.7 unittest incompatibilites
914
        if sys.version_info > (2, 7):
915
            self.expectFailure("_ExpectedFailure on 2.7 loses the message",
916
                self.assertNotEqual, lines[1], '    ')
2418.3.1 by John Arbash Meinel
Remove timing dependencies from the selftest tests.
917
        self.assertEqual(lines[1], '    foo')
918
        self.assertEqual(2, len(lines))
919
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
920
    def get_passing_test(self):
921
        """Return a test object that can't be run usefully."""
922
        def passing_test():
923
            pass
924
        return unittest.FunctionTestCase(passing_test)
925
2367.1.5 by Robert Collins
Implement reporting of Unsupported tests in the bzr test result and runner
926
    def test_add_not_supported(self):
927
        """Test the behaviour of invoking addNotSupported."""
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
928
        class InstrumentedTestResult(tests.ExtendedTestResult):
4650.1.6 by Robert Collins
Fix interface skew between bzr selftest and python unittest - use stopTestRun not done to end test runs.
929
            def stopTestRun(self): pass
5412.1.4 by Martin
Fix errors on three selftest tests by splitting report_tests_starting out of startTests
930
            def report_tests_starting(self): pass
2367.1.5 by Robert Collins
Implement reporting of Unsupported tests in the bzr test result and runner
931
            def report_unsupported(self, test, feature):
932
                self._call = test, feature
933
        result = InstrumentedTestResult(None, None, None, None)
934
        test = SampleTestCase('_test_pass')
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
935
        feature = tests.Feature()
2367.1.5 by Robert Collins
Implement reporting of Unsupported tests in the bzr test result and runner
936
        result.startTest(test)
937
        result.addNotSupported(test, feature)
938
        # it should invoke 'report_unsupported'.
939
        self.assertEqual(2, len(result._call))
940
        self.assertEqual(test, result._call[0])
941
        self.assertEqual(feature, result._call[1])
942
        # the result should be successful.
943
        self.assertTrue(result.wasSuccessful())
944
        # it should record the test against a count of tests not run due to
945
        # this feature.
946
        self.assertEqual(1, result.unsupported['Feature'])
947
        # and invoking it again should increment that counter
948
        result.addNotSupported(test, feature)
949
        self.assertEqual(2, result.unsupported['Feature'])
950
951
    def test_verbose_report_unsupported(self):
952
        # verbose test output formatting
953
        result_stream = StringIO()
954
        result = bzrlib.tests.VerboseTestResult(
5340.6.1 by Martin
Avoid Python 2.7 unittest incompatibilites
955
            result_stream,
2367.1.5 by Robert Collins
Implement reporting of Unsupported tests in the bzr test result and runner
956
            descriptions=0,
957
            verbosity=2,
958
            )
959
        test = self.get_passing_test()
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
960
        feature = tests.Feature()
2367.1.5 by Robert Collins
Implement reporting of Unsupported tests in the bzr test result and runner
961
        result.startTest(test)
962
        prefix = len(result_stream.getvalue())
963
        result.report_unsupported(test, feature)
964
        output = result_stream.getvalue()[prefix:]
965
        lines = output.splitlines()
4861.1.1 by Vincent Ladeuil
Fix a test timing-dependency issue.
966
        # We don't check for the final '0ms' since it may fail on slow hosts
967
        self.assertStartsWith(lines[0], 'NODEP')
968
        self.assertEqual(lines[1],
969
                         "    The feature 'Feature' is not available.")
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
970
2367.1.6 by Robert Collins
Allow per-test-fixture feature requirements via 'requireFeature'.(Robert Collins)
971
    def test_unavailable_exception(self):
972
        """An UnavailableFeature being raised should invoke addNotSupported."""
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
973
        class InstrumentedTestResult(tests.ExtendedTestResult):
4650.1.6 by Robert Collins
Fix interface skew between bzr selftest and python unittest - use stopTestRun not done to end test runs.
974
            def stopTestRun(self): pass
5412.1.4 by Martin
Fix errors on three selftest tests by splitting report_tests_starting out of startTests
975
            def report_tests_starting(self): pass
2367.1.6 by Robert Collins
Allow per-test-fixture feature requirements via 'requireFeature'.(Robert Collins)
976
            def addNotSupported(self, test, feature):
977
                self._call = test, feature
978
        result = InstrumentedTestResult(None, None, None, None)
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
979
        feature = tests.Feature()
4780.1.1 by Robert Collins
Make addUnsupported more compatible with other TestResults.
980
        class Test(tests.TestCase):
981
            def test_function(self):
982
                raise tests.UnavailableFeature(feature)
983
        test = Test("test_function")
2367.1.6 by Robert Collins
Allow per-test-fixture feature requirements via 'requireFeature'.(Robert Collins)
984
        test.run(result)
985
        # it should invoke 'addNotSupported'.
986
        self.assertEqual(2, len(result._call))
4794.1.2 by Robert Collins
First cut at testtools support: rename, remove TestCase.run() and change testcase tests to not assume the same instance runs (for cleaner testing at this point).
987
        self.assertEqual(test.id(), result._call[0].id())
2367.1.6 by Robert Collins
Allow per-test-fixture feature requirements via 'requireFeature'.(Robert Collins)
988
        self.assertEqual(feature, result._call[1])
989
        # and not count as an error
990
        self.assertEqual(0, result.error_count)
991
2658.3.2 by Daniel Watkins
Added tests for ExtendedTestResult.wasStrictlySuccessful.
992
    def test_strict_with_unsupported_feature(self):
993
        result = bzrlib.tests.TextTestResult(self._log_file, descriptions=0,
2695.1.3 by Martin Pool
Fix up selftest tests for new extractBenchmarkTime behaviour; remove many unneeded calls to it
994
                                             verbosity=1)
2658.3.2 by Daniel Watkins
Added tests for ExtendedTestResult.wasStrictlySuccessful.
995
        test = self.get_passing_test()
996
        feature = "Unsupported Feature"
997
        result.addNotSupported(test, feature)
998
        self.assertFalse(result.wasStrictlySuccessful())
2695.1.3 by Martin Pool
Fix up selftest tests for new extractBenchmarkTime behaviour; remove many unneeded calls to it
999
        self.assertEqual(None, result._extractBenchmarkTime(test))
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1000
2658.3.2 by Daniel Watkins
Added tests for ExtendedTestResult.wasStrictlySuccessful.
1001
    def test_strict_with_known_failure(self):
1002
        result = bzrlib.tests.TextTestResult(self._log_file, descriptions=0,
2695.1.3 by Martin Pool
Fix up selftest tests for new extractBenchmarkTime behaviour; remove many unneeded calls to it
1003
                                             verbosity=1)
2658.3.2 by Daniel Watkins
Added tests for ExtendedTestResult.wasStrictlySuccessful.
1004
        test = self.get_passing_test()
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
1005
        err = (tests.KnownFailure, tests.KnownFailure('foo'), None)
4780.1.4 by Robert Collins
Switch reporting of KnownFailure to be Python2.7 compatible.
1006
        result.addExpectedFailure(test, err)
2658.3.2 by Daniel Watkins
Added tests for ExtendedTestResult.wasStrictlySuccessful.
1007
        self.assertFalse(result.wasStrictlySuccessful())
2695.1.3 by Martin Pool
Fix up selftest tests for new extractBenchmarkTime behaviour; remove many unneeded calls to it
1008
        self.assertEqual(None, result._extractBenchmarkTime(test))
2658.3.2 by Daniel Watkins
Added tests for ExtendedTestResult.wasStrictlySuccessful.
1009
1010
    def test_strict_with_success(self):
1011
        result = bzrlib.tests.TextTestResult(self._log_file, descriptions=0,
2695.1.3 by Martin Pool
Fix up selftest tests for new extractBenchmarkTime behaviour; remove many unneeded calls to it
1012
                                             verbosity=1)
2658.3.2 by Daniel Watkins
Added tests for ExtendedTestResult.wasStrictlySuccessful.
1013
        test = self.get_passing_test()
1014
        result.addSuccess(test)
1015
        self.assertTrue(result.wasStrictlySuccessful())
2695.1.3 by Martin Pool
Fix up selftest tests for new extractBenchmarkTime behaviour; remove many unneeded calls to it
1016
        self.assertEqual(None, result._extractBenchmarkTime(test))
2658.3.2 by Daniel Watkins
Added tests for ExtendedTestResult.wasStrictlySuccessful.
1017
4271.2.3 by Vincent Ladeuil
Fix failure, add tests.
1018
    def test_startTests(self):
1019
        """Starting the first test should trigger startTests."""
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
1020
        class InstrumentedTestResult(tests.ExtendedTestResult):
4271.2.3 by Vincent Ladeuil
Fix failure, add tests.
1021
            calls = 0
1022
            def startTests(self): self.calls += 1
1023
        result = InstrumentedTestResult(None, None, None, None)
1024
        def test_function():
1025
            pass
1026
        test = unittest.FunctionTestCase(test_function)
1027
        test.run(result)
1028
        self.assertEquals(1, result.calls)
1029
5412.1.5 by Martin
Move test count addition into startTest from report methods in subclasses
1030
    def test_startTests_only_once(self):
1031
        """With multiple tests startTests should still only be called once"""
1032
        class InstrumentedTestResult(tests.ExtendedTestResult):
1033
            calls = 0
1034
            def startTests(self): self.calls += 1
1035
        result = InstrumentedTestResult(None, None, None, None)
1036
        suite = unittest.TestSuite([
1037
            unittest.FunctionTestCase(lambda: None),
1038
            unittest.FunctionTestCase(lambda: None)])
1039
        suite.run(result)
1040
        self.assertEquals(1, result.calls)
1041
        self.assertEquals(2, result.count)
1042
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
1043
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
1044
class TestUnicodeFilenameFeature(tests.TestCase):
3477.1.1 by John Arbash Meinel
Move UnicodeFeature into a core 'tests' feature, rather than living in test_diff.
1045
1046
    def test_probe_passes(self):
3477.1.2 by John Arbash Meinel
Rename UnicodeFilename => UnicodeFilenameFeature
1047
        """UnicodeFilenameFeature._probe passes."""
3477.1.1 by John Arbash Meinel
Move UnicodeFeature into a core 'tests' feature, rather than living in test_diff.
1048
        # We can't test much more than that because the behaviour depends
1049
        # on the platform.
3477.1.2 by John Arbash Meinel
Rename UnicodeFilename => UnicodeFilenameFeature
1050
        tests.UnicodeFilenameFeature._probe()
3477.1.1 by John Arbash Meinel
Move UnicodeFeature into a core 'tests' feature, rather than living in test_diff.
1051
1052
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
1053
class TestRunner(tests.TestCase):
1534.11.1 by Robert Collins
Teach bzr selftest to use a progress bar in non verbose mode.
1054
1055
    def dummy_test(self):
1056
        pass
1057
1534.11.7 by Robert Collins
Test and correct the problem with nested test logs breaking further in-test logs.
1058
    def run_test_runner(self, testrunner, test):
1059
        """Run suite in testrunner, saving global state and restoring it.
1060
1061
        This current saves and restores:
1062
        TestCaseInTempDir.TEST_ROOT
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1063
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
1064
        There should be no tests in this file that use
1065
        bzrlib.tests.TextTestRunner without using this convenience method,
1066
        because of our use of global state.
1534.11.7 by Robert Collins
Test and correct the problem with nested test logs breaking further in-test logs.
1067
        """
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
1068
        old_root = tests.TestCaseInTempDir.TEST_ROOT
1534.11.7 by Robert Collins
Test and correct the problem with nested test logs breaking further in-test logs.
1069
        try:
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
1070
            tests.TestCaseInTempDir.TEST_ROOT = None
1534.11.7 by Robert Collins
Test and correct the problem with nested test logs breaking further in-test logs.
1071
            return testrunner.run(test)
1072
        finally:
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
1073
            tests.TestCaseInTempDir.TEST_ROOT = old_root
1534.11.7 by Robert Collins
Test and correct the problem with nested test logs breaking further in-test logs.
1074
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
1075
    def test_known_failure_failed_run(self):
1076
        # run a test that generates a known failure which should be printed in
1077
        # the final output when real failures occur.
4780.1.4 by Robert Collins
Switch reporting of KnownFailure to be Python2.7 compatible.
1078
        class Test(tests.TestCase):
1079
            def known_failure_test(self):
4794.1.15 by Robert Collins
Review feedback.
1080
                self.expectFailure('failed', self.assertTrue, False)
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
1081
        test = unittest.TestSuite()
4780.1.4 by Robert Collins
Switch reporting of KnownFailure to be Python2.7 compatible.
1082
        test.addTest(Test("known_failure_test"))
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
1083
        def failing_test():
4794.1.15 by Robert Collins
Review feedback.
1084
            self.fail('foo')
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
1085
        test.addTest(unittest.FunctionTestCase(failing_test))
1086
        stream = StringIO()
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
1087
        runner = tests.TextTestRunner(stream=stream)
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
1088
        result = self.run_test_runner(runner, test)
1089
        lines = stream.getvalue().splitlines()
4595.7.4 by Martin Pool
Change overly-tight selftest test to use a re
1090
        self.assertContainsRe(stream.getvalue(),
4794.1.13 by Robert Collins
Stop regular test output looking quite so much like subunit.
1091
            '(?sm)^bzr selftest.*$'
4595.7.4 by Martin Pool
Change overly-tight selftest test to use a re
1092
            '.*'
1093
            '^======================================================================\n'
4789.29.3 by Robert Collins
And fix the one failing test.
1094
            '^FAIL: failing_test\n'
4595.7.4 by Martin Pool
Change overly-tight selftest test to use a re
1095
            '^----------------------------------------------------------------------\n'
1096
            'Traceback \\(most recent call last\\):\n'
1097
            '  .*' # File .*, line .*, in failing_test' - but maybe not from .pyc
4794.1.15 by Robert Collins
Review feedback.
1098
            '    self.fail\\(\'foo\'\\)\n'
4595.7.4 by Martin Pool
Change overly-tight selftest test to use a re
1099
            '.*'
1100
            '^----------------------------------------------------------------------\n'
1101
            '.*'
1102
            'FAILED \\(failures=1, known_failure_count=1\\)'
1103
            )
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
1104
1105
    def test_known_failure_ok_run(self):
4780.1.4 by Robert Collins
Switch reporting of KnownFailure to be Python2.7 compatible.
1106
        # run a test that generates a known failure which should be printed in
1107
        # the final output.
1108
        class Test(tests.TestCase):
1109
            def known_failure_test(self):
4794.1.15 by Robert Collins
Review feedback.
1110
                self.expectFailure('failed', self.assertTrue, False)
4780.1.4 by Robert Collins
Switch reporting of KnownFailure to be Python2.7 compatible.
1111
        test = Test("known_failure_test")
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
1112
        stream = StringIO()
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
1113
        runner = tests.TextTestRunner(stream=stream)
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
1114
        result = self.run_test_runner(runner, test)
2418.3.1 by John Arbash Meinel
Remove timing dependencies from the selftest tests.
1115
        self.assertContainsRe(stream.getvalue(),
1116
            '\n'
1117
            '-*\n'
1118
            'Ran 1 test in .*\n'
1119
            '\n'
1120
            'OK \\(known_failures=1\\)\n')
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
1121
4641.3.3 by Robert Collins
Enable --lsprof-tests on bzr selftest.
1122
    def test_result_decorator(self):
1123
        # decorate results
1124
        calls = []
5495.1.1 by Andrew Bennetts
Remove unused definition of ForwardingResult, and switch all code to use the testtools name for it. Also remove a few unused imports.
1125
        class LoggingDecorator(ExtendedToOriginalDecorator):
4641.3.3 by Robert Collins
Enable --lsprof-tests on bzr selftest.
1126
            def startTest(self, test):
5495.1.1 by Andrew Bennetts
Remove unused definition of ForwardingResult, and switch all code to use the testtools name for it. Also remove a few unused imports.
1127
                ExtendedToOriginalDecorator.startTest(self, test)
4641.3.3 by Robert Collins
Enable --lsprof-tests on bzr selftest.
1128
                calls.append('start')
1129
        test = unittest.FunctionTestCase(lambda:None)
1130
        stream = StringIO()
1131
        runner = tests.TextTestRunner(stream=stream,
1132
            result_decorators=[LoggingDecorator])
1133
        result = self.run_test_runner(runner, test)
1134
        self.assertLength(1, calls)
1135
1534.11.7 by Robert Collins
Test and correct the problem with nested test logs breaking further in-test logs.
1136
    def test_skipped_test(self):
1137
        # run a test that is skipped, and check the suite as a whole still
1138
        # succeeds.
1139
        # skipping_test must be hidden in here so it's not run as a real test
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
1140
        class SkippingTest(tests.TestCase):
4063.1.1 by Robert Collins
Move skipped test detection to TestCase, and make reporting use an addSkip method as per testtools.
1141
            def skipping_test(self):
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
1142
                raise tests.TestSkipped('test intentionally skipped')
1143
        runner = tests.TextTestRunner(stream=self._log_file)
4063.1.1 by Robert Collins
Move skipped test detection to TestCase, and make reporting use an addSkip method as per testtools.
1144
        test = SkippingTest("skipping_test")
2338.4.10 by Marien Zwart
Make a test skipped from setUp run tearDown again. Make calling _runCleanups twice safe. Clean up tests.
1145
        result = self.run_test_runner(runner, test)
1146
        self.assertTrue(result.wasSuccessful())
1147
1148
    def test_skipped_from_setup(self):
3224.4.1 by Andrew Bennetts
Prune __dict__ of TestCases after they have run to save memory.
1149
        calls = []
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
1150
        class SkippedSetupTest(tests.TestCase):
2338.4.8 by Marien Zwart
Fix a bug in selftest causing tearDown to run twice for skipped tests.
1151
1152
            def setUp(self):
3224.4.1 by Andrew Bennetts
Prune __dict__ of TestCases after they have run to save memory.
1153
                calls.append('setUp')
2338.4.10 by Marien Zwart
Make a test skipped from setUp run tearDown again. Make calling _runCleanups twice safe. Clean up tests.
1154
                self.addCleanup(self.cleanup)
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
1155
                raise tests.TestSkipped('skipped setup')
2338.4.8 by Marien Zwart
Fix a bug in selftest causing tearDown to run twice for skipped tests.
1156
1157
            def test_skip(self):
1158
                self.fail('test reached')
1159
2338.4.10 by Marien Zwart
Make a test skipped from setUp run tearDown again. Make calling _runCleanups twice safe. Clean up tests.
1160
            def cleanup(self):
3224.4.1 by Andrew Bennetts
Prune __dict__ of TestCases after they have run to save memory.
1161
                calls.append('cleanup')
2338.4.10 by Marien Zwart
Make a test skipped from setUp run tearDown again. Make calling _runCleanups twice safe. Clean up tests.
1162
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
1163
        runner = tests.TextTestRunner(stream=self._log_file)
2338.4.10 by Marien Zwart
Make a test skipped from setUp run tearDown again. Make calling _runCleanups twice safe. Clean up tests.
1164
        test = SkippedSetupTest('test_skip')
1165
        result = self.run_test_runner(runner, test)
1166
        self.assertTrue(result.wasSuccessful())
1167
        # Check if cleanup was called the right number of times.
3224.4.1 by Andrew Bennetts
Prune __dict__ of TestCases after they have run to save memory.
1168
        self.assertEqual(['setUp', 'cleanup'], calls)
2338.4.10 by Marien Zwart
Make a test skipped from setUp run tearDown again. Make calling _runCleanups twice safe. Clean up tests.
1169
1170
    def test_skipped_from_test(self):
3224.4.1 by Andrew Bennetts
Prune __dict__ of TestCases after they have run to save memory.
1171
        calls = []
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
1172
        class SkippedTest(tests.TestCase):
2338.4.8 by Marien Zwart
Fix a bug in selftest causing tearDown to run twice for skipped tests.
1173
1174
            def setUp(self):
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
1175
                tests.TestCase.setUp(self)
3224.4.1 by Andrew Bennetts
Prune __dict__ of TestCases after they have run to save memory.
1176
                calls.append('setUp')
2338.4.10 by Marien Zwart
Make a test skipped from setUp run tearDown again. Make calling _runCleanups twice safe. Clean up tests.
1177
                self.addCleanup(self.cleanup)
2338.4.8 by Marien Zwart
Fix a bug in selftest causing tearDown to run twice for skipped tests.
1178
1179
            def test_skip(self):
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
1180
                raise tests.TestSkipped('skipped test')
2338.4.8 by Marien Zwart
Fix a bug in selftest causing tearDown to run twice for skipped tests.
1181
2338.4.10 by Marien Zwart
Make a test skipped from setUp run tearDown again. Make calling _runCleanups twice safe. Clean up tests.
1182
            def cleanup(self):
3224.4.1 by Andrew Bennetts
Prune __dict__ of TestCases after they have run to save memory.
1183
                calls.append('cleanup')
2338.4.8 by Marien Zwart
Fix a bug in selftest causing tearDown to run twice for skipped tests.
1184
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
1185
        runner = tests.TextTestRunner(stream=self._log_file)
2338.4.8 by Marien Zwart
Fix a bug in selftest causing tearDown to run twice for skipped tests.
1186
        test = SkippedTest('test_skip')
1187
        result = self.run_test_runner(runner, test)
1188
        self.assertTrue(result.wasSuccessful())
2338.4.10 by Marien Zwart
Make a test skipped from setUp run tearDown again. Make calling _runCleanups twice safe. Clean up tests.
1189
        # Check if cleanup was called the right number of times.
3224.4.1 by Andrew Bennetts
Prune __dict__ of TestCases after they have run to save memory.
1190
        self.assertEqual(['setUp', 'cleanup'], calls)
1534.11.7 by Robert Collins
Test and correct the problem with nested test logs breaking further in-test logs.
1191
2729.1.1 by Martin Pool
Add TestNotApplicable exception and handling of it; document test parameterization
1192
    def test_not_applicable(self):
1193
        # run a test that is skipped because it's not applicable
4780.1.3 by Robert Collins
TestNotApplicable handling improved for compatibility with stdlib TestResult objects.
1194
        class Test(tests.TestCase):
1195
            def not_applicable_test(self):
1196
                raise tests.TestNotApplicable('this test never runs')
2729.1.1 by Martin Pool
Add TestNotApplicable exception and handling of it; document test parameterization
1197
        out = StringIO()
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
1198
        runner = tests.TextTestRunner(stream=out, verbosity=2)
4780.1.3 by Robert Collins
TestNotApplicable handling improved for compatibility with stdlib TestResult objects.
1199
        test = Test("not_applicable_test")
2729.1.1 by Martin Pool
Add TestNotApplicable exception and handling of it; document test parameterization
1200
        result = self.run_test_runner(runner, test)
1201
        self._log_file.write(out.getvalue())
1202
        self.assertTrue(result.wasSuccessful())
1203
        self.assertTrue(result.wasStrictlySuccessful())
1204
        self.assertContainsRe(out.getvalue(),
1205
                r'(?m)not_applicable_test   * N/A')
1206
        self.assertContainsRe(out.getvalue(),
1207
                r'(?m)^    this test never runs')
1208
2367.1.5 by Robert Collins
Implement reporting of Unsupported tests in the bzr test result and runner
1209
    def test_unsupported_features_listed(self):
1210
        """When unsupported features are encountered they are detailed."""
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
1211
        class Feature1(tests.Feature):
2367.1.5 by Robert Collins
Implement reporting of Unsupported tests in the bzr test result and runner
1212
            def _probe(self): return False
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
1213
        class Feature2(tests.Feature):
2367.1.5 by Robert Collins
Implement reporting of Unsupported tests in the bzr test result and runner
1214
            def _probe(self): return False
1215
        # create sample tests
1216
        test1 = SampleTestCase('_test_pass')
1217
        test1._test_needs_features = [Feature1()]
1218
        test2 = SampleTestCase('_test_pass')
1219
        test2._test_needs_features = [Feature2()]
1220
        test = unittest.TestSuite()
1221
        test.addTest(test1)
1222
        test.addTest(test2)
1223
        stream = StringIO()
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
1224
        runner = tests.TextTestRunner(stream=stream)
2367.1.5 by Robert Collins
Implement reporting of Unsupported tests in the bzr test result and runner
1225
        result = self.run_test_runner(runner, test)
1226
        lines = stream.getvalue().splitlines()
1227
        self.assertEqual([
1228
            'OK',
1229
            "Missing feature 'Feature1' skipped 1 tests.",
1230
            "Missing feature 'Feature2' skipped 1 tests.",
1231
            ],
2367.1.6 by Robert Collins
Allow per-test-fixture feature requirements via 'requireFeature'.(Robert Collins)
1232
            lines[-3:])
2367.1.5 by Robert Collins
Implement reporting of Unsupported tests in the bzr test result and runner
1233
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
1234
    def _patch_get_bzr_source_tree(self):
1235
        # Reading from the actual source tree breaks isolation, but we don't
1236
        # want to assume that thats *all* that would happen.
1237
        self._get_source_tree_calls = []
4985.1.5 by Vincent Ladeuil
Deploying the new overrideAttr facility further reduces the complexity
1238
        def new_get():
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
1239
            self._get_source_tree_calls.append("called")
1240
            return None
4985.1.5 by Vincent Ladeuil
Deploying the new overrideAttr facility further reduces the complexity
1241
        self.overrideAttr(bzrlib.version, '_get_bzr_source_tree',  new_get)
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
1242
1819.1.2 by Carl Friedrich Bolz
(lifeless, cfbolz, hpk): Add a benchmark output parameter to TextTestRunner.
1243
    def test_bench_history(self):
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
1244
        # tests that the running the benchmark passes bench_history into
1245
        # the test result object. We can tell that happens if
1246
        # _get_bzr_source_tree is called.
1247
        self._patch_get_bzr_source_tree()
1819.1.2 by Carl Friedrich Bolz
(lifeless, cfbolz, hpk): Add a benchmark output parameter to TextTestRunner.
1248
        test = TestRunner('dummy_test')
1249
        output = StringIO()
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
1250
        runner = tests.TextTestRunner(stream=self._log_file,
1251
                                      bench_history=output)
1819.1.2 by Carl Friedrich Bolz
(lifeless, cfbolz, hpk): Add a benchmark output parameter to TextTestRunner.
1252
        result = self.run_test_runner(runner, test)
1253
        output_string = output.getvalue()
1951.1.1 by Andrew Bennetts
Make test_bench_history and _get_bzr_source_tree tolerant of UnknownFormatError for the bzr workingtree.
1254
        self.assertContainsRe(output_string, "--date [0-9.]+")
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
1255
        self.assertLength(1, self._get_source_tree_calls)
1819.1.2 by Carl Friedrich Bolz
(lifeless, cfbolz, hpk): Add a benchmark output parameter to TextTestRunner.
1256
5425.3.1 by Martin
Add failing test for test count reported at start of verbose test run
1257
    def test_verbose_test_count(self):
1258
        """A verbose test run reports the right test count at the start"""
1259
        suite = TestUtil.TestSuite([
1260
            unittest.FunctionTestCase(lambda:None),
1261
            unittest.FunctionTestCase(lambda:None)])
1262
        self.assertEqual(suite.countTestCases(), 2)
1263
        stream = StringIO()
1264
        runner = tests.TextTestRunner(stream=stream, verbosity=2)
1265
        # Need to use the CountingDecorator as that's what sets num_tests
1266
        result = self.run_test_runner(runner, tests.CountingDecorator(suite))
1267
        self.assertStartsWith(stream.getvalue(), "running 2 tests")
1268
4650.1.8 by Robert Collins
Push all starting up reporting down into startTestRun.
1269
    def test_startTestRun(self):
1270
        """run should call result.startTestRun()"""
1271
        calls = []
5495.1.1 by Andrew Bennetts
Remove unused definition of ForwardingResult, and switch all code to use the testtools name for it. Also remove a few unused imports.
1272
        class LoggingDecorator(ExtendedToOriginalDecorator):
4650.1.8 by Robert Collins
Push all starting up reporting down into startTestRun.
1273
            def startTestRun(self):
5495.1.1 by Andrew Bennetts
Remove unused definition of ForwardingResult, and switch all code to use the testtools name for it. Also remove a few unused imports.
1274
                ExtendedToOriginalDecorator.startTestRun(self)
4650.1.8 by Robert Collins
Push all starting up reporting down into startTestRun.
1275
                calls.append('startTestRun')
1276
        test = unittest.FunctionTestCase(lambda:None)
1277
        stream = StringIO()
1278
        runner = tests.TextTestRunner(stream=stream,
1279
            result_decorators=[LoggingDecorator])
1280
        result = self.run_test_runner(runner, test)
1281
        self.assertLength(1, calls)
1282
4650.1.7 by Robert Collins
Push result reporting thoroughly into TestResult.
1283
    def test_stopTestRun(self):
1284
        """run should call result.stopTestRun()"""
1285
        calls = []
5495.1.1 by Andrew Bennetts
Remove unused definition of ForwardingResult, and switch all code to use the testtools name for it. Also remove a few unused imports.
1286
        class LoggingDecorator(ExtendedToOriginalDecorator):
4650.1.7 by Robert Collins
Push result reporting thoroughly into TestResult.
1287
            def stopTestRun(self):
5495.1.1 by Andrew Bennetts
Remove unused definition of ForwardingResult, and switch all code to use the testtools name for it. Also remove a few unused imports.
1288
                ExtendedToOriginalDecorator.stopTestRun(self)
4650.1.7 by Robert Collins
Push result reporting thoroughly into TestResult.
1289
                calls.append('stopTestRun')
1290
        test = unittest.FunctionTestCase(lambda:None)
1291
        stream = StringIO()
1292
        runner = tests.TextTestRunner(stream=stream,
1293
            result_decorators=[LoggingDecorator])
1294
        result = self.run_test_runner(runner, test)
1295
        self.assertLength(1, calls)
1296
2036.1.2 by John Arbash Meinel
whitespace fix
1297
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
1298
class SampleTestCase(tests.TestCase):
2367.1.3 by Robert Collins
Add support for calling addNotSupported on TestResults to bzr TestCase's
1299
1300
    def _test_pass(self):
1301
        pass
1302
3287.20.1 by John Arbash Meinel
Update assertListRaises so that it returns the exception.
1303
class _TestException(Exception):
1304
    pass
2367.1.3 by Robert Collins
Add support for calling addNotSupported on TestResults to bzr TestCase's
1305
4523.4.11 by John Arbash Meinel
Update the tests, adding a test for -Edisable_lock_checks.
1306
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
1307
class TestTestCase(tests.TestCase):
1534.11.7 by Robert Collins
Test and correct the problem with nested test logs breaking further in-test logs.
1308
    """Tests that test the core bzrlib TestCase."""
1309
4144.1.1 by Robert Collins
New assertLength method based on one Martin has squirreled away somewhere.
1310
    def test_assertLength_matches_empty(self):
1311
        a_list = []
1312
        self.assertLength(0, a_list)
1313
1314
    def test_assertLength_matches_nonempty(self):
1315
        a_list = [1, 2, 3]
1316
        self.assertLength(3, a_list)
1317
1318
    def test_assertLength_fails_different(self):
1319
        a_list = []
1320
        self.assertRaises(AssertionError, self.assertLength, 1, a_list)
1321
1322
    def test_assertLength_shows_sequence_in_failure(self):
1323
        a_list = [1, 2, 3]
1324
        exception = self.assertRaises(AssertionError, self.assertLength, 2,
1325
            a_list)
1326
        self.assertEqual('Incorrect length: wanted 2, got 3 for [1, 2, 3]',
1327
            exception.args[0])
1328
4153.1.1 by Andrew Bennetts
Check that TestCase.setUp was called in TestCase.run. If not, fail the test.
1329
    def test_base_setUp_not_called_causes_failure(self):
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
1330
        class TestCaseWithBrokenSetUp(tests.TestCase):
4153.1.1 by Andrew Bennetts
Check that TestCase.setUp was called in TestCase.run. If not, fail the test.
1331
            def setUp(self):
1332
                pass # does not call TestCase.setUp
1333
            def test_foo(self):
1334
                pass
1335
        test = TestCaseWithBrokenSetUp('test_foo')
1336
        result = unittest.TestResult()
1337
        test.run(result)
1338
        self.assertFalse(result.wasSuccessful())
4153.1.5 by Andrew Bennetts
Tweak assertions based on Robert's review.
1339
        self.assertEqual(1, result.testsRun)
4153.1.1 by Andrew Bennetts
Check that TestCase.setUp was called in TestCase.run. If not, fail the test.
1340
4153.1.3 by Andrew Bennetts
Check that bzrlib.tests.TestCase.tearDown is called too.
1341
    def test_base_tearDown_not_called_causes_failure(self):
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
1342
        class TestCaseWithBrokenTearDown(tests.TestCase):
4153.1.3 by Andrew Bennetts
Check that bzrlib.tests.TestCase.tearDown is called too.
1343
            def tearDown(self):
1344
                pass # does not call TestCase.tearDown
1345
            def test_foo(self):
1346
                pass
1347
        test = TestCaseWithBrokenTearDown('test_foo')
1348
        result = unittest.TestResult()
1349
        test.run(result)
1350
        self.assertFalse(result.wasSuccessful())
4153.1.5 by Andrew Bennetts
Tweak assertions based on Robert's review.
1351
        self.assertEqual(1, result.testsRun)
4153.1.3 by Andrew Bennetts
Check that bzrlib.tests.TestCase.tearDown is called too.
1352
2560.1.1 by Robert Collins
Make debug.debug_flags be isolated for all tests.
1353
    def test_debug_flags_sanitised(self):
1354
        """The bzrlib debug flags should be sanitised by setUp."""
3731.3.1 by Andrew Bennetts
Make the test suite pass when -Eallow_debug is used.
1355
        if 'allow_debug' in tests.selftest_debug_flags:
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
1356
            raise tests.TestNotApplicable(
3731.3.2 by Andrew Bennetts
Fix typo.
1357
                '-Eallow_debug option prevents debug flag sanitisation')
2560.1.1 by Robert Collins
Make debug.debug_flags be isolated for all tests.
1358
        # we could set something and run a test that will check
1359
        # it gets santised, but this is probably sufficient for now:
1360
        # if someone runs the test with -Dsomething it will error.
4523.4.12 by John Arbash Meinel
Update the test_selftest tests so that they pass again.
1361
        flags = set()
1362
        if self._lock_check_thorough:
1363
            flags.add('strict_locks')
1364
        self.assertEqual(flags, bzrlib.debug.debug_flags)
2560.1.1 by Robert Collins
Make debug.debug_flags be isolated for all tests.
1365
3731.3.3 by Andrew Bennetts
Add tests suggested by Vincent.
1366
    def change_selftest_debug_flags(self, new_flags):
4985.1.5 by Vincent Ladeuil
Deploying the new overrideAttr facility further reduces the complexity
1367
        self.overrideAttr(tests, 'selftest_debug_flags', set(new_flags))
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1368
3731.3.3 by Andrew Bennetts
Add tests suggested by Vincent.
1369
    def test_allow_debug_flag(self):
1370
        """The -Eallow_debug flag prevents bzrlib.debug.debug_flags from being
1371
        sanitised (i.e. cleared) before running a test.
1372
        """
1373
        self.change_selftest_debug_flags(set(['allow_debug']))
1374
        bzrlib.debug.debug_flags = set(['a-flag'])
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
1375
        class TestThatRecordsFlags(tests.TestCase):
3731.3.3 by Andrew Bennetts
Add tests suggested by Vincent.
1376
            def test_foo(nested_self):
1377
                self.flags = set(bzrlib.debug.debug_flags)
1378
        test = TestThatRecordsFlags('test_foo')
1379
        test.run(self.make_test_result())
4523.4.12 by John Arbash Meinel
Update the test_selftest tests so that they pass again.
1380
        flags = set(['a-flag'])
1381
        if 'disable_lock_checks' not in tests.selftest_debug_flags:
1382
            flags.add('strict_locks')
1383
        self.assertEqual(flags, self.flags)
3731.3.3 by Andrew Bennetts
Add tests suggested by Vincent.
1384
4523.4.11 by John Arbash Meinel
Update the tests, adding a test for -Edisable_lock_checks.
1385
    def test_disable_lock_checks(self):
1386
        """The -Edisable_lock_checks flag disables thorough checks."""
1387
        class TestThatRecordsFlags(tests.TestCase):
1388
            def test_foo(nested_self):
1389
                self.flags = set(bzrlib.debug.debug_flags)
1390
                self.test_lock_check_thorough = nested_self._lock_check_thorough
4523.4.12 by John Arbash Meinel
Update the test_selftest tests so that they pass again.
1391
        self.change_selftest_debug_flags(set())
4523.4.11 by John Arbash Meinel
Update the tests, adding a test for -Edisable_lock_checks.
1392
        test = TestThatRecordsFlags('test_foo')
1393
        test.run(self.make_test_result())
4523.4.12 by John Arbash Meinel
Update the test_selftest tests so that they pass again.
1394
        # By default we do strict lock checking and thorough lock/unlock
1395
        # tracking.
4523.4.11 by John Arbash Meinel
Update the tests, adding a test for -Edisable_lock_checks.
1396
        self.assertTrue(self.test_lock_check_thorough)
4523.4.12 by John Arbash Meinel
Update the test_selftest tests so that they pass again.
1397
        self.assertEqual(set(['strict_locks']), self.flags)
1398
        # Now set the disable_lock_checks flag, and show that this changed.
4523.4.11 by John Arbash Meinel
Update the tests, adding a test for -Edisable_lock_checks.
1399
        self.change_selftest_debug_flags(set(['disable_lock_checks']))
1400
        test = TestThatRecordsFlags('test_foo')
1401
        test.run(self.make_test_result())
1402
        self.assertFalse(self.test_lock_check_thorough)
1403
        self.assertEqual(set(), self.flags)
1404
4523.4.13 by John Arbash Meinel
Add a test that thisFailsStrictLockCheck() does the right thing.
1405
    def test_this_fails_strict_lock_check(self):
1406
        class TestThatRecordsFlags(tests.TestCase):
1407
            def test_foo(nested_self):
1408
                self.flags1 = set(bzrlib.debug.debug_flags)
1409
                self.thisFailsStrictLockCheck()
1410
                self.flags2 = set(bzrlib.debug.debug_flags)
1411
        # Make sure lock checking is active
1412
        self.change_selftest_debug_flags(set())
1413
        test = TestThatRecordsFlags('test_foo')
1414
        test.run(self.make_test_result())
1415
        self.assertEqual(set(['strict_locks']), self.flags1)
1416
        self.assertEqual(set(), self.flags2)
1417
3731.3.3 by Andrew Bennetts
Add tests suggested by Vincent.
1418
    def test_debug_flags_restored(self):
1419
        """The bzrlib debug flags should be restored to their original state
1420
        after the test was run, even if allow_debug is set.
1421
        """
1422
        self.change_selftest_debug_flags(set(['allow_debug']))
1423
        # Now run a test that modifies debug.debug_flags.
1424
        bzrlib.debug.debug_flags = set(['original-state'])
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
1425
        class TestThatModifiesFlags(tests.TestCase):
3731.3.3 by Andrew Bennetts
Add tests suggested by Vincent.
1426
            def test_foo(self):
1427
                bzrlib.debug.debug_flags = set(['modified'])
1428
        test = TestThatModifiesFlags('test_foo')
1429
        test.run(self.make_test_result())
1430
        self.assertEqual(set(['original-state']), bzrlib.debug.debug_flags)
1431
1432
    def make_test_result(self):
4794.1.7 by Robert Collins
Remove references to _get_log from test_selftest.
1433
        """Get a test result that writes to the test log file."""
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
1434
        return tests.TextTestResult(self._log_file, descriptions=0, verbosity=1)
3731.3.3 by Andrew Bennetts
Add tests suggested by Vincent.
1435
1534.11.7 by Robert Collins
Test and correct the problem with nested test logs breaking further in-test logs.
1436
    def inner_test(self):
1437
        # the inner child test
1438
        note("inner_test")
1439
1440
    def outer_child(self):
1441
        # the outer child test
1442
        note("outer_start")
1443
        self.inner_test = TestTestCase("inner_child")
3731.3.3 by Andrew Bennetts
Add tests suggested by Vincent.
1444
        result = self.make_test_result()
1534.11.7 by Robert Collins
Test and correct the problem with nested test logs breaking further in-test logs.
1445
        self.inner_test.run(result)
1446
        note("outer finish")
4794.1.2 by Robert Collins
First cut at testtools support: rename, remove TestCase.run() and change testcase tests to not assume the same instance runs (for cleaner testing at this point).
1447
        self.addCleanup(osutils.delete_any, self._log_file_name)
1534.11.7 by Robert Collins
Test and correct the problem with nested test logs breaking further in-test logs.
1448
1449
    def test_trace_nesting(self):
1450
        # this tests that each test case nests its trace facility correctly.
1451
        # we do this by running a test case manually. That test case (A)
1452
        # should setup a new log, log content to it, setup a child case (B),
1453
        # which should log independently, then case (A) should log a trailer
1454
        # and return.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1455
        # we do two nested children so that we can verify the state of the
1534.11.7 by Robert Collins
Test and correct the problem with nested test logs breaking further in-test logs.
1456
        # logs after the outer child finishes is correct, which a bad clean
1457
        # up routine in tearDown might trigger a fault in our test with only
1458
        # one child, we should instead see the bad result inside our test with
1459
        # the two children.
1460
        # the outer child test
1461
        original_trace = bzrlib.trace._trace_file
1462
        outer_test = TestTestCase("outer_child")
3731.3.3 by Andrew Bennetts
Add tests suggested by Vincent.
1463
        result = self.make_test_result()
1534.11.7 by Robert Collins
Test and correct the problem with nested test logs breaking further in-test logs.
1464
        outer_test.run(result)
1465
        self.assertEqual(original_trace, bzrlib.trace._trace_file)
1707.2.4 by Robert Collins
Teach the bzrlib TestCase to report the time take by calls to self.time as benchmark time, allowing granular reporting of time during benchmarks. See bzrlib.benchmarks.bench_add. (Robert Collins, Martin Pool)
1466
1467
    def method_that_times_a_bit_twice(self):
1468
        # call self.time twice to ensure it aggregates
1713.1.4 by Robert Collins
Make the test test_time_creates_benchmark_in_result more robust to timing variation.
1469
        self.time(time.sleep, 0.007)
1470
        self.time(time.sleep, 0.007)
1707.2.4 by Robert Collins
Teach the bzrlib TestCase to report the time take by calls to self.time as benchmark time, allowing granular reporting of time during benchmarks. See bzrlib.benchmarks.bench_add. (Robert Collins, Martin Pool)
1471
1472
    def test_time_creates_benchmark_in_result(self):
1473
        """Test that the TestCase.time() method accumulates a benchmark time."""
1474
        sample_test = TestTestCase("method_that_times_a_bit_twice")
1475
        output_stream = StringIO()
2095.4.1 by Martin Pool
Better progress bars during tests
1476
        result = bzrlib.tests.VerboseTestResult(
5340.6.1 by Martin
Avoid Python 2.7 unittest incompatibilites
1477
            output_stream,
1707.2.4 by Robert Collins
Teach the bzrlib TestCase to report the time take by calls to self.time as benchmark time, allowing granular reporting of time during benchmarks. See bzrlib.benchmarks.bench_add. (Robert Collins, Martin Pool)
1478
            descriptions=0,
4573.2.2 by Robert Collins
Fix selftest for TestResult progress changes.
1479
            verbosity=2)
1707.2.4 by Robert Collins
Teach the bzrlib TestCase to report the time take by calls to self.time as benchmark time, allowing granular reporting of time during benchmarks. See bzrlib.benchmarks.bench_add. (Robert Collins, Martin Pool)
1480
        sample_test.run(result)
1481
        self.assertContainsRe(
1482
            output_stream.getvalue(),
4536.5.5 by Martin Pool
More selftest display test tweaks
1483
            r"\d+ms\*\n$")
2245.1.1 by Robert Collins
New Branch hooks facility, with one initial hook 'set_rh' which triggers
1484
1485
    def test_hooks_sanitised(self):
1486
        """The bzrlib hooks should be sanitised by setUp."""
4000.1.1 by Robert Collins
Add a new hook Commands['extend_command'] for plugins that want to alter commands without overriding the entire command.
1487
        # Note this test won't fail with hooks that the core library doesn't
1488
        # use - but it trigger with a plugin that adds hooks, so its still a
1489
        # useful warning in that case.
2245.1.2 by Robert Collins
Remove the static DefaultHooks method from Branch, replacing it with a derived dict BranchHooks object, which is easier to use and provides a place to put the policy-checking add method discussed on list.
1490
        self.assertEqual(bzrlib.branch.BranchHooks(),
2245.1.1 by Robert Collins
New Branch hooks facility, with one initial hook 'set_rh' which triggers
1491
            bzrlib.branch.Branch.hooks)
2400.1.7 by Andrew Bennetts
Merge from bzr.dev.
1492
        self.assertEqual(bzrlib.smart.server.SmartServerHooks(),
1493
            bzrlib.smart.server.SmartTCPServer.hooks)
4000.1.1 by Robert Collins
Add a new hook Commands['extend_command'] for plugins that want to alter commands without overriding the entire command.
1494
        self.assertEqual(bzrlib.commands.CommandHooks(),
1495
            bzrlib.commands.Command.hooks)
2245.1.1 by Robert Collins
New Branch hooks facility, with one initial hook 'set_rh' which triggers
1496
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
1497
    def test__gather_lsprof_in_benchmarks(self):
1498
        """When _gather_lsprof_in_benchmarks is on, accumulate profile data.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1499
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
1500
        Each self.time() call is individually and separately profiled.
1501
        """
1551.15.28 by Aaron Bentley
Improve Feature usage style w/ lsprof
1502
        self.requireFeature(test_lsprof.LSProfFeature)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1503
        # overrides the class member with an instance member so no cleanup
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
1504
        # needed.
1505
        self._gather_lsprof_in_benchmarks = True
1506
        self.time(time.sleep, 0.000)
1507
        self.time(time.sleep, 0.003)
1508
        self.assertEqual(2, len(self._benchcalls))
1509
        self.assertEqual((time.sleep, (0.000,), {}), self._benchcalls[0][0])
1510
        self.assertEqual((time.sleep, (0.003,), {}), self._benchcalls[1][0])
1511
        self.assertIsInstance(self._benchcalls[0][1], bzrlib.lsprof.Stats)
1512
        self.assertIsInstance(self._benchcalls[1][1], bzrlib.lsprof.Stats)
4641.3.1 by Robert Collins
Squelch test noise on test__gather_lsprof_in_benchmarks verbose mode.
1513
        del self._benchcalls[:]
1725.1.1 by Robert Collins
'bzr selftest --benchmark --lsprof-timed' will use lsprofile to generate
1514
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
1515
    def test_knownFailure(self):
1516
        """Self.knownFailure() should raise a KnownFailure exception."""
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
1517
        self.assertRaises(tests.KnownFailure, self.knownFailure, "A Failure")
2367.1.2 by Robert Collins
Some minor cleanups of test code, and implement KnownFailure support as
1518
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
1519
    def test_open_bzrdir_safe_roots(self):
1520
        # even a memory transport should fail to open when its url isn't 
1521
        # permitted.
1522
        # Manually set one up (TestCase doesn't and shouldn't provide magic
1523
        # machinery)
5017.3.45 by Vincent Ladeuil
Move MemoryServer back into bzrlib.transport.memory as it's needed as soon as a MemoryTransport is used. Add a NEWS entry.
1524
        transport_server = memory.MemoryServer()
4934.3.3 by Martin Pool
Rename Server.setUp to Server.start_server
1525
        transport_server.start_server()
4934.3.1 by Martin Pool
Rename Server.tearDown to .stop_server
1526
        self.addCleanup(transport_server.stop_server)
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
1527
        t = transport.get_transport(transport_server.get_url())
1528
        bzrdir.BzrDir.create(t.base)
1529
        self.assertRaises(errors.BzrError,
1530
            bzrdir.BzrDir.open_from_transport, t)
1531
        # But if we declare this as safe, we can open the bzrdir.
1532
        self.permit_url(t.base)
1533
        self._bzr_selftest_roots.append(t.base)
1534
        bzrdir.BzrDir.open_from_transport(t)
1535
2367.1.6 by Robert Collins
Allow per-test-fixture feature requirements via 'requireFeature'.(Robert Collins)
1536
    def test_requireFeature_available(self):
1537
        """self.requireFeature(available) is a no-op."""
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
1538
        class Available(tests.Feature):
2367.1.6 by Robert Collins
Allow per-test-fixture feature requirements via 'requireFeature'.(Robert Collins)
1539
            def _probe(self):return True
1540
        feature = Available()
1541
        self.requireFeature(feature)
1542
1543
    def test_requireFeature_unavailable(self):
1544
        """self.requireFeature(unavailable) raises UnavailableFeature."""
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
1545
        class Unavailable(tests.Feature):
2367.1.6 by Robert Collins
Allow per-test-fixture feature requirements via 'requireFeature'.(Robert Collins)
1546
            def _probe(self):return False
1547
        feature = Unavailable()
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
1548
        self.assertRaises(tests.UnavailableFeature,
1549
                          self.requireFeature, feature)
2367.1.6 by Robert Collins
Allow per-test-fixture feature requirements via 'requireFeature'.(Robert Collins)
1550
2367.1.3 by Robert Collins
Add support for calling addNotSupported on TestResults to bzr TestCase's
1551
    def test_run_no_parameters(self):
1552
        test = SampleTestCase('_test_pass')
1553
        test.run()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1554
2367.1.3 by Robert Collins
Add support for calling addNotSupported on TestResults to bzr TestCase's
1555
    def test_run_enabled_unittest_result(self):
5050.33.3 by Andrew Bennetts
Restore accidentally deleted test docstring.
1556
        """Test we revert to regular behaviour when the test is enabled."""
2367.1.3 by Robert Collins
Add support for calling addNotSupported on TestResults to bzr TestCase's
1557
        test = SampleTestCase('_test_pass')
1558
        class EnabledFeature(object):
1559
            def available(self):
1560
                return True
1561
        test._test_needs_features = [EnabledFeature()]
1562
        result = unittest.TestResult()
1563
        test.run(result)
1564
        self.assertEqual(1, result.testsRun)
1565
        self.assertEqual([], result.errors)
1566
        self.assertEqual([], result.failures)
1567
1568
    def test_run_disabled_unittest_result(self):
1569
        """Test our compatability for disabled tests with unittest results."""
1570
        test = SampleTestCase('_test_pass')
1571
        class DisabledFeature(object):
1572
            def available(self):
1573
                return False
1574
        test._test_needs_features = [DisabledFeature()]
1575
        result = unittest.TestResult()
1576
        test.run(result)
1577
        self.assertEqual(1, result.testsRun)
1578
        self.assertEqual([], result.errors)
1579
        self.assertEqual([], result.failures)
1580
1581
    def test_run_disabled_supporting_result(self):
1582
        """Test disabled tests behaviour with support aware results."""
1583
        test = SampleTestCase('_test_pass')
1584
        class DisabledFeature(object):
4794.1.2 by Robert Collins
First cut at testtools support: rename, remove TestCase.run() and change testcase tests to not assume the same instance runs (for cleaner testing at this point).
1585
            def __eq__(self, other):
1586
                return isinstance(other, DisabledFeature)
2367.1.3 by Robert Collins
Add support for calling addNotSupported on TestResults to bzr TestCase's
1587
            def available(self):
1588
                return False
1589
        the_feature = DisabledFeature()
1590
        test._test_needs_features = [the_feature]
1591
        class InstrumentedTestResult(unittest.TestResult):
1592
            def __init__(self):
1593
                unittest.TestResult.__init__(self)
1594
                self.calls = []
1595
            def startTest(self, test):
1596
                self.calls.append(('startTest', test))
1597
            def stopTest(self, test):
1598
                self.calls.append(('stopTest', test))
1599
            def addNotSupported(self, test, feature):
1600
                self.calls.append(('addNotSupported', test, feature))
1601
        result = InstrumentedTestResult()
1602
        test.run(result)
4794.1.2 by Robert Collins
First cut at testtools support: rename, remove TestCase.run() and change testcase tests to not assume the same instance runs (for cleaner testing at this point).
1603
        case = result.calls[0][1]
2367.1.3 by Robert Collins
Add support for calling addNotSupported on TestResults to bzr TestCase's
1604
        self.assertEqual([
4794.1.2 by Robert Collins
First cut at testtools support: rename, remove TestCase.run() and change testcase tests to not assume the same instance runs (for cleaner testing at this point).
1605
            ('startTest', case),
1606
            ('addNotSupported', case, the_feature),
1607
            ('stopTest', case),
2367.1.3 by Robert Collins
Add support for calling addNotSupported on TestResults to bzr TestCase's
1608
            ],
1609
            result.calls)
1610
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
1611
    def test_start_server_registers_url(self):
5017.3.45 by Vincent Ladeuil
Move MemoryServer back into bzrlib.transport.memory as it's needed as soon as a MemoryTransport is used. Add a NEWS entry.
1612
        transport_server = memory.MemoryServer()
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
1613
        # A little strict, but unlikely to be changed soon.
1614
        self.assertEqual([], self._bzr_selftest_roots)
1615
        self.start_server(transport_server)
1616
        self.assertSubset([transport_server.get_url()],
1617
            self._bzr_selftest_roots)
1618
3287.20.1 by John Arbash Meinel
Update assertListRaises so that it returns the exception.
1619
    def test_assert_list_raises_on_generator(self):
1620
        def generator_which_will_raise():
1621
            # This will not raise until after the first yield
1622
            yield 1
1623
            raise _TestException()
1624
1625
        e = self.assertListRaises(_TestException, generator_which_will_raise)
1626
        self.assertIsInstance(e, _TestException)
1627
1628
        e = self.assertListRaises(Exception, generator_which_will_raise)
1629
        self.assertIsInstance(e, _TestException)
1630
1631
    def test_assert_list_raises_on_plain(self):
1632
        def plain_exception():
1633
            raise _TestException()
1634
            return []
1635
1636
        e = self.assertListRaises(_TestException, plain_exception)
1637
        self.assertIsInstance(e, _TestException)
1638
1639
        e = self.assertListRaises(Exception, plain_exception)
1640
        self.assertIsInstance(e, _TestException)
1641
1642
    def test_assert_list_raises_assert_wrong_exception(self):
1643
        class _NotTestException(Exception):
1644
            pass
1645
1646
        def wrong_exception():
1647
            raise _NotTestException()
1648
1649
        def wrong_exception_generator():
1650
            yield 1
1651
            yield 2
1652
            raise _NotTestException()
1653
1654
        # Wrong exceptions are not intercepted
1655
        self.assertRaises(_NotTestException,
1656
            self.assertListRaises, _TestException, wrong_exception)
1657
        self.assertRaises(_NotTestException,
1658
            self.assertListRaises, _TestException, wrong_exception_generator)
1659
1660
    def test_assert_list_raises_no_exception(self):
1661
        def success():
1662
            return []
1663
1664
        def success_generator():
1665
            yield 1
1666
            yield 2
1667
1668
        self.assertRaises(AssertionError,
1669
            self.assertListRaises, _TestException, success)
1670
1671
        self.assertRaises(AssertionError,
1672
            self.assertListRaises, _TestException, success_generator)
1673
4985.1.3 by Vincent Ladeuil
Change it to a more usable form.
1674
    def test_overrideAttr_without_value(self):
4985.1.2 by Vincent Ladeuil
We're testing TestCase not TestRunner.
1675
        self.test_attr = 'original' # Define a test attribute
1676
        obj = self # Make 'obj' visible to the embedded test
1677
        class Test(tests.TestCase):
1678
1679
            def setUp(self):
1680
                tests.TestCase.setUp(self)
4985.1.3 by Vincent Ladeuil
Change it to a more usable form.
1681
                self.orig = self.overrideAttr(obj, 'test_attr')
1682
1683
            def test_value(self):
1684
                self.assertEqual('original', self.orig)
1685
                self.assertEqual('original', obj.test_attr)
4985.1.2 by Vincent Ladeuil
We're testing TestCase not TestRunner.
1686
                obj.test_attr = 'modified'
4985.1.3 by Vincent Ladeuil
Change it to a more usable form.
1687
                self.assertEqual('modified', obj.test_attr)
1688
1689
        test = Test('test_value')
1690
        test.run(unittest.TestResult())
1691
        self.assertEqual('original', obj.test_attr)
1692
1693
    def test_overrideAttr_with_value(self):
1694
        self.test_attr = 'original' # Define a test attribute
1695
        obj = self # Make 'obj' visible to the embedded test
1696
        class Test(tests.TestCase):
1697
1698
            def setUp(self):
1699
                tests.TestCase.setUp(self)
1700
                self.orig = self.overrideAttr(obj, 'test_attr', new='modified')
4985.1.2 by Vincent Ladeuil
We're testing TestCase not TestRunner.
1701
1702
            def test_value(self):
1703
                self.assertEqual('original', self.orig)
1704
                self.assertEqual('modified', obj.test_attr)
1705
1706
        test = Test('test_value')
1707
        test.run(unittest.TestResult())
1708
        self.assertEqual('original', obj.test_attr)
1709
1534.11.4 by Robert Collins
Merge from mainline.
1710
5387.2.6 by John Arbash Meinel
Do a full test suite against all the subunit permutations.
1711
class _MissingFeature(tests.Feature):
1712
    def _probe(self):
1713
        return False
1714
missing_feature = _MissingFeature()
1715
1716
1717
def _get_test(name):
1718
    """Get an instance of a specific example test.
1719
1720
    We protect this in a function so that they don't auto-run in the test
1721
    suite.
1722
    """
1723
1724
    class ExampleTests(tests.TestCase):
1725
1726
        def test_fail(self):
1727
            mutter('this was a failing test')
1728
            self.fail('this test will fail')
1729
1730
        def test_error(self):
1731
            mutter('this test errored')
1732
            raise RuntimeError('gotcha')
1733
1734
        def test_missing_feature(self):
1735
            mutter('missing the feature')
1736
            self.requireFeature(missing_feature)
1737
1738
        def test_skip(self):
1739
            mutter('this test will be skipped')
1740
            raise tests.TestSkipped('reason')
1741
1742
        def test_success(self):
1743
            mutter('this test succeeds')
1744
1745
        def test_xfail(self):
1746
            mutter('test with expected failure')
1747
            self.knownFailure('this_fails')
1748
1749
        def test_unexpected_success(self):
1750
            mutter('test with unexpected success')
1751
            self.expectFailure('should_fail', lambda: None)
1752
1753
    return ExampleTests(name)
1754
1755
5387.2.4 by John Arbash Meinel
Add tests for when we should and shouldn't get a 'log' in the details.
1756
class TestTestCaseLogDetails(tests.TestCase):
1757
5387.2.6 by John Arbash Meinel
Do a full test suite against all the subunit permutations.
1758
    def _run_test(self, test_name):
1759
        test = _get_test(test_name)
5387.2.4 by John Arbash Meinel
Add tests for when we should and shouldn't get a 'log' in the details.
1760
        result = testtools.TestResult()
5387.2.6 by John Arbash Meinel
Do a full test suite against all the subunit permutations.
1761
        test.run(result)
5387.2.4 by John Arbash Meinel
Add tests for when we should and shouldn't get a 'log' in the details.
1762
        return result
1763
1764
    def test_fail_has_log(self):
5387.2.6 by John Arbash Meinel
Do a full test suite against all the subunit permutations.
1765
        result = self._run_test('test_fail')
5387.2.4 by John Arbash Meinel
Add tests for when we should and shouldn't get a 'log' in the details.
1766
        self.assertEqual(1, len(result.failures))
1767
        result_content = result.failures[0][1]
1768
        self.assertContainsRe(result_content, 'Text attachment: log')
1769
        self.assertContainsRe(result_content, 'this was a failing test')
1770
1771
    def test_error_has_log(self):
5387.2.6 by John Arbash Meinel
Do a full test suite against all the subunit permutations.
1772
        result = self._run_test('test_error')
5387.2.4 by John Arbash Meinel
Add tests for when we should and shouldn't get a 'log' in the details.
1773
        self.assertEqual(1, len(result.errors))
1774
        result_content = result.errors[0][1]
1775
        self.assertContainsRe(result_content, 'Text attachment: log')
1776
        self.assertContainsRe(result_content, 'this test errored')
1777
1778
    def test_skip_has_no_log(self):
5387.2.6 by John Arbash Meinel
Do a full test suite against all the subunit permutations.
1779
        result = self._run_test('test_skip')
5387.2.4 by John Arbash Meinel
Add tests for when we should and shouldn't get a 'log' in the details.
1780
        self.assertEqual(['reason'], result.skip_reasons.keys())
1781
        skips = result.skip_reasons['reason']
1782
        self.assertEqual(1, len(skips))
1783
        test = skips[0]
1784
        self.assertFalse('log' in test.getDetails())
1785
1786
    def test_missing_feature_has_no_log(self):
1787
        # testtools doesn't know about addNotSupported, so it just gets
1788
        # considered as a skip
5387.2.6 by John Arbash Meinel
Do a full test suite against all the subunit permutations.
1789
        result = self._run_test('test_missing_feature')
1790
        self.assertEqual([missing_feature], result.skip_reasons.keys())
1791
        skips = result.skip_reasons[missing_feature]
5387.2.4 by John Arbash Meinel
Add tests for when we should and shouldn't get a 'log' in the details.
1792
        self.assertEqual(1, len(skips))
1793
        test = skips[0]
1794
        self.assertFalse('log' in test.getDetails())
1795
1796
    def test_xfail_has_no_log(self):
5387.2.6 by John Arbash Meinel
Do a full test suite against all the subunit permutations.
1797
        result = self._run_test('test_xfail')
5387.2.4 by John Arbash Meinel
Add tests for when we should and shouldn't get a 'log' in the details.
1798
        self.assertEqual(1, len(result.expectedFailures))
1799
        result_content = result.expectedFailures[0][1]
1800
        self.assertNotContainsRe(result_content, 'Text attachment: log')
1801
        self.assertNotContainsRe(result_content, 'test with expected failure')
1802
1803
    def test_unexpected_success_has_log(self):
5387.2.6 by John Arbash Meinel
Do a full test suite against all the subunit permutations.
1804
        result = self._run_test('test_unexpected_success')
5387.2.4 by John Arbash Meinel
Add tests for when we should and shouldn't get a 'log' in the details.
1805
        self.assertEqual(1, len(result.unexpectedSuccesses))
1806
        # Inconsistency, unexpectedSuccesses is a list of tests,
1807
        # expectedFailures is a list of reasons?
1808
        test = result.unexpectedSuccesses[0]
1809
        details = test.getDetails()
1810
        self.assertTrue('log' in details)
1811
1812
5050.33.2 by Andrew Bennetts
More robust fix for TestCase cloning, this time with tests.
1813
class TestTestCloning(tests.TestCase):
1814
    """Tests that test cloning of TestCases (as used by multiply_tests)."""
1815
1816
    def test_cloned_testcase_does_not_share_details(self):
1817
        """A TestCase cloned with clone_test does not share mutable attributes
1818
        such as details or cleanups.
1819
        """
1820
        class Test(tests.TestCase):
1821
            def test_foo(self):
1822
                self.addDetail('foo', Content('text/plain', lambda: 'foo'))
1823
        orig_test = Test('test_foo')
1824
        cloned_test = tests.clone_test(orig_test, orig_test.id() + '(cloned)')
1825
        orig_test.run(unittest.TestResult())
1826
        self.assertEqual('foo', orig_test.getDetails()['foo'].iter_bytes())
1827
        self.assertEqual(None, cloned_test.getDetails().get('foo'))
1828
1829
    def test_double_apply_scenario_preserves_first_scenario(self):
1830
        """Applying two levels of scenarios to a test preserves the attributes
1831
        added by both scenarios.
1832
        """
1833
        class Test(tests.TestCase):
1834
            def test_foo(self):
1835
                pass
1836
        test = Test('test_foo')
1837
        scenarios_x = [('x=1', {'x': 1}), ('x=2', {'x': 2})]
1838
        scenarios_y = [('y=1', {'y': 1}), ('y=2', {'y': 2})]
1839
        suite = tests.multiply_tests(test, scenarios_x, unittest.TestSuite())
1840
        suite = tests.multiply_tests(suite, scenarios_y, unittest.TestSuite())
1841
        all_tests = list(tests.iter_suite_tests(suite))
1842
        self.assertLength(4, all_tests)
1843
        all_xys = sorted((t.x, t.y) for t in all_tests)
1844
        self.assertEqual([(1, 1), (1, 2), (2, 1), (2, 2)], all_xys)
1845
1846
3948.3.1 by Martin Pool
Remove old static deprecation template strings, and update style of their tests
1847
# NB: Don't delete this; it's not actually from 0.11!
1848
@deprecated_function(deprecated_in((0, 11, 0)))
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1849
def sample_deprecated_function():
1850
    """A deprecated function to test applyDeprecated with."""
1851
    return 2
1852
1853
1854
def sample_undeprecated_function(a_param):
1855
    """A undeprecated function to test applyDeprecated with."""
1856
1857
1858
class ApplyDeprecatedHelper(object):
1859
    """A helper class for ApplyDeprecated tests."""
1860
3948.3.1 by Martin Pool
Remove old static deprecation template strings, and update style of their tests
1861
    @deprecated_method(deprecated_in((0, 11, 0)))
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1862
    def sample_deprecated_method(self, param_one):
1863
        """A deprecated method for testing with."""
1864
        return param_one
1865
1866
    def sample_normal_method(self):
1867
        """A undeprecated method."""
1868
3948.3.1 by Martin Pool
Remove old static deprecation template strings, and update style of their tests
1869
    @deprecated_method(deprecated_in((0, 10, 0)))
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1870
    def sample_nested_deprecation(self):
1871
        return sample_deprecated_function()
1872
1873
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
1874
class TestExtraAssertions(tests.TestCase):
1540.3.22 by Martin Pool
[patch] Add TestCase.assertIsInstance
1875
    """Tests for new test assertions in bzrlib test suite"""
1876
1877
    def test_assert_isinstance(self):
1878
        self.assertIsInstance(2, int)
1879
        self.assertIsInstance(u'', basestring)
4449.3.43 by Martin Pool
More tests for assertIsInstance
1880
        e = self.assertRaises(AssertionError, self.assertIsInstance, None, int)
1881
        self.assertEquals(str(e),
1882
            "None is an instance of <type 'NoneType'> rather than <type 'int'>")
1540.3.22 by Martin Pool
[patch] Add TestCase.assertIsInstance
1883
        self.assertRaises(AssertionError, self.assertIsInstance, 23.3, int)
4449.3.43 by Martin Pool
More tests for assertIsInstance
1884
        e = self.assertRaises(AssertionError,
1885
            self.assertIsInstance, None, int, "it's just not")
1886
        self.assertEquals(str(e),
1887
            "None is an instance of <type 'NoneType'> rather than <type 'int'>"
1888
            ": it's just not")
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
1889
1692.3.1 by Robert Collins
Fix push to work with just a branch, no need for a working tree.
1890
    def test_assertEndsWith(self):
1891
        self.assertEndsWith('foo', 'oo')
1892
        self.assertRaises(AssertionError, self.assertEndsWith, 'o', 'oo')
1893
4680.1.1 by Vincent Ladeuil
Surprisingly, assertEqualDiff was wrong.
1894
    def test_assertEqualDiff(self):
1895
        e = self.assertRaises(AssertionError,
1896
                              self.assertEqualDiff, '', '\n')
1897
        self.assertEquals(str(e),
1898
                          # Don't blink ! The '+' applies to the second string
1899
                          'first string is missing a final newline.\n+ \n')
1900
        e = self.assertRaises(AssertionError,
1901
                              self.assertEqualDiff, '\n', '')
1902
        self.assertEquals(str(e),
1903
                          # Don't blink ! The '-' applies to the second string
1904
                          'second string is missing a final newline.\n- \n')
1905
1906
1907
class TestDeprecations(tests.TestCase):
1908
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1909
    def test_applyDeprecated_not_deprecated(self):
1910
        sample_object = ApplyDeprecatedHelper()
1911
        # calling an undeprecated callable raises an assertion
3948.3.1 by Martin Pool
Remove old static deprecation template strings, and update style of their tests
1912
        self.assertRaises(AssertionError, self.applyDeprecated,
1913
            deprecated_in((0, 11, 0)),
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1914
            sample_object.sample_normal_method)
3948.3.1 by Martin Pool
Remove old static deprecation template strings, and update style of their tests
1915
        self.assertRaises(AssertionError, self.applyDeprecated,
1916
            deprecated_in((0, 11, 0)),
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1917
            sample_undeprecated_function, "a param value")
1918
        # calling a deprecated callable (function or method) with the wrong
1919
        # expected deprecation fails.
3948.3.1 by Martin Pool
Remove old static deprecation template strings, and update style of their tests
1920
        self.assertRaises(AssertionError, self.applyDeprecated,
1921
            deprecated_in((0, 10, 0)),
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1922
            sample_object.sample_deprecated_method, "a param value")
3948.3.1 by Martin Pool
Remove old static deprecation template strings, and update style of their tests
1923
        self.assertRaises(AssertionError, self.applyDeprecated,
1924
            deprecated_in((0, 10, 0)),
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1925
            sample_deprecated_function)
1926
        # calling a deprecated callable (function or method) with the right
1927
        # expected deprecation returns the functions result.
3948.3.1 by Martin Pool
Remove old static deprecation template strings, and update style of their tests
1928
        self.assertEqual("a param value",
1929
            self.applyDeprecated(deprecated_in((0, 11, 0)),
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1930
            sample_object.sample_deprecated_method, "a param value"))
3948.3.1 by Martin Pool
Remove old static deprecation template strings, and update style of their tests
1931
        self.assertEqual(2, self.applyDeprecated(deprecated_in((0, 11, 0)),
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1932
            sample_deprecated_function))
1933
        # calling a nested deprecation with the wrong deprecation version
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1934
        # fails even if a deeper nested function was deprecated with the
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1935
        # supplied version.
1936
        self.assertRaises(AssertionError, self.applyDeprecated,
3948.3.1 by Martin Pool
Remove old static deprecation template strings, and update style of their tests
1937
            deprecated_in((0, 11, 0)), sample_object.sample_nested_deprecation)
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1938
        # calling a nested deprecation with the right deprecation value
1939
        # returns the calls result.
3948.3.1 by Martin Pool
Remove old static deprecation template strings, and update style of their tests
1940
        self.assertEqual(2, self.applyDeprecated(deprecated_in((0, 10, 0)),
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1941
            sample_object.sample_nested_deprecation))
1942
1551.8.9 by Aaron Bentley
Rename assertDeprecated to callDeprecated
1943
    def test_callDeprecated(self):
1551.8.8 by Aaron Bentley
Made assertDeprecated return the callable's result
1944
        def testfunc(be_deprecated, result=None):
1910.2.10 by Aaron Bentley
Add tests for assertDeprecated
1945
            if be_deprecated is True:
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1946
                symbol_versioning.warn('i am deprecated', DeprecationWarning,
1910.2.10 by Aaron Bentley
Add tests for assertDeprecated
1947
                                       stacklevel=1)
1551.8.8 by Aaron Bentley
Made assertDeprecated return the callable's result
1948
            return result
1551.8.9 by Aaron Bentley
Rename assertDeprecated to callDeprecated
1949
        result = self.callDeprecated(['i am deprecated'], testfunc, True)
1551.8.8 by Aaron Bentley
Made assertDeprecated return the callable's result
1950
        self.assertIs(None, result)
1551.8.9 by Aaron Bentley
Rename assertDeprecated to callDeprecated
1951
        result = self.callDeprecated([], testfunc, False, 'result')
1551.8.8 by Aaron Bentley
Made assertDeprecated return the callable's result
1952
        self.assertEqual('result', result)
1982.3.2 by Robert Collins
New TestCase helper applyDeprecated. This allows you to call a callable
1953
        self.callDeprecated(['i am deprecated'], testfunc, be_deprecated=True)
1551.8.9 by Aaron Bentley
Rename assertDeprecated to callDeprecated
1954
        self.callDeprecated([], testfunc, be_deprecated=False)
1910.2.10 by Aaron Bentley
Add tests for assertDeprecated
1955
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
1956
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
1957
class TestWarningTests(tests.TestCase):
2592.3.242 by Martin Pool
New method TestCase.call_catch_warnings
1958
    """Tests for calling methods that raise warnings."""
1959
1960
    def test_callCatchWarnings(self):
1961
        def meth(a, b):
1962
            warnings.warn("this is your last warning")
1963
            return a + b
1964
        wlist, result = self.callCatchWarnings(meth, 1, 2)
1965
        self.assertEquals(3, result)
1966
        # would like just to compare them, but UserWarning doesn't implement
1967
        # eq well
1968
        w0, = wlist
1969
        self.assertIsInstance(w0, UserWarning)
2592.3.247 by Andrew Bennetts
Fix test_callCatchWarnings to pass when run with Python 2.4.
1970
        self.assertEquals("this is your last warning", str(w0))
2592.3.242 by Martin Pool
New method TestCase.call_catch_warnings
1971
1972
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
1973
class TestConvenienceMakers(tests.TestCaseWithTransport):
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
1974
    """Test for the make_* convenience functions."""
1975
1976
    def test_make_branch_and_tree_with_format(self):
1977
        # we should be able to supply a format to make_branch_and_tree
1978
        self.make_branch_and_tree('a', format=bzrlib.bzrdir.BzrDirMetaFormat1())
1979
        self.make_branch_and_tree('b', format=bzrlib.bzrdir.BzrDirFormat6())
1980
        self.assertIsInstance(bzrlib.bzrdir.BzrDir.open('a')._format,
1981
                              bzrlib.bzrdir.BzrDirMetaFormat1)
1982
        self.assertIsInstance(bzrlib.bzrdir.BzrDir.open('b')._format,
1983
                              bzrlib.bzrdir.BzrDirFormat6)
1707.2.1 by Robert Collins
'bzr selftest --benchmark' will run a new benchmarking selftest.
1984
1986.2.1 by Robert Collins
Bugfix - the name of the test for make_branch_and_memory_tree was wrong.
1985
    def test_make_branch_and_memory_tree(self):
1986.1.2 by Robert Collins
Various changes to allow non-workingtree specific tests to run entirely
1986
        # we should be able to get a new branch and a mutable tree from
1987
        # TestCaseWithTransport
1988
        tree = self.make_branch_and_memory_tree('a')
1989
        self.assertIsInstance(tree, bzrlib.memorytree.MemoryTree)
1990
4650.1.2 by Robert Collins
Remove unnecessary use of an SFTP server connection to test the behaviour of TestCase.make_branch_and_tree.
1991
    def test_make_tree_for_local_vfs_backed_transport(self):
1992
        # make_branch_and_tree has to use local branch and repositories
1993
        # when the vfs transport and local disk are colocated, even if
1994
        # a different transport is in use for url generation.
5017.3.24 by Vincent Ladeuil
selftest -s bt.test_selftest passing
1995
        self.transport_server = test_server.FakeVFATServer
4650.1.2 by Robert Collins
Remove unnecessary use of an SFTP server connection to test the behaviour of TestCase.make_branch_and_tree.
1996
        self.assertFalse(self.get_url('t1').startswith('file://'))
1910.14.1 by Andrew Bennetts
Fix to make_branch_and_tree's behavior when used with an sftp transport.
1997
        tree = self.make_branch_and_tree('t1')
1998
        base = tree.bzrdir.root_transport.base
4650.1.2 by Robert Collins
Remove unnecessary use of an SFTP server connection to test the behaviour of TestCase.make_branch_and_tree.
1999
        self.assertStartsWith(base, 'file://')
1910.14.1 by Andrew Bennetts
Fix to make_branch_and_tree's behavior when used with an sftp transport.
2000
        self.assertEquals(tree.bzrdir.root_transport,
2001
                tree.branch.bzrdir.root_transport)
2002
        self.assertEquals(tree.bzrdir.root_transport,
2003
                tree.branch.repository.bzrdir.root_transport)
2004
2005
5387.2.5 by John Arbash Meinel
add a failing test that the subunit stream doesn't contain the log info.
2006
class SelfTestHelper(object):
4636.2.4 by Robert Collins
Move selftest internals tests out of blackbox test space - they are not testing our selftest command line.
2007
2008
    def run_selftest(self, **kwargs):
2009
        """Run selftest returning its output."""
2010
        output = StringIO()
2011
        old_transport = bzrlib.tests.default_transport
2012
        old_root = tests.TestCaseWithMemoryTransport.TEST_ROOT
2013
        tests.TestCaseWithMemoryTransport.TEST_ROOT = None
2014
        try:
2015
            self.assertEqual(True, tests.selftest(stream=output, **kwargs))
2016
        finally:
2017
            bzrlib.tests.default_transport = old_transport
2018
            tests.TestCaseWithMemoryTransport.TEST_ROOT = old_root
2019
        output.seek(0)
2020
        return output
2021
2022
2023
class TestSelftest(tests.TestCase, SelfTestHelper):
1707.2.1 by Robert Collins
'bzr selftest --benchmark' will run a new benchmarking selftest.
2024
    """Tests of bzrlib.tests.selftest."""
2025
2026
    def test_selftest_benchmark_parameter_invokes_test_suite__benchmark__(self):
2027
        factory_called = []
2028
        def factory():
2029
            factory_called.append(True)
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
2030
            return TestUtil.TestSuite()
1707.2.1 by Robert Collins
'bzr selftest --benchmark' will run a new benchmarking selftest.
2031
        out = StringIO()
2032
        err = StringIO()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2033
        self.apply_redirected(out, err, None, bzrlib.tests.selftest,
1707.2.1 by Robert Collins
'bzr selftest --benchmark' will run a new benchmarking selftest.
2034
            test_suite_factory=factory)
2035
        self.assertEqual([True], factory_called)
2172.4.3 by Alexander Belchenko
Change name of option to '--clean-output' and provide tests
2036
4636.2.1 by Robert Collins
Test selftest --list-only and --randomize options using more precisely layers.
2037
    def factory(self):
2038
        """A test suite factory."""
2039
        class Test(tests.TestCase):
2040
            def a(self):
2041
                pass
2042
            def b(self):
2043
                pass
2044
            def c(self):
2045
                pass
2046
        return TestUtil.TestSuite([Test("a"), Test("b"), Test("c")])
2047
2048
    def test_list_only(self):
2049
        output = self.run_selftest(test_suite_factory=self.factory,
2050
            list_only=True)
2051
        self.assertEqual(3, len(output.readlines()))
2052
2053
    def test_list_only_filtered(self):
2054
        output = self.run_selftest(test_suite_factory=self.factory,
2055
            list_only=True, pattern="Test.b")
2056
        self.assertEndsWith(output.getvalue(), "Test.b\n")
2057
        self.assertLength(1, output.readlines())
2058
2059
    def test_list_only_excludes(self):
2060
        output = self.run_selftest(test_suite_factory=self.factory,
2061
            list_only=True, exclude_pattern="Test.b")
2062
        self.assertNotContainsRe("Test.b", output.getvalue())
2063
        self.assertLength(2, output.readlines())
2064
4641.3.3 by Robert Collins
Enable --lsprof-tests on bzr selftest.
2065
    def test_lsprof_tests(self):
4641.3.5 by Robert Collins
Properly guard LSProf using tests.
2066
        self.requireFeature(test_lsprof.LSProfFeature)
4641.3.3 by Robert Collins
Enable --lsprof-tests on bzr selftest.
2067
        calls = []
2068
        class Test(object):
2069
            def __call__(test, result):
2070
                test.run(result)
2071
            def run(test, result):
5495.1.1 by Andrew Bennetts
Remove unused definition of ForwardingResult, and switch all code to use the testtools name for it. Also remove a few unused imports.
2072
                self.assertIsInstance(result, ExtendedToOriginalDecorator)
4641.3.3 by Robert Collins
Enable --lsprof-tests on bzr selftest.
2073
                calls.append("called")
2074
            def countTestCases(self):
2075
                return 1
2076
        self.run_selftest(test_suite_factory=Test, lsprof_tests=True)
2077
        self.assertLength(1, calls)
2078
4636.2.1 by Robert Collins
Test selftest --list-only and --randomize options using more precisely layers.
2079
    def test_random(self):
2080
        # test randomising by listing a number of tests.
2081
        output_123 = self.run_selftest(test_suite_factory=self.factory,
2082
            list_only=True, random_seed="123")
2083
        output_234 = self.run_selftest(test_suite_factory=self.factory,
2084
            list_only=True, random_seed="234")
2085
        self.assertNotEqual(output_123, output_234)
2086
        # "Randominzing test order..\n\n
2087
        self.assertLength(5, output_123.readlines())
2088
        self.assertLength(5, output_234.readlines())
2089
2090
    def test_random_reuse_is_same_order(self):
2091
        # test randomising by listing a number of tests.
2092
        expected = self.run_selftest(test_suite_factory=self.factory,
2093
            list_only=True, random_seed="123")
2094
        repeated = self.run_selftest(test_suite_factory=self.factory,
2095
            list_only=True, random_seed="123")
2096
        self.assertEqual(expected.getvalue(), repeated.getvalue())
2097
4636.2.3 by Robert Collins
Layer tests for selftest --subunit better.
2098
    def test_runner_class(self):
4913.2.18 by John Arbash Meinel
Add a _CompatibilityThunkFeature.
2099
        self.requireFeature(features.subunit)
4636.2.3 by Robert Collins
Layer tests for selftest --subunit better.
2100
        from subunit import ProtocolTestCase
2101
        stream = self.run_selftest(runner_class=tests.SubUnitBzrRunner,
2102
            test_suite_factory=self.factory)
2103
        test = ProtocolTestCase(stream)
2104
        result = unittest.TestResult()
2105
        test.run(result)
2106
        self.assertEqual(3, result.testsRun)
2107
4636.2.4 by Robert Collins
Move selftest internals tests out of blackbox test space - they are not testing our selftest command line.
2108
    def test_starting_with_single_argument(self):
2109
        output = self.run_selftest(test_suite_factory=self.factory,
2110
            starting_with=['bzrlib.tests.test_selftest.Test.a'],
2111
            list_only=True)
2112
        self.assertEqual('bzrlib.tests.test_selftest.Test.a\n',
2113
            output.getvalue())
2114
2115
    def test_starting_with_multiple_argument(self):
2116
        output = self.run_selftest(test_suite_factory=self.factory,
2117
            starting_with=['bzrlib.tests.test_selftest.Test.a',
2118
                'bzrlib.tests.test_selftest.Test.b'],
2119
            list_only=True)
2120
        self.assertEqual('bzrlib.tests.test_selftest.Test.a\n'
2121
            'bzrlib.tests.test_selftest.Test.b\n',
2122
            output.getvalue())
2123
4636.2.2 by Robert Collins
Fix selftest tests for --transport to test each layer precisely.
2124
    def check_transport_set(self, transport_server):
2125
        captured_transport = []
2126
        def seen_transport(a_transport):
2127
            captured_transport.append(a_transport)
2128
        class Capture(tests.TestCase):
2129
            def a(self):
2130
                seen_transport(bzrlib.tests.default_transport)
2131
        def factory():
2132
            return TestUtil.TestSuite([Capture("a")])
2133
        self.run_selftest(transport=transport_server, test_suite_factory=factory)
2134
        self.assertEqual(transport_server, captured_transport[0])
2135
2136
    def test_transport_sftp(self):
4913.2.17 by John Arbash Meinel
Found another paramiko dependent
2137
        self.requireFeature(features.paramiko)
5158.3.2 by Martin
Fix moved stub_sftp imports
2138
        from bzrlib.tests import stub_sftp
4797.11.2 by Vincent Ladeuil
Stop requiring testtools for sftp use.
2139
        self.check_transport_set(stub_sftp.SFTPAbsoluteServer)
4636.2.2 by Robert Collins
Fix selftest tests for --transport to test each layer precisely.
2140
2141
    def test_transport_memory(self):
5017.3.45 by Vincent Ladeuil
Move MemoryServer back into bzrlib.transport.memory as it's needed as soon as a MemoryTransport is used. Add a NEWS entry.
2142
        self.check_transport_set(memory.MemoryServer)
4636.2.2 by Robert Collins
Fix selftest tests for --transport to test each layer precisely.
2143
2172.4.3 by Alexander Belchenko
Change name of option to '--clean-output' and provide tests
2144
4636.2.4 by Robert Collins
Move selftest internals tests out of blackbox test space - they are not testing our selftest command line.
2145
class TestSelftestWithIdList(tests.TestCaseInTempDir, SelfTestHelper):
2146
    # Does IO: reads test.list
2147
2148
    def test_load_list(self):
2149
        # Provide a list with one test - this test.
2150
        test_id_line = '%s\n' % self.id()
2151
        self.build_tree_contents([('test.list', test_id_line)])
2152
        # And generate a list of the tests in  the suite.
2153
        stream = self.run_selftest(load_list='test.list', list_only=True)
2154
        self.assertEqual(test_id_line, stream.getvalue())
2155
2156
    def test_load_unknown(self):
2157
        # Provide a list with one test - this test.
2158
        # And generate a list of the tests in  the suite.
2159
        err = self.assertRaises(errors.NoSuchFile, self.run_selftest,
2160
            load_list='missing file name', list_only=True)
2161
2162
5387.2.5 by John Arbash Meinel
add a failing test that the subunit stream doesn't contain the log info.
2163
class TestSubunitLogDetails(tests.TestCase, SelfTestHelper):
2164
2165
    _test_needs_features = [features.subunit]
2166
5387.2.6 by John Arbash Meinel
Do a full test suite against all the subunit permutations.
2167
    def run_subunit_stream(self, test_name):
5387.2.5 by John Arbash Meinel
add a failing test that the subunit stream doesn't contain the log info.
2168
        from subunit import ProtocolTestCase
5387.2.6 by John Arbash Meinel
Do a full test suite against all the subunit permutations.
2169
        def factory():
2170
            return TestUtil.TestSuite([_get_test(test_name)])
5387.2.5 by John Arbash Meinel
add a failing test that the subunit stream doesn't contain the log info.
2171
        stream = self.run_selftest(runner_class=tests.SubUnitBzrRunner,
5387.2.6 by John Arbash Meinel
Do a full test suite against all the subunit permutations.
2172
            test_suite_factory=factory)
5387.2.5 by John Arbash Meinel
add a failing test that the subunit stream doesn't contain the log info.
2173
        test = ProtocolTestCase(stream)
5387.2.6 by John Arbash Meinel
Do a full test suite against all the subunit permutations.
2174
        result = testtools.TestResult()
5387.2.5 by John Arbash Meinel
add a failing test that the subunit stream doesn't contain the log info.
2175
        test.run(result)
5387.2.6 by John Arbash Meinel
Do a full test suite against all the subunit permutations.
2176
        content = stream.getvalue()
2177
        return content, result
2178
2179
    def test_fail_has_log(self):
2180
        content, result = self.run_subunit_stream('test_fail')
2181
        self.assertEqual(1, len(result.failures))
2182
        self.assertContainsRe(content, '(?m)^log$')
2183
        self.assertContainsRe(content, 'this test will fail')
2184
2185
    def test_error_has_log(self):
2186
        content, result = self.run_subunit_stream('test_error')
2187
        self.assertContainsRe(content, '(?m)^log$')
2188
        self.assertContainsRe(content, 'this test errored')
2189
2190
    def test_skip_has_no_log(self):
2191
        content, result = self.run_subunit_stream('test_skip')
2192
        self.assertNotContainsRe(content, '(?m)^log$')
2193
        self.assertNotContainsRe(content, 'this test will be skipped')
2194
        self.assertEqual(['reason'], result.skip_reasons.keys())
2195
        skips = result.skip_reasons['reason']
2196
        self.assertEqual(1, len(skips))
2197
        test = skips[0]
2198
        # RemotedTestCase doesn't preserve the "details"
2199
        ## self.assertFalse('log' in test.getDetails())
2200
2201
    def test_missing_feature_has_no_log(self):
2202
        content, result = self.run_subunit_stream('test_missing_feature')
2203
        self.assertNotContainsRe(content, '(?m)^log$')
2204
        self.assertNotContainsRe(content, 'missing the feature')
2205
        self.assertEqual(['_MissingFeature\n'], result.skip_reasons.keys())
2206
        skips = result.skip_reasons['_MissingFeature\n']
2207
        self.assertEqual(1, len(skips))
2208
        test = skips[0]
2209
        # RemotedTestCase doesn't preserve the "details"
2210
        ## self.assertFalse('log' in test.getDetails())
2211
2212
    def test_xfail_has_no_log(self):
2213
        content, result = self.run_subunit_stream('test_xfail')
2214
        self.assertNotContainsRe(content, '(?m)^log$')
2215
        self.assertNotContainsRe(content, 'test with expected failure')
2216
        self.assertEqual(1, len(result.expectedFailures))
2217
        result_content = result.expectedFailures[0][1]
2218
        self.assertNotContainsRe(result_content, 'Text attachment: log')
2219
        self.assertNotContainsRe(result_content, 'test with expected failure')
2220
2221
    def test_unexpected_success_has_log(self):
2222
        content, result = self.run_subunit_stream('test_unexpected_success')
2223
        self.assertContainsRe(content, '(?m)^log$')
2224
        self.assertContainsRe(content, 'test with unexpected success')
2225
        self.expectFailure('subunit treats "unexpectedSuccess"'
2226
                           ' as a plain success',
2227
            self.assertEqual, 1, len(result.unexpectedSuccesses))
2228
        self.assertEqual(1, len(result.unexpectedSuccesses))
2229
        test = result.unexpectedSuccesses[0]
2230
        # RemotedTestCase doesn't preserve the "details"
2231
        ## self.assertTrue('log' in test.getDetails())
5387.2.5 by John Arbash Meinel
add a failing test that the subunit stream doesn't contain the log info.
2232
2233
    def test_success_has_no_log(self):
5387.2.6 by John Arbash Meinel
Do a full test suite against all the subunit permutations.
2234
        content, result = self.run_subunit_stream('test_success')
5387.2.5 by John Arbash Meinel
add a failing test that the subunit stream doesn't contain the log info.
2235
        self.assertEqual(1, result.testsRun)
2236
        self.assertNotContainsRe(content, '(?m)^log$')
2237
        self.assertNotContainsRe(content, 'this test succeeds')
2238
2239
4636.2.4 by Robert Collins
Move selftest internals tests out of blackbox test space - they are not testing our selftest command line.
2240
class TestRunBzr(tests.TestCase):
2241
2242
    out = ''
2243
    err = ''
2244
2245
    def _run_bzr_core(self, argv, retcode=0, encoding=None, stdin=None,
2246
                         working_dir=None):
2247
        """Override _run_bzr_core to test how it is invoked by run_bzr.
2248
2249
        Attempts to run bzr from inside this class don't actually run it.
2250
4665.5.15 by Vincent Ladeuil
Catch the retcode for all commands.
2251
        We test how run_bzr actually invokes bzr in another location.  Here we
2252
        only need to test that it passes the right parameters to run_bzr.
4636.2.4 by Robert Collins
Move selftest internals tests out of blackbox test space - they are not testing our selftest command line.
2253
        """
2254
        self.argv = list(argv)
2255
        self.retcode = retcode
2256
        self.encoding = encoding
2257
        self.stdin = stdin
2258
        self.working_dir = working_dir
4665.5.15 by Vincent Ladeuil
Catch the retcode for all commands.
2259
        return self.retcode, self.out, self.err
4636.2.4 by Robert Collins
Move selftest internals tests out of blackbox test space - they are not testing our selftest command line.
2260
2261
    def test_run_bzr_error(self):
2262
        self.out = "It sure does!\n"
2263
        out, err = self.run_bzr_error(['^$'], ['rocks'], retcode=34)
2264
        self.assertEqual(['rocks'], self.argv)
2265
        self.assertEqual(34, self.retcode)
4665.5.15 by Vincent Ladeuil
Catch the retcode for all commands.
2266
        self.assertEqual('It sure does!\n', out)
2267
        self.assertEquals(out, self.out)
2268
        self.assertEqual('', err)
2269
        self.assertEquals(err, self.err)
4636.2.4 by Robert Collins
Move selftest internals tests out of blackbox test space - they are not testing our selftest command line.
2270
2271
    def test_run_bzr_error_regexes(self):
2272
        self.out = ''
2273
        self.err = "bzr: ERROR: foobarbaz is not versioned"
2274
        out, err = self.run_bzr_error(
4665.5.15 by Vincent Ladeuil
Catch the retcode for all commands.
2275
            ["bzr: ERROR: foobarbaz is not versioned"],
2276
            ['file-id', 'foobarbaz'])
4636.2.4 by Robert Collins
Move selftest internals tests out of blackbox test space - they are not testing our selftest command line.
2277
2278
    def test_encoding(self):
2279
        """Test that run_bzr passes encoding to _run_bzr_core"""
2280
        self.run_bzr('foo bar')
2281
        self.assertEqual(None, self.encoding)
2282
        self.assertEqual(['foo', 'bar'], self.argv)
2283
2284
        self.run_bzr('foo bar', encoding='baz')
2285
        self.assertEqual('baz', self.encoding)
2286
        self.assertEqual(['foo', 'bar'], self.argv)
2287
2288
    def test_retcode(self):
2289
        """Test that run_bzr passes retcode to _run_bzr_core"""
2290
        # Default is retcode == 0
2291
        self.run_bzr('foo bar')
2292
        self.assertEqual(0, self.retcode)
2293
        self.assertEqual(['foo', 'bar'], self.argv)
2294
2295
        self.run_bzr('foo bar', retcode=1)
2296
        self.assertEqual(1, self.retcode)
2297
        self.assertEqual(['foo', 'bar'], self.argv)
2298
2299
        self.run_bzr('foo bar', retcode=None)
2300
        self.assertEqual(None, self.retcode)
2301
        self.assertEqual(['foo', 'bar'], self.argv)
2302
2303
        self.run_bzr(['foo', 'bar'], retcode=3)
2304
        self.assertEqual(3, self.retcode)
2305
        self.assertEqual(['foo', 'bar'], self.argv)
2306
2307
    def test_stdin(self):
2308
        # test that the stdin keyword to run_bzr is passed through to
2309
        # _run_bzr_core as-is. We do this by overriding
2310
        # _run_bzr_core in this class, and then calling run_bzr,
2311
        # which is a convenience function for _run_bzr_core, so
2312
        # should invoke it.
2313
        self.run_bzr('foo bar', stdin='gam')
2314
        self.assertEqual('gam', self.stdin)
2315
        self.assertEqual(['foo', 'bar'], self.argv)
2316
2317
        self.run_bzr('foo bar', stdin='zippy')
2318
        self.assertEqual('zippy', self.stdin)
2319
        self.assertEqual(['foo', 'bar'], self.argv)
2320
2321
    def test_working_dir(self):
2322
        """Test that run_bzr passes working_dir to _run_bzr_core"""
2323
        self.run_bzr('foo bar')
2324
        self.assertEqual(None, self.working_dir)
2325
        self.assertEqual(['foo', 'bar'], self.argv)
2326
2327
        self.run_bzr('foo bar', working_dir='baz')
2328
        self.assertEqual('baz', self.working_dir)
2329
        self.assertEqual(['foo', 'bar'], self.argv)
2330
2331
    def test_reject_extra_keyword_arguments(self):
2332
        self.assertRaises(TypeError, self.run_bzr, "foo bar",
2333
                          error_regex=['error message'])
2334
2335
2336
class TestRunBzrCaptured(tests.TestCaseWithTransport):
2337
    # Does IO when testing the working_dir parameter.
2338
2339
    def apply_redirected(self, stdin=None, stdout=None, stderr=None,
2340
                         a_callable=None, *args, **kwargs):
2341
        self.stdin = stdin
2342
        self.factory_stdin = getattr(bzrlib.ui.ui_factory, "stdin", None)
2343
        self.factory = bzrlib.ui.ui_factory
2344
        self.working_dir = osutils.getcwd()
2345
        stdout.write('foo\n')
2346
        stderr.write('bar\n')
2347
        return 0
2348
2349
    def test_stdin(self):
2350
        # test that the stdin keyword to _run_bzr_core is passed through to
2351
        # apply_redirected as a StringIO. We do this by overriding
2352
        # apply_redirected in this class, and then calling _run_bzr_core,
2353
        # which calls apply_redirected.
2354
        self.run_bzr(['foo', 'bar'], stdin='gam')
2355
        self.assertEqual('gam', self.stdin.read())
2356
        self.assertTrue(self.stdin is self.factory_stdin)
2357
        self.run_bzr(['foo', 'bar'], stdin='zippy')
2358
        self.assertEqual('zippy', self.stdin.read())
2359
        self.assertTrue(self.stdin is self.factory_stdin)
2360
2361
    def test_ui_factory(self):
2362
        # each invocation of self.run_bzr should get its
2363
        # own UI factory, which is an instance of TestUIFactory,
2364
        # with stdin, stdout and stderr attached to the stdin,
2365
        # stdout and stderr of the invoked run_bzr
2366
        current_factory = bzrlib.ui.ui_factory
2367
        self.run_bzr(['foo'])
2368
        self.failIf(current_factory is self.factory)
2369
        self.assertNotEqual(sys.stdout, self.factory.stdout)
2370
        self.assertNotEqual(sys.stderr, self.factory.stderr)
2371
        self.assertEqual('foo\n', self.factory.stdout.getvalue())
2372
        self.assertEqual('bar\n', self.factory.stderr.getvalue())
2373
        self.assertIsInstance(self.factory, tests.TestUIFactory)
2374
2375
    def test_working_dir(self):
2376
        self.build_tree(['one/', 'two/'])
2377
        cwd = osutils.getcwd()
2378
2379
        # Default is to work in the current directory
2380
        self.run_bzr(['foo', 'bar'])
2381
        self.assertEqual(cwd, self.working_dir)
2382
2383
        self.run_bzr(['foo', 'bar'], working_dir=None)
2384
        self.assertEqual(cwd, self.working_dir)
2385
2386
        # The function should be run in the alternative directory
2387
        # but afterwards the current working dir shouldn't be changed
2388
        self.run_bzr(['foo', 'bar'], working_dir='one')
2389
        self.assertNotEqual(cwd, self.working_dir)
2390
        self.assertEndsWith(self.working_dir, 'one')
2391
        self.assertEqual(cwd, osutils.getcwd())
2392
2393
        self.run_bzr(['foo', 'bar'], working_dir='two')
2394
        self.assertNotEqual(cwd, self.working_dir)
2395
        self.assertEndsWith(self.working_dir, 'two')
2396
        self.assertEqual(cwd, osutils.getcwd())
2397
2398
2399
class StubProcess(object):
2400
    """A stub process for testing run_bzr_subprocess."""
2401
    
2402
    def __init__(self, out="", err="", retcode=0):
2403
        self.out = out
2404
        self.err = err
2405
        self.returncode = retcode
2406
2407
    def communicate(self):
2408
        return self.out, self.err
2409
2410
4650.1.4 by Robert Collins
Make tests for finish_bzr_subprocess that really only care about the interface use StubProcess.
2411
class TestWithFakedStartBzrSubprocess(tests.TestCaseWithTransport):
2412
    """Base class for tests testing how we might run bzr."""
4636.2.4 by Robert Collins
Move selftest internals tests out of blackbox test space - they are not testing our selftest command line.
2413
2414
    def setUp(self):
2415
        tests.TestCaseWithTransport.setUp(self)
2416
        self.subprocess_calls = []
2417
2418
    def start_bzr_subprocess(self, process_args, env_changes=None,
2419
                             skip_if_plan_to_signal=False,
2420
                             working_dir=None,
2421
                             allow_plugins=False):
2422
        """capture what run_bzr_subprocess tries to do."""
2423
        self.subprocess_calls.append({'process_args':process_args,
2424
            'env_changes':env_changes,
2425
            'skip_if_plan_to_signal':skip_if_plan_to_signal,
2426
            'working_dir':working_dir, 'allow_plugins':allow_plugins})
2427
        return self.next_subprocess
2428
4650.1.4 by Robert Collins
Make tests for finish_bzr_subprocess that really only care about the interface use StubProcess.
2429
2430
class TestRunBzrSubprocess(TestWithFakedStartBzrSubprocess):
2431
4636.2.4 by Robert Collins
Move selftest internals tests out of blackbox test space - they are not testing our selftest command line.
2432
    def assertRunBzrSubprocess(self, expected_args, process, *args, **kwargs):
2433
        """Run run_bzr_subprocess with args and kwargs using a stubbed process.
2434
2435
        Inside TestRunBzrSubprocessCommands we use a stub start_bzr_subprocess
2436
        that will return static results. This assertion method populates those
2437
        results and also checks the arguments run_bzr_subprocess generates.
2438
        """
2439
        self.next_subprocess = process
2440
        try:
2441
            result = self.run_bzr_subprocess(*args, **kwargs)
2442
        except:
2443
            self.next_subprocess = None
2444
            for key, expected in expected_args.iteritems():
2445
                self.assertEqual(expected, self.subprocess_calls[-1][key])
2446
            raise
2447
        else:
2448
            self.next_subprocess = None
2449
            for key, expected in expected_args.iteritems():
2450
                self.assertEqual(expected, self.subprocess_calls[-1][key])
2451
            return result
2452
2453
    def test_run_bzr_subprocess(self):
2454
        """The run_bzr_helper_external command behaves nicely."""
2455
        self.assertRunBzrSubprocess({'process_args':['--version']},
2456
            StubProcess(), '--version')
2457
        self.assertRunBzrSubprocess({'process_args':['--version']},
2458
            StubProcess(), ['--version'])
2459
        # retcode=None disables retcode checking
2460
        result = self.assertRunBzrSubprocess({},
2461
            StubProcess(retcode=3), '--version', retcode=None)
2462
        result = self.assertRunBzrSubprocess({},
2463
            StubProcess(out="is free software"), '--version')
2464
        self.assertContainsRe(result[0], 'is free software')
2465
        # Running a subcommand that is missing errors
2466
        self.assertRaises(AssertionError, self.assertRunBzrSubprocess,
2467
            {'process_args':['--versionn']}, StubProcess(retcode=3),
2468
            '--versionn')
2469
        # Unless it is told to expect the error from the subprocess
2470
        result = self.assertRunBzrSubprocess({},
2471
            StubProcess(retcode=3), '--versionn', retcode=3)
2472
        # Or to ignore retcode checking
2473
        result = self.assertRunBzrSubprocess({},
2474
            StubProcess(err="unknown command", retcode=3), '--versionn',
2475
            retcode=None)
2476
        self.assertContainsRe(result[1], 'unknown command')
2477
2478
    def test_env_change_passes_through(self):
2479
        self.assertRunBzrSubprocess(
2480
            {'env_changes':{'new':'value', 'changed':'newvalue', 'deleted':None}},
2481
            StubProcess(), '',
2482
            env_changes={'new':'value', 'changed':'newvalue', 'deleted':None})
2483
2484
    def test_no_working_dir_passed_as_None(self):
2485
        self.assertRunBzrSubprocess({'working_dir': None}, StubProcess(), '')
2486
2487
    def test_no_working_dir_passed_through(self):
2488
        self.assertRunBzrSubprocess({'working_dir': 'dir'}, StubProcess(), '',
2489
            working_dir='dir')
2490
2491
    def test_run_bzr_subprocess_no_plugins(self):
2492
        self.assertRunBzrSubprocess({'allow_plugins': False},
2493
            StubProcess(), '')
2494
2495
    def test_allow_plugins(self):
2496
        self.assertRunBzrSubprocess({'allow_plugins': True},
2497
            StubProcess(), '', allow_plugins=True)
2498
2499
4650.1.4 by Robert Collins
Make tests for finish_bzr_subprocess that really only care about the interface use StubProcess.
2500
class TestFinishBzrSubprocess(TestWithFakedStartBzrSubprocess):
2501
2502
    def test_finish_bzr_subprocess_with_error(self):
2503
        """finish_bzr_subprocess allows specification of the desired exit code.
2504
        """
2505
        process = StubProcess(err="unknown command", retcode=3)
2506
        result = self.finish_bzr_subprocess(process, retcode=3)
2507
        self.assertEqual('', result[0])
2508
        self.assertContainsRe(result[1], 'unknown command')
2509
2510
    def test_finish_bzr_subprocess_ignoring_retcode(self):
2511
        """finish_bzr_subprocess allows the exit code to be ignored."""
2512
        process = StubProcess(err="unknown command", retcode=3)
2513
        result = self.finish_bzr_subprocess(process, retcode=None)
2514
        self.assertEqual('', result[0])
2515
        self.assertContainsRe(result[1], 'unknown command')
2516
2517
    def test_finish_subprocess_with_unexpected_retcode(self):
2518
        """finish_bzr_subprocess raises self.failureException if the retcode is
2519
        not the expected one.
2520
        """
2521
        process = StubProcess(err="unknown command", retcode=3)
2522
        self.assertRaises(self.failureException, self.finish_bzr_subprocess,
2523
                          process)
2524
2525
4636.2.4 by Robert Collins
Move selftest internals tests out of blackbox test space - they are not testing our selftest command line.
2526
class _DontSpawnProcess(Exception):
2527
    """A simple exception which just allows us to skip unnecessary steps"""
2528
2529
2530
class TestStartBzrSubProcess(tests.TestCase):
2531
2532
    def check_popen_state(self):
2533
        """Replace to make assertions when popen is called."""
2534
2535
    def _popen(self, *args, **kwargs):
2536
        """Record the command that is run, so that we can ensure it is correct"""
2537
        self.check_popen_state()
2538
        self._popen_args = args
2539
        self._popen_kwargs = kwargs
2540
        raise _DontSpawnProcess()
2541
2542
    def test_run_bzr_subprocess_no_plugins(self):
2543
        self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [])
2544
        command = self._popen_args[0]
2545
        self.assertEqual(sys.executable, command[0])
2546
        self.assertEqual(self.get_bzr_path(), command[1])
2547
        self.assertEqual(['--no-plugins'], command[2:])
2548
2549
    def test_allow_plugins(self):
2550
        self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [],
2551
            allow_plugins=True)
2552
        command = self._popen_args[0]
2553
        self.assertEqual([], command[2:])
2554
2555
    def test_set_env(self):
2556
        self.failIf('EXISTANT_ENV_VAR' in os.environ)
2557
        # set in the child
2558
        def check_environment():
2559
            self.assertEqual('set variable', os.environ['EXISTANT_ENV_VAR'])
2560
        self.check_popen_state = check_environment
2561
        self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [],
2562
            env_changes={'EXISTANT_ENV_VAR':'set variable'})
2563
        # not set in theparent
2564
        self.assertFalse('EXISTANT_ENV_VAR' in os.environ)
2565
2566
    def test_run_bzr_subprocess_env_del(self):
2567
        """run_bzr_subprocess can remove environment variables too."""
2568
        self.failIf('EXISTANT_ENV_VAR' in os.environ)
2569
        def check_environment():
2570
            self.assertFalse('EXISTANT_ENV_VAR' in os.environ)
2571
        os.environ['EXISTANT_ENV_VAR'] = 'set variable'
2572
        self.check_popen_state = check_environment
2573
        self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [],
2574
            env_changes={'EXISTANT_ENV_VAR':None})
2575
        # Still set in parent
2576
        self.assertEqual('set variable', os.environ['EXISTANT_ENV_VAR'])
2577
        del os.environ['EXISTANT_ENV_VAR']
2578
2579
    def test_env_del_missing(self):
2580
        self.failIf('NON_EXISTANT_ENV_VAR' in os.environ)
2581
        def check_environment():
2582
            self.assertFalse('NON_EXISTANT_ENV_VAR' in os.environ)
2583
        self.check_popen_state = check_environment
2584
        self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [],
2585
            env_changes={'NON_EXISTANT_ENV_VAR':None})
2586
2587
    def test_working_dir(self):
2588
        """Test that we can specify the working dir for the child"""
2589
        orig_getcwd = osutils.getcwd
2590
        orig_chdir = os.chdir
2591
        chdirs = []
2592
        def chdir(path):
2593
            chdirs.append(path)
2594
        os.chdir = chdir
2595
        try:
2596
            def getcwd():
2597
                return 'current'
2598
            osutils.getcwd = getcwd
2599
            try:
2600
                self.assertRaises(_DontSpawnProcess, self.start_bzr_subprocess, [],
2601
                    working_dir='foo')
2602
            finally:
2603
                osutils.getcwd = orig_getcwd
2604
        finally:
2605
            os.chdir = orig_chdir
2606
        self.assertEqual(['foo', 'current'], chdirs)
2607
5340.3.1 by Martin
Add test for problem with TestCase.get_bzr_path method
2608
    def test_get_bzr_path_with_cwd_bzrlib(self):
2609
        self.get_source_path = lambda: ""
2610
        self.overrideAttr(os.path, "isfile", lambda path: True)
2611
        self.assertEqual(self.get_bzr_path(), "bzr")
2612
4636.2.4 by Robert Collins
Move selftest internals tests out of blackbox test space - they are not testing our selftest command line.
2613
4650.1.4 by Robert Collins
Make tests for finish_bzr_subprocess that really only care about the interface use StubProcess.
2614
class TestActuallyStartBzrSubprocess(tests.TestCaseWithTransport):
2615
    """Tests that really need to do things with an external bzr."""
4636.2.4 by Robert Collins
Move selftest internals tests out of blackbox test space - they are not testing our selftest command line.
2616
2617
    def test_start_and_stop_bzr_subprocess_send_signal(self):
2618
        """finish_bzr_subprocess raises self.failureException if the retcode is
2619
        not the expected one.
2620
        """
4695.3.2 by Vincent Ladeuil
Simplified and claried as per Robert's review.
2621
        self.disable_missing_extensions_warning()
4636.2.4 by Robert Collins
Move selftest internals tests out of blackbox test space - they are not testing our selftest command line.
2622
        process = self.start_bzr_subprocess(['wait-until-signalled'],
2623
                                            skip_if_plan_to_signal=True)
2624
        self.assertEqual('running\n', process.stdout.readline())
2625
        result = self.finish_bzr_subprocess(process, send_signal=signal.SIGINT,
2626
                                            retcode=3)
2627
        self.assertEqual('', result[0])
2628
        self.assertEqual('bzr: interrupted\n', result[1])
2629
2630
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
2631
class TestFeature(tests.TestCase):
2367.1.4 by Robert Collins
Add operating system Feature model to bzrlib.tests to allow writing tests
2632
2633
    def test_caching(self):
2634
        """Feature._probe is called by the feature at most once."""
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
2635
        class InstrumentedFeature(tests.Feature):
2367.1.4 by Robert Collins
Add operating system Feature model to bzrlib.tests to allow writing tests
2636
            def __init__(self):
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
2637
                super(InstrumentedFeature, self).__init__()
2367.1.4 by Robert Collins
Add operating system Feature model to bzrlib.tests to allow writing tests
2638
                self.calls = []
2639
            def _probe(self):
2640
                self.calls.append('_probe')
2641
                return False
2642
        feature = InstrumentedFeature()
2643
        feature.available()
2644
        self.assertEqual(['_probe'], feature.calls)
2645
        feature.available()
2646
        self.assertEqual(['_probe'], feature.calls)
2647
2648
    def test_named_str(self):
2649
        """Feature.__str__ should thunk to feature_name()."""
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
2650
        class NamedFeature(tests.Feature):
2367.1.4 by Robert Collins
Add operating system Feature model to bzrlib.tests to allow writing tests
2651
            def feature_name(self):
2652
                return 'symlinks'
2653
        feature = NamedFeature()
2654
        self.assertEqual('symlinks', str(feature))
2655
2656
    def test_default_str(self):
2657
        """Feature.__str__ should default to __class__.__name__."""
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
2658
        class NamedFeature(tests.Feature):
2367.1.4 by Robert Collins
Add operating system Feature model to bzrlib.tests to allow writing tests
2659
            pass
2660
        feature = NamedFeature()
2661
        self.assertEqual('NamedFeature', str(feature))
2367.1.6 by Robert Collins
Allow per-test-fixture feature requirements via 'requireFeature'.(Robert Collins)
2662
2663
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
2664
class TestUnavailableFeature(tests.TestCase):
2367.1.6 by Robert Collins
Allow per-test-fixture feature requirements via 'requireFeature'.(Robert Collins)
2665
2666
    def test_access_feature(self):
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
2667
        feature = tests.Feature()
2668
        exception = tests.UnavailableFeature(feature)
2367.1.6 by Robert Collins
Allow per-test-fixture feature requirements via 'requireFeature'.(Robert Collins)
2669
        self.assertIs(feature, exception.args[0])
2394.2.5 by Ian Clatworthy
list-only working, include test not
2670
2671
4913.2.18 by John Arbash Meinel
Add a _CompatibilityThunkFeature.
2672
simple_thunk_feature = tests._CompatabilityThunkFeature(
5003.2.1 by Vincent Ladeuil
Avoid infinite recursion when probing for apport.
2673
    deprecated_in((2, 1, 0)),
2674
    'bzrlib.tests.test_selftest',
2675
    'simple_thunk_feature','UnicodeFilename',
2676
    replacement_module='bzrlib.tests'
2677
    )
4913.2.18 by John Arbash Meinel
Add a _CompatibilityThunkFeature.
2678
2679
class Test_CompatibilityFeature(tests.TestCase):
2680
2681
    def test_does_thunk(self):
2682
        res = self.callDeprecated(
2683
            ['bzrlib.tests.test_selftest.simple_thunk_feature was deprecated'
2684
             ' in version 2.1.0. Use bzrlib.tests.UnicodeFilename instead.'],
2685
            simple_thunk_feature.available)
2686
        self.assertEqual(tests.UnicodeFilename.available(), res)
2687
5003.2.1 by Vincent Ladeuil
Avoid infinite recursion when probing for apport.
2688
4873.2.3 by John Arbash Meinel
Change from _ModuleFeature to ModuleAvailableFeature, per vila's review.
2689
class TestModuleAvailableFeature(tests.TestCase):
4873.2.1 by John Arbash Meinel
Add a helper _ModuleFeature.
2690
2691
    def test_available_module(self):
4873.2.3 by John Arbash Meinel
Change from _ModuleFeature to ModuleAvailableFeature, per vila's review.
2692
        feature = tests.ModuleAvailableFeature('bzrlib.tests')
4873.2.1 by John Arbash Meinel
Add a helper _ModuleFeature.
2693
        self.assertEqual('bzrlib.tests', feature.module_name)
2694
        self.assertEqual('bzrlib.tests', str(feature))
2695
        self.assertTrue(feature.available())
2696
        self.assertIs(tests, feature.module)
2697
2698
    def test_unavailable_module(self):
4873.2.3 by John Arbash Meinel
Change from _ModuleFeature to ModuleAvailableFeature, per vila's review.
2699
        feature = tests.ModuleAvailableFeature('bzrlib.no_such_module_exists')
4873.2.1 by John Arbash Meinel
Add a helper _ModuleFeature.
2700
        self.assertEqual('bzrlib.no_such_module_exists', str(feature))
2701
        self.assertFalse(feature.available())
2702
        self.assertIs(None, feature.module)
2703
2704
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
2705
class TestSelftestFiltering(tests.TestCase):
2394.2.5 by Ian Clatworthy
list-only working, include test not
2706
2394.2.7 by Ian Clatworthy
Added whitebox tests - filter_suite_by_re and sort_suite_by_re
2707
    def setUp(self):
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
2708
        tests.TestCase.setUp(self)
2394.2.7 by Ian Clatworthy
Added whitebox tests - filter_suite_by_re and sort_suite_by_re
2709
        self.suite = TestUtil.TestSuite()
2710
        self.loader = TestUtil.TestLoader()
4636.2.5 by Robert Collins
Minor tweaks to clarity in slower selftest tests.
2711
        self.suite.addTest(self.loader.loadTestsFromModule(
2712
            sys.modules['bzrlib.tests.test_selftest']))
3302.7.1 by Vincent Ladeuil
Extract _test_ids helper for reuse by other test classes.
2713
        self.all_names = _test_ids(self.suite)
2394.2.7 by Ian Clatworthy
Added whitebox tests - filter_suite_by_re and sort_suite_by_re
2714
2921.6.9 by Robert Collins
* New helper function ``bzrlib.tests.condition_id_re`` which helps
2715
    def test_condition_id_re(self):
2716
        test_name = ('bzrlib.tests.test_selftest.TestSelftestFiltering.'
2717
            'test_condition_id_re')
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
2718
        filtered_suite = tests.filter_suite_by_condition(
2719
            self.suite, tests.condition_id_re('test_condition_id_re'))
3302.7.1 by Vincent Ladeuil
Extract _test_ids helper for reuse by other test classes.
2720
        self.assertEqual([test_name], _test_ids(filtered_suite))
2921.6.9 by Robert Collins
* New helper function ``bzrlib.tests.condition_id_re`` which helps
2721
3193.1.2 by Vincent Ladeuil
Add condition_id_in_list and filter_suite_by_id_list capabilities.
2722
    def test_condition_id_in_list(self):
2723
        test_names = ['bzrlib.tests.test_selftest.TestSelftestFiltering.'
2724
                      'test_condition_id_in_list']
3193.1.11 by Vincent Ladeuil
Relax constraint on test ids, simplify implementation and update tests.
2725
        id_list = tests.TestIdList(test_names)
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
2726
        filtered_suite = tests.filter_suite_by_condition(
3193.1.11 by Vincent Ladeuil
Relax constraint on test ids, simplify implementation and update tests.
2727
            self.suite, tests.condition_id_in_list(id_list))
3193.1.2 by Vincent Ladeuil
Add condition_id_in_list and filter_suite_by_id_list capabilities.
2728
        my_pattern = 'TestSelftestFiltering.*test_condition_id_in_list'
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
2729
        re_filtered = tests.filter_suite_by_re(self.suite, my_pattern)
3302.7.1 by Vincent Ladeuil
Extract _test_ids helper for reuse by other test classes.
2730
        self.assertEqual(_test_ids(re_filtered), _test_ids(filtered_suite))
3193.1.2 by Vincent Ladeuil
Add condition_id_in_list and filter_suite_by_id_list capabilities.
2731
3302.11.1 by Vincent Ladeuil
Create a new selftest filter allowing loading only one module/class/test.
2732
    def test_condition_id_startswith(self):
2733
        klass = 'bzrlib.tests.test_selftest.TestSelftestFiltering.'
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
2734
        start1 = klass + 'test_condition_id_starts'
2735
        start2 = klass + 'test_condition_id_in'
2736
        test_names = [ klass + 'test_condition_id_in_list',
2737
                      klass + 'test_condition_id_startswith',
2738
                     ]
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
2739
        filtered_suite = tests.filter_suite_by_condition(
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
2740
            self.suite, tests.condition_id_startswith([start1, start2]))
2741
        self.assertEqual(test_names, _test_ids(filtered_suite))
3302.11.1 by Vincent Ladeuil
Create a new selftest filter allowing loading only one module/class/test.
2742
2921.6.8 by Robert Collins
* New helper function ``bzrlib.tests.condition_isinstance`` which helps
2743
    def test_condition_isinstance(self):
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
2744
        filtered_suite = tests.filter_suite_by_condition(
2745
            self.suite, tests.condition_isinstance(self.__class__))
2921.6.8 by Robert Collins
* New helper function ``bzrlib.tests.condition_isinstance`` which helps
2746
        class_pattern = 'bzrlib.tests.test_selftest.TestSelftestFiltering.'
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
2747
        re_filtered = tests.filter_suite_by_re(self.suite, class_pattern)
3302.7.1 by Vincent Ladeuil
Extract _test_ids helper for reuse by other test classes.
2748
        self.assertEqual(_test_ids(re_filtered), _test_ids(filtered_suite))
2921.6.8 by Robert Collins
* New helper function ``bzrlib.tests.condition_isinstance`` which helps
2749
2921.6.9 by Robert Collins
* New helper function ``bzrlib.tests.condition_id_re`` which helps
2750
    def test_exclude_tests_by_condition(self):
2751
        excluded_name = ('bzrlib.tests.test_selftest.TestSelftestFiltering.'
2752
            'test_exclude_tests_by_condition')
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
2753
        filtered_suite = tests.exclude_tests_by_condition(self.suite,
2921.6.9 by Robert Collins
* New helper function ``bzrlib.tests.condition_id_re`` which helps
2754
            lambda x:x.id() == excluded_name)
2755
        self.assertEqual(len(self.all_names) - 1,
2756
            filtered_suite.countTestCases())
3302.7.1 by Vincent Ladeuil
Extract _test_ids helper for reuse by other test classes.
2757
        self.assertFalse(excluded_name in _test_ids(filtered_suite))
2921.6.9 by Robert Collins
* New helper function ``bzrlib.tests.condition_id_re`` which helps
2758
        remaining_names = list(self.all_names)
2759
        remaining_names.remove(excluded_name)
3302.7.1 by Vincent Ladeuil
Extract _test_ids helper for reuse by other test classes.
2760
        self.assertEqual(remaining_names, _test_ids(filtered_suite))
2921.6.9 by Robert Collins
* New helper function ``bzrlib.tests.condition_id_re`` which helps
2761
2921.6.2 by Robert Collins
* New helper method ``bzrlib.tests.exclude_tests_by_re`` which gives a new
2762
    def test_exclude_tests_by_re(self):
3302.7.1 by Vincent Ladeuil
Extract _test_ids helper for reuse by other test classes.
2763
        self.all_names = _test_ids(self.suite)
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
2764
        filtered_suite = tests.exclude_tests_by_re(self.suite,
2765
                                                   'exclude_tests_by_re')
2921.6.2 by Robert Collins
* New helper method ``bzrlib.tests.exclude_tests_by_re`` which gives a new
2766
        excluded_name = ('bzrlib.tests.test_selftest.TestSelftestFiltering.'
2767
            'test_exclude_tests_by_re')
2768
        self.assertEqual(len(self.all_names) - 1,
2769
            filtered_suite.countTestCases())
3302.7.1 by Vincent Ladeuil
Extract _test_ids helper for reuse by other test classes.
2770
        self.assertFalse(excluded_name in _test_ids(filtered_suite))
2921.6.2 by Robert Collins
* New helper method ``bzrlib.tests.exclude_tests_by_re`` which gives a new
2771
        remaining_names = list(self.all_names)
2772
        remaining_names.remove(excluded_name)
3302.7.1 by Vincent Ladeuil
Extract _test_ids helper for reuse by other test classes.
2773
        self.assertEqual(remaining_names, _test_ids(filtered_suite))
2921.6.2 by Robert Collins
* New helper method ``bzrlib.tests.exclude_tests_by_re`` which gives a new
2774
2921.6.7 by Robert Collins
* New helper function ``bzrlib.tests.filter_suite_by_condition`` which
2775
    def test_filter_suite_by_condition(self):
2776
        test_name = ('bzrlib.tests.test_selftest.TestSelftestFiltering.'
2777
            'test_filter_suite_by_condition')
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
2778
        filtered_suite = tests.filter_suite_by_condition(self.suite,
2921.6.7 by Robert Collins
* New helper function ``bzrlib.tests.filter_suite_by_condition`` which
2779
            lambda x:x.id() == test_name)
3302.7.1 by Vincent Ladeuil
Extract _test_ids helper for reuse by other test classes.
2780
        self.assertEqual([test_name], _test_ids(filtered_suite))
2921.6.7 by Robert Collins
* New helper function ``bzrlib.tests.filter_suite_by_condition`` which
2781
2394.2.5 by Ian Clatworthy
list-only working, include test not
2782
    def test_filter_suite_by_re(self):
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
2783
        filtered_suite = tests.filter_suite_by_re(self.suite,
2784
                                                  'test_filter_suite_by_r')
3302.7.1 by Vincent Ladeuil
Extract _test_ids helper for reuse by other test classes.
2785
        filtered_names = _test_ids(filtered_suite)
2394.2.7 by Ian Clatworthy
Added whitebox tests - filter_suite_by_re and sort_suite_by_re
2786
        self.assertEqual(filtered_names, ['bzrlib.tests.test_selftest.'
2787
            'TestSelftestFiltering.test_filter_suite_by_re'])
2921.6.1 by Robert Collins
* New helper method ``bzrlib.tests.split_suite_by_re`` which splits a test
2788
3193.1.2 by Vincent Ladeuil
Add condition_id_in_list and filter_suite_by_id_list capabilities.
2789
    def test_filter_suite_by_id_list(self):
3193.1.11 by Vincent Ladeuil
Relax constraint on test ids, simplify implementation and update tests.
2790
        test_list = ['bzrlib.tests.test_selftest.'
2791
                     'TestSelftestFiltering.test_filter_suite_by_id_list']
3193.1.2 by Vincent Ladeuil
Add condition_id_in_list and filter_suite_by_id_list capabilities.
2792
        filtered_suite = tests.filter_suite_by_id_list(
3193.1.11 by Vincent Ladeuil
Relax constraint on test ids, simplify implementation and update tests.
2793
            self.suite, tests.TestIdList(test_list))
3302.7.1 by Vincent Ladeuil
Extract _test_ids helper for reuse by other test classes.
2794
        filtered_names = _test_ids(filtered_suite)
3193.1.2 by Vincent Ladeuil
Add condition_id_in_list and filter_suite_by_id_list capabilities.
2795
        self.assertEqual(
2796
            filtered_names,
2797
            ['bzrlib.tests.test_selftest.'
2798
             'TestSelftestFiltering.test_filter_suite_by_id_list'])
2799
3302.11.1 by Vincent Ladeuil
Create a new selftest filter allowing loading only one module/class/test.
2800
    def test_filter_suite_by_id_startswith(self):
3302.11.6 by Vincent Ladeuil
Fixed as per Martin and John reviews. Also fix a bug.
2801
        # By design this test may fail if another test is added whose name also
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
2802
        # begins with one of the start value used.
3302.11.1 by Vincent Ladeuil
Create a new selftest filter allowing loading only one module/class/test.
2803
        klass = 'bzrlib.tests.test_selftest.TestSelftestFiltering.'
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
2804
        start1 = klass + 'test_filter_suite_by_id_starts'
2805
        start2 = klass + 'test_filter_suite_by_id_li'
2806
        test_list = [klass + 'test_filter_suite_by_id_list',
2807
                     klass + 'test_filter_suite_by_id_startswith',
2808
                     ]
2809
        filtered_suite = tests.filter_suite_by_id_startswith(
2810
            self.suite, [start1, start2])
3302.11.1 by Vincent Ladeuil
Create a new selftest filter allowing loading only one module/class/test.
2811
        self.assertEqual(
3649.6.4 by Vincent Ladeuil
selftest --starting-with now accepts multiple values.
2812
            test_list,
2813
            _test_ids(filtered_suite),
2814
            )
3302.11.1 by Vincent Ladeuil
Create a new selftest filter allowing loading only one module/class/test.
2815
2921.6.6 by Robert Collins
* The ``exclude_pattern`` and ``random_order`` parameters to the function
2816
    def test_preserve_input(self):
2817
        # NB: Surely this is something in the stdlib to do this?
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
2818
        self.assertTrue(self.suite is tests.preserve_input(self.suite))
2819
        self.assertTrue("@#$" is tests.preserve_input("@#$"))
2921.6.6 by Robert Collins
* The ``exclude_pattern`` and ``random_order`` parameters to the function
2820
3128.1.2 by Vincent Ladeuil
Tweak as per review feedback: s/randomise.*/randomize&/, 0.92 -> 1.0.
2821
    def test_randomize_suite(self):
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
2822
        randomized_suite = tests.randomize_suite(self.suite)
3128.1.2 by Vincent Ladeuil
Tweak as per review feedback: s/randomise.*/randomize&/, 0.92 -> 1.0.
2823
        # randomizing should not add or remove test names.
3302.7.1 by Vincent Ladeuil
Extract _test_ids helper for reuse by other test classes.
2824
        self.assertEqual(set(_test_ids(self.suite)),
2825
                         set(_test_ids(randomized_suite)))
2921.6.3 by Robert Collins
* New helper method ``bzrlib.tests.randomise_suite`` which returns a
2826
        # Technically, this *can* fail, because random.shuffle(list) can be
2827
        # equal to list. Trying multiple times just pushes the frequency back.
2828
        # As its len(self.all_names)!:1, the failure frequency should be low
2829
        # enough to ignore. RBC 20071021.
2830
        # It should change the order.
3302.7.1 by Vincent Ladeuil
Extract _test_ids helper for reuse by other test classes.
2831
        self.assertNotEqual(self.all_names, _test_ids(randomized_suite))
2921.6.3 by Robert Collins
* New helper method ``bzrlib.tests.randomise_suite`` which returns a
2832
        # But not the length. (Possibly redundant with the set test, but not
2833
        # necessarily.)
3302.7.4 by Vincent Ladeuil
Cosmetic change.
2834
        self.assertEqual(len(self.all_names), len(_test_ids(randomized_suite)))
2921.6.3 by Robert Collins
* New helper method ``bzrlib.tests.randomise_suite`` which returns a
2835
3350.5.1 by Robert Collins
* New helper function for splitting test suites ``split_suite_by_condition``.
2836
    def test_split_suit_by_condition(self):
2837
        self.all_names = _test_ids(self.suite)
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
2838
        condition = tests.condition_id_re('test_filter_suite_by_r')
2839
        split_suite = tests.split_suite_by_condition(self.suite, condition)
3350.5.1 by Robert Collins
* New helper function for splitting test suites ``split_suite_by_condition``.
2840
        filtered_name = ('bzrlib.tests.test_selftest.TestSelftestFiltering.'
2841
            'test_filter_suite_by_re')
2842
        self.assertEqual([filtered_name], _test_ids(split_suite[0]))
2843
        self.assertFalse(filtered_name in _test_ids(split_suite[1]))
2844
        remaining_names = list(self.all_names)
2845
        remaining_names.remove(filtered_name)
2846
        self.assertEqual(remaining_names, _test_ids(split_suite[1]))
2847
2921.6.1 by Robert Collins
* New helper method ``bzrlib.tests.split_suite_by_re`` which splits a test
2848
    def test_split_suit_by_re(self):
3302.7.1 by Vincent Ladeuil
Extract _test_ids helper for reuse by other test classes.
2849
        self.all_names = _test_ids(self.suite)
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
2850
        split_suite = tests.split_suite_by_re(self.suite,
2851
                                              'test_filter_suite_by_r')
2921.6.1 by Robert Collins
* New helper method ``bzrlib.tests.split_suite_by_re`` which splits a test
2852
        filtered_name = ('bzrlib.tests.test_selftest.TestSelftestFiltering.'
2853
            'test_filter_suite_by_re')
3302.7.1 by Vincent Ladeuil
Extract _test_ids helper for reuse by other test classes.
2854
        self.assertEqual([filtered_name], _test_ids(split_suite[0]))
2855
        self.assertFalse(filtered_name in _test_ids(split_suite[1]))
2921.6.1 by Robert Collins
* New helper method ``bzrlib.tests.split_suite_by_re`` which splits a test
2856
        remaining_names = list(self.all_names)
2857
        remaining_names.remove(filtered_name)
3302.7.1 by Vincent Ladeuil
Extract _test_ids helper for reuse by other test classes.
2858
        self.assertEqual(remaining_names, _test_ids(split_suite[1]))
2921.6.1 by Robert Collins
* New helper method ``bzrlib.tests.split_suite_by_re`` which splits a test
2859
2545.3.2 by James Westby
Add a test for check_inventory_shape.
2860
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
2861
class TestCheckInventoryShape(tests.TestCaseWithTransport):
2545.3.2 by James Westby
Add a test for check_inventory_shape.
2862
2863
    def test_check_inventory_shape(self):
2561.1.2 by Aaron Bentley
Fix indenting in TestCheckInventoryShape
2864
        files = ['a', 'b/', 'b/c']
2865
        tree = self.make_branch_and_tree('.')
2866
        self.build_tree(files)
2867
        tree.add(files)
2868
        tree.lock_read()
2869
        try:
2870
            self.check_inventory_shape(tree.inventory, files)
2871
        finally:
2872
            tree.unlock()
2830.2.1 by Martin Pool
If TestCase.run_bzr hits an internal exception, don't catch it but rather propagate up into the test suite
2873
2874
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
2875
class TestBlackboxSupport(tests.TestCase):
2830.2.1 by Martin Pool
If TestCase.run_bzr hits an internal exception, don't catch it but rather propagate up into the test suite
2876
    """Tests for testsuite blackbox features."""
2877
2878
    def test_run_bzr_failure_not_caught(self):
2879
        # When we run bzr in blackbox mode, we want any unexpected errors to
2880
        # propagate up to the test suite so that it can show the error in the
2881
        # usual way, and we won't get a double traceback.
2882
        e = self.assertRaises(
2883
            AssertionError,
2884
            self.run_bzr, ['assert-fail'])
2885
        # make sure we got the real thing, not an error from somewhere else in
2886
        # the test framework
2887
        self.assertEquals('always fails', str(e))
2888
        # check that there's no traceback in the test log
4794.1.15 by Robert Collins
Review feedback.
2889
        self.assertNotContainsRe(self.get_log(), r'Traceback')
2830.2.1 by Martin Pool
If TestCase.run_bzr hits an internal exception, don't catch it but rather propagate up into the test suite
2890
2891
    def test_run_bzr_user_error_caught(self):
2892
        # Running bzr in blackbox mode, normal/expected/user errors should be
2893
        # caught in the regular way and turned into an error message plus exit
2894
        # code.
5017.3.45 by Vincent Ladeuil
Move MemoryServer back into bzrlib.transport.memory as it's needed as soon as a MemoryTransport is used. Add a NEWS entry.
2895
        transport_server = memory.MemoryServer()
4934.3.3 by Martin Pool
Rename Server.setUp to Server.start_server
2896
        transport_server.start_server()
4934.3.1 by Martin Pool
Rename Server.tearDown to .stop_server
2897
        self.addCleanup(transport_server.stop_server)
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
2898
        url = transport_server.get_url()
2899
        self.permit_url(url)
2900
        out, err = self.run_bzr(["log", "%s/nonexistantpath" % url], retcode=3)
2830.2.1 by Martin Pool
If TestCase.run_bzr hits an internal exception, don't catch it but rather propagate up into the test suite
2901
        self.assertEqual(out, '')
3146.4.7 by Aaron Bentley
Remove UNIX path assumption
2902
        self.assertContainsRe(err,
2903
            'bzr: ERROR: Not a branch: ".*nonexistantpath/".\n')
2921.6.13 by Robert Collins
* Modules can now customise their tests by defining a ``load_tests``
2904
2905
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
2906
class TestTestLoader(tests.TestCase):
2921.6.13 by Robert Collins
* Modules can now customise their tests by defining a ``load_tests``
2907
    """Tests for the test loader."""
2908
2909
    def _get_loader_and_module(self):
2910
        """Gets a TestLoader and a module with one test in it."""
2911
        loader = TestUtil.TestLoader()
2912
        module = {}
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
2913
        class Stub(tests.TestCase):
2921.6.13 by Robert Collins
* Modules can now customise their tests by defining a ``load_tests``
2914
            def test_foo(self):
2915
                pass
2916
        class MyModule(object):
2917
            pass
2918
        MyModule.a_class = Stub
2919
        module = MyModule()
2920
        return loader, module
2921
2922
    def test_module_no_load_tests_attribute_loads_classes(self):
2923
        loader, module = self._get_loader_and_module()
2924
        self.assertEqual(1, loader.loadTestsFromModule(module).countTestCases())
2925
2926
    def test_module_load_tests_attribute_gets_called(self):
2927
        loader, module = self._get_loader_and_module()
2928
        # 'self' is here because we're faking the module with a class. Regular
2929
        # load_tests do not need that :)
2930
        def load_tests(self, standard_tests, module, loader):
2931
            result = loader.suiteClass()
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
2932
            for test in tests.iter_suite_tests(standard_tests):
2921.6.13 by Robert Collins
* Modules can now customise their tests by defining a ``load_tests``
2933
                result.addTests([test, test])
2934
            return result
2935
        # add a load_tests() method which multiplies the tests from the module.
2936
        module.__class__.load_tests = load_tests
2937
        self.assertEqual(2, loader.loadTestsFromModule(module).countTestCases())
2938
3302.7.3 by Vincent Ladeuil
Prepare TestLoader for specialization.
2939
    def test_load_tests_from_module_name_smoke_test(self):
2940
        loader = TestUtil.TestLoader()
2941
        suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
2942
        self.assertEquals(['bzrlib.tests.test_sampler.DemoTest.test_nothing'],
2943
                          _test_ids(suite))
2944
3302.7.8 by Vincent Ladeuil
Fix typos.
2945
    def test_load_tests_from_module_name_with_bogus_module_name(self):
3302.7.3 by Vincent Ladeuil
Prepare TestLoader for specialization.
2946
        loader = TestUtil.TestLoader()
2947
        self.assertRaises(ImportError, loader.loadTestsFromModuleName, 'bogus')
2948
3193.1.1 by Vincent Ladeuil
Helper to filter test suite building by module when loading a list.
2949
3193.1.11 by Vincent Ladeuil
Relax constraint on test ids, simplify implementation and update tests.
2950
class TestTestIdList(tests.TestCase):
2951
2952
    def _create_id_list(self, test_list):
2953
        return tests.TestIdList(test_list)
2954
2955
    def _create_suite(self, test_id_list):
3193.1.5 by Vincent Ladeuil
Add helper method to get only listed tests from a module test suite.
2956
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
2957
        class Stub(tests.TestCase):
3193.1.5 by Vincent Ladeuil
Add helper method to get only listed tests from a module test suite.
2958
            def test_foo(self):
2959
                pass
2960
2961
        def _create_test_id(id):
2962
            return lambda: id
2963
2964
        suite = TestUtil.TestSuite()
3193.1.11 by Vincent Ladeuil
Relax constraint on test ids, simplify implementation and update tests.
2965
        for id in test_id_list:
3193.1.5 by Vincent Ladeuil
Add helper method to get only listed tests from a module test suite.
2966
            t  = Stub('test_foo')
2967
            t.id = _create_test_id(id)
2968
            suite.addTest(t)
2969
        return suite
2970
2971
    def _test_ids(self, test_suite):
2972
        """Get the ids for the tests in a test suite."""
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
2973
        return [t.id() for t in tests.iter_suite_tests(test_suite)]
3193.1.5 by Vincent Ladeuil
Add helper method to get only listed tests from a module test suite.
2974
3193.1.1 by Vincent Ladeuil
Helper to filter test suite building by module when loading a list.
2975
    def test_empty_list(self):
3193.1.11 by Vincent Ladeuil
Relax constraint on test ids, simplify implementation and update tests.
2976
        id_list = self._create_id_list([])
2977
        self.assertEquals({}, id_list.tests)
2978
        self.assertEquals({}, id_list.modules)
3193.1.1 by Vincent Ladeuil
Helper to filter test suite building by module when loading a list.
2979
2980
    def test_valid_list(self):
3193.1.11 by Vincent Ladeuil
Relax constraint on test ids, simplify implementation and update tests.
2981
        id_list = self._create_id_list(
3193.1.4 by Vincent Ladeuil
Make TestTestIdListFilter aware that a test exists for a module or one of
2982
            ['mod1.cl1.meth1', 'mod1.cl1.meth2',
3193.1.11 by Vincent Ladeuil
Relax constraint on test ids, simplify implementation and update tests.
2983
             'mod1.func1', 'mod1.cl2.meth2',
2984
             'mod1.submod1',
3193.1.4 by Vincent Ladeuil
Make TestTestIdListFilter aware that a test exists for a module or one of
2985
             'mod1.submod2.cl1.meth1', 'mod1.submod2.cl2.meth2',
2986
             ])
3302.8.3 by Vincent Ladeuil
Use better names for TestIdList methods.
2987
        self.assertTrue(id_list.refers_to('mod1'))
2988
        self.assertTrue(id_list.refers_to('mod1.submod1'))
2989
        self.assertTrue(id_list.refers_to('mod1.submod2'))
2990
        self.assertTrue(id_list.includes('mod1.cl1.meth1'))
2991
        self.assertTrue(id_list.includes('mod1.submod1'))
2992
        self.assertTrue(id_list.includes('mod1.func1'))
3193.1.1 by Vincent Ladeuil
Helper to filter test suite building by module when loading a list.
2993
2994
    def test_bad_chars_in_params(self):
3193.1.11 by Vincent Ladeuil
Relax constraint on test ids, simplify implementation and update tests.
2995
        id_list = self._create_id_list(['mod1.cl1.meth1(xx.yy)'])
3302.8.3 by Vincent Ladeuil
Use better names for TestIdList methods.
2996
        self.assertTrue(id_list.refers_to('mod1'))
2997
        self.assertTrue(id_list.includes('mod1.cl1.meth1(xx.yy)'))
3193.1.4 by Vincent Ladeuil
Make TestTestIdListFilter aware that a test exists for a module or one of
2998
2999
    def test_module_used(self):
3193.1.11 by Vincent Ladeuil
Relax constraint on test ids, simplify implementation and update tests.
3000
        id_list = self._create_id_list(['mod.class.meth'])
3302.8.3 by Vincent Ladeuil
Use better names for TestIdList methods.
3001
        self.assertTrue(id_list.refers_to('mod'))
3002
        self.assertTrue(id_list.refers_to('mod.class'))
3003
        self.assertTrue(id_list.refers_to('mod.class.meth'))
3193.1.6 by Vincent Ladeuil
Filter the whole test suite.
3004
3302.3.1 by Vincent Ladeuil
Help identify duplicates IDs in test suite and missing tests in id
3005
    def test_test_suite_matches_id_list_with_unknown(self):
3006
        loader = TestUtil.TestLoader()
3302.7.6 by Vincent Ladeuil
Catch up with loadTestsFromModuleName use.
3007
        suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
3302.3.1 by Vincent Ladeuil
Help identify duplicates IDs in test suite and missing tests in id
3008
        test_list = ['bzrlib.tests.test_sampler.DemoTest.test_nothing',
3009
                     'bogus']
3010
        not_found, duplicates = tests.suite_matches_id_list(suite, test_list)
3011
        self.assertEquals(['bogus'], not_found)
3012
        self.assertEquals([], duplicates)
3013
3014
    def test_suite_matches_id_list_with_duplicates(self):
3015
        loader = TestUtil.TestLoader()
3302.7.6 by Vincent Ladeuil
Catch up with loadTestsFromModuleName use.
3016
        suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
3302.3.1 by Vincent Ladeuil
Help identify duplicates IDs in test suite and missing tests in id
3017
        dupes = loader.suiteClass()
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
3018
        for test in tests.iter_suite_tests(suite):
3302.3.1 by Vincent Ladeuil
Help identify duplicates IDs in test suite and missing tests in id
3019
            dupes.addTest(test)
3020
            dupes.addTest(test) # Add it again
3021
3022
        test_list = ['bzrlib.tests.test_sampler.DemoTest.test_nothing',]
3023
        not_found, duplicates = tests.suite_matches_id_list(
3024
            dupes, test_list)
3025
        self.assertEquals([], not_found)
3026
        self.assertEquals(['bzrlib.tests.test_sampler.DemoTest.test_nothing'],
3027
                          duplicates)
3028
3193.1.7 by Vincent Ladeuil
Load test id list from a text file.
3029
4498.1.2 by Vincent Ladeuil
Fix selftest -s xxx --load yyy usage.
3030
class TestTestSuite(tests.TestCase):
3031
4650.1.1 by Robert Collins
Refactor test_suite to make stubbing out the list of tests to load possible without sacrificing coverage.
3032
    def test__test_suite_testmod_names(self):
3033
        # Test that a plausible list of test module names are returned
3034
        # by _test_suite_testmod_names.
3035
        test_list = tests._test_suite_testmod_names()
3036
        self.assertSubset([
3037
            'bzrlib.tests.blackbox',
3038
            'bzrlib.tests.per_transport',
3039
            'bzrlib.tests.test_selftest',
3040
            ],
3041
            test_list)
3042
3043
    def test__test_suite_modules_to_doctest(self):
3044
        # Test that a plausible list of modules to doctest is returned
3045
        # by _test_suite_modules_to_doctest.
3046
        test_list = tests._test_suite_modules_to_doctest()
5131.2.6 by Martin
Fix more tests which were failing under -OO that had been missed earlier
3047
        if __doc__ is None:
3048
            # When docstrings are stripped, there are no modules to doctest
3049
            self.assertEqual([], test_list)
3050
            return
4650.1.1 by Robert Collins
Refactor test_suite to make stubbing out the list of tests to load possible without sacrificing coverage.
3051
        self.assertSubset([
3052
            'bzrlib.timestamp',
3053
            ],
3054
            test_list)
3055
4498.1.2 by Vincent Ladeuil
Fix selftest -s xxx --load yyy usage.
3056
    def test_test_suite(self):
4650.1.1 by Robert Collins
Refactor test_suite to make stubbing out the list of tests to load possible without sacrificing coverage.
3057
        # test_suite() loads the entire test suite to operate. To avoid this
3058
        # overhead, and yet still be confident that things are happening,
3059
        # we temporarily replace two functions used by test_suite with 
3060
        # test doubles that supply a few sample tests to load, and check they
3061
        # are loaded.
3062
        calls = []
4985.1.5 by Vincent Ladeuil
Deploying the new overrideAttr facility further reduces the complexity
3063
        def testmod_names():
4650.1.1 by Robert Collins
Refactor test_suite to make stubbing out the list of tests to load possible without sacrificing coverage.
3064
            calls.append("testmod_names")
3065
            return [
3066
                'bzrlib.tests.blackbox.test_branch',
3067
                'bzrlib.tests.per_transport',
3068
                'bzrlib.tests.test_selftest',
3069
                ]
4985.1.5 by Vincent Ladeuil
Deploying the new overrideAttr facility further reduces the complexity
3070
        self.overrideAttr(tests, '_test_suite_testmod_names', testmod_names)
3071
        def doctests():
4650.1.1 by Robert Collins
Refactor test_suite to make stubbing out the list of tests to load possible without sacrificing coverage.
3072
            calls.append("modules_to_doctest")
5131.2.6 by Martin
Fix more tests which were failing under -OO that had been missed earlier
3073
            if __doc__ is None:
3074
                return []
4650.1.1 by Robert Collins
Refactor test_suite to make stubbing out the list of tests to load possible without sacrificing coverage.
3075
            return ['bzrlib.timestamp']
4985.1.5 by Vincent Ladeuil
Deploying the new overrideAttr facility further reduces the complexity
3076
        self.overrideAttr(tests, '_test_suite_modules_to_doctest', doctests)
4650.1.1 by Robert Collins
Refactor test_suite to make stubbing out the list of tests to load possible without sacrificing coverage.
3077
        expected_test_list = [
4498.1.2 by Vincent Ladeuil
Fix selftest -s xxx --load yyy usage.
3078
            # testmod_names
3079
            'bzrlib.tests.blackbox.test_branch.TestBranch.test_branch',
4523.1.5 by Vincent Ladeuil
Fixed as asked in review.
3080
            ('bzrlib.tests.per_transport.TransportTests'
4725.1.1 by Vincent Ladeuil
Mention transport class name in test id.
3081
             '.test_abspath(LocalTransport,LocalURLServer)'),
4498.1.2 by Vincent Ladeuil
Fix selftest -s xxx --load yyy usage.
3082
            'bzrlib.tests.test_selftest.TestTestSuite.test_test_suite',
3083
            # plugins can't be tested that way since selftest may be run with
3084
            # --no-plugins
3085
            ]
5131.2.6 by Martin
Fix more tests which were failing under -OO that had been missed earlier
3086
        if __doc__ is not None:
3087
            expected_test_list.extend([
3088
                # modules_to_doctest
3089
                'bzrlib.timestamp.format_highres_date',
3090
                ])
4650.1.1 by Robert Collins
Refactor test_suite to make stubbing out the list of tests to load possible without sacrificing coverage.
3091
        suite = tests.test_suite()
3092
        self.assertEqual(set(["testmod_names", "modules_to_doctest"]),
3093
            set(calls))
3094
        self.assertSubset(expected_test_list, _test_ids(suite))
4498.1.2 by Vincent Ladeuil
Fix selftest -s xxx --load yyy usage.
3095
3096
    def test_test_suite_list_and_start(self):
4636.2.5 by Robert Collins
Minor tweaks to clarity in slower selftest tests.
3097
        # We cannot test this at the same time as the main load, because we want
4650.1.1 by Robert Collins
Refactor test_suite to make stubbing out the list of tests to load possible without sacrificing coverage.
3098
        # to know that starting_with == None works. So a second load is
3099
        # incurred - note that the starting_with parameter causes a partial load
3100
        # rather than a full load so this test should be pretty quick.
4498.1.2 by Vincent Ladeuil
Fix selftest -s xxx --load yyy usage.
3101
        test_list = ['bzrlib.tests.test_selftest.TestTestSuite.test_test_suite']
3102
        suite = tests.test_suite(test_list,
3103
                                 ['bzrlib.tests.test_selftest.TestTestSuite'])
3104
        # test_test_suite_list_and_start is not included 
3105
        self.assertEquals(test_list, _test_ids(suite))
3106
3107
3193.1.7 by Vincent Ladeuil
Load test id list from a text file.
3108
class TestLoadTestIdList(tests.TestCaseInTempDir):
3109
3110
    def _create_test_list_file(self, file_name, content):
3111
        fl = open(file_name, 'wt')
3112
        fl.write(content)
3113
        fl.close()
3114
3115
    def test_load_unknown(self):
3116
        self.assertRaises(errors.NoSuchFile,
3117
                          tests.load_test_id_list, 'i_do_not_exist')
3118
3119
    def test_load_test_list(self):
3120
        test_list_fname = 'test.list'
3121
        self._create_test_list_file(test_list_fname,
3122
                                    'mod1.cl1.meth1\nmod2.cl2.meth2\n')
3123
        tlist = tests.load_test_id_list(test_list_fname)
3124
        self.assertEquals(2, len(tlist))
3125
        self.assertEquals('mod1.cl1.meth1', tlist[0])
3126
        self.assertEquals('mod2.cl2.meth2', tlist[1])
3127
3128
    def test_load_dirty_file(self):
3129
        test_list_fname = 'test.list'
3130
        self._create_test_list_file(test_list_fname,
3131
                                    '  mod1.cl1.meth1\n\nmod2.cl2.meth2  \n'
3132
                                    'bar baz\n')
3133
        tlist = tests.load_test_id_list(test_list_fname)
3134
        self.assertEquals(4, len(tlist))
3135
        self.assertEquals('mod1.cl1.meth1', tlist[0])
3136
        self.assertEquals('', tlist[1])
3137
        self.assertEquals('mod2.cl2.meth2', tlist[2])
3138
        self.assertEquals('bar baz', tlist[3])
3139
3140
3302.8.2 by Vincent Ladeuil
New test loader reducing modules imports and tests loaded.
3141
class TestFilteredByModuleTestLoader(tests.TestCase):
3142
3143
    def _create_loader(self, test_list):
3144
        id_filter = tests.TestIdList(test_list)
3302.8.4 by Vincent Ladeuil
Cosmetic changes.
3145
        loader = TestUtil.FilteredByModuleTestLoader(id_filter.refers_to)
3302.8.2 by Vincent Ladeuil
New test loader reducing modules imports and tests loaded.
3146
        return loader
3147
3148
    def test_load_tests(self):
3149
        test_list = ['bzrlib.tests.test_sampler.DemoTest.test_nothing']
3150
        loader = self._create_loader(test_list)
3151
        suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
3152
        self.assertEquals(test_list, _test_ids(suite))
3153
3154
    def test_exclude_tests(self):
3155
        test_list = ['bogus']
3156
        loader = self._create_loader(test_list)
3157
        suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
3158
        self.assertEquals([], _test_ids(suite))
3302.11.1 by Vincent Ladeuil
Create a new selftest filter allowing loading only one module/class/test.
3159
3160
3161
class TestFilteredByNameStartTestLoader(tests.TestCase):
3162
3163
    def _create_loader(self, name_start):
3302.11.6 by Vincent Ladeuil
Fixed as per Martin and John reviews. Also fix a bug.
3164
        def needs_module(name):
3165
            return name.startswith(name_start) or name_start.startswith(name)
3166
        loader = TestUtil.FilteredByModuleTestLoader(needs_module)
3302.11.1 by Vincent Ladeuil
Create a new selftest filter allowing loading only one module/class/test.
3167
        return loader
3168
3169
    def test_load_tests(self):
3170
        test_list = ['bzrlib.tests.test_sampler.DemoTest.test_nothing']
3302.11.6 by Vincent Ladeuil
Fixed as per Martin and John reviews. Also fix a bug.
3171
        loader = self._create_loader('bzrlib.tests.test_samp')
3172
3173
        suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
3174
        self.assertEquals(test_list, _test_ids(suite))
3175
3176
    def test_load_tests_inside_module(self):
3177
        test_list = ['bzrlib.tests.test_sampler.DemoTest.test_nothing']
3178
        loader = self._create_loader('bzrlib.tests.test_sampler.Demo')
3302.11.1 by Vincent Ladeuil
Create a new selftest filter allowing loading only one module/class/test.
3179
3180
        suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
3181
        self.assertEquals(test_list, _test_ids(suite))
3182
3183
    def test_exclude_tests(self):
3184
        test_list = ['bogus']
3185
        loader = self._create_loader('bogus')
3186
3187
        suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
3188
        self.assertEquals([], _test_ids(suite))
3649.6.2 by Vincent Ladeuil
Replace aliases in selftest --starting-with option.
3189
3190
3191
class TestTestPrefixRegistry(tests.TestCase):
3192
3193
    def _get_registry(self):
3194
        tp_registry = tests.TestPrefixAliasRegistry()
3195
        return tp_registry
3196
3197
    def test_register_new_prefix(self):
3198
        tpr = self._get_registry()
3199
        tpr.register('foo', 'fff.ooo.ooo')
3200
        self.assertEquals('fff.ooo.ooo', tpr.get('foo'))
3201
3202
    def test_register_existing_prefix(self):
3203
        tpr = self._get_registry()
3204
        tpr.register('bar', 'bbb.aaa.rrr')
3205
        tpr.register('bar', 'bBB.aAA.rRR')
3206
        self.assertEquals('bbb.aaa.rrr', tpr.get('bar'))
4794.1.15 by Robert Collins
Review feedback.
3207
        self.assertThat(self.get_log(),
4794.1.7 by Robert Collins
Remove references to _get_log from test_selftest.
3208
            DocTestMatches("...bar...bbb.aaa.rrr...BB.aAA.rRR", ELLIPSIS))
3649.6.2 by Vincent Ladeuil
Replace aliases in selftest --starting-with option.
3209
3210
    def test_get_unknown_prefix(self):
3211
        tpr = self._get_registry()
3212
        self.assertRaises(KeyError, tpr.get, 'I am not a prefix')
3213
3214
    def test_resolve_prefix(self):
3215
        tpr = self._get_registry()
3216
        tpr.register('bar', 'bb.aa.rr')
3217
        self.assertEquals('bb.aa.rr', tpr.resolve_alias('bar'))
3218
3219
    def test_resolve_unknown_alias(self):
3220
        tpr = self._get_registry()
3221
        self.assertRaises(errors.BzrCommandError,
3222
                          tpr.resolve_alias, 'I am not a prefix')
3223
3224
    def test_predefined_prefixes(self):
3225
        tpr = tests.test_prefix_alias_registry
3226
        self.assertEquals('bzrlib', tpr.resolve_alias('bzrlib'))
3227
        self.assertEquals('bzrlib.doc', tpr.resolve_alias('bd'))
3228
        self.assertEquals('bzrlib.utils', tpr.resolve_alias('bu'))
3229
        self.assertEquals('bzrlib.tests', tpr.resolve_alias('bt'))
3230
        self.assertEquals('bzrlib.tests.blackbox', tpr.resolve_alias('bb'))
3231
        self.assertEquals('bzrlib.plugins', tpr.resolve_alias('bp'))
4000.2.1 by Robert Collins
Add library level support for different test runners to bzrlib.
3232
3233
5412.1.3 by Martin
Add tests for test case thread leak detection
3234
class TestThreadLeakDetection(tests.TestCase):
3235
    """Ensure when tests leak threads we detect and report it"""
3236
3237
    class LeakRecordingResult(tests.ExtendedTestResult):
3238
        def __init__(self):
3239
            tests.ExtendedTestResult.__init__(self, StringIO(), 0, 1)
3240
            self.leaks = []
3241
        def _report_thread_leak(self, test, leaks, alive):
3242
            self.leaks.append((test, leaks))
3243
3244
    def test_testcase_without_addCleanups(self):
5412.1.6 by Martin
Document the less obvious code and note future reporting plans, as requested in review by vila
3245
        """Check old TestCase instances don't break with leak detection"""
5412.1.3 by Martin
Add tests for test case thread leak detection
3246
        class Test(unittest.TestCase):
3247
            def runTest(self):
3248
                pass
3249
            addCleanup = None # for when on Python 2.7 with native addCleanup
3250
        result = self.LeakRecordingResult()
3251
        test = Test()
3252
        self.assertIs(getattr(test, "addCleanup", None), None)
3253
        result.startTestRun()
3254
        test.run(result)
3255
        result.stopTestRun()
3256
        self.assertEqual(result._tests_leaking_threads_count, 0)
3257
        self.assertEqual(result.leaks, [])
3258
        
3259
    def test_thread_leak(self):
5412.1.6 by Martin
Document the less obvious code and note future reporting plans, as requested in review by vila
3260
        """Ensure a thread that outlives the running of a test is reported
3261
3262
        Uses a thread that blocks on an event, and is started by the inner
3263
        test case. As the thread outlives the inner case's run, it should be
3264
        detected as a leak, but the event is then set so that the thread can
3265
        be safely joined in cleanup so it's not leaked for real.
3266
        """
5412.1.3 by Martin
Add tests for test case thread leak detection
3267
        event = threading.Event()
3268
        thread = threading.Thread(name="Leaker", target=event.wait)
3269
        class Test(tests.TestCase):
3270
            def test_leak(self):
3271
                thread.start()
3272
        result = self.LeakRecordingResult()
3273
        test = Test("test_leak")
3274
        self.addCleanup(thread.join)
3275
        self.addCleanup(event.set)
3276
        result.startTestRun()
3277
        test.run(result)
3278
        result.stopTestRun()
3279
        self.assertEqual(result._tests_leaking_threads_count, 1)
3280
        self.assertEqual(result._first_thread_leaker_id, test.id())
3281
        self.assertEqual(result.leaks, [(test, set([thread]))])
3282
        self.assertContainsString(result.stream.getvalue(), "leaking threads")
3283
3284
    def test_multiple_leaks(self):
5412.1.6 by Martin
Document the less obvious code and note future reporting plans, as requested in review by vila
3285
        """Check multiple leaks are blamed on the test cases at fault
3286
3287
        Same concept as the previous test, but has one inner test method that
3288
        leaks two threads, and one that doesn't leak at all.
3289
        """
5412.1.3 by Martin
Add tests for test case thread leak detection
3290
        event = threading.Event()
3291
        thread_a = threading.Thread(name="LeakerA", target=event.wait)
3292
        thread_b = threading.Thread(name="LeakerB", target=event.wait)
3293
        thread_c = threading.Thread(name="LeakerC", target=event.wait)
3294
        class Test(tests.TestCase):
3295
            def test_first_leak(self):
3296
                thread_b.start()
3297
            def test_second_no_leak(self):
3298
                pass
3299
            def test_third_leak(self):
3300
                thread_c.start()
3301
                thread_a.start()
3302
        result = self.LeakRecordingResult()
3303
        first_test = Test("test_first_leak")
3304
        third_test = Test("test_third_leak")
3305
        self.addCleanup(thread_a.join)
3306
        self.addCleanup(thread_b.join)
3307
        self.addCleanup(thread_c.join)
3308
        self.addCleanup(event.set)
3309
        result.startTestRun()
3310
        unittest.TestSuite(
3311
            [first_test, Test("test_second_no_leak"), third_test]
3312
            ).run(result)
3313
        result.stopTestRun()
3314
        self.assertEqual(result._tests_leaking_threads_count, 2)
3315
        self.assertEqual(result._first_thread_leaker_id, first_test.id())
3316
        self.assertEqual(result.leaks, [
3317
            (first_test, set([thread_b])),
3318
            (third_test, set([thread_a, thread_c]))])
3319
        self.assertContainsString(result.stream.getvalue(), "leaking threads")
3320
3321
5459.5.1 by Martin
Add tests for location of stack when ExtendedTestResult.post_mortem is run
3322
class TestPostMortemDebugging(tests.TestCase):
3323
    """Check post mortem debugging works when tests fail or error"""
3324
3325
    class TracebackRecordingResult(tests.ExtendedTestResult):
3326
        def __init__(self):
3327
            tests.ExtendedTestResult.__init__(self, StringIO(), 0, 1)
3328
            self.postcode = None
5459.5.2 by Martin
Add handler to record the traceback from testtools cases to get BZR_TEST_PDB working again
3329
        def _post_mortem(self, tb=None):
5459.5.1 by Martin
Add tests for location of stack when ExtendedTestResult.post_mortem is run
3330
            """Record the code object at the end of the current traceback"""
5459.5.2 by Martin
Add handler to record the traceback from testtools cases to get BZR_TEST_PDB working again
3331
            tb = tb or sys.exc_info()[2]
5459.5.1 by Martin
Add tests for location of stack when ExtendedTestResult.post_mortem is run
3332
            if tb is not None:
3333
                next = tb.tb_next
3334
                while next is not None:
3335
                    tb = next
3336
                    next = next.tb_next
3337
                self.postcode = tb.tb_frame.f_code
3338
        def report_error(self, test, err):
3339
            pass
3340
        def report_failure(self, test, err):
3341
            pass
3342
3343
    def test_location_unittest_error(self):
3344
        """Needs right post mortem traceback with erroring unittest case"""
3345
        class Test(unittest.TestCase):
3346
            def runTest(self):
3347
                raise RuntimeError
3348
        result = self.TracebackRecordingResult()
3349
        Test().run(result)
3350
        self.assertEqual(result.postcode, Test.runTest.func_code)
3351
3352
    def test_location_unittest_failure(self):
3353
        """Needs right post mortem traceback with failing unittest case"""
3354
        class Test(unittest.TestCase):
3355
            def runTest(self):
3356
                raise self.failureException
3357
        result = self.TracebackRecordingResult()
3358
        Test().run(result)
3359
        self.assertEqual(result.postcode, Test.runTest.func_code)
3360
3361
    def test_location_bt_error(self):
3362
        """Needs right post mortem traceback with erroring bzrlib.tests case"""
3363
        class Test(tests.TestCase):
3364
            def test_error(self):
3365
                raise RuntimeError
3366
        result = self.TracebackRecordingResult()
3367
        Test("test_error").run(result)
3368
        self.assertEqual(result.postcode, Test.test_error.func_code)
3369
3370
    def test_location_bt_failure(self):
3371
        """Needs right post mortem traceback with failing bzrlib.tests case"""
3372
        class Test(tests.TestCase):
3373
            def test_failure(self):
3374
                raise self.failureException
3375
        result = self.TracebackRecordingResult()
3376
        Test("test_failure").run(result)
3377
        self.assertEqual(result.postcode, Test.test_failure.func_code)
3378
5459.5.3 by Martin
Add test for triggering of pdb.post_mortem with BZR_TEST_PDB
3379
    def test_env_var_triggers_post_mortem(self):
3380
        """Check pdb.post_mortem is called iff BZR_TEST_PDB is set"""
3381
        import pdb
3382
        result = tests.ExtendedTestResult(StringIO(), 0, 1)
3383
        post_mortem_calls = []
3384
        self.overrideAttr(pdb, "post_mortem", post_mortem_calls.append)
3385
        self.addCleanup(osutils.set_or_unset_env, "BZR_TEST_PDB",
3386
            osutils.set_or_unset_env("BZR_TEST_PDB", None))
3387
        result._post_mortem(1)
3388
        os.environ["BZR_TEST_PDB"] = "on"
3389
        result._post_mortem(2)
3390
        self.assertEqual([2], post_mortem_calls)
3391
5459.5.1 by Martin
Add tests for location of stack when ExtendedTestResult.post_mortem is run
3392
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
3393
class TestRunSuite(tests.TestCase):
4000.2.1 by Robert Collins
Add library level support for different test runners to bzrlib.
3394
3395
    def test_runner_class(self):
3396
        """run_suite accepts and uses a runner_class keyword argument."""
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
3397
        class Stub(tests.TestCase):
4000.2.1 by Robert Collins
Add library level support for different test runners to bzrlib.
3398
            def test_foo(self):
3399
                pass
3400
        suite = Stub("test_foo")
3401
        calls = []
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
3402
        class MyRunner(tests.TextTestRunner):
4000.2.1 by Robert Collins
Add library level support for different test runners to bzrlib.
3403
            def run(self, test):
3404
                calls.append(test)
4498.1.1 by Vincent Ladeuil
Fix test_selftest.py imports.
3405
                return tests.ExtendedTestResult(self.stream, self.descriptions,
3406
                                                self.verbosity)
3407
        tests.run_suite(suite, runner_class=MyRunner, stream=StringIO())
4573.2.2 by Robert Collins
Fix selftest for TestResult progress changes.
3408
        self.assertLength(1, calls)