~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_selftest.py

  • Committer: Vincent Ladeuil
  • Date: 2009-06-22 12:52:39 UTC
  • mto: (4471.1.1 integration)
  • mto: This revision was merged to the branch mainline in revision 4472.
  • Revision ID: v.ladeuil+lp@free.fr-20090622125239-kabo9smxt9c3vnir
Use a consistent scheme for naming pyrex source files.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006, 2007 Canonical Ltd
 
1
# Copyright (C) 2005, 2006, 2007, 2008, 2009 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
12
12
#
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
17
17
"""Tests for the test framework."""
18
18
 
26
26
 
27
27
import bzrlib
28
28
from bzrlib import (
 
29
    branchbuilder,
29
30
    bzrdir,
 
31
    debug,
30
32
    errors,
 
33
    lockdir,
31
34
    memorytree,
32
35
    osutils,
 
36
    remote,
33
37
    repository,
34
38
    symbol_versioning,
35
39
    tests,
 
40
    workingtree,
36
41
    )
37
42
from bzrlib.progress import _BaseProgressBar
38
 
from bzrlib.repofmt import weaverepo
 
43
from bzrlib.repofmt import (
 
44
    pack_repo,
 
45
    weaverepo,
 
46
    )
39
47
from bzrlib.symbol_versioning import (
40
 
    one_zero,
41
 
    zero_eleven,
42
 
    zero_ten,
 
48
    deprecated_function,
 
49
    deprecated_in,
 
50
    deprecated_method,
43
51
    )
44
52
from bzrlib.tests import (
45
53
                          ChrootedTestCase,
65
73
                          iter_suite_tests,
66
74
                          preserve_input,
67
75
                          randomize_suite,
 
76
                          run_suite,
68
77
                          split_suite_by_condition,
69
78
                          split_suite_by_re,
70
79
                          test_lsprof,
103
112
                              'a test message\n')
104
113
 
105
114
 
 
115
class TestUnicodeFilename(TestCase):
 
116
 
 
117
    def test_probe_passes(self):
 
118
        """UnicodeFilename._probe passes."""
 
119
        # We can't test much more than that because the behaviour depends
 
120
        # on the platform.
 
121
        tests.UnicodeFilename._probe()
 
122
 
 
123
 
106
124
class TestTreeShape(TestCaseInTempDir):
107
125
 
108
126
    def test_unicode_paths(self):
 
127
        self.requireFeature(tests.UnicodeFilename)
 
128
 
109
129
        filename = u'hell\u00d8'
110
 
        try:
111
 
            self.build_tree_contents([(filename, 'contents of hello')])
112
 
        except UnicodeEncodeError:
113
 
            raise TestSkipped("can't build unicode working tree in "
114
 
                "filesystem encoding %s" % sys.getfilesystemencoding())
 
130
        self.build_tree_contents([(filename, 'contents of hello')])
115
131
        self.failUnlessExists(filename)
116
132
 
117
133
 
118
 
class TestTransportProviderAdapter(TestCase):
 
134
class TestTransportScenarios(TestCase):
119
135
    """A group of tests that test the transport implementation adaption core.
120
136
 
121
 
    This is a meta test that the tests are applied to all available 
 
137
    This is a meta test that the tests are applied to all available
122
138
    transports.
123
139
 
124
 
    This will be generalised in the future which is why it is in this 
 
140
    This will be generalised in the future which is why it is in this
125
141
    test file even though it is specific to transport tests at the moment.
126
142
    """
127
143
 
128
144
    def test_get_transport_permutations(self):
129
 
        # this checks that we the module get_test_permutations call
130
 
        # is made by the adapter get_transport_test_permitations method.
 
145
        # this checks that get_test_permutations defined by the module is
 
146
        # called by the get_transport_test_permutations function.
131
147
        class MockModule(object):
132
148
            def get_test_permutations(self):
133
149
                return sample_permutation
134
150
        sample_permutation = [(1,2), (3,4)]
135
151
        from bzrlib.tests.test_transport_implementations \
136
 
            import TransportTestProviderAdapter
137
 
        adapter = TransportTestProviderAdapter()
 
152
            import get_transport_test_permutations
138
153
        self.assertEqual(sample_permutation,
139
 
                         adapter.get_transport_test_permutations(MockModule()))
 
154
                         get_transport_test_permutations(MockModule()))
140
155
 
141
 
    def test_adapter_checks_all_modules(self):
142
 
        # this checks that the adapter returns as many permurtations as
143
 
        # there are in all the registered# transport modules for there
144
 
        # - we assume if this matches its probably doing the right thing
145
 
        # especially in combination with the tests for setting the right
146
 
        # classes below.
 
156
    def test_scenarios_invlude_all_modules(self):
 
157
        # this checks that the scenario generator returns as many permutations
 
158
        # as there are in all the registered transport modules - we assume if
 
159
        # this matches its probably doing the right thing especially in
 
160
        # combination with the tests for setting the right classes below.
147
161
        from bzrlib.tests.test_transport_implementations \
148
 
            import TransportTestProviderAdapter
 
162
            import transport_test_permutations
149
163
        from bzrlib.transport import _get_transport_modules
150
164
        modules = _get_transport_modules()
151
165
        permutation_count = 0
152
166
        for module in modules:
153
167
            try:
154
 
                permutation_count += len(reduce(getattr, 
 
168
                permutation_count += len(reduce(getattr,
155
169
                    (module + ".get_test_permutations").split('.')[1:],
156
170
                     __import__(module))())
157
171
            except errors.DependencyNotPresent:
158
172
                pass
159
 
        input_test = TestTransportProviderAdapter(
160
 
            "test_adapter_sets_transport_class")
161
 
        adapter = TransportTestProviderAdapter()
162
 
        self.assertEqual(permutation_count,
163
 
                         len(list(iter(adapter.adapt(input_test)))))
 
173
        scenarios = transport_test_permutations()
 
174
        self.assertEqual(permutation_count, len(scenarios))
164
175
 
165
 
    def test_adapter_sets_transport_class(self):
166
 
        # Check that the test adapter inserts a transport and server into the
167
 
        # generated test.
168
 
        #
 
176
    def test_scenarios_include_transport_class(self):
169
177
        # This test used to know about all the possible transports and the
170
178
        # order they were returned but that seems overly brittle (mbp
171
179
        # 20060307)
172
180
        from bzrlib.tests.test_transport_implementations \
173
 
            import TransportTestProviderAdapter
174
 
        scenarios = TransportTestProviderAdapter().scenarios
 
181
            import transport_test_permutations
 
182
        scenarios = transport_test_permutations()
175
183
        # there are at least that many builtin transports
176
184
        self.assertTrue(len(scenarios) > 6)
177
185
        one_scenario = scenarios[0]
182
190
                                   bzrlib.transport.Server))
183
191
 
184
192
 
185
 
class TestBranchProviderAdapter(TestCase):
186
 
    """A group of tests that test the branch implementation test adapter."""
 
193
class TestBranchScenarios(TestCase):
187
194
 
188
 
    def test_constructor(self):
 
195
    def test_scenarios(self):
189
196
        # check that constructor parameters are passed through to the adapted
190
197
        # test.
191
 
        from bzrlib.tests.branch_implementations import BranchTestProviderAdapter
 
198
        from bzrlib.tests.branch_implementations import make_scenarios
192
199
        server1 = "a"
193
200
        server2 = "b"
194
201
        formats = [("c", "C"), ("d", "D")]
195
 
        adapter = BranchTestProviderAdapter(server1, server2, formats)
196
 
        self.assertEqual(2, len(adapter.scenarios))
 
202
        scenarios = make_scenarios(server1, server2, formats)
 
203
        self.assertEqual(2, len(scenarios))
197
204
        self.assertEqual([
198
205
            ('str',
199
206
             {'branch_format': 'c',
205
212
              'bzrdir_format': 'D',
206
213
              'transport_readonly_server': 'b',
207
214
              'transport_server': 'a'})],
208
 
            adapter.scenarios)
209
 
 
210
 
 
211
 
class TestBzrDirProviderAdapter(TestCase):
212
 
    """A group of tests that test the bzr dir implementation test adapter."""
213
 
 
214
 
    def test_adapted_tests(self):
 
215
            scenarios)
 
216
 
 
217
 
 
218
class TestBzrDirScenarios(TestCase):
 
219
 
 
220
    def test_scenarios(self):
215
221
        # check that constructor parameters are passed through to the adapted
216
222
        # test.
217
 
        from bzrlib.tests.bzrdir_implementations import BzrDirTestProviderAdapter
 
223
        from bzrlib.tests.bzrdir_implementations import make_scenarios
218
224
        vfs_factory = "v"
219
225
        server1 = "a"
220
226
        server2 = "b"
221
227
        formats = ["c", "d"]
222
 
        adapter = BzrDirTestProviderAdapter(vfs_factory,
223
 
            server1, server2, formats)
 
228
        scenarios = make_scenarios(vfs_factory, server1, server2, formats)
