/brz/remove-bazaar

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