224
229
        self.assertEqual([
225
230
            ('str',
226
231
             {'bzrdir_format': 'c',
232
237
              'transport_readonly_server': 'b',
233
238
              'transport_server': 'a',
234
239
              'vfs_transport_factory': 'v'})],
235
 
            adapter.scenarios)
236
 
 
237
 
 
238
 
class TestRepositoryProviderAdapter(TestCase):
239
 
    """A group of tests that test the repository implementation test adapter."""
240
 
 
241
 
    def test_constructor(self):
242
 
        # check that constructor parameters are passed through to the
243
 
        # scenarios.
244
 
        from bzrlib.tests.repository_implementations import RepositoryTestProviderAdapter
245
 
        server1 = "a"
246
 
        server2 = "b"
247
 
        formats = [("c", "C"), ("d", "D")]
248
 
        adapter = RepositoryTestProviderAdapter(server1, server2, formats)
249
 
        self.assertEqual([
250
 
            ('str',
251
 
             {'bzrdir_format': 'C',
252
 
              'repository_format': 'c',
253
 
              'transport_readonly_server': 'b',
254
 
              'transport_server': 'a'}),
255
 
            ('str',
256
 
             {'bzrdir_format': 'D',
257
 
              'repository_format': 'd',
258
 
              'transport_readonly_server': 'b',
259
 
              'transport_server': 'a'})],
260
 
            adapter.scenarios)
261
 
 
262
 
    def test_setting_vfs_transport(self):
263
 
        """The vfs_transport_factory can be set optionally."""
264
 
        from bzrlib.tests.repository_implementations import RepositoryTestProviderAdapter
265
 
        formats = [("a", "b"), ("c", "d")]
266
 
        adapter = RepositoryTestProviderAdapter(None, None, formats,
 
240
            scenarios)
 
241
 
 
242
 
 
243
class TestRepositoryScenarios(TestCase):
 
244
 
 
245
    def test_formats_to_scenarios(self):
 
246
        from bzrlib.tests.per_repository import formats_to_scenarios
 
247
        formats = [("(c)", remote.RemoteRepositoryFormat()),
 
248
                   ("(d)", repository.format_registry.get(
 
249
                        'Bazaar pack repository format 1 (needs bzr 0.92)\n'))]
 
250
        no_vfs_scenarios = formats_to_scenarios(formats, "server", "readonly",
 
251
            None)
 
252
        vfs_scenarios = formats_to_scenarios(formats, "server", "readonly",
267
253
            vfs_transport_factory="vfs")
268
 
        self.assertEqual([
269
 
            ('str',
270
 
             {'bzrdir_format': 'b',
271
 
              'repository_format': 'a',
272
 
              'transport_readonly_server': None,
273
 
              'transport_server': None,
274
 
              'vfs_transport_factory': 'vfs'}),
275
 
            ('str',
276
 
             {'bzrdir_format': 'd',
277
 
              'repository_format': 'c',
278
 
              'transport_readonly_server': None,
279
 
              'transport_server': None,
280
 
              'vfs_transport_factory': 'vfs'})],
281
 
            adapter.scenarios)
282
 
 
283
 
    def test_formats_to_scenarios(self):
284
 
        """The adapter can generate all the scenarios needed."""
285
 
        from bzrlib.tests.repository_implementations import RepositoryTestProviderAdapter
286
 
        no_vfs_adapter = RepositoryTestProviderAdapter("server", "readonly",
287
 
            [], None)
288
 
        vfs_adapter = RepositoryTestProviderAdapter("server", "readonly",
289
 
            [], vfs_transport_factory="vfs")
290
 
        # no_vfs generate scenarios without vfs_transport_factor
291
 
        formats = [("c", "C"), (1, "D")]
292
 
        self.assertEqual([
293
 
            ('str',
294
 
             {'bzrdir_format': 'C',
295
 
              'repository_format': 'c',
 
254
        # no_vfs generate scenarios without vfs_transport_factory
 
255
        self.assertEqual([
 
256
            ('RemoteRepositoryFormat(c)',
 
257
             {'bzrdir_format': remote.RemoteBzrDirFormat(),
 
258
              'repository_format': remote.RemoteRepositoryFormat(),
296
259
              'transport_readonly_server': 'readonly',
297
260
              'transport_server': 'server'}),
298
 
            ('int',
299
 
             {'bzrdir_format': 'D',
300
 
              'repository_format': 1,
 
261
            ('RepositoryFormatKnitPack1(d)',
 
262
             {'bzrdir_format': bzrdir.BzrDirMetaFormat1(),
 
263
              'repository_format': pack_repo.RepositoryFormatKnitPack1(),
301
264
              'transport_readonly_server': 'readonly',
302
265
              'transport_server': 'server'})],
303
 
            no_vfs_adapter.formats_to_scenarios(formats))
 
266
            no_vfs_scenarios)
304
267
        self.assertEqual([
305
 
            ('str',
306
 
             {'bzrdir_format': 'C',
307
 
              'repository_format': 'c',
 
268
            ('RemoteRepositoryFormat(c)',
 
269
             {'bzrdir_format': remote.RemoteBzrDirFormat(),
 
270
              'repository_format': remote.RemoteRepositoryFormat(),
308
271
              'transport_readonly_server': 'readonly',
309
272
              'transport_server': 'server',
310
273
              'vfs_transport_factory': 'vfs'}),
311
 
            ('int',
312
 
             {'bzrdir_format': 'D',
313
 
              'repository_format': 1,
 
274
            ('RepositoryFormatKnitPack1(d)',
 
275
             {'bzrdir_format': bzrdir.BzrDirMetaFormat1(),
 
276
              'repository_format': pack_repo.RepositoryFormatKnitPack1(),
314
277
              'transport_readonly_server': 'readonly',
315
278
              'transport_server': 'server',
316
279
              'vfs_transport_factory': 'vfs'})],
317
 
            vfs_adapter.formats_to_scenarios(formats))
318
 
 
319
 
 
320
 
class TestTestScenarioApplier(TestCase):
 
280
            vfs_scenarios)
 
281
 
 
282
 
 
283
class TestTestScenarioApplication(TestCase):
321
284
    """Tests for the test adaption facilities."""
322
285
 
323
 
    def test_adapt_applies_scenarios(self):
324
 
        from bzrlib.tests.repository_implementations import TestScenarioApplier
325
 
        input_test = TestTestScenarioApplier("test_adapt_test_to_scenario")
326
 
        adapter = TestScenarioApplier()
327
 
        adapter.scenarios = [("1", "dict"), ("2", "settings")]
328
 
        calls = []
329
 
        def capture_call(test, scenario):
330
 
            calls.append((test, scenario))
331
 
            return test
332
 
        adapter.adapt_test_to_scenario = capture_call
333
 
        adapter.adapt(input_test)
334
 
        self.assertEqual([(input_test, ("1", "dict")),
335
 
            (input_test, ("2", "settings"))], calls)
336
 
 
337
 
    def test_adapt_test_to_scenario(self):
338
 
        from bzrlib.tests.repository_implementations import TestScenarioApplier
339
 
        input_test = TestTestScenarioApplier("test_adapt_test_to_scenario")
340
 
        adapter = TestScenarioApplier()
 
286
    def test_apply_scenario(self):
 
287
        from bzrlib.tests import apply_scenario
 
288
        input_test = TestTestScenarioApplication("test_apply_scenario")
341
289
        # setup two adapted tests
342
 
        adapted_test1 = adapter.adapt_test_to_scenario(input_test,
 
290
        adapted_test1 = apply_scenario(input_test,
343
291
            ("new id",
344
292
            {"bzrdir_format":"bzr_format",
345
293
             "repository_format":"repo_fmt",
346
294
             "transport_server":"transport_server",
347
295
             "transport_readonly_server":"readonly-server"}))
348
 
        adapted_test2 = adapter.adapt_test_to_scenario(input_test,
 
296
        adapted_test2 = apply_scenario(input_test,
349
297
            ("new id 2", {"bzrdir_format":None}))
350
298
        # input_test should have been altered.
351
299
        self.assertRaises(AttributeError, getattr, input_test, "bzrdir_format")
352
 
        # the new tests are mutually incompatible, ensuring it has 
 
300
        # the new tests are mutually incompatible, ensuring it has
353
301
        # made new ones, and unspecified elements in the scenario
354
302
        # should not have been altered.
355
303
        self.assertEqual("bzr_format", adapted_test1.bzrdir_format)
358
306
        self.assertEqual("readonly-server",
359
307
            adapted_test1.transport_readonly_server)
360
308
        self.assertEqual(
361
 
            "bzrlib.tests.test_selftest.TestTestScenarioApplier."
362
 
            "test_adapt_test_to_scenario(new id)",
 
309
            "bzrlib.tests.test_selftest.TestTestScenarioApplication."
 
310
            "test_apply_scenario(new id)",
363
311
            adapted_test1.id())
364
312
        self.assertEqual(None, adapted_test2.bzrdir_format)
365
313
        self.assertEqual(
366
 
            "bzrlib.tests.test_selftest.TestTestScenarioApplier."
367
 
            "test_adapt_test_to_scenario(new id 2)",
 
314
            "bzrlib.tests.test_selftest.TestTestScenarioApplication."
 
315
            "test_apply_scenario(new id 2)",
368
316
            adapted_test2.id())
369
317
 
370
318
 
371
 
class TestInterRepositoryProviderAdapter(TestCase):
372
 
    """A group of tests that test the InterRepository test adapter."""
 
319
class TestInterRepositoryScenarios(TestCase):
373
320
 
374
 
    def test_adapted_tests(self):
 
321
    def test_scenarios(self):
375
322
        # check that constructor parameters are passed through to the adapted
376
323
        # test.
377
324
        from bzrlib.tests.interrepository_implementations import \
378
 
            InterRepositoryTestProviderAdapter
 
325
            make_scenarios
379
326
        server1 = "a"
380
327
        server2 = "b"
381
328
        formats = [(str, "C1", "C2"), (int, "D1", "D2")]
382
 
        adapter = InterRepositoryTestProviderAdapter(server1, server2, formats)
 
329
        scenarios = make_scenarios(server1, server2, formats)
383
330
        self.assertEqual([
384
331
            ('str,str,str',
385
332
             {'interrepo_class': str,
393
340
              'repository_format_to': 'D2',
394
341
              'transport_readonly_server': 'b',
395
342
              'transport_server': 'a'})],
396
 
            adapter.formats_to_scenarios(formats))
397
 
 
398
 
 
399
 
class TestInterVersionedFileProviderAdapter(TestCase):
400
 
    """A group of tests that test the InterVersionedFile test adapter."""
401
 
 
402
 
    def test_scenarios(self):
403
 
        # check that constructor parameters are passed through to the adapted
404
 
        # test.
405
 
        from bzrlib.tests.interversionedfile_implementations \
406
 
            import InterVersionedFileTestProviderAdapter
407
 
        server1 = "a"
408
 
        server2 = "b"
409
 
        formats = [(str, "C1", "C2"), (int, "D1", "D2")]
410
 
        adapter = InterVersionedFileTestProviderAdapter(server1, server2, formats)
411
 
        self.assertEqual([
412
 
            ('str',
413
 
             {'interversionedfile_class':str,
414
 
              'transport_readonly_server': 'b',
415
 
              'transport_server': 'a',
416
 
              'versionedfile_factory': 'C1',
417
 
              'versionedfile_factory_to': 'C2'}),
418
 
            ('int',
419
 
             {'interversionedfile_class': int,
420
 
              'transport_readonly_server': 'b',
421
 
              'transport_server': 'a',
422
 
              'versionedfile_factory': 'D1',
423
 
              'versionedfile_factory_to': 'D2'})],
424
 
            adapter.scenarios)
425
 
 
426
 
 
427
 
class TestRevisionStoreProviderAdapter(TestCase):
428
 
    """A group of tests that test the RevisionStore test adapter."""
429
 
 
430
 
    def test_scenarios(self):
431
 
        # check that constructor parameters are passed through to the adapted
432
 
        # test.
433
 
        from bzrlib.tests.revisionstore_implementations \
434
 
            import RevisionStoreTestProviderAdapter
435
 
        # revision stores need a store factory - i.e. RevisionKnit
436
 
        #, a readonly and rw transport 
437
 
        # transport servers:
438
 
        server1 = "a"
439
 
        server2 = "b"
440
 
        store_factories = ["c", "d"]
441
 
        adapter = RevisionStoreTestProviderAdapter(server1, server2, store_factories)
442
 
        self.assertEqual([
443
 
            ('c',
444
 
             {'store_factory': 'c',
445
 
              'transport_readonly_server': 'b',
446
 
              'transport_server': 'a'}),
447
 
            ('d',
448
 
             {'store_factory': 'd',
449
 
              'transport_readonly_server': 'b',
450
 
              'transport_server': 'a'})],
451
 
            adapter.scenarios)
452
 
 
453
 
 
454
 
class TestWorkingTreeProviderAdapter(TestCase):
455
 
    """A group of tests that test the workingtree implementation test adapter."""
 
343
            scenarios)
 
344
 
 
345
 
 
346
class TestWorkingTreeScenarios(TestCase):
456
347
 
457
348
    def test_scenarios(self):
458
349
        # check that constructor parameters are passed through to the adapted
459
350
        # test.
460
351
        from bzrlib.tests.workingtree_implementations \
461
 
            import WorkingTreeTestProviderAdapter
 
352
            import make_scenarios
462
353
        server1 = "a"
463
354
        server2 = "b"
464
 
        formats = [("c", "C"), ("d", "D")]
465
 
        adapter = WorkingTreeTestProviderAdapter(server1, server2, formats)
 
355
        formats = [workingtree.WorkingTreeFormat2(),
 
356
                   workingtree.WorkingTreeFormat3(),]
 
357
        scenarios = make_scenarios(server1, server2, formats)
466
358
        self.assertEqual([
467
 
            ('str',
468
 
             {'bzrdir_format': 'C',
469
 
              'transport_readonly_server': 'b',
470
 
              'transport_server': 'a',
471
 
              'workingtree_format': 'c'}),
472
 
            ('str',
473
 
             {'bzrdir_format': 'D',
474
 
              'transport_readonly_server': 'b',
475
 
              'transport_server': 'a',
476
 
              'workingtree_format': 'd'})],
477
 
            adapter.scenarios)
478
 
 
479
 
 
480
 
class TestTreeProviderAdapter(TestCase):
481
 
    """Test the setup of tree_implementation tests."""
482
 
 
483
 
    def test_adapted_tests(self):
484
 
        # the tree implementation adapter is meant to setup one instance for
485
 
        # each working tree format, and one additional instance that will
486
 
        # use the default wt format, but create a revision tree for the tests.
487
 
        # this means that the wt ones should have the workingtree_to_test_tree
488
 
        # attribute set to 'return_parameter' and the revision one set to
489
 
        # revision_tree_from_workingtree.
 
359
            ('WorkingTreeFormat2',
 
360
             {'bzrdir_format': formats[0]._matchingbzrdir,
 
361
              'transport_readonly_server': 'b',
 
362
              'transport_server': 'a',
 
363
              'workingtree_format': formats[0]}),
 
364
            ('WorkingTreeFormat3',
 
365
             {'bzrdir_format': formats[1]._matchingbzrdir,
 
366
              'transport_readonly_server': 'b',
 
367
              'transport_server': 'a',
 
368
              'workingtree_format': formats[1]})],
 
369
            scenarios)
 
370
 
 
371
 
 
372
class TestTreeScenarios(TestCase):
 
373
 
 
374
    def test_scenarios(self):
 
375
        # the tree implementation scenario generator is meant to setup one
 
376
        # instance for each working tree format, and one additional instance
 
377
        # that will use the default wt format, but create a revision tree for
 
378
        # the tests.  this means that the wt ones should have the
 
379
        # workingtree_to_test_tree attribute set to 'return_parameter' and the
 
380
        # revision one set to revision_tree_from_workingtree.
490
381
 
491
382
        from bzrlib.tests.tree_implementations import (
492
 
            TreeTestProviderAdapter,
 
383
            _dirstate_tree_from_workingtree,
 
384
            make_scenarios,
 
385
            preview_tree_pre,
 
386
            preview_tree_post,
493
387
            return_parameter,
494
388
            revision_tree_from_workingtree
495
389
            )
496
 
        from bzrlib.workingtree import WorkingTreeFormat, WorkingTreeFormat3
497
 
        input_test = TestTreeProviderAdapter(
498
 
            "test_adapted_tests")
499
390
        server1 = "a"
500
391
        server2 = "b"
501
 
        formats = [("c", "C"), ("d", "D")]
502
 
        adapter = TreeTestProviderAdapter(server1, server2, formats)
503
 
        suite = adapter.adapt(input_test)
504
 
        tests = list(iter(suite))
505
 
        # XXX We should not have tests fail as we add more scenarios
506
 
        # abentley 20080412
507
 
        self.assertEqual(5, len(tests))
508
 
        # this must match the default format setp up in
509
 
        # TreeTestProviderAdapter.adapt
510
 
        default_format = WorkingTreeFormat3
511
 
        self.assertEqual(tests[0].workingtree_format, formats[0][0])
512
 
        self.assertEqual(tests[0].bzrdir_format, formats[0][1])
513
 
        self.assertEqual(tests[0].transport_server, server1)
514
 
        self.assertEqual(tests[0].transport_readonly_server, server2)
515
 
        self.assertEqual(tests[0]._workingtree_to_test_tree, return_parameter)
516
 
        self.assertEqual(tests[1].workingtree_format, formats[1][0])
517
 
        self.assertEqual(tests[1].bzrdir_format, formats[1][1])
518
 
        self.assertEqual(tests[1].transport_server, server1)
519
 
        self.assertEqual(tests[1].transport_readonly_server, server2)
520
 
        self.assertEqual(tests[1]._workingtree_to_test_tree, return_parameter)
521
 
        self.assertIsInstance(tests[2].workingtree_format, default_format)
522
 
        #self.assertEqual(tests[2].bzrdir_format,
523
 
        #                 default_format._matchingbzrdir)
524
 
        self.assertEqual(tests[2].transport_server, server1)
525
 
        self.assertEqual(tests[2].transport_readonly_server, server2)
526
 
        self.assertEqual(tests[2]._workingtree_to_test_tree,
527
 
            revision_tree_from_workingtree)
528
 
 
529
 
 
530
 
class TestInterTreeProviderAdapter(TestCase):
 
392
        formats = [workingtree.WorkingTreeFormat2(),
 
393
                   workingtree.WorkingTreeFormat3(),]
 
394
        scenarios = make_scenarios(server1, server2, formats)
 
395
        self.assertEqual(7, len(scenarios))
 
396
        default_wt_format = workingtree.WorkingTreeFormat4._default_format
 
397
        wt4_format = workingtree.WorkingTreeFormat4()
 
398
        wt5_format = workingtree.WorkingTreeFormat5()
 
399
        expected_scenarios = [
 
400
            ('WorkingTreeFormat2',
 
401
             {'bzrdir_format': formats[0]._matchingbzrdir,
 
402
              'transport_readonly_server': 'b',
 
403
              'transport_server': 'a',
 
404
              'workingtree_format': formats[0],
 
405
              '_workingtree_to_test_tree': return_parameter,
 
406
              }),
 
407
            ('WorkingTreeFormat3',
 
408
             {'bzrdir_format': formats[1]._matchingbzrdir,
 
409
              'transport_readonly_server': 'b',
 
410
              'transport_server': 'a',
 
411
              'workingtree_format': formats[1],
 
412
              '_workingtree_to_test_tree': return_parameter,
 
413
             }),
 
414
            ('RevisionTree',
 
415
             {'_workingtree_to_test_tree': revision_tree_from_workingtree,
 
416
              'bzrdir_format': default_wt_format._matchingbzrdir,
 
417
              'transport_readonly_server': 'b',
 
418
              'transport_server': 'a',
 
419
              'workingtree_format': default_wt_format,
 
420
             }),
 
421
            ('DirStateRevisionTree,WT4',
 
422
             {'_workingtree_to_test_tree': _dirstate_tree_from_workingtree,
 
423
              'bzrdir_format': wt4_format._matchingbzrdir,
 
424
              'transport_readonly_server': 'b',
 
425
              'transport_server': 'a',
 
426
              'workingtree_format': wt4_format,
 
427
             }),
 
428
            ('DirStateRevisionTree,WT5',
 
429
             {'_workingtree_to_test_tree': _dirstate_tree_from_workingtree,
 
430
              'bzrdir_format': wt5_format._matchingbzrdir,
 
431
              'transport_readonly_server': 'b',
 
432
              'transport_server': 'a',
 
433
              'workingtree_format': wt5_format,
 
434
             }),
 
435
            ('PreviewTree',
 
436
             {'_workingtree_to_test_tree': preview_tree_pre,
 
437
              'bzrdir_format': default_wt_format._matchingbzrdir,
 
438
              'transport_readonly_server': 'b',
 
439
              'transport_server': 'a',
 
440
              'workingtree_format': default_wt_format}),
 
441
            ('PreviewTreePost',
 
442
             {'_workingtree_to_test_tree': preview_tree_post,
 
443
              'bzrdir_format': default_wt_format._matchingbzrdir,
 
444
              'transport_readonly_server': 'b',
 
445
              'transport_server': 'a',
 
446
              'workingtree_format': default_wt_format}),
 
447
             ]
 
448
        self.assertEqual(expected_scenarios, scenarios)
 
449
 
 
450
 
 
451
class TestInterTreeScenarios(TestCase):
531
452
    """A group of tests that test the InterTreeTestAdapter."""
532
453
 
533
 
    def test_adapted_tests(self):
 
454
    def test_scenarios(self):
534
455
        # check that constructor parameters are passed through to the adapted
535
456
        # test.
536
457
        # for InterTree tests we want the machinery to bring up two trees in
545
466
            revision_tree_from_workingtree
546
467
            )
547
468
        from bzrlib.tests.intertree_implementations import (
548
 
            InterTreeTestProviderAdapter,
 
469
            make_scenarios,
549
470
            )
550
471
        from bzrlib.workingtree import WorkingTreeFormat2, WorkingTreeFormat3
551
 
        input_test = TestInterTreeProviderAdapter(
552
 
            "test_adapted_tests")
 
472
        input_test = TestInterTreeScenarios(
 
473
            "test_scenarios")
553
474
        server1 = "a"
554
475
        server2 = "b"
555
476
        format1 = WorkingTreeFormat2()
556
477
        format2 = WorkingTreeFormat3()
557
 
        formats = [(str, format1, format2, "converter1"),
558
 
            (int, format2, format1, "converter2")]
559
 
        adapter = InterTreeTestProviderAdapter(server1, server2, formats)
560
 
        suite = adapter.adapt(input_test)
561
 
        tests = list(iter(suite))
562
 
        self.assertEqual(2, len(tests))
563
 
        self.assertEqual(tests[0].intertree_class, formats[0][0])
564
 
        self.assertEqual(tests[0].workingtree_format, formats[0][1])
565
 
        self.assertEqual(tests[0].workingtree_format_to, formats[0][2])
566
 
        self.assertEqual(tests[0].mutable_trees_to_test_trees, formats[0][3])
567
 
        self.assertEqual(tests[0]._workingtree_to_test_tree, return_parameter)
568
 
        self.assertEqual(tests[0].transport_server, server1)
569
 
        self.assertEqual(tests[0].transport_readonly_server, server2)
570
 
        self.assertEqual(tests[1].intertree_class, formats[1][0])
571
 
        self.assertEqual(tests[1].workingtree_format, formats[1][1])
572
 
        self.assertEqual(tests[1].workingtree_format_to, formats[1][2])
573
 
        self.assertEqual(tests[1].mutable_trees_to_test_trees, formats[1][3])
574
 
        self.assertEqual(tests[1]._workingtree_to_test_tree, return_parameter)
575
 
        self.assertEqual(tests[1].transport_server, server1)
576
 
        self.assertEqual(tests[1].transport_readonly_server, server2)
 
478
        formats = [("1", str, format1, format2, "converter1"),
 
479
            ("2", int, format2, format1, "converter2")]
 
480
        scenarios = make_scenarios(server1, server2, formats)
 
481
        self.assertEqual(2, len(scenarios))
 
482
        expected_scenarios = [
 
483
            ("1", {
 
484
                "bzrdir_format": format1._matchingbzrdir,
 
485
                "intertree_class": formats[0][1],
 
486
                "workingtree_format": formats[0][2],
 
487
                "workingtree_format_to": formats[0][3],
 
488
                "mutable_trees_to_test_trees": formats[0][4],
 
489
                "_workingtree_to_test_tree": return_parameter,
 
490
                "transport_server": server1,
 
491
                "transport_readonly_server": server2,
 
492
                }),
 
493
            ("2", {
 
494
                "bzrdir_format": format2._matchingbzrdir,
 
495
                "intertree_class": formats[1][1],
 
496
                "workingtree_format": formats[1][2],
 
497
                "workingtree_format_to": formats[1][3],
 
498
                "mutable_trees_to_test_trees": formats[1][4],
 
499
                "_workingtree_to_test_tree": return_parameter,
 
500
                "transport_server": server1,
 
501
                "transport_readonly_server": server2,
 
502
                }),
 
503
            ]
 
504
        self.assertEqual(scenarios, expected_scenarios)
577
505
 
578
506
 
579
507
class TestTestCaseInTempDir(TestCaseInTempDir):
584
512
        self.assertIsSameRealPath(self.test_dir, cwd)
585
513
        self.assertIsSameRealPath(self.test_home_dir, os.environ['HOME'])
586
514
 
 
515
    def test_assertEqualStat_equal(self):
 
516
        from bzrlib.tests.test_dirstate import _FakeStat
 
517
        self.build_tree(["foo"])
 
518
        real = os.lstat("foo")
 
519
        fake = _FakeStat(real.st_size, real.st_mtime, real.st_ctime,
 
520
            real.st_dev, real.st_ino, real.st_mode)
 
521
        self.assertEqualStat(real, fake)
 
522
 
 
523
    def test_assertEqualStat_notequal(self):
 
524
        self.build_tree(["foo", "bar"])
 
525
        self.assertRaises(AssertionError, self.assertEqualStat,
 
526
            os.lstat("foo"), os.lstat("bar"))
 
527
 
587
528
 
588
529
class TestTestCaseWithMemoryTransport(TestCaseWithMemoryTransport):
589
530
 
591
532
        """The test_home_dir for TestCaseWithMemoryTransport is missing.
592
533
 
593
534
        This is because TestCaseWithMemoryTransport is for tests that do not
594
 
        need any disk resources: they should be hooked into bzrlib in such a 
595
 
        way that no global settings are being changed by the test (only a 
 
535
        need any disk resources: they should be hooked into bzrlib in such a
 
536
        way that no global settings are being changed by the test (only a
596
537
        few tests should need to do that), and having a missing dir as home is
597
538
        an effective way to ensure that this is the case.
598
539
        """
600
541
            self.TEST_ROOT + "/MemoryTransportMissingHomeDir",
601
542
            self.test_home_dir)
602
543
        self.assertIsSameRealPath(self.test_home_dir, os.environ['HOME'])
603
 
        
 
544
 
604
545
    def test_cwd_is_TEST_ROOT(self):
605
546
        self.assertIsSameRealPath(self.test_dir, self.TEST_ROOT)
606
547
        cwd = osutils.getcwd()
630
571
        self.assertEqual(format.repository_format.__class__,
631
572
            tree.branch.repository._format.__class__)
632
573
 
 
574
    def test_make_branch_builder(self):
 
575
        builder = self.make_branch_builder('dir')
 
576
        self.assertIsInstance(builder, branchbuilder.BranchBuilder)
 
577
        # Guard against regression into MemoryTransport leaking
 
578
        # files to disk instead of keeping them in memory.
 
579
        self.failIf(osutils.lexists('dir'))
 
580
 
 
581
    def test_make_branch_builder_with_format(self):
 
582
        # Use a repo layout that doesn't conform to a 'named' layout, to ensure
 
583
        # that the format objects are used.
 
584
        format = bzrdir.BzrDirMetaFormat1()
 
585
        repo_format = weaverepo.RepositoryFormat7()
 
586
        format.repository_format = repo_format
 
587
        builder = self.make_branch_builder('dir', format=format)
 
588
        the_branch = builder.get_branch()
 
589
        # Guard against regression into MemoryTransport leaking
 
590
        # files to disk instead of keeping them in memory.
 
591
        self.failIf(osutils.lexists('dir'))
 
592
        self.assertEqual(format.repository_format.__class__,
 
593
                         the_branch.repository._format.__class__)
 
594
        self.assertEqual(repo_format.get_format_string(),
 
595
                         self.get_transport().get_bytes(
 
596
                            'dir/.bzr/repository/format'))
 
597
 
 
598
    def test_make_branch_builder_with_format_name(self):
 
599
        builder = self.make_branch_builder('dir', format='knit')
 
600
        the_branch = builder.get_branch()
 
601
        # Guard against regression into MemoryTransport leaking
 
602
        # files to disk instead of keeping them in memory.
 
603
        self.failIf(osutils.lexists('dir'))
 
604
        dir_format = bzrdir.format_registry.make_bzrdir('knit')
 
605
        self.assertEqual(dir_format.repository_format.__class__,
 
606
                         the_branch.repository._format.__class__)
 
607
        self.assertEqual('Bazaar-NG Knit Repository Format 1',
 
608
                         self.get_transport().get_bytes(
 
609
                            'dir/.bzr/repository/format'))
 
610
 
633
611
    def test_safety_net(self):
634
612
        """No test should modify the safety .bzr directory.
635
613
 
643
621
        # But we have a safety net in place.
644
622
        self.assertRaises(AssertionError, self._check_safety_net)
645
623
 
 
624
    def test_dangling_locks_cause_failures(self):
 
625
        class TestDanglingLock(TestCaseWithMemoryTransport):
 
626
            def test_function(self):
 
627
                t = self.get_transport('.')
 
628
                l = lockdir.LockDir(t, 'lock')
 
629
                l.create()
 
630
                l.attempt_lock()
 
631
        test = TestDanglingLock('test_function')
 
632
        result = test.run()
 
633
        self.assertEqual(1, len(result.errors))
 
634
 
646
635
 
647
636
class TestTestCaseWithTransport(TestCaseWithTransport):
648
637
    """Tests for the convenience functions TestCaseWithTransport introduces."""
688
677
        self.assertRaises(AssertionError, self.assertIsDirectory, 'a_file', t)
689
678
        self.assertRaises(AssertionError, self.assertIsDirectory, 'not_here', t)
690
679
 
 
680
    def test_make_branch_builder(self):
 
681
        builder = self.make_branch_builder('dir')
 
682
        rev_id = builder.build_commit()
 
683
        self.failUnlessExists('dir')
 
684
        a_dir = bzrdir.BzrDir.open('dir')
 
685
        self.assertRaises(errors.NoWorkingTree, a_dir.open_workingtree)
 
686
        a_branch = a_dir.open_branch()
 
687
        builder_branch = builder.get_branch()
 
688
        self.assertEqual(a_branch.base, builder_branch.base)
 
689
        self.assertEqual((1, rev_id), builder_branch.last_revision_info())
 
690
        self.assertEqual((1, rev_id), a_branch.last_revision_info())
 
691
 
691
692
 
692
693
class TestTestCaseTransports(TestCaseWithTransport):
693
694
 
698
699
    def test_make_bzrdir_preserves_transport(self):
699
700
        t = self.get_transport()
700
701
        result_bzrdir = self.make_bzrdir('subdir')
701
 
        self.assertIsInstance(result_bzrdir.transport, 
 
702
        self.assertIsInstance(result_bzrdir.transport,
702
703
                              MemoryTransport)
703
704
        # should not be on disk, should only be in memory
704
705
        self.failIfExists('subdir')
766
767
                time.sleep(0.003)
767
768
        self.check_timing(ShortDelayTestCase('test_short_delay'),
768
769
                          r"^ +[0-9]+ms$")
769
 
        
 
770
 
770
771
    def test_assigned_benchmark_file_stores_date(self):
771
772
        output = StringIO()
772
773
        result = bzrlib.tests.TextTestResult(self._log_file,
799
800
        self.assertContainsRe(lines[1],
800
801
            " *[0-9]+ms bzrlib.tests.test_selftest.TestTestResult"
801
802
            "._time_hello_world_encoding")
802
 
 
 
803
 
803
804
    def _time_hello_world_encoding(self):
804
805
        """Profile two sleep calls
805
 
        
 
806
 
806
807
        This is used to exercise the test framework.
807
808
        """
808
809
        self.time(unicode, 'hello', errors='replace')
826
827
        # execute the test, which should succeed and record profiles
827
828
        example_test_case.run(result)
828
829
        # lsprofile_something()
829
 
        # if this worked we want 
 
830
        # if this worked we want
830
831
        # LSProf output for <built in function unicode> (['hello'], {'errors': 'replace'})
831
832
        #    CallCount    Recursive    Total(ms)   Inline(ms) module:lineno(function)
832
833
        # (the lsprof header)
833
834
        # ... an arbitrary number of lines
834
835
        # and the function call which is time.sleep.
835
 
        #           1        0            ???         ???       ???(sleep) 
 
836
        #           1        0            ???         ???       ???(sleep)
836
837
        # and then repeated but with 'world', rather than 'hello'.
837
838
        # this should appear in the output stream of our test result.
838
839
        output = result_stream.getvalue()
848
849
    def test_known_failure(self):
849
850
        """A KnownFailure being raised should trigger several result actions."""
850
851
        class InstrumentedTestResult(ExtendedTestResult):
851
 
 
 
852
            def done(self): pass
 
853
            def startTests(self): pass
852
854
            def report_test_start(self, test): pass
853
855
            def report_known_failure(self, test, err):
854
856
                self._call = test, err
896
898
        # text test output formatting
897
899
        pb = MockProgress()
898
900
        result = bzrlib.tests.TextTestResult(
899
 
            None,
 
901
            StringIO(),
900
902
            descriptions=0,
901
903
            verbosity=1,
902
904
            pb=pb,
936
938
    def test_add_not_supported(self):
937
939
        """Test the behaviour of invoking addNotSupported."""
938
940
        class InstrumentedTestResult(ExtendedTestResult):
 
941
            def done(self): pass
 
942
            def startTests(self): pass
939
943
            def report_test_start(self, test): pass
940
944
            def report_unsupported(self, test, feature):
941
945
                self._call = test, feature
973
977
        output = result_stream.getvalue()[prefix:]
974
978
        lines = output.splitlines()
975
979
        self.assertEqual(lines, ['NODEP                   0ms', "    The feature 'Feature' is not available."])
976
 
    
 
980
 
977
981
    def test_text_report_unsupported(self):
978
982
        # text test output formatting
979
983
        pb = MockProgress()
980
984
        result = bzrlib.tests.TextTestResult(
981
 
            None,
 
985
            StringIO(),
982
986
            descriptions=0,
983
987
            verbosity=1,
984
988
            pb=pb,
1002
1006
            ('update', '[2 in 0s, 2 missing] passing_test', None, None),
1003
1007
            ],
1004
1008
            pb.calls[1:])
1005
 
    
 
1009
 
1006
1010
    def test_unavailable_exception(self):
1007
1011
        """An UnavailableFeature being raised should invoke addNotSupported."""
1008
1012
        class InstrumentedTestResult(ExtendedTestResult):
1009
 
 
 
1013
            def done(self): pass
 
1014
            def startTests(self): pass
1010
1015
            def report_test_start(self, test): pass
1011
1016
            def addNotSupported(self, test, feature):
1012
1017
                self._call = test, feature
1031
1036
        result.addNotSupported(test, feature)
1032
1037
        self.assertFalse(result.wasStrictlySuccessful())
1033
1038
        self.assertEqual(None, result._extractBenchmarkTime(test))
1034
 
 
 
1039
 
1035
1040
    def test_strict_with_known_failure(self):
1036
1041
        result = bzrlib.tests.TextTestResult(self._log_file, descriptions=0,
1037
1042
                                             verbosity=1)
1049
1054
        self.assertTrue(result.wasStrictlySuccessful())
1050
1055
        self.assertEqual(None, result._extractBenchmarkTime(test))
1051
1056
 
 
1057
    def test_startTests(self):
 
1058
        """Starting the first test should trigger startTests."""
 
1059
        class InstrumentedTestResult(ExtendedTestResult):
 
1060
            calls = 0
 
1061
            def startTests(self): self.calls += 1
 
1062
            def report_test_start(self, test): pass
 
1063
        result = InstrumentedTestResult(None, None, None, None)
 
1064
        def test_function():
 
1065
            pass
 
1066
        test = unittest.FunctionTestCase(test_function)
 
1067
        test.run(result)
 
1068
        self.assertEquals(1, result.calls)
 
1069
 
 
1070
 
 
1071
class TestUnicodeFilenameFeature(TestCase):
 
1072
 
 
1073
    def test_probe_passes(self):
 
1074
        """UnicodeFilenameFeature._probe passes."""
 
1075
        # We can't test much more than that because the behaviour depends
 
1076
        # on the platform.
 
1077
        tests.UnicodeFilenameFeature._probe()
 
1078
 
1052
1079
 
1053
1080
class TestRunner(TestCase):
1054
1081
 
1060
1087
 
1061
1088
        This current saves and restores:
1062
1089
        TestCaseInTempDir.TEST_ROOT
1063
 
        
 
1090
 
1064
1091
        There should be no tests in this file that use bzrlib.tests.TextTestRunner
1065
1092
        without using this convenience method, because of our use of global state.
1066
1093
        """
1097
1124
            '----------------------------------------------------------------------',
1098
1125
            '',
1099
1126
            'FAILED (failures=1, known_failure_count=1)'],
1100
 
            lines[0:5] + lines[6:10] + lines[11:])
 
1127
            lines[3:8] + lines[9:13] + lines[14:])
1101
1128
 
1102
1129
    def test_known_failure_ok_run(self):
1103
1130
        # run a test that generates a known failure which should be printed in the final output.
1118
1145
        # run a test that is skipped, and check the suite as a whole still
1119
1146
        # succeeds.
1120
1147
        # skipping_test must be hidden in here so it's not run as a real test
1121
 
        def skipping_test():
1122
 
            raise TestSkipped('test intentionally skipped')
1123
 
 
 
1148
        class SkippingTest(TestCase):
 
1149
            def skipping_test(self):
 
1150
                raise TestSkipped('test intentionally skipped')
1124
1151
        runner = TextTestRunner(stream=self._log_file)
1125
 
        test = unittest.FunctionTestCase(skipping_test)
 
1152
        test = SkippingTest("skipping_test")
1126
1153
        result = self.run_test_runner(runner, test)
1127
1154
        self.assertTrue(result.wasSuccessful())
1128
1155
 
1153
1180
        class SkippedTest(TestCase):
1154
1181
 
1155
1182
            def setUp(self):
 
1183
                TestCase.setUp(self)
1156
1184
                calls.append('setUp')
1157
1185
                self.addCleanup(self.cleanup)
1158
1186
 
1349
1377
    def _test_pass(self):
1350
1378
        pass
1351
1379
 
 
1380
class _TestException(Exception):
 
1381
    pass
1352
1382
 
1353
1383
class TestTestCase(TestCase):
1354
1384
    """Tests that test the core bzrlib TestCase."""
1355
1385
 
 
1386
    def test_assertLength_matches_empty(self):
 
1387
        a_list = []
 
1388
        self.assertLength(0, a_list)
 
1389
 
 
1390
    def test_assertLength_matches_nonempty(self):
 
1391
        a_list = [1, 2, 3]
 
1392
        self.assertLength(3, a_list)
 
1393
 
 
1394
    def test_assertLength_fails_different(self):
 
1395
        a_list = []
 
1396
        self.assertRaises(AssertionError, self.assertLength, 1, a_list)
 
1397
 
 
1398
    def test_assertLength_shows_sequence_in_failure(self):
 
1399
        a_list = [1, 2, 3]
 
1400
        exception = self.assertRaises(AssertionError, self.assertLength, 2,
 
1401
            a_list)
 
1402
        self.assertEqual('Incorrect length: wanted 2, got 3 for [1, 2, 3]',
 
1403
            exception.args[0])
 
1404
 
 
1405
    def test_base_setUp_not_called_causes_failure(self):
 
1406
        class TestCaseWithBrokenSetUp(TestCase):
 
1407
            def setUp(self):
 
1408
                pass # does not call TestCase.setUp
 
1409
            def test_foo(self):
 
1410
                pass
 
1411
        test = TestCaseWithBrokenSetUp('test_foo')
 
1412
        result = unittest.TestResult()
 
1413
        test.run(result)
 
1414
        self.assertFalse(result.wasSuccessful())
 
1415
        self.assertEqual(1, result.testsRun)
 
1416
 
 
1417
    def test_base_tearDown_not_called_causes_failure(self):
 
1418
        class TestCaseWithBrokenTearDown(TestCase):
 
1419
            def tearDown(self):
 
1420
                pass # does not call TestCase.tearDown
 
1421
            def test_foo(self):
 
1422
                pass
 
1423
        test = TestCaseWithBrokenTearDown('test_foo')
 
1424
        result = unittest.TestResult()
 
1425
        test.run(result)
 
1426
        self.assertFalse(result.wasSuccessful())
 
1427
        self.assertEqual(1, result.testsRun)
 
1428
 
1356
1429
    def test_debug_flags_sanitised(self):
1357
1430
        """The bzrlib debug flags should be sanitised by setUp."""
 
1431
        if 'allow_debug' in tests.selftest_debug_flags:
 
1432
            raise TestNotApplicable(
 
1433
                '-Eallow_debug option prevents debug flag sanitisation')
1358
1434
        # we could set something and run a test that will check
1359
1435
        # it gets santised, but this is probably sufficient for now:
1360
1436
        # if someone runs the test with -Dsomething it will error.
1361
1437
        self.assertEqual(set(), bzrlib.debug.debug_flags)
1362
1438
 
 
1439
    def change_selftest_debug_flags(self, new_flags):
 
1440
        orig_selftest_flags = tests.selftest_debug_flags
 
1441
        self.addCleanup(self._restore_selftest_debug_flags, orig_selftest_flags)
 
1442
        tests.selftest_debug_flags = set(new_flags)
 
1443
 
 
1444
    def _restore_selftest_debug_flags(self, flags):
 
1445
        tests.selftest_debug_flags = flags
 
1446
 
 
1447
    def test_allow_debug_flag(self):
 
1448
        """The -Eallow_debug flag prevents bzrlib.debug.debug_flags from being
 
1449
        sanitised (i.e. cleared) before running a test.
 
1450
        """
 
1451
        self.change_selftest_debug_flags(set(['allow_debug']))
 
1452
        bzrlib.debug.debug_flags = set(['a-flag'])
 
1453
        class TestThatRecordsFlags(TestCase):
 
1454
            def test_foo(nested_self):
 
1455
                self.flags = set(bzrlib.debug.debug_flags)
 
1456
        test = TestThatRecordsFlags('test_foo')
 
1457
        test.run(self.make_test_result())
 
1458
        self.assertEqual(set(['a-flag']), self.flags)
 
1459
 
 
1460
    def test_debug_flags_restored(self):
 
1461
        """The bzrlib debug flags should be restored to their original state
 
1462
        after the test was run, even if allow_debug is set.
 
1463
        """
 
1464
        self.change_selftest_debug_flags(set(['allow_debug']))
 
1465
        # Now run a test that modifies debug.debug_flags.
 
1466
        bzrlib.debug.debug_flags = set(['original-state'])
 
1467
        class TestThatModifiesFlags(TestCase):
 
1468
            def test_foo(self):
 
1469
                bzrlib.debug.debug_flags = set(['modified'])
 
1470
        test = TestThatModifiesFlags('test_foo')
 
1471
        test.run(self.make_test_result())
 
1472
        self.assertEqual(set(['original-state']), bzrlib.debug.debug_flags)
 
1473
 
 
1474
    def make_test_result(self):
 
1475
        return bzrlib.tests.TextTestResult(
 
1476
            self._log_file, descriptions=0, verbosity=1)
 
1477
 
1363
1478
    def inner_test(self):
1364
1479
        # the inner child test
1365
1480
        note("inner_test")
1368
1483
        # the outer child test
1369
1484
        note("outer_start")
1370
1485
        self.inner_test = TestTestCase("inner_child")
1371
 
        result = bzrlib.tests.TextTestResult(self._log_file,
1372
 
                                        descriptions=0,
1373
 
                                        verbosity=1)
 
1486
        result = self.make_test_result()
1374
1487
        self.inner_test.run(result)
1375
1488
        note("outer finish")
1376
1489
 
1380
1493
        # should setup a new log, log content to it, setup a child case (B),
1381
1494
        # which should log independently, then case (A) should log a trailer
1382
1495
        # and return.
1383
 
        # we do two nested children so that we can verify the state of the 
 
1496
        # we do two nested children so that we can verify the state of the
1384
1497
        # logs after the outer child finishes is correct, which a bad clean
1385
1498
        # up routine in tearDown might trigger a fault in our test with only
1386
1499
        # one child, we should instead see the bad result inside our test with
1388
1501
        # the outer child test
1389
1502
        original_trace = bzrlib.trace._trace_file
1390
1503
        outer_test = TestTestCase("outer_child")
1391
 
        result = bzrlib.tests.TextTestResult(self._log_file,
1392
 
                                        descriptions=0,
1393
 
                                        verbosity=1)
 
1504
        result = self.make_test_result()
1394
1505
        outer_test.run(result)
1395
1506
        self.assertEqual(original_trace, bzrlib.trace._trace_file)
1396
1507
 
1415
1526
 
1416
1527
    def test_hooks_sanitised(self):
1417
1528
        """The bzrlib hooks should be sanitised by setUp."""
 
1529
        # Note this test won't fail with hooks that the core library doesn't
 
1530
        # use - but it trigger with a plugin that adds hooks, so its still a
 
1531
        # useful warning in that case.
1418
1532
        self.assertEqual(bzrlib.branch.BranchHooks(),
1419
1533
            bzrlib.branch.Branch.hooks)
1420
1534
        self.assertEqual(bzrlib.smart.server.SmartServerHooks(),
1421
1535
            bzrlib.smart.server.SmartTCPServer.hooks)
 
1536
        self.assertEqual(bzrlib.commands.CommandHooks(),
 
1537
            bzrlib.commands.Command.hooks)
1422
1538
 
1423
1539
    def test__gather_lsprof_in_benchmarks(self):
1424
1540
        """When _gather_lsprof_in_benchmarks is on, accumulate profile data.
1425
 
        
 
1541
 
1426
1542
        Each self.time() call is individually and separately profiled.
1427
1543
        """
1428
1544
        self.requireFeature(test_lsprof.LSProfFeature)
1429
 
        # overrides the class member with an instance member so no cleanup 
 
1545
        # overrides the class member with an instance member so no cleanup
1430
1546
        # needed.
1431
1547
        self._gather_lsprof_in_benchmarks = True
1432
1548
        self.time(time.sleep, 0.000)
1458
1574
    def test_run_no_parameters(self):
1459
1575
        test = SampleTestCase('_test_pass')
1460
1576
        test.run()
1461
 
    
 
1577
 
1462
1578
    def test_run_enabled_unittest_result(self):
1463
1579
        """Test we revert to regular behaviour when the test is enabled."""
1464
1580
        test = SampleTestCase('_test_pass')
1512
1628
            ],
1513
1629
            result.calls)
1514
1630
 
1515
 
 
1516
 
@symbol_versioning.deprecated_function(zero_eleven)
 
1631
    def test_assert_list_raises_on_generator(self):
 
1632
        def generator_which_will_raise():
 
1633
            # This will not raise until after the first yield
 
1634
            yield 1
 
1635
            raise _TestException()
 
1636
 
 
1637
        e = self.assertListRaises(_TestException, generator_which_will_raise)
 
1638
        self.assertIsInstance(e, _TestException)
 
1639
 
 
1640
        e = self.assertListRaises(Exception, generator_which_will_raise)
 
1641
        self.assertIsInstance(e, _TestException)
 
1642
 
 
1643
    def test_assert_list_raises_on_plain(self):
 
1644
        def plain_exception():
 
1645
            raise _TestException()
 
1646
            return []
 
1647
 
 
1648
        e = self.assertListRaises(_TestException, plain_exception)
 
1649
        self.assertIsInstance(e, _TestException)
 
1650
 
 
1651
        e = self.assertListRaises(Exception, plain_exception)
 
1652
        self.assertIsInstance(e, _TestException)
 
1653
 
 
1654
    def test_assert_list_raises_assert_wrong_exception(self):
 
1655
        class _NotTestException(Exception):
 
1656
            pass
 
1657
 
 
1658
        def wrong_exception():
 
1659
            raise _NotTestException()
 
1660
 
 
1661
        def wrong_exception_generator():
 
1662
            yield 1
 
1663
            yield 2
 
1664
            raise _NotTestException()
 
1665
 
 
1666
        # Wrong exceptions are not intercepted
 
1667
        self.assertRaises(_NotTestException,
 
1668
            self.assertListRaises, _TestException, wrong_exception)
 
1669
        self.assertRaises(_NotTestException,
 
1670
            self.assertListRaises, _TestException, wrong_exception_generator)
 
1671
 
 
1672
    def test_assert_list_raises_no_exception(self):
 
1673
        def success():
 
1674
            return []
 
1675
 
 
1676
        def success_generator():
 
1677
            yield 1
 
1678
            yield 2
 
1679
 
 
1680
        self.assertRaises(AssertionError,
 
1681
            self.assertListRaises, _TestException, success)
 
1682
 
 
1683
        self.assertRaises(AssertionError,
 
1684
            self.assertListRaises, _TestException, success_generator)
 
1685
 
 
1686
 
 
1687
# NB: Don't delete this; it's not actually from 0.11!
 
1688
@deprecated_function(deprecated_in((0, 11, 0)))
1517
1689
def sample_deprecated_function():
1518
1690
    """A deprecated function to test applyDeprecated with."""
1519
1691
    return 2
1526
1698
class ApplyDeprecatedHelper(object):
1527
1699
    """A helper class for ApplyDeprecated tests."""
1528
1700
 
1529
 
    @symbol_versioning.deprecated_method(zero_eleven)
 
1701
    @deprecated_method(deprecated_in((0, 11, 0)))
1530
1702
    def sample_deprecated_method(self, param_one):
1531
1703
        """A deprecated method for testing with."""
1532
1704
        return param_one
1534
1706
    def sample_normal_method(self):
1535
1707
        """A undeprecated method."""
1536
1708
 
1537
 
    @symbol_versioning.deprecated_method(zero_ten)
 
1709
    @deprecated_method(deprecated_in((0, 10, 0)))
1538
1710
    def sample_nested_deprecation(self):
1539
1711
        return sample_deprecated_function()
1540
1712
 
1555
1727
    def test_applyDeprecated_not_deprecated(self):
1556
1728
        sample_object = ApplyDeprecatedHelper()
1557
1729
        # calling an undeprecated callable raises an assertion
1558
 
        self.assertRaises(AssertionError, self.applyDeprecated, zero_eleven,
 
1730
        self.assertRaises(AssertionError, self.applyDeprecated,
 
1731
            deprecated_in((0, 11, 0)),
1559
1732
            sample_object.sample_normal_method)
1560
 
        self.assertRaises(AssertionError, self.applyDeprecated, zero_eleven,
 
1733
        self.assertRaises(AssertionError, self.applyDeprecated,
 
1734
            deprecated_in((0, 11, 0)),
1561
1735
            sample_undeprecated_function, "a param value")
1562
1736
        # calling a deprecated callable (function or method) with the wrong
1563
1737
        # expected deprecation fails.
1564
 
        self.assertRaises(AssertionError, self.applyDeprecated, zero_ten,
 
1738
        self.assertRaises(AssertionError, self.applyDeprecated,
 
1739
            deprecated_in((0, 10, 0)),
1565
1740
            sample_object.sample_deprecated_method, "a param value")
1566
 
        self.assertRaises(AssertionError, self.applyDeprecated, zero_ten,
 
1741
        self.assertRaises(AssertionError, self.applyDeprecated,
 
1742
            deprecated_in((0, 10, 0)),
1567
1743
            sample_deprecated_function)
1568
1744
        # calling a deprecated callable (function or method) with the right
1569
1745
        # expected deprecation returns the functions result.
1570
 
        self.assertEqual("a param value", self.applyDeprecated(zero_eleven,
 
1746
        self.assertEqual("a param value",
 
1747
            self.applyDeprecated(deprecated_in((0, 11, 0)),
1571
1748
            sample_object.sample_deprecated_method, "a param value"))
1572
 
        self.assertEqual(2, self.applyDeprecated(zero_eleven,
 
1749
        self.assertEqual(2, self.applyDeprecated(deprecated_in((0, 11, 0)),
1573
1750
            sample_deprecated_function))
1574
1751
        # calling a nested deprecation with the wrong deprecation version
1575
 
        # fails even if a deeper nested function was deprecated with the 
 
1752
        # fails even if a deeper nested function was deprecated with the
1576
1753
        # supplied version.
1577
1754
        self.assertRaises(AssertionError, self.applyDeprecated,
1578
 
            zero_eleven, sample_object.sample_nested_deprecation)
 
1755
            deprecated_in((0, 11, 0)), sample_object.sample_nested_deprecation)
1579
1756
        # calling a nested deprecation with the right deprecation value
1580
1757
        # returns the calls result.
1581
 
        self.assertEqual(2, self.applyDeprecated(zero_ten,
 
1758
        self.assertEqual(2, self.applyDeprecated(deprecated_in((0, 10, 0)),
1582
1759
            sample_object.sample_nested_deprecation))
1583
1760
 
1584
1761
    def test_callDeprecated(self):
1585
1762
        def testfunc(be_deprecated, result=None):
1586
1763
            if be_deprecated is True:
1587
 
                symbol_versioning.warn('i am deprecated', DeprecationWarning, 
 
1764
                symbol_versioning.warn('i am deprecated', DeprecationWarning,
1588
1765
                                       stacklevel=1)
1589
1766
            return result
1590
1767
        result = self.callDeprecated(['i am deprecated'], testfunc, True)
1655
1832
            return TestSuite()
1656
1833
        out = StringIO()
1657
1834
        err = StringIO()
1658
 
        self.apply_redirected(out, err, None, bzrlib.tests.selftest, 
 
1835
        self.apply_redirected(out, err, None, bzrlib.tests.selftest,
1659
1836
            test_suite_factory=factory)
1660
1837
        self.assertEqual([True], factory_called)
1661
1838
 
1726
1903
class TestSelftestFiltering(TestCase):
1727
1904
 
1728
1905
    def setUp(self):
 
1906
        TestCase.setUp(self)
1729
1907
        self.suite = TestUtil.TestSuite()
1730
1908
        self.loader = TestUtil.TestLoader()
1731
1909
        self.suite.addTest(self.loader.loadTestsFromModuleNames([
1751
1929
 
1752
1930
    def test_condition_id_startswith(self):
1753
1931
        klass = 'bzrlib.tests.test_selftest.TestSelftestFiltering.'
1754
 
        start = klass + 'test_condition_id_starts'
1755
 
        test_names = [klass + 'test_condition_id_startswith']
 
1932
        start1 = klass + 'test_condition_id_starts'
 
1933
        start2 = klass + 'test_condition_id_in'
 
1934
        test_names = [ klass + 'test_condition_id_in_list',
 
1935
                      klass + 'test_condition_id_startswith',
 
1936
                     ]
1756
1937
        filtered_suite = filter_suite_by_condition(
1757
 
            self.suite, tests.condition_id_startswith(start))
1758
 
        my_pattern = 'TestSelftestFiltering.*test_condition_id_startswith'
1759
 
        re_filtered = filter_suite_by_re(self.suite, my_pattern)
1760
 
        self.assertEqual(_test_ids(re_filtered), _test_ids(filtered_suite))
 
1938
            self.suite, tests.condition_id_startswith([start1, start2]))
 
1939
        self.assertEqual(test_names, _test_ids(filtered_suite))
1761
1940
 
1762
1941
    def test_condition_isinstance(self):
1763
1942
        filtered_suite = filter_suite_by_condition(self.suite,
1816
1995
 
1817
1996
    def test_filter_suite_by_id_startswith(self):
1818
1997
        # By design this test may fail if another test is added whose name also
1819
 
        # begins with the start value used.
 
1998
        # begins with one of the start value used.
1820
1999
        klass = 'bzrlib.tests.test_selftest.TestSelftestFiltering.'
1821
 
        start = klass + 'test_filter_suite_by_id_starts'
1822
 
        test_list = [klass + 'test_filter_suite_by_id_startswith']
1823
 
        filtered_suite = tests.filter_suite_by_id_startswith(self.suite, start)
1824
 
        filtered_names = _test_ids(filtered_suite)
 
2000
        start1 = klass + 'test_filter_suite_by_id_starts'
 
2001
        start2 = klass + 'test_filter_suite_by_id_li'
 
2002
        test_list = [klass + 'test_filter_suite_by_id_list',
 
2003
                     klass + 'test_filter_suite_by_id_startswith',
 
2004
                     ]
 
2005
        filtered_suite = tests.filter_suite_by_id_startswith(
 
2006
            self.suite, [start1, start2])
1825
2007
        self.assertEqual(
1826
 
            filtered_names,
1827
 
            ['bzrlib.tests.test_selftest.'
1828
 
             'TestSelftestFiltering.test_filter_suite_by_id_startswith'])
 
2008
            test_list,
 
2009
            _test_ids(filtered_suite),
 
2010
            )
1829
2011
 
1830
2012
    def test_preserve_input(self):
1831
2013
        # NB: Surely this is something in the stdlib to do this?
2137
2319
 
2138
2320
        suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
2139
2321
        self.assertEquals([], _test_ids(suite))
 
2322
 
 
2323
 
 
2324
class TestTestPrefixRegistry(tests.TestCase):
 
2325
 
 
2326
    def _get_registry(self):
 
2327
        tp_registry = tests.TestPrefixAliasRegistry()
 
2328
        return tp_registry
 
2329
 
 
2330
    def test_register_new_prefix(self):
 
2331
        tpr = self._get_registry()
 
2332
        tpr.register('foo', 'fff.ooo.ooo')
 
2333
        self.assertEquals('fff.ooo.ooo', tpr.get('foo'))
 
2334
 
 
2335
    def test_register_existing_prefix(self):
 
2336
        tpr = self._get_registry()
 
2337
        tpr.register('bar', 'bbb.aaa.rrr')
 
2338
        tpr.register('bar', 'bBB.aAA.rRR')
 
2339
        self.assertEquals('bbb.aaa.rrr', tpr.get('bar'))
 
2340
        self.assertContainsRe(self._get_log(keep_log_file=True),
 
2341
                              r'.*bar.*bbb.aaa.rrr.*bBB.aAA.rRR')
 
2342
 
 
2343
    def test_get_unknown_prefix(self):
 
2344
        tpr = self._get_registry()
 
2345
        self.assertRaises(KeyError, tpr.get, 'I am not a prefix')
 
2346
 
 
2347
    def test_resolve_prefix(self):
 
2348
        tpr = self._get_registry()
 
2349
        tpr.register('bar', 'bb.aa.rr')
 
2350
        self.assertEquals('bb.aa.rr', tpr.resolve_alias('bar'))
 
2351
 
 
2352
    def test_resolve_unknown_alias(self):
 
2353
        tpr = self._get_registry()
 
2354
        self.assertRaises(errors.BzrCommandError,
 
2355
                          tpr.resolve_alias, 'I am not a prefix')
 
2356
 
 
2357
    def test_predefined_prefixes(self):
 
2358
        tpr = tests.test_prefix_alias_registry
 
2359
        self.assertEquals('bzrlib', tpr.resolve_alias('bzrlib'))
 
2360
        self.assertEquals('bzrlib.doc', tpr.resolve_alias('bd'))
 
2361
        self.assertEquals('bzrlib.utils', tpr.resolve_alias('bu'))
 
2362
        self.assertEquals('bzrlib.tests', tpr.resolve_alias('bt'))
 
2363
        self.assertEquals('bzrlib.tests.blackbox', tpr.resolve_alias('bb'))
 
2364
        self.assertEquals('bzrlib.plugins', tpr.resolve_alias('bp'))
 
2365
 
 
2366
 
 
2367
class TestRunSuite(TestCase):
 
2368
 
 
2369
    def test_runner_class(self):
 
2370
        """run_suite accepts and uses a runner_class keyword argument."""
 
2371
        class Stub(TestCase):
 
2372
            def test_foo(self):
 
2373
                pass
 
2374
        suite = Stub("test_foo")
 
2375
        calls = []
 
2376
        class MyRunner(TextTestRunner):
 
2377
            def run(self, test):
 
2378
                calls.append(test)
 
2379
                return ExtendedTestResult(self.stream, self.descriptions,
 
2380
                    self.verbosity)
 
2381
        run_suite(suite, runner_class=MyRunner, stream=StringIO())
 
2382
        self.assertEqual(calls, [suite])
 
2383
 
 
2384
    def test_done(self):
 
2385
        """run_suite should call result.done()"""
 
2386
        self.calls = 0
 
2387
        def one_more_call(): self.calls += 1
 
2388
        def test_function():
 
2389
            pass
 
2390
        test = unittest.FunctionTestCase(test_function)
 
2391
        class InstrumentedTestResult(ExtendedTestResult):
 
2392
            def done(self): one_more_call()
 
2393
        class MyRunner(TextTestRunner):
 
2394
            def run(self, test):
 
2395
                return InstrumentedTestResult(self.stream, self.descriptions,
 
2396
                                              self.verbosity)
 
2397
        run_suite(test, runner_class=MyRunner, stream=StringIO())
 
2398
        self.assertEquals(1, self.calls)