~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_selftest.py

  • Committer: Aaron Bentley
  • Date: 2007-02-06 14:52:16 UTC
  • mfrom: (2266 +trunk)
  • mto: This revision was merged to the branch mainline in revision 2268.
  • Revision ID: abentley@panoramicfeedback.com-20070206145216-fcpi8o3ufvuzwbp9
Merge bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006, 2007, 2008 Canonical Ltd
 
1
# Copyright (C) 2005, 2006 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
26
26
 
27
27
import bzrlib
28
28
from bzrlib import (
29
 
    branchbuilder,
30
29
    bzrdir,
31
 
    errors,
32
30
    memorytree,
33
31
    osutils,
34
 
    remote,
35
32
    repository,
36
 
    symbol_versioning,
37
 
    tests,
38
 
    workingtree,
39
33
    )
40
34
from bzrlib.progress import _BaseProgressBar
41
 
from bzrlib.repofmt import (
42
 
    pack_repo,
43
 
    weaverepo,
44
 
    )
45
 
from bzrlib.symbol_versioning import (
46
 
    one_zero,
47
 
    zero_eleven,
48
 
    zero_ten,
49
 
    )
50
35
from bzrlib.tests import (
51
36
                          ChrootedTestCase,
52
 
                          ExtendedTestResult,
53
 
                          Feature,
54
 
                          KnownFailure,
55
37
                          TestCase,
56
38
                          TestCaseInTempDir,
57
39
                          TestCaseWithMemoryTransport,
58
40
                          TestCaseWithTransport,
59
 
                          TestNotApplicable,
60
41
                          TestSkipped,
61
42
                          TestSuite,
62
 
                          TestUtil,
63
43
                          TextTestRunner,
64
 
                          UnavailableFeature,
65
 
                          condition_id_re,
66
 
                          condition_isinstance,
67
 
                          exclude_tests_by_condition,
68
 
                          exclude_tests_by_re,
69
 
                          filter_suite_by_condition,
70
 
                          filter_suite_by_re,
71
 
                          iter_suite_tests,
72
 
                          preserve_input,
73
 
                          randomize_suite,
74
 
                          split_suite_by_condition,
75
 
                          split_suite_by_re,
76
 
                          test_lsprof,
77
 
                          test_suite,
78
44
                          )
79
45
from bzrlib.tests.test_sftp_transport import TestCaseWithSFTPServer
80
46
from bzrlib.tests.TestUtil import _load_module_by_name
 
47
import bzrlib.errors as errors
 
48
from bzrlib import symbol_versioning
 
49
from bzrlib.symbol_versioning import zero_ten, zero_eleven
81
50
from bzrlib.trace import note
82
51
from bzrlib.transport.memory import MemoryServer, MemoryTransport
83
52
from bzrlib.version import _get_bzr_source_tree
84
53
 
85
54
 
86
 
def _test_ids(test_suite):
87
 
    """Get the ids for the tests in a test suite."""
88
 
    return [t.id() for t in iter_suite_tests(test_suite)]
89
 
 
90
 
 
91
55
class SelftestTests(TestCase):
92
56
 
93
57
    def test_import_tests(self):
109
73
                              'a test message\n')
110
74
 
111
75
 
112
 
class TestUnicodeFilename(TestCase):
113
 
 
114
 
    def test_probe_passes(self):
115
 
        """UnicodeFilename._probe passes."""
116
 
        # We can't test much more than that because the behaviour depends
117
 
        # on the platform.
118
 
        tests.UnicodeFilename._probe()
119
 
 
120
 
 
121
76
class TestTreeShape(TestCaseInTempDir):
122
77
 
123
78
    def test_unicode_paths(self):
124
 
        self.requireFeature(tests.UnicodeFilename)
125
 
 
126
79
        filename = u'hell\u00d8'
127
 
        self.build_tree_contents([(filename, 'contents of hello')])
 
80
        try:
 
81
            self.build_tree_contents([(filename, 'contents of hello')])
 
82
        except UnicodeEncodeError:
 
83
            raise TestSkipped("can't build unicode working tree in "
 
84
                "filesystem encoding %s" % sys.getfilesystemencoding())
128
85
        self.failUnlessExists(filename)
129
86
 
130
87
 
139
96
    """
140
97
 
141
98
    def test_get_transport_permutations(self):
142
 
        # this checks that get_test_permutations defined by the module is
143
 
        # called by the adapter get_transport_test_permutations method.
 
99
        # this checks that we the module get_test_permutations call
 
100
        # is made by the adapter get_transport_test_permitations method.
144
101
        class MockModule(object):
145
102
            def get_test_permutations(self):
146
103
                return sample_permutation
147
104
        sample_permutation = [(1,2), (3,4)]
148
 
        from bzrlib.tests.test_transport_implementations \
149
 
            import TransportTestProviderAdapter
 
105
        from bzrlib.transport import TransportTestProviderAdapter
150
106
        adapter = TransportTestProviderAdapter()
151
107
        self.assertEqual(sample_permutation,
152
108
                         adapter.get_transport_test_permutations(MockModule()))
153
109
 
154
110
    def test_adapter_checks_all_modules(self):
155
 
        # this checks that the adapter returns as many permutations as there
156
 
        # are in all the registered transport modules - we assume if this
157
 
        # matches its probably doing the right thing especially in combination
158
 
        # with the tests for setting the right classes below.
159
 
        from bzrlib.tests.test_transport_implementations \
160
 
            import TransportTestProviderAdapter
161
 
        from bzrlib.transport import _get_transport_modules
 
111
        # this checks that the adapter returns as many permurtations as
 
112
        # there are in all the registered# transport modules for there
 
113
        # - we assume if this matches its probably doing the right thing
 
114
        # especially in combination with the tests for setting the right
 
115
        # classes below.
 
116
        from bzrlib.transport import (TransportTestProviderAdapter,
 
117
                                      _get_transport_modules
 
118
                                      )
162
119
        modules = _get_transport_modules()
163
120
        permutation_count = 0
164
121
        for module in modules:
181
138
        # This test used to know about all the possible transports and the
182
139
        # order they were returned but that seems overly brittle (mbp
183
140
        # 20060307)
184
 
        from bzrlib.tests.test_transport_implementations \
185
 
            import TransportTestProviderAdapter
186
 
        scenarios = TransportTestProviderAdapter().scenarios
 
141
        input_test = TestTransportProviderAdapter(
 
142
            "test_adapter_sets_transport_class")
 
143
        from bzrlib.transport import TransportTestProviderAdapter
 
144
        suite = TransportTestProviderAdapter().adapt(input_test)
 
145
        tests = list(iter(suite))
 
146
        self.assertTrue(len(tests) > 6)
187
147
        # there are at least that many builtin transports
188
 
        self.assertTrue(len(scenarios) > 6)
189
 
        one_scenario = scenarios[0]
190
 
        self.assertIsInstance(one_scenario[0], str)
191
 
        self.assertTrue(issubclass(one_scenario[1]["transport_class"],
 
148
        one_test = tests[0]
 
149
        self.assertTrue(issubclass(one_test.transport_class, 
192
150
                                   bzrlib.transport.Transport))
193
 
        self.assertTrue(issubclass(one_scenario[1]["transport_server"],
 
151
        self.assertTrue(issubclass(one_test.transport_server, 
194
152
                                   bzrlib.transport.Server))
195
153
 
196
154
 
197
155
class TestBranchProviderAdapter(TestCase):
198
156
    """A group of tests that test the branch implementation test adapter."""
199
157
 
200
 
    def test_constructor(self):
 
158
    def test_adapted_tests(self):
201
159
        # check that constructor parameters are passed through to the adapted
202
160
        # test.
203
 
        from bzrlib.tests.branch_implementations import BranchTestProviderAdapter
 
161
        from bzrlib.branch import BranchTestProviderAdapter
 
162
        input_test = TestBranchProviderAdapter(
 
163
            "test_adapted_tests")
204
164
        server1 = "a"
205
165
        server2 = "b"
206
166
        formats = [("c", "C"), ("d", "D")]
207
167
        adapter = BranchTestProviderAdapter(server1, server2, formats)
208
 
        self.assertEqual(2, len(adapter.scenarios))
209
 
        self.assertEqual([
210
 
            ('str',
211
 
             {'branch_format': 'c',
212
 
              'bzrdir_format': 'C',
213
 
              'transport_readonly_server': 'b',
214
 
              'transport_server': 'a'}),
215
 
            ('str',
216
 
             {'branch_format': 'd',
217
 
              'bzrdir_format': 'D',
218
 
              'transport_readonly_server': 'b',
219
 
              'transport_server': 'a'})],
220
 
            adapter.scenarios)
 
168
        suite = adapter.adapt(input_test)
 
169
        tests = list(iter(suite))
 
170
        self.assertEqual(2, len(tests))
 
171
        self.assertEqual(tests[0].branch_format, formats[0][0])
 
172
        self.assertEqual(tests[0].bzrdir_format, formats[0][1])
 
173
        self.assertEqual(tests[0].transport_server, server1)
 
174
        self.assertEqual(tests[0].transport_readonly_server, server2)
 
175
        self.assertEqual(tests[1].branch_format, formats[1][0])
 
176
        self.assertEqual(tests[1].bzrdir_format, formats[1][1])
 
177
        self.assertEqual(tests[1].transport_server, server1)
 
178
        self.assertEqual(tests[1].transport_readonly_server, server2)
221
179
 
222
180
 
223
181
class TestBzrDirProviderAdapter(TestCase):
226
184
    def test_adapted_tests(self):
227
185
        # check that constructor parameters are passed through to the adapted
228
186
        # test.
229
 
        from bzrlib.tests.bzrdir_implementations import BzrDirTestProviderAdapter
230
 
        vfs_factory = "v"
 
187
        from bzrlib.bzrdir import BzrDirTestProviderAdapter
 
188
        input_test = TestBzrDirProviderAdapter(
 
189
            "test_adapted_tests")
231
190
        server1 = "a"
232
191
        server2 = "b"
233
192
        formats = ["c", "d"]
234
 
        adapter = BzrDirTestProviderAdapter(vfs_factory,
235
 
            server1, server2, formats)
236
 
        self.assertEqual([
237
 
            ('str',
238
 
             {'bzrdir_format': 'c',
239
 
              'transport_readonly_server': 'b',
240
 
              'transport_server': 'a',
241
 
              'vfs_transport_factory': 'v'}),
242
 
            ('str',
243
 
             {'bzrdir_format': 'd',
244
 
              'transport_readonly_server': 'b',
245
 
              'transport_server': 'a',
246
 
              'vfs_transport_factory': 'v'})],
247
 
            adapter.scenarios)
248
 
 
249
 
 
250
 
class TestRepositoryParameterisation(TestCase):
 
193
        adapter = BzrDirTestProviderAdapter(server1, server2, formats)
 
194
        suite = adapter.adapt(input_test)
 
195
        tests = list(iter(suite))
 
196
        self.assertEqual(2, len(tests))
 
197
        self.assertEqual(tests[0].bzrdir_format, formats[0])
 
198
        self.assertEqual(tests[0].transport_server, server1)
 
199
        self.assertEqual(tests[0].transport_readonly_server, server2)
 
200
        self.assertEqual(tests[1].bzrdir_format, formats[1])
 
201
        self.assertEqual(tests[1].transport_server, server1)
 
202
        self.assertEqual(tests[1].transport_readonly_server, server2)
 
203
 
 
204
 
 
205
class TestRepositoryProviderAdapter(TestCase):
251
206
    """A group of tests that test the repository implementation test adapter."""
252
207
 
253
 
    def test_formats_to_scenarios(self):
254
 
        """The adapter can generate all the scenarios needed."""
255
 
        from bzrlib.tests.repository_implementations import formats_to_scenarios
256
 
        formats = [("(c)", remote.RemoteRepositoryFormat()),
257
 
                   ("(d)", repository.format_registry.get(
258
 
                        'Bazaar pack repository format 1 (needs bzr 0.92)\n'))]
259
 
        no_vfs_scenarios = formats_to_scenarios(formats, "server", "readonly",
260
 
            None)
261
 
        vfs_scenarios = formats_to_scenarios(formats, "server", "readonly",
262
 
            vfs_transport_factory="vfs")
263
 
        # no_vfs generate scenarios without vfs_transport_factory
264
 
        self.assertEqual([
265
 
            ('RemoteRepositoryFormat(c)',
266
 
             {'bzrdir_format': remote.RemoteBzrDirFormat(),
267
 
              'repository_format': remote.RemoteRepositoryFormat(),
268
 
              'transport_readonly_server': 'readonly',
269
 
              'transport_server': 'server'}),
270
 
            ('RepositoryFormatKnitPack1(d)',
271
 
             {'bzrdir_format': bzrdir.BzrDirMetaFormat1(),
272
 
              'repository_format': pack_repo.RepositoryFormatKnitPack1(),
273
 
              'transport_readonly_server': 'readonly',
274
 
              'transport_server': 'server'})],
275
 
            no_vfs_scenarios)
276
 
        self.assertEqual([
277
 
            ('RemoteRepositoryFormat(c)',
278
 
             {'bzrdir_format': remote.RemoteBzrDirFormat(),
279
 
              'repository_format': remote.RemoteRepositoryFormat(),
280
 
              'transport_readonly_server': 'readonly',
281
 
              'transport_server': 'server',
282
 
              'vfs_transport_factory': 'vfs'}),
283
 
            ('RepositoryFormatKnitPack1(d)',
284
 
             {'bzrdir_format': bzrdir.BzrDirMetaFormat1(),
285
 
              'repository_format': pack_repo.RepositoryFormatKnitPack1(),
286
 
              'transport_readonly_server': 'readonly',
287
 
              'transport_server': 'server',
288
 
              'vfs_transport_factory': 'vfs'})],
289
 
            vfs_scenarios)
290
 
 
291
 
 
292
 
class TestTestScenarioApplier(TestCase):
293
 
    """Tests for the test adaption facilities."""
294
 
 
295
 
    def test_adapt_applies_scenarios(self):
296
 
        from bzrlib.tests.repository_implementations import TestScenarioApplier
297
 
        input_test = TestTestScenarioApplier("test_adapt_test_to_scenario")
298
 
        adapter = TestScenarioApplier()
299
 
        adapter.scenarios = [("1", "dict"), ("2", "settings")]
300
 
        calls = []
301
 
        def capture_call(test, scenario):
302
 
            calls.append((test, scenario))
303
 
            return test
304
 
        adapter.adapt_test_to_scenario = capture_call
305
 
        adapter.adapt(input_test)
306
 
        self.assertEqual([(input_test, ("1", "dict")),
307
 
            (input_test, ("2", "settings"))], calls)
308
 
 
309
 
    def test_adapt_test_to_scenario(self):
310
 
        from bzrlib.tests.repository_implementations import TestScenarioApplier
311
 
        input_test = TestTestScenarioApplier("test_adapt_test_to_scenario")
312
 
        adapter = TestScenarioApplier()
313
 
        # setup two adapted tests
314
 
        adapted_test1 = adapter.adapt_test_to_scenario(input_test,
315
 
            ("new id",
316
 
            {"bzrdir_format":"bzr_format",
317
 
             "repository_format":"repo_fmt",
318
 
             "transport_server":"transport_server",
319
 
             "transport_readonly_server":"readonly-server"}))
320
 
        adapted_test2 = adapter.adapt_test_to_scenario(input_test,
321
 
            ("new id 2", {"bzrdir_format":None}))
322
 
        # input_test should have been altered.
323
 
        self.assertRaises(AttributeError, getattr, input_test, "bzrdir_format")
324
 
        # the new tests are mutually incompatible, ensuring it has 
325
 
        # made new ones, and unspecified elements in the scenario
326
 
        # should not have been altered.
327
 
        self.assertEqual("bzr_format", adapted_test1.bzrdir_format)
328
 
        self.assertEqual("repo_fmt", adapted_test1.repository_format)
329
 
        self.assertEqual("transport_server", adapted_test1.transport_server)
330
 
        self.assertEqual("readonly-server",
331
 
            adapted_test1.transport_readonly_server)
332
 
        self.assertEqual(
333
 
            "bzrlib.tests.test_selftest.TestTestScenarioApplier."
334
 
            "test_adapt_test_to_scenario(new id)",
335
 
            adapted_test1.id())
336
 
        self.assertEqual(None, adapted_test2.bzrdir_format)
337
 
        self.assertEqual(
338
 
            "bzrlib.tests.test_selftest.TestTestScenarioApplier."
339
 
            "test_adapt_test_to_scenario(new id 2)",
340
 
            adapted_test2.id())
 
208
    def test_adapted_tests(self):
 
209
        # check that constructor parameters are passed through to the adapted
 
210
        # test.
 
211
        from bzrlib.repository import RepositoryTestProviderAdapter
 
212
        input_test = TestRepositoryProviderAdapter(
 
213
            "test_adapted_tests")
 
214
        server1 = "a"
 
215
        server2 = "b"
 
216
        formats = [("c", "C"), ("d", "D")]
 
217
        adapter = RepositoryTestProviderAdapter(server1, server2, formats)
 
218
        suite = adapter.adapt(input_test)
 
219
        tests = list(iter(suite))
 
220
        self.assertEqual(2, len(tests))
 
221
        self.assertEqual(tests[0].bzrdir_format, formats[0][1])
 
222
        self.assertEqual(tests[0].repository_format, formats[0][0])
 
223
        self.assertEqual(tests[0].transport_server, server1)
 
224
        self.assertEqual(tests[0].transport_readonly_server, server2)
 
225
        self.assertEqual(tests[1].bzrdir_format, formats[1][1])
 
226
        self.assertEqual(tests[1].repository_format, formats[1][0])
 
227
        self.assertEqual(tests[1].transport_server, server1)
 
228
        self.assertEqual(tests[1].transport_readonly_server, server2)
341
229
 
342
230
 
343
231
class TestInterRepositoryProviderAdapter(TestCase):
346
234
    def test_adapted_tests(self):
347
235
        # check that constructor parameters are passed through to the adapted
348
236
        # test.
349
 
        from bzrlib.tests.interrepository_implementations import \
350
 
            InterRepositoryTestProviderAdapter
 
237
        from bzrlib.repository import InterRepositoryTestProviderAdapter
 
238
        input_test = TestInterRepositoryProviderAdapter(
 
239
            "test_adapted_tests")
351
240
        server1 = "a"
352
241
        server2 = "b"
353
242
        formats = [(str, "C1", "C2"), (int, "D1", "D2")]
354
243
        adapter = InterRepositoryTestProviderAdapter(server1, server2, formats)
355
 
        self.assertEqual([
356
 
            ('str,str,str',
357
 
             {'interrepo_class': str,
358
 
              'repository_format': 'C1',
359
 
              'repository_format_to': 'C2',
360
 
              'transport_readonly_server': 'b',
361
 
              'transport_server': 'a'}),
362
 
            ('int,str,str',
363
 
             {'interrepo_class': int,
364
 
              'repository_format': 'D1',
365
 
              'repository_format_to': 'D2',
366
 
              'transport_readonly_server': 'b',
367
 
              'transport_server': 'a'})],
368
 
            adapter.formats_to_scenarios(formats))
 
244
        suite = adapter.adapt(input_test)
 
245
        tests = list(iter(suite))
 
246
        self.assertEqual(2, len(tests))
 
247
        self.assertEqual(tests[0].interrepo_class, formats[0][0])
 
248
        self.assertEqual(tests[0].repository_format, formats[0][1])
 
249
        self.assertEqual(tests[0].repository_format_to, formats[0][2])
 
250
        self.assertEqual(tests[0].transport_server, server1)
 
251
        self.assertEqual(tests[0].transport_readonly_server, server2)
 
252
        self.assertEqual(tests[1].interrepo_class, formats[1][0])
 
253
        self.assertEqual(tests[1].repository_format, formats[1][1])
 
254
        self.assertEqual(tests[1].repository_format_to, formats[1][2])
 
255
        self.assertEqual(tests[1].transport_server, server1)
 
256
        self.assertEqual(tests[1].transport_readonly_server, server2)
 
257
 
 
258
 
 
259
class TestInterVersionedFileProviderAdapter(TestCase):
 
260
    """A group of tests that test the InterVersionedFile test adapter."""
 
261
 
 
262
    def test_adapted_tests(self):
 
263
        # check that constructor parameters are passed through to the adapted
 
264
        # test.
 
265
        from bzrlib.versionedfile import InterVersionedFileTestProviderAdapter
 
266
        input_test = TestInterRepositoryProviderAdapter(
 
267
            "test_adapted_tests")
 
268
        server1 = "a"
 
269
        server2 = "b"
 
270
        formats = [(str, "C1", "C2"), (int, "D1", "D2")]
 
271
        adapter = InterVersionedFileTestProviderAdapter(server1, server2, formats)
 
272
        suite = adapter.adapt(input_test)
 
273
        tests = list(iter(suite))
 
274
        self.assertEqual(2, len(tests))
 
275
        self.assertEqual(tests[0].interversionedfile_class, formats[0][0])
 
276
        self.assertEqual(tests[0].versionedfile_factory, formats[0][1])
 
277
        self.assertEqual(tests[0].versionedfile_factory_to, formats[0][2])
 
278
        self.assertEqual(tests[0].transport_server, server1)
 
279
        self.assertEqual(tests[0].transport_readonly_server, server2)
 
280
        self.assertEqual(tests[1].interversionedfile_class, formats[1][0])
 
281
        self.assertEqual(tests[1].versionedfile_factory, formats[1][1])
 
282
        self.assertEqual(tests[1].versionedfile_factory_to, formats[1][2])
 
283
        self.assertEqual(tests[1].transport_server, server1)
 
284
        self.assertEqual(tests[1].transport_readonly_server, server2)
 
285
 
 
286
 
 
287
class TestRevisionStoreProviderAdapter(TestCase):
 
288
    """A group of tests that test the RevisionStore test adapter."""
 
289
 
 
290
    def test_adapted_tests(self):
 
291
        # check that constructor parameters are passed through to the adapted
 
292
        # test.
 
293
        from bzrlib.store.revision import RevisionStoreTestProviderAdapter
 
294
        input_test = TestRevisionStoreProviderAdapter(
 
295
            "test_adapted_tests")
 
296
        # revision stores need a store factory - i.e. RevisionKnit
 
297
        #, a readonly and rw transport 
 
298
        # transport servers:
 
299
        server1 = "a"
 
300
        server2 = "b"
 
301
        store_factories = ["c", "d"]
 
302
        adapter = RevisionStoreTestProviderAdapter(server1, server2, store_factories)
 
303
        suite = adapter.adapt(input_test)
 
304
        tests = list(iter(suite))
 
305
        self.assertEqual(2, len(tests))
 
306
        self.assertEqual(tests[0].store_factory, store_factories[0][0])
 
307
        self.assertEqual(tests[0].transport_server, server1)
 
308
        self.assertEqual(tests[0].transport_readonly_server, server2)
 
309
        self.assertEqual(tests[1].store_factory, store_factories[1][0])
 
310
        self.assertEqual(tests[1].transport_server, server1)
 
311
        self.assertEqual(tests[1].transport_readonly_server, server2)
369
312
 
370
313
 
371
314
class TestWorkingTreeProviderAdapter(TestCase):
372
315
    """A group of tests that test the workingtree implementation test adapter."""
373
316
 
374
 
    def test_scenarios(self):
 
317
    def test_adapted_tests(self):
375
318
        # check that constructor parameters are passed through to the adapted
376
319
        # test.
377
 
        from bzrlib.tests.workingtree_implementations \
378
 
            import WorkingTreeTestProviderAdapter
 
320
        from bzrlib.workingtree import WorkingTreeTestProviderAdapter
 
321
        input_test = TestWorkingTreeProviderAdapter(
 
322
            "test_adapted_tests")
379
323
        server1 = "a"
380
324
        server2 = "b"
381
 
        formats = [workingtree.WorkingTreeFormat2(),
382
 
                   workingtree.WorkingTreeFormat3(),]
 
325
        formats = [("c", "C"), ("d", "D")]
383
326
        adapter = WorkingTreeTestProviderAdapter(server1, server2, formats)
384
 
        self.assertEqual([
385
 
            ('WorkingTreeFormat2',
386
 
             {'bzrdir_format': formats[0]._matchingbzrdir,
387
 
              'transport_readonly_server': 'b',
388
 
              'transport_server': 'a',
389
 
              'workingtree_format': formats[0]}),
390
 
            ('WorkingTreeFormat3',
391
 
             {'bzrdir_format': formats[1]._matchingbzrdir,
392
 
              'transport_readonly_server': 'b',
393
 
              'transport_server': 'a',
394
 
              'workingtree_format': formats[1]})],
395
 
            adapter.scenarios)
 
327
        suite = adapter.adapt(input_test)
 
328
        tests = list(iter(suite))
 
329
        self.assertEqual(2, len(tests))
 
330
        self.assertEqual(tests[0].workingtree_format, formats[0][0])
 
331
        self.assertEqual(tests[0].bzrdir_format, formats[0][1])
 
332
        self.assertEqual(tests[0].transport_server, server1)
 
333
        self.assertEqual(tests[0].transport_readonly_server, server2)
 
334
        self.assertEqual(tests[1].workingtree_format, formats[1][0])
 
335
        self.assertEqual(tests[1].bzrdir_format, formats[1][1])
 
336
        self.assertEqual(tests[1].transport_server, server1)
 
337
        self.assertEqual(tests[1].transport_readonly_server, server2)
396
338
 
397
339
 
398
340
class TestTreeProviderAdapter(TestCase):
411
353
            return_parameter,
412
354
            revision_tree_from_workingtree
413
355
            )
 
356
        from bzrlib.workingtree import WorkingTreeFormat
414
357
        input_test = TestTreeProviderAdapter(
415
358
            "test_adapted_tests")
416
359
        server1 = "a"
417
360
        server2 = "b"
418
 
        formats = [workingtree.WorkingTreeFormat2(),
419
 
                   workingtree.WorkingTreeFormat3(),]
 
361
        formats = [("c", "C"), ("d", "D")]
420
362
        adapter = TreeTestProviderAdapter(server1, server2, formats)
421
363
        suite = adapter.adapt(input_test)
422
364
        tests = list(iter(suite))
423
 
        # XXX We should not have tests fail as we add more scenarios
424
 
        # abentley 20080412
425
 
        self.assertEqual(5, len(tests))
426
 
        # this must match the default format setp up in
427
 
        # TreeTestProviderAdapter.adapt
428
 
        default_format = workingtree.WorkingTreeFormat3
429
 
        self.assertEqual(tests[0].workingtree_format, formats[0])
430
 
        self.assertEqual(tests[0].bzrdir_format, formats[0]._matchingbzrdir)
 
365
        self.assertEqual(3, len(tests))
 
366
        default_format = WorkingTreeFormat.get_default_format()
 
367
        self.assertEqual(tests[0].workingtree_format, formats[0][0])
 
368
        self.assertEqual(tests[0].bzrdir_format, formats[0][1])
431
369
        self.assertEqual(tests[0].transport_server, server1)
432
370
        self.assertEqual(tests[0].transport_readonly_server, server2)
433
 
        self.assertEqual(tests[0]._workingtree_to_test_tree, return_parameter)
434
 
        self.assertEqual(tests[1].workingtree_format, formats[1])
435
 
        self.assertEqual(tests[1].bzrdir_format, formats[1]._matchingbzrdir)
 
371
        self.assertEqual(tests[0].workingtree_to_test_tree, return_parameter)
 
372
        self.assertEqual(tests[1].workingtree_format, formats[1][0])
 
373
        self.assertEqual(tests[1].bzrdir_format, formats[1][1])
436
374
        self.assertEqual(tests[1].transport_server, server1)
437
375
        self.assertEqual(tests[1].transport_readonly_server, server2)
438
 
        self.assertEqual(tests[1]._workingtree_to_test_tree, return_parameter)
439
 
        self.assertIsInstance(tests[2].workingtree_format, default_format)
440
 
        #self.assertEqual(tests[2].bzrdir_format,
441
 
        #                 default_format._matchingbzrdir)
 
376
        self.assertEqual(tests[1].workingtree_to_test_tree, return_parameter)
 
377
        self.assertEqual(tests[2].workingtree_format, default_format)
 
378
        self.assertEqual(tests[2].bzrdir_format, default_format._matchingbzrdir)
442
379
        self.assertEqual(tests[2].transport_server, server1)
443
380
        self.assertEqual(tests[2].transport_readonly_server, server2)
444
 
        self.assertEqual(tests[2]._workingtree_to_test_tree,
 
381
        self.assertEqual(tests[2].workingtree_to_test_tree,
445
382
            revision_tree_from_workingtree)
446
383
 
447
384
 
456
393
        # because each optimiser can be direction specific, we need to test
457
394
        # each optimiser in its chosen direction.
458
395
        # unlike the TestProviderAdapter we dont want to automatically add a
459
 
        # parameterized one for WorkingTree - the optimisers will tell us what
 
396
        # parameterised one for WorkingTree - the optimisers will tell us what
460
397
        # ones to add.
461
398
        from bzrlib.tests.tree_implementations import (
462
399
            return_parameter,
472
409
        server2 = "b"
473
410
        format1 = WorkingTreeFormat2()
474
411
        format2 = WorkingTreeFormat3()
475
 
        formats = [(str, format1, format2, "converter1"),
476
 
            (int, format2, format1, "converter2")]
 
412
        formats = [(str, format1, format2, False, True),
 
413
            (int, format2, format1, False, True)]
477
414
        adapter = InterTreeTestProviderAdapter(server1, server2, formats)
478
415
        suite = adapter.adapt(input_test)
479
416
        tests = list(iter(suite))
480
417
        self.assertEqual(2, len(tests))
481
418
        self.assertEqual(tests[0].intertree_class, formats[0][0])
482
419
        self.assertEqual(tests[0].workingtree_format, formats[0][1])
483
 
        self.assertEqual(tests[0].workingtree_format_to, formats[0][2])
484
 
        self.assertEqual(tests[0].mutable_trees_to_test_trees, formats[0][3])
485
 
        self.assertEqual(tests[0]._workingtree_to_test_tree, return_parameter)
 
420
        self.assertEqual(tests[0].workingtree_to_test_tree, formats[0][2])
 
421
        self.assertEqual(tests[0].workingtree_format_to, formats[0][3])
 
422
        self.assertEqual(tests[0].workingtree_to_test_tree_to, formats[0][4])
486
423
        self.assertEqual(tests[0].transport_server, server1)
487
424
        self.assertEqual(tests[0].transport_readonly_server, server2)
488
425
        self.assertEqual(tests[1].intertree_class, formats[1][0])
489
426
        self.assertEqual(tests[1].workingtree_format, formats[1][1])
490
 
        self.assertEqual(tests[1].workingtree_format_to, formats[1][2])
491
 
        self.assertEqual(tests[1].mutable_trees_to_test_trees, formats[1][3])
492
 
        self.assertEqual(tests[1]._workingtree_to_test_tree, return_parameter)
 
427
        self.assertEqual(tests[1].workingtree_to_test_tree, formats[1][2])
 
428
        self.assertEqual(tests[1].workingtree_format_to, formats[1][3])
 
429
        self.assertEqual(tests[1].workingtree_to_test_tree_to, formats[1][4])
493
430
        self.assertEqual(tests[1].transport_server, server1)
494
431
        self.assertEqual(tests[1].transport_readonly_server, server2)
495
432
 
499
436
    def test_home_is_not_working(self):
500
437
        self.assertNotEqual(self.test_dir, self.test_home_dir)
501
438
        cwd = osutils.getcwd()
502
 
        self.assertIsSameRealPath(self.test_dir, cwd)
503
 
        self.assertIsSameRealPath(self.test_home_dir, os.environ['HOME'])
 
439
        self.assertEqual(self.test_dir, cwd)
 
440
        self.assertEqual(self.test_home_dir, os.environ['HOME'])
504
441
 
505
442
 
506
443
class TestTestCaseWithMemoryTransport(TestCaseWithMemoryTransport):
514
451
        few tests should need to do that), and having a missing dir as home is
515
452
        an effective way to ensure that this is the case.
516
453
        """
517
 
        self.assertIsSameRealPath(
518
 
            self.TEST_ROOT + "/MemoryTransportMissingHomeDir",
 
454
        self.assertEqual(self.TEST_ROOT + "/MemoryTransportMissingHomeDir",
519
455
            self.test_home_dir)
520
 
        self.assertIsSameRealPath(self.test_home_dir, os.environ['HOME'])
 
456
        self.assertEqual(self.test_home_dir, os.environ['HOME'])
521
457
        
522
458
    def test_cwd_is_TEST_ROOT(self):
523
 
        self.assertIsSameRealPath(self.test_dir, self.TEST_ROOT)
 
459
        self.assertEqual(self.test_dir, self.TEST_ROOT)
524
460
        cwd = osutils.getcwd()
525
 
        self.assertIsSameRealPath(self.test_dir, cwd)
 
461
        self.assertEqual(self.test_dir, cwd)
526
462
 
527
463
    def test_make_branch_and_memory_tree(self):
528
464
        """In TestCaseWithMemoryTransport we should not make the branch on disk.
539
475
    def test_make_branch_and_memory_tree_with_format(self):
540
476
        """make_branch_and_memory_tree should accept a format option."""
541
477
        format = bzrdir.BzrDirMetaFormat1()
542
 
        format.repository_format = weaverepo.RepositoryFormat7()
 
478
        format.repository_format = repository.RepositoryFormat7()
543
479
        tree = self.make_branch_and_memory_tree('dir', format=format)
544
480
        # Guard against regression into MemoryTransport leaking
545
481
        # files to disk instead of keeping them in memory.
548
484
        self.assertEqual(format.repository_format.__class__,
549
485
            tree.branch.repository._format.__class__)
550
486
 
551
 
    def test_make_branch_builder(self):
552
 
        builder = self.make_branch_builder('dir')
553
 
        self.assertIsInstance(builder, branchbuilder.BranchBuilder)
554
 
        # Guard against regression into MemoryTransport leaking
555
 
        # files to disk instead of keeping them in memory.
556
 
        self.failIf(osutils.lexists('dir'))
557
 
 
558
 
    def test_make_branch_builder_with_format(self):
559
 
        # Use a repo layout that doesn't conform to a 'named' layout, to ensure
560
 
        # that the format objects are used.
561
 
        format = bzrdir.BzrDirMetaFormat1()
562
 
        repo_format = weaverepo.RepositoryFormat7()
563
 
        format.repository_format = repo_format
564
 
        builder = self.make_branch_builder('dir', format=format)
565
 
        the_branch = builder.get_branch()
566
 
        # Guard against regression into MemoryTransport leaking
567
 
        # files to disk instead of keeping them in memory.
568
 
        self.failIf(osutils.lexists('dir'))
569
 
        self.assertEqual(format.repository_format.__class__,
570
 
                         the_branch.repository._format.__class__)
571
 
        self.assertEqual(repo_format.get_format_string(),
572
 
                         self.get_transport().get_bytes(
573
 
                            'dir/.bzr/repository/format'))
574
 
 
575
 
    def test_make_branch_builder_with_format_name(self):
576
 
        builder = self.make_branch_builder('dir', format='knit')
577
 
        the_branch = builder.get_branch()
578
 
        # Guard against regression into MemoryTransport leaking
579
 
        # files to disk instead of keeping them in memory.
580
 
        self.failIf(osutils.lexists('dir'))
581
 
        dir_format = bzrdir.format_registry.make_bzrdir('knit')
582
 
        self.assertEqual(dir_format.repository_format.__class__,
583
 
                         the_branch.repository._format.__class__)
584
 
        self.assertEqual('Bazaar-NG Knit Repository Format 1',
585
 
                         self.get_transport().get_bytes(
586
 
                            'dir/.bzr/repository/format'))
587
 
 
588
 
    def test_safety_net(self):
589
 
        """No test should modify the safety .bzr directory.
590
 
 
591
 
        We just test that the _check_safety_net private method raises
592
 
        AssertionError, it's easier than building a test suite with the same
593
 
        test.
594
 
        """
595
 
        # Oops, a commit in the current directory (i.e. without local .bzr
596
 
        # directory) will crawl up the hierarchy to find a .bzr directory.
597
 
        self.run_bzr(['commit', '-mfoo', '--unchanged'])
598
 
        # But we have a safety net in place.
599
 
        self.assertRaises(AssertionError, self._check_safety_net)
600
 
 
601
487
 
602
488
class TestTestCaseWithTransport(TestCaseWithTransport):
603
489
    """Tests for the convenience functions TestCaseWithTransport introduces."""
606
492
        from bzrlib.transport import get_transport
607
493
        from bzrlib.transport.memory import MemoryServer
608
494
        from bzrlib.transport.readonly import ReadonlyTransportDecorator
609
 
        self.vfs_transport_factory = MemoryServer
 
495
        self.transport_server = MemoryServer
610
496
        self.transport_readonly_server = None
611
497
        # calling get_readonly_transport() constructs a decorator on the url
612
498
        # for the server
619
505
        self.assertEqual(t2.base[:-1], t.abspath('foo/bar'))
620
506
 
621
507
    def test_get_readonly_url_http(self):
622
 
        from bzrlib.tests.http_server import HttpServer
 
508
        from bzrlib.tests.HttpServer import HttpServer
623
509
        from bzrlib.transport import get_transport
624
510
        from bzrlib.transport.local import LocalURLServer
625
511
        from bzrlib.transport.http import HttpTransportBase
643
529
        self.assertRaises(AssertionError, self.assertIsDirectory, 'a_file', t)
644
530
        self.assertRaises(AssertionError, self.assertIsDirectory, 'not_here', t)
645
531
 
646
 
    def test_make_branch_builder(self):
647
 
        builder = self.make_branch_builder('dir')
648
 
        rev_id = builder.build_commit()
649
 
        self.failUnlessExists('dir')
650
 
        a_dir = bzrdir.BzrDir.open('dir')
651
 
        self.assertRaises(errors.NoWorkingTree, a_dir.open_workingtree)
652
 
        a_branch = a_dir.open_branch()
653
 
        builder_branch = builder.get_branch()
654
 
        self.assertEqual(a_branch.base, builder_branch.base)
655
 
        self.assertEqual((1, rev_id), builder_branch.last_revision_info())
656
 
        self.assertEqual((1, rev_id), a_branch.last_revision_info())
657
 
 
658
532
 
659
533
class TestTestCaseTransports(TestCaseWithTransport):
660
534
 
661
535
    def setUp(self):
662
536
        super(TestTestCaseTransports, self).setUp()
663
 
        self.vfs_transport_factory = MemoryServer
 
537
        self.transport_server = MemoryServer
664
538
 
665
539
    def test_make_bzrdir_preserves_transport(self):
666
540
        t = self.get_transport()
705
579
 
706
580
class TestTestResult(TestCase):
707
581
 
708
 
    def check_timing(self, test_case, expected_re):
 
582
    def test_elapsed_time_with_benchmarking(self):
709
583
        result = bzrlib.tests.TextTestResult(self._log_file,
710
 
                descriptions=0,
711
 
                verbosity=1,
712
 
                )
713
 
        test_case.run(result)
714
 
        timed_string = result._testTimeString(test_case)
715
 
        self.assertContainsRe(timed_string, expected_re)
716
 
 
717
 
    def test_test_reporting(self):
718
 
        class ShortDelayTestCase(TestCase):
719
 
            def test_short_delay(self):
720
 
                time.sleep(0.003)
721
 
            def test_short_benchmark(self):
722
 
                self.time(time.sleep, 0.003)
723
 
        self.check_timing(ShortDelayTestCase('test_short_delay'),
724
 
                          r"^ +[0-9]+ms$")
 
584
                                        descriptions=0,
 
585
                                        verbosity=1,
 
586
                                        )
 
587
        result._recordTestStartTime()
 
588
        time.sleep(0.003)
 
589
        result.extractBenchmarkTime(self)
 
590
        timed_string = result._testTimeString()
 
591
        # without explicit benchmarking, we should get a simple time.
 
592
        self.assertContainsRe(timed_string, "^ *[ 1-9][0-9]ms$")
725
593
        # if a benchmark time is given, we want a x of y style result.
726
 
        self.check_timing(ShortDelayTestCase('test_short_benchmark'),
727
 
                          r"^ +[0-9]+ms/ +[0-9]+ms$")
 
594
        self.time(time.sleep, 0.001)
 
595
        result.extractBenchmarkTime(self)
 
596
        timed_string = result._testTimeString()
 
597
        self.assertContainsRe(timed_string, "^ *[ 1-9][0-9]ms/ *[ 1-9][0-9]ms$")
 
598
        # extracting the time from a non-bzrlib testcase sets to None
 
599
        result._recordTestStartTime()
 
600
        result.extractBenchmarkTime(
 
601
            unittest.FunctionTestCase(self.test_elapsed_time_with_benchmarking))
 
602
        timed_string = result._testTimeString()
 
603
        self.assertContainsRe(timed_string, "^ *[ 1-9][0-9]ms$")
 
604
        # cheat. Yes, wash thy mouth out with soap.
 
605
        self._benchtime = None
728
606
 
729
 
    def test_unittest_reporting_unittest_class(self):
730
 
        # getting the time from a non-bzrlib test works ok
731
 
        class ShortDelayTestCase(unittest.TestCase):
732
 
            def test_short_delay(self):
733
 
                time.sleep(0.003)
734
 
        self.check_timing(ShortDelayTestCase('test_short_delay'),
735
 
                          r"^ +[0-9]+ms$")
736
 
        
737
607
    def test_assigned_benchmark_file_stores_date(self):
738
608
        output = StringIO()
739
609
        result = bzrlib.tests.TextTestResult(self._log_file,
742
612
                                        bench_history=output
743
613
                                        )
744
614
        output_string = output.getvalue()
 
615
        
745
616
        # if you are wondering about the regexp please read the comment in
746
617
        # test_bench_history (bzrlib.tests.test_selftest.TestRunner)
747
618
        # XXX: what comment?  -- Andrew Bennetts
777
648
 
778
649
    def test_lsprofiling(self):
779
650
        """Verbose test result prints lsprof statistics from test cases."""
780
 
        self.requireFeature(test_lsprof.LSProfFeature)
 
651
        try:
 
652
            import bzrlib.lsprof
 
653
        except ImportError:
 
654
            raise TestSkipped("lsprof not installed.")
781
655
        result_stream = StringIO()
782
656
        result = bzrlib.tests.VerboseTestResult(
783
657
            unittest._WritelnDecorator(result_stream),
812
686
        self.assertContainsRe(output,
813
687
            r"LSProf output for <type 'unicode'>\(\('world',\), {'errors': 'replace'}\)\n")
814
688
 
815
 
    def test_known_failure(self):
816
 
        """A KnownFailure being raised should trigger several result actions."""
817
 
        class InstrumentedTestResult(ExtendedTestResult):
818
 
 
819
 
            def report_test_start(self, test): pass
820
 
            def report_known_failure(self, test, err):
821
 
                self._call = test, err
822
 
        result = InstrumentedTestResult(None, None, None, None)
823
 
        def test_function():
824
 
            raise KnownFailure('failed!')
825
 
        test = unittest.FunctionTestCase(test_function)
826
 
        test.run(result)
827
 
        # it should invoke 'report_known_failure'.
828
 
        self.assertEqual(2, len(result._call))
829
 
        self.assertEqual(test, result._call[0])
830
 
        self.assertEqual(KnownFailure, result._call[1][0])
831
 
        self.assertIsInstance(result._call[1][1], KnownFailure)
832
 
        # we dont introspec the traceback, if the rest is ok, it would be
833
 
        # exceptional for it not to be.
834
 
        # it should update the known_failure_count on the object.
835
 
        self.assertEqual(1, result.known_failure_count)
836
 
        # the result should be successful.
837
 
        self.assertTrue(result.wasSuccessful())
838
 
 
839
 
    def test_verbose_report_known_failure(self):
840
 
        # verbose test output formatting
841
 
        result_stream = StringIO()
842
 
        result = bzrlib.tests.VerboseTestResult(
843
 
            unittest._WritelnDecorator(result_stream),
844
 
            descriptions=0,
845
 
            verbosity=2,
846
 
            )
847
 
        test = self.get_passing_test()
848
 
        result.startTest(test)
849
 
        prefix = len(result_stream.getvalue())
850
 
        # the err parameter has the shape:
851
 
        # (class, exception object, traceback)
852
 
        # KnownFailures dont get their tracebacks shown though, so we
853
 
        # can skip that.
854
 
        err = (KnownFailure, KnownFailure('foo'), None)
855
 
        result.report_known_failure(test, err)
856
 
        output = result_stream.getvalue()[prefix:]
857
 
        lines = output.splitlines()
858
 
        self.assertContainsRe(lines[0], r'XFAIL *\d+ms$')
859
 
        self.assertEqual(lines[1], '    foo')
860
 
        self.assertEqual(2, len(lines))
861
 
 
862
 
    def test_text_report_known_failure(self):
863
 
        # text test output formatting
864
 
        pb = MockProgress()
865
 
        result = bzrlib.tests.TextTestResult(
866
 
            None,
867
 
            descriptions=0,
868
 
            verbosity=1,
869
 
            pb=pb,
870
 
            )
871
 
        test = self.get_passing_test()
872
 
        # this seeds the state to handle reporting the test.
873
 
        result.startTest(test)
874
 
        # the err parameter has the shape:
875
 
        # (class, exception object, traceback)
876
 
        # KnownFailures dont get their tracebacks shown though, so we
877
 
        # can skip that.
878
 
        err = (KnownFailure, KnownFailure('foo'), None)
879
 
        result.report_known_failure(test, err)
880
 
        self.assertEqual(
881
 
            [
882
 
            ('update', '[1 in 0s] passing_test', None, None),
883
 
            ('note', 'XFAIL: %s\n%s\n', ('passing_test', err[1]))
884
 
            ],
885
 
            pb.calls)
886
 
        # known_failures should be printed in the summary, so if we run a test
887
 
        # after there are some known failures, the update prefix should match
888
 
        # this.
889
 
        result.known_failure_count = 3
890
 
        test.run(result)
891
 
        self.assertEqual(
892
 
            [
893
 
            ('update', '[2 in 0s] passing_test', None, None),
894
 
            ],
895
 
            pb.calls[2:])
896
 
 
897
 
    def get_passing_test(self):
898
 
        """Return a test object that can't be run usefully."""
899
 
        def passing_test():
900
 
            pass
901
 
        return unittest.FunctionTestCase(passing_test)
902
 
 
903
 
    def test_add_not_supported(self):
904
 
        """Test the behaviour of invoking addNotSupported."""
905
 
        class InstrumentedTestResult(ExtendedTestResult):
906
 
            def report_test_start(self, test): pass
907
 
            def report_unsupported(self, test, feature):
908
 
                self._call = test, feature
909
 
        result = InstrumentedTestResult(None, None, None, None)
910
 
        test = SampleTestCase('_test_pass')
911
 
        feature = Feature()
912
 
        result.startTest(test)
913
 
        result.addNotSupported(test, feature)
914
 
        # it should invoke 'report_unsupported'.
915
 
        self.assertEqual(2, len(result._call))
916
 
        self.assertEqual(test, result._call[0])
917
 
        self.assertEqual(feature, result._call[1])
918
 
        # the result should be successful.
919
 
        self.assertTrue(result.wasSuccessful())
920
 
        # it should record the test against a count of tests not run due to
921
 
        # this feature.
922
 
        self.assertEqual(1, result.unsupported['Feature'])
923
 
        # and invoking it again should increment that counter
924
 
        result.addNotSupported(test, feature)
925
 
        self.assertEqual(2, result.unsupported['Feature'])
926
 
 
927
 
    def test_verbose_report_unsupported(self):
928
 
        # verbose test output formatting
929
 
        result_stream = StringIO()
930
 
        result = bzrlib.tests.VerboseTestResult(
931
 
            unittest._WritelnDecorator(result_stream),
932
 
            descriptions=0,
933
 
            verbosity=2,
934
 
            )
935
 
        test = self.get_passing_test()
936
 
        feature = Feature()
937
 
        result.startTest(test)
938
 
        prefix = len(result_stream.getvalue())
939
 
        result.report_unsupported(test, feature)
940
 
        output = result_stream.getvalue()[prefix:]
941
 
        lines = output.splitlines()
942
 
        self.assertEqual(lines, ['NODEP                   0ms', "    The feature 'Feature' is not available."])
943
 
    
944
 
    def test_text_report_unsupported(self):
945
 
        # text test output formatting
946
 
        pb = MockProgress()
947
 
        result = bzrlib.tests.TextTestResult(
948
 
            None,
949
 
            descriptions=0,
950
 
            verbosity=1,
951
 
            pb=pb,
952
 
            )
953
 
        test = self.get_passing_test()
954
 
        feature = Feature()
955
 
        # this seeds the state to handle reporting the test.
956
 
        result.startTest(test)
957
 
        result.report_unsupported(test, feature)
958
 
        # no output on unsupported features
959
 
        self.assertEqual(
960
 
            [('update', '[1 in 0s] passing_test', None, None)
961
 
            ],
962
 
            pb.calls)
963
 
        # the number of missing features should be printed in the progress
964
 
        # summary, so check for that.
965
 
        result.unsupported = {'foo':0, 'bar':0}
966
 
        test.run(result)
967
 
        self.assertEqual(
968
 
            [
969
 
            ('update', '[2 in 0s, 2 missing] passing_test', None, None),
970
 
            ],
971
 
            pb.calls[1:])
972
 
    
973
 
    def test_unavailable_exception(self):
974
 
        """An UnavailableFeature being raised should invoke addNotSupported."""
975
 
        class InstrumentedTestResult(ExtendedTestResult):
976
 
 
977
 
            def report_test_start(self, test): pass
978
 
            def addNotSupported(self, test, feature):
979
 
                self._call = test, feature
980
 
        result = InstrumentedTestResult(None, None, None, None)
981
 
        feature = Feature()
982
 
        def test_function():
983
 
            raise UnavailableFeature(feature)
984
 
        test = unittest.FunctionTestCase(test_function)
985
 
        test.run(result)
986
 
        # it should invoke 'addNotSupported'.
987
 
        self.assertEqual(2, len(result._call))
988
 
        self.assertEqual(test, result._call[0])
989
 
        self.assertEqual(feature, result._call[1])
990
 
        # and not count as an error
991
 
        self.assertEqual(0, result.error_count)
992
 
 
993
 
    def test_strict_with_unsupported_feature(self):
994
 
        result = bzrlib.tests.TextTestResult(self._log_file, descriptions=0,
995
 
                                             verbosity=1)
996
 
        test = self.get_passing_test()
997
 
        feature = "Unsupported Feature"
998
 
        result.addNotSupported(test, feature)
999
 
        self.assertFalse(result.wasStrictlySuccessful())
1000
 
        self.assertEqual(None, result._extractBenchmarkTime(test))
1001
 
 
1002
 
    def test_strict_with_known_failure(self):
1003
 
        result = bzrlib.tests.TextTestResult(self._log_file, descriptions=0,
1004
 
                                             verbosity=1)
1005
 
        test = self.get_passing_test()
1006
 
        err = (KnownFailure, KnownFailure('foo'), None)
1007
 
        result._addKnownFailure(test, err)
1008
 
        self.assertFalse(result.wasStrictlySuccessful())
1009
 
        self.assertEqual(None, result._extractBenchmarkTime(test))
1010
 
 
1011
 
    def test_strict_with_success(self):
1012
 
        result = bzrlib.tests.TextTestResult(self._log_file, descriptions=0,
1013
 
                                             verbosity=1)
1014
 
        test = self.get_passing_test()
1015
 
        result.addSuccess(test)
1016
 
        self.assertTrue(result.wasStrictlySuccessful())
1017
 
        self.assertEqual(None, result._extractBenchmarkTime(test))
1018
 
 
1019
 
 
1020
 
class TestUnicodeFilenameFeature(TestCase):
1021
 
 
1022
 
    def test_probe_passes(self):
1023
 
        """UnicodeFilenameFeature._probe passes."""
1024
 
        # We can't test much more than that because the behaviour depends
1025
 
        # on the platform.
1026
 
        tests.UnicodeFilenameFeature._probe()
1027
 
 
1028
689
 
1029
690
class TestRunner(TestCase):
1030
691
 
1047
708
        finally:
1048
709
            TestCaseInTempDir.TEST_ROOT = old_root
1049
710
 
1050
 
    def test_known_failure_failed_run(self):
1051
 
        # run a test that generates a known failure which should be printed in
1052
 
        # the final output when real failures occur.
1053
 
        def known_failure_test():
1054
 
            raise KnownFailure('failed')
1055
 
        test = unittest.TestSuite()
1056
 
        test.addTest(unittest.FunctionTestCase(known_failure_test))
1057
 
        def failing_test():
1058
 
            raise AssertionError('foo')
1059
 
        test.addTest(unittest.FunctionTestCase(failing_test))
1060
 
        stream = StringIO()
1061
 
        runner = TextTestRunner(stream=stream)
1062
 
        result = self.run_test_runner(runner, test)
1063
 
        lines = stream.getvalue().splitlines()
1064
 
        self.assertEqual([
1065
 
            '',
1066
 
            '======================================================================',
1067
 
            'FAIL: unittest.FunctionTestCase (failing_test)',
1068
 
            '----------------------------------------------------------------------',
1069
 
            'Traceback (most recent call last):',
1070
 
            '    raise AssertionError(\'foo\')',
1071
 
            'AssertionError: foo',
1072
 
            '',
1073
 
            '----------------------------------------------------------------------',
1074
 
            '',
1075
 
            'FAILED (failures=1, known_failure_count=1)'],
1076
 
            lines[0:5] + lines[6:10] + lines[11:])
1077
 
 
1078
 
    def test_known_failure_ok_run(self):
1079
 
        # run a test that generates a known failure which should be printed in the final output.
1080
 
        def known_failure_test():
1081
 
            raise KnownFailure('failed')
1082
 
        test = unittest.FunctionTestCase(known_failure_test)
1083
 
        stream = StringIO()
1084
 
        runner = TextTestRunner(stream=stream)
1085
 
        result = self.run_test_runner(runner, test)
1086
 
        self.assertContainsRe(stream.getvalue(),
1087
 
            '\n'
1088
 
            '-*\n'
1089
 
            'Ran 1 test in .*\n'
1090
 
            '\n'
1091
 
            'OK \\(known_failures=1\\)\n')
1092
 
 
1093
711
    def test_skipped_test(self):
1094
712
        # run a test that is skipped, and check the suite as a whole still
1095
713
        # succeeds.
1096
714
        # skipping_test must be hidden in here so it's not run as a real test
1097
715
        def skipping_test():
1098
716
            raise TestSkipped('test intentionally skipped')
1099
 
 
1100
 
        runner = TextTestRunner(stream=self._log_file)
 
717
        runner = TextTestRunner(stream=self._log_file, keep_output=True)
1101
718
        test = unittest.FunctionTestCase(skipping_test)
1102
719
        result = self.run_test_runner(runner, test)
1103
720
        self.assertTrue(result.wasSuccessful())
1104
721
 
1105
 
    def test_skipped_from_setup(self):
1106
 
        calls = []
1107
 
        class SkippedSetupTest(TestCase):
1108
 
 
1109
 
            def setUp(self):
1110
 
                calls.append('setUp')
1111
 
                self.addCleanup(self.cleanup)
1112
 
                raise TestSkipped('skipped setup')
1113
 
 
1114
 
            def test_skip(self):
1115
 
                self.fail('test reached')
1116
 
 
1117
 
            def cleanup(self):
1118
 
                calls.append('cleanup')
1119
 
 
1120
 
        runner = TextTestRunner(stream=self._log_file)
1121
 
        test = SkippedSetupTest('test_skip')
1122
 
        result = self.run_test_runner(runner, test)
1123
 
        self.assertTrue(result.wasSuccessful())
1124
 
        # Check if cleanup was called the right number of times.
1125
 
        self.assertEqual(['setUp', 'cleanup'], calls)
1126
 
 
1127
 
    def test_skipped_from_test(self):
1128
 
        calls = []
1129
 
        class SkippedTest(TestCase):
1130
 
 
1131
 
            def setUp(self):
1132
 
                calls.append('setUp')
1133
 
                self.addCleanup(self.cleanup)
1134
 
 
1135
 
            def test_skip(self):
1136
 
                raise TestSkipped('skipped test')
1137
 
 
1138
 
            def cleanup(self):
1139
 
                calls.append('cleanup')
1140
 
 
1141
 
        runner = TextTestRunner(stream=self._log_file)
1142
 
        test = SkippedTest('test_skip')
1143
 
        result = self.run_test_runner(runner, test)
1144
 
        self.assertTrue(result.wasSuccessful())
1145
 
        # Check if cleanup was called the right number of times.
1146
 
        self.assertEqual(['setUp', 'cleanup'], calls)
1147
 
 
1148
 
    def test_not_applicable(self):
1149
 
        # run a test that is skipped because it's not applicable
1150
 
        def not_applicable_test():
1151
 
            from bzrlib.tests import TestNotApplicable
1152
 
            raise TestNotApplicable('this test never runs')
1153
 
        out = StringIO()
1154
 
        runner = TextTestRunner(stream=out, verbosity=2)
1155
 
        test = unittest.FunctionTestCase(not_applicable_test)
1156
 
        result = self.run_test_runner(runner, test)
1157
 
        self._log_file.write(out.getvalue())
1158
 
        self.assertTrue(result.wasSuccessful())
1159
 
        self.assertTrue(result.wasStrictlySuccessful())
1160
 
        self.assertContainsRe(out.getvalue(),
1161
 
                r'(?m)not_applicable_test   * N/A')
1162
 
        self.assertContainsRe(out.getvalue(),
1163
 
                r'(?m)^    this test never runs')
1164
 
 
1165
 
    def test_not_applicable_demo(self):
1166
 
        # just so you can see it in the test output
1167
 
        raise TestNotApplicable('this test is just a demonstation')
1168
 
 
1169
 
    def test_unsupported_features_listed(self):
1170
 
        """When unsupported features are encountered they are detailed."""
1171
 
        class Feature1(Feature):
1172
 
            def _probe(self): return False
1173
 
        class Feature2(Feature):
1174
 
            def _probe(self): return False
1175
 
        # create sample tests
1176
 
        test1 = SampleTestCase('_test_pass')
1177
 
        test1._test_needs_features = [Feature1()]
1178
 
        test2 = SampleTestCase('_test_pass')
1179
 
        test2._test_needs_features = [Feature2()]
1180
 
        test = unittest.TestSuite()
1181
 
        test.addTest(test1)
1182
 
        test.addTest(test2)
1183
 
        stream = StringIO()
1184
 
        runner = TextTestRunner(stream=stream)
1185
 
        result = self.run_test_runner(runner, test)
1186
 
        lines = stream.getvalue().splitlines()
1187
 
        self.assertEqual([
1188
 
            'OK',
1189
 
            "Missing feature 'Feature1' skipped 1 tests.",
1190
 
            "Missing feature 'Feature2' skipped 1 tests.",
1191
 
            ],
1192
 
            lines[-3:])
1193
 
 
1194
722
    def test_bench_history(self):
1195
723
        # tests that the running the benchmark produces a history file
1196
724
        # containing a timestamp and the revision id of the bzrlib source which
1206
734
            revision_id = workingtree.get_parent_ids()[0]
1207
735
            self.assertEndsWith(output_string.rstrip(), revision_id)
1208
736
 
1209
 
    def assertLogDeleted(self, test):
1210
 
        log = test._get_log()
1211
 
        self.assertEqual("DELETED log file to reduce memory footprint", log)
1212
 
        self.assertEqual('', test._log_contents)
1213
 
        self.assertIs(None, test._log_file_name)
1214
 
 
1215
737
    def test_success_log_deleted(self):
1216
738
        """Successful tests have their log deleted"""
1217
739
 
1225
747
        test = LogTester('test_success')
1226
748
        result = self.run_test_runner(runner, test)
1227
749
 
1228
 
        self.assertLogDeleted(test)
1229
 
 
1230
 
    def test_skipped_log_deleted(self):
1231
 
        """Skipped tests have their log deleted"""
1232
 
 
1233
 
        class LogTester(TestCase):
1234
 
 
1235
 
            def test_skipped(self):
1236
 
                self.log('this will be removed\n')
1237
 
                raise tests.TestSkipped()
1238
 
 
1239
 
        sio = cStringIO.StringIO()
1240
 
        runner = TextTestRunner(stream=sio)
1241
 
        test = LogTester('test_skipped')
1242
 
        result = self.run_test_runner(runner, test)
1243
 
 
1244
 
        self.assertLogDeleted(test)
1245
 
 
1246
 
    def test_not_aplicable_log_deleted(self):
1247
 
        """Not applicable tests have their log deleted"""
1248
 
 
1249
 
        class LogTester(TestCase):
1250
 
 
1251
 
            def test_not_applicable(self):
1252
 
                self.log('this will be removed\n')
1253
 
                raise tests.TestNotApplicable()
1254
 
 
1255
 
        sio = cStringIO.StringIO()
1256
 
        runner = TextTestRunner(stream=sio)
1257
 
        test = LogTester('test_not_applicable')
1258
 
        result = self.run_test_runner(runner, test)
1259
 
 
1260
 
        self.assertLogDeleted(test)
1261
 
 
1262
 
    def test_known_failure_log_deleted(self):
1263
 
        """Know failure tests have their log deleted"""
1264
 
 
1265
 
        class LogTester(TestCase):
1266
 
 
1267
 
            def test_known_failure(self):
1268
 
                self.log('this will be removed\n')
1269
 
                raise tests.KnownFailure()
1270
 
 
1271
 
        sio = cStringIO.StringIO()
1272
 
        runner = TextTestRunner(stream=sio)
1273
 
        test = LogTester('test_known_failure')
1274
 
        result = self.run_test_runner(runner, test)
1275
 
 
1276
 
        self.assertLogDeleted(test)
 
750
        log = test._get_log()
 
751
        self.assertEqual("DELETED log file to reduce memory footprint", log)
 
752
        self.assertEqual('', test._log_contents)
 
753
        self.assertIs(None, test._log_file_name)
1277
754
 
1278
755
    def test_fail_log_kept(self):
1279
756
        """Failed tests have their log kept"""
1320
797
        self.assertEqual(log, test._log_contents)
1321
798
 
1322
799
 
1323
 
class SampleTestCase(TestCase):
1324
 
 
1325
 
    def _test_pass(self):
1326
 
        pass
1327
 
 
1328
 
class _TestException(Exception):
1329
 
    pass
1330
 
 
1331
800
class TestTestCase(TestCase):
1332
801
    """Tests that test the core bzrlib TestCase."""
1333
802
 
1334
 
    def test_debug_flags_sanitised(self):
1335
 
        """The bzrlib debug flags should be sanitised by setUp."""
1336
 
        # we could set something and run a test that will check
1337
 
        # it gets santised, but this is probably sufficient for now:
1338
 
        # if someone runs the test with -Dsomething it will error.
1339
 
        self.assertEqual(set(), bzrlib.debug.debug_flags)
1340
 
 
1341
803
    def inner_test(self):
1342
804
        # the inner child test
1343
805
        note("inner_test")
1395
857
        """The bzrlib hooks should be sanitised by setUp."""
1396
858
        self.assertEqual(bzrlib.branch.BranchHooks(),
1397
859
            bzrlib.branch.Branch.hooks)
1398
 
        self.assertEqual(bzrlib.smart.server.SmartServerHooks(),
1399
 
            bzrlib.smart.server.SmartTCPServer.hooks)
1400
860
 
1401
861
    def test__gather_lsprof_in_benchmarks(self):
1402
862
        """When _gather_lsprof_in_benchmarks is on, accumulate profile data.
1403
863
        
1404
864
        Each self.time() call is individually and separately profiled.
1405
865
        """
1406
 
        self.requireFeature(test_lsprof.LSProfFeature)
 
866
        try:
 
867
            import bzrlib.lsprof
 
868
        except ImportError:
 
869
            raise TestSkipped("lsprof not installed.")
1407
870
        # overrides the class member with an instance member so no cleanup 
1408
871
        # needed.
1409
872
        self._gather_lsprof_in_benchmarks = True
1415
878
        self.assertIsInstance(self._benchcalls[0][1], bzrlib.lsprof.Stats)
1416
879
        self.assertIsInstance(self._benchcalls[1][1], bzrlib.lsprof.Stats)
1417
880
 
1418
 
    def test_knownFailure(self):
1419
 
        """Self.knownFailure() should raise a KnownFailure exception."""
1420
 
        self.assertRaises(KnownFailure, self.knownFailure, "A Failure")
1421
 
 
1422
 
    def test_requireFeature_available(self):
1423
 
        """self.requireFeature(available) is a no-op."""
1424
 
        class Available(Feature):
1425
 
            def _probe(self):return True
1426
 
        feature = Available()
1427
 
        self.requireFeature(feature)
1428
 
 
1429
 
    def test_requireFeature_unavailable(self):
1430
 
        """self.requireFeature(unavailable) raises UnavailableFeature."""
1431
 
        class Unavailable(Feature):
1432
 
            def _probe(self):return False
1433
 
        feature = Unavailable()
1434
 
        self.assertRaises(UnavailableFeature, self.requireFeature, feature)
1435
 
 
1436
 
    def test_run_no_parameters(self):
1437
 
        test = SampleTestCase('_test_pass')
1438
 
        test.run()
1439
 
    
1440
 
    def test_run_enabled_unittest_result(self):
1441
 
        """Test we revert to regular behaviour when the test is enabled."""
1442
 
        test = SampleTestCase('_test_pass')
1443
 
        class EnabledFeature(object):
1444
 
            def available(self):
1445
 
                return True
1446
 
        test._test_needs_features = [EnabledFeature()]
1447
 
        result = unittest.TestResult()
1448
 
        test.run(result)
1449
 
        self.assertEqual(1, result.testsRun)
1450
 
        self.assertEqual([], result.errors)
1451
 
        self.assertEqual([], result.failures)
1452
 
 
1453
 
    def test_run_disabled_unittest_result(self):
1454
 
        """Test our compatability for disabled tests with unittest results."""
1455
 
        test = SampleTestCase('_test_pass')
1456
 
        class DisabledFeature(object):
1457
 
            def available(self):
1458
 
                return False
1459
 
        test._test_needs_features = [DisabledFeature()]
1460
 
        result = unittest.TestResult()
1461
 
        test.run(result)
1462
 
        self.assertEqual(1, result.testsRun)
1463
 
        self.assertEqual([], result.errors)
1464
 
        self.assertEqual([], result.failures)
1465
 
 
1466
 
    def test_run_disabled_supporting_result(self):
1467
 
        """Test disabled tests behaviour with support aware results."""
1468
 
        test = SampleTestCase('_test_pass')
1469
 
        class DisabledFeature(object):
1470
 
            def available(self):
1471
 
                return False
1472
 
        the_feature = DisabledFeature()
1473
 
        test._test_needs_features = [the_feature]
1474
 
        class InstrumentedTestResult(unittest.TestResult):
1475
 
            def __init__(self):
1476
 
                unittest.TestResult.__init__(self)
1477
 
                self.calls = []
1478
 
            def startTest(self, test):
1479
 
                self.calls.append(('startTest', test))
1480
 
            def stopTest(self, test):
1481
 
                self.calls.append(('stopTest', test))
1482
 
            def addNotSupported(self, test, feature):
1483
 
                self.calls.append(('addNotSupported', test, feature))
1484
 
        result = InstrumentedTestResult()
1485
 
        test.run(result)
1486
 
        self.assertEqual([
1487
 
            ('startTest', test),
1488
 
            ('addNotSupported', test, the_feature),
1489
 
            ('stopTest', test),
1490
 
            ],
1491
 
            result.calls)
1492
 
 
1493
 
    def test_assert_list_raises_on_generator(self):
1494
 
        def generator_which_will_raise():
1495
 
            # This will not raise until after the first yield
1496
 
            yield 1
1497
 
            raise _TestException()
1498
 
 
1499
 
        e = self.assertListRaises(_TestException, generator_which_will_raise)
1500
 
        self.assertIsInstance(e, _TestException)
1501
 
 
1502
 
        e = self.assertListRaises(Exception, generator_which_will_raise)
1503
 
        self.assertIsInstance(e, _TestException)
1504
 
 
1505
 
    def test_assert_list_raises_on_plain(self):
1506
 
        def plain_exception():
1507
 
            raise _TestException()
1508
 
            return []
1509
 
 
1510
 
        e = self.assertListRaises(_TestException, plain_exception)
1511
 
        self.assertIsInstance(e, _TestException)
1512
 
 
1513
 
        e = self.assertListRaises(Exception, plain_exception)
1514
 
        self.assertIsInstance(e, _TestException)
1515
 
 
1516
 
    def test_assert_list_raises_assert_wrong_exception(self):
1517
 
        class _NotTestException(Exception):
1518
 
            pass
1519
 
 
1520
 
        def wrong_exception():
1521
 
            raise _NotTestException()
1522
 
 
1523
 
        def wrong_exception_generator():
1524
 
            yield 1
1525
 
            yield 2
1526
 
            raise _NotTestException()
1527
 
 
1528
 
        # Wrong exceptions are not intercepted
1529
 
        self.assertRaises(_NotTestException,
1530
 
            self.assertListRaises, _TestException, wrong_exception)
1531
 
        self.assertRaises(_NotTestException,
1532
 
            self.assertListRaises, _TestException, wrong_exception_generator)
1533
 
 
1534
 
    def test_assert_list_raises_no_exception(self):
1535
 
        def success():
1536
 
            return []
1537
 
 
1538
 
        def success_generator():
1539
 
            yield 1
1540
 
            yield 2
1541
 
 
1542
 
        self.assertRaises(AssertionError,
1543
 
            self.assertListRaises, _TestException, success)
1544
 
 
1545
 
        self.assertRaises(AssertionError,
1546
 
            self.assertListRaises, _TestException, success_generator)
1547
 
 
1548
881
 
1549
882
@symbol_versioning.deprecated_function(zero_eleven)
1550
883
def sample_deprecated_function():
1628
961
        self.callDeprecated([], testfunc, be_deprecated=False)
1629
962
 
1630
963
 
1631
 
class TestWarningTests(TestCase):
1632
 
    """Tests for calling methods that raise warnings."""
1633
 
 
1634
 
    def test_callCatchWarnings(self):
1635
 
        def meth(a, b):
1636
 
            warnings.warn("this is your last warning")
1637
 
            return a + b
1638
 
        wlist, result = self.callCatchWarnings(meth, 1, 2)
1639
 
        self.assertEquals(3, result)
1640
 
        # would like just to compare them, but UserWarning doesn't implement
1641
 
        # eq well
1642
 
        w0, = wlist
1643
 
        self.assertIsInstance(w0, UserWarning)
1644
 
        self.assertEquals("this is your last warning", str(w0))
1645
 
 
1646
 
 
1647
964
class TestConvenienceMakers(TestCaseWithTransport):
1648
965
    """Test for the make_* convenience functions."""
1649
966
 
1693
1010
        self.assertEqual([True], factory_called)
1694
1011
 
1695
1012
 
1696
 
class TestKnownFailure(TestCase):
1697
 
 
1698
 
    def test_known_failure(self):
1699
 
        """Check that KnownFailure is defined appropriately."""
1700
 
        # a KnownFailure is an assertion error for compatability with unaware
1701
 
        # runners.
1702
 
        self.assertIsInstance(KnownFailure(""), AssertionError)
1703
 
 
1704
 
    def test_expect_failure(self):
1705
 
        try:
1706
 
            self.expectFailure("Doomed to failure", self.assertTrue, False)
1707
 
        except KnownFailure, e:
1708
 
            self.assertEqual('Doomed to failure', e.args[0])
1709
 
        try:
1710
 
            self.expectFailure("Doomed to failure", self.assertTrue, True)
1711
 
        except AssertionError, e:
1712
 
            self.assertEqual('Unexpected success.  Should have failed:'
1713
 
                             ' Doomed to failure', e.args[0])
1714
 
        else:
1715
 
            self.fail('Assertion not raised')
1716
 
 
1717
 
 
1718
 
class TestFeature(TestCase):
1719
 
 
1720
 
    def test_caching(self):
1721
 
        """Feature._probe is called by the feature at most once."""
1722
 
        class InstrumentedFeature(Feature):
1723
 
            def __init__(self):
1724
 
                Feature.__init__(self)
1725
 
                self.calls = []
1726
 
            def _probe(self):
1727
 
                self.calls.append('_probe')
1728
 
                return False
1729
 
        feature = InstrumentedFeature()
1730
 
        feature.available()
1731
 
        self.assertEqual(['_probe'], feature.calls)
1732
 
        feature.available()
1733
 
        self.assertEqual(['_probe'], feature.calls)
1734
 
 
1735
 
    def test_named_str(self):
1736
 
        """Feature.__str__ should thunk to feature_name()."""
1737
 
        class NamedFeature(Feature):
1738
 
            def feature_name(self):
1739
 
                return 'symlinks'
1740
 
        feature = NamedFeature()
1741
 
        self.assertEqual('symlinks', str(feature))
1742
 
 
1743
 
    def test_default_str(self):
1744
 
        """Feature.__str__ should default to __class__.__name__."""
1745
 
        class NamedFeature(Feature):
1746
 
            pass
1747
 
        feature = NamedFeature()
1748
 
        self.assertEqual('NamedFeature', str(feature))
1749
 
 
1750
 
 
1751
 
class TestUnavailableFeature(TestCase):
1752
 
 
1753
 
    def test_access_feature(self):
1754
 
        feature = Feature()
1755
 
        exception = UnavailableFeature(feature)
1756
 
        self.assertIs(feature, exception.args[0])
1757
 
 
1758
 
 
1759
 
class TestSelftestFiltering(TestCase):
1760
 
 
1761
 
    def setUp(self):
1762
 
        self.suite = TestUtil.TestSuite()
1763
 
        self.loader = TestUtil.TestLoader()
1764
 
        self.suite.addTest(self.loader.loadTestsFromModuleNames([
1765
 
            'bzrlib.tests.test_selftest']))
1766
 
        self.all_names = _test_ids(self.suite)
1767
 
 
1768
 
    def test_condition_id_re(self):
1769
 
        test_name = ('bzrlib.tests.test_selftest.TestSelftestFiltering.'
1770
 
            'test_condition_id_re')
1771
 
        filtered_suite = filter_suite_by_condition(self.suite,
1772
 
            condition_id_re('test_condition_id_re'))
1773
 
        self.assertEqual([test_name], _test_ids(filtered_suite))
1774
 
 
1775
 
    def test_condition_id_in_list(self):
1776
 
        test_names = ['bzrlib.tests.test_selftest.TestSelftestFiltering.'
1777
 
                      'test_condition_id_in_list']
1778
 
        id_list = tests.TestIdList(test_names)
1779
 
        filtered_suite = filter_suite_by_condition(
1780
 
            self.suite, tests.condition_id_in_list(id_list))
1781
 
        my_pattern = 'TestSelftestFiltering.*test_condition_id_in_list'
1782
 
        re_filtered = filter_suite_by_re(self.suite, my_pattern)
1783
 
        self.assertEqual(_test_ids(re_filtered), _test_ids(filtered_suite))
1784
 
 
1785
 
    def test_condition_id_startswith(self):
1786
 
        klass = 'bzrlib.tests.test_selftest.TestSelftestFiltering.'
1787
 
        start = klass + 'test_condition_id_starts'
1788
 
        test_names = [klass + 'test_condition_id_startswith']
1789
 
        filtered_suite = filter_suite_by_condition(
1790
 
            self.suite, tests.condition_id_startswith(start))
1791
 
        my_pattern = 'TestSelftestFiltering.*test_condition_id_startswith'
1792
 
        re_filtered = filter_suite_by_re(self.suite, my_pattern)
1793
 
        self.assertEqual(_test_ids(re_filtered), _test_ids(filtered_suite))
1794
 
 
1795
 
    def test_condition_isinstance(self):
1796
 
        filtered_suite = filter_suite_by_condition(self.suite,
1797
 
            condition_isinstance(self.__class__))
1798
 
        class_pattern = 'bzrlib.tests.test_selftest.TestSelftestFiltering.'
1799
 
        re_filtered = filter_suite_by_re(self.suite, class_pattern)
1800
 
        self.assertEqual(_test_ids(re_filtered), _test_ids(filtered_suite))
1801
 
 
1802
 
    def test_exclude_tests_by_condition(self):
1803
 
        excluded_name = ('bzrlib.tests.test_selftest.TestSelftestFiltering.'
1804
 
            'test_exclude_tests_by_condition')
1805
 
        filtered_suite = exclude_tests_by_condition(self.suite,
1806
 
            lambda x:x.id() == excluded_name)
1807
 
        self.assertEqual(len(self.all_names) - 1,
1808
 
            filtered_suite.countTestCases())
1809
 
        self.assertFalse(excluded_name in _test_ids(filtered_suite))
1810
 
        remaining_names = list(self.all_names)
1811
 
        remaining_names.remove(excluded_name)
1812
 
        self.assertEqual(remaining_names, _test_ids(filtered_suite))
1813
 
 
1814
 
    def test_exclude_tests_by_re(self):
1815
 
        self.all_names = _test_ids(self.suite)
1816
 
        filtered_suite = exclude_tests_by_re(self.suite, 'exclude_tests_by_re')
1817
 
        excluded_name = ('bzrlib.tests.test_selftest.TestSelftestFiltering.'
1818
 
            'test_exclude_tests_by_re')
1819
 
        self.assertEqual(len(self.all_names) - 1,
1820
 
            filtered_suite.countTestCases())
1821
 
        self.assertFalse(excluded_name in _test_ids(filtered_suite))
1822
 
        remaining_names = list(self.all_names)
1823
 
        remaining_names.remove(excluded_name)
1824
 
        self.assertEqual(remaining_names, _test_ids(filtered_suite))
1825
 
 
1826
 
    def test_filter_suite_by_condition(self):
1827
 
        test_name = ('bzrlib.tests.test_selftest.TestSelftestFiltering.'
1828
 
            'test_filter_suite_by_condition')
1829
 
        filtered_suite = filter_suite_by_condition(self.suite,
1830
 
            lambda x:x.id() == test_name)
1831
 
        self.assertEqual([test_name], _test_ids(filtered_suite))
1832
 
 
1833
 
    def test_filter_suite_by_re(self):
1834
 
        filtered_suite = filter_suite_by_re(self.suite, 'test_filter_suite_by_r')
1835
 
        filtered_names = _test_ids(filtered_suite)
1836
 
        self.assertEqual(filtered_names, ['bzrlib.tests.test_selftest.'
1837
 
            'TestSelftestFiltering.test_filter_suite_by_re'])
1838
 
 
1839
 
    def test_filter_suite_by_id_list(self):
1840
 
        test_list = ['bzrlib.tests.test_selftest.'
1841
 
                     'TestSelftestFiltering.test_filter_suite_by_id_list']
1842
 
        filtered_suite = tests.filter_suite_by_id_list(
1843
 
            self.suite, tests.TestIdList(test_list))
1844
 
        filtered_names = _test_ids(filtered_suite)
1845
 
        self.assertEqual(
1846
 
            filtered_names,
1847
 
            ['bzrlib.tests.test_selftest.'
1848
 
             'TestSelftestFiltering.test_filter_suite_by_id_list'])
1849
 
 
1850
 
    def test_filter_suite_by_id_startswith(self):
1851
 
        # By design this test may fail if another test is added whose name also
1852
 
        # begins with the start value used.
1853
 
        klass = 'bzrlib.tests.test_selftest.TestSelftestFiltering.'
1854
 
        start = klass + 'test_filter_suite_by_id_starts'
1855
 
        test_list = [klass + 'test_filter_suite_by_id_startswith']
1856
 
        filtered_suite = tests.filter_suite_by_id_startswith(self.suite, start)
1857
 
        filtered_names = _test_ids(filtered_suite)
1858
 
        self.assertEqual(
1859
 
            filtered_names,
1860
 
            ['bzrlib.tests.test_selftest.'
1861
 
             'TestSelftestFiltering.test_filter_suite_by_id_startswith'])
1862
 
 
1863
 
    def test_preserve_input(self):
1864
 
        # NB: Surely this is something in the stdlib to do this?
1865
 
        self.assertTrue(self.suite is preserve_input(self.suite))
1866
 
        self.assertTrue("@#$" is preserve_input("@#$"))
1867
 
 
1868
 
    def test_randomize_suite(self):
1869
 
        randomized_suite = randomize_suite(self.suite)
1870
 
        # randomizing should not add or remove test names.
1871
 
        self.assertEqual(set(_test_ids(self.suite)),
1872
 
                         set(_test_ids(randomized_suite)))
1873
 
        # Technically, this *can* fail, because random.shuffle(list) can be
1874
 
        # equal to list. Trying multiple times just pushes the frequency back.
1875
 
        # As its len(self.all_names)!:1, the failure frequency should be low
1876
 
        # enough to ignore. RBC 20071021.
1877
 
        # It should change the order.
1878
 
        self.assertNotEqual(self.all_names, _test_ids(randomized_suite))
1879
 
        # But not the length. (Possibly redundant with the set test, but not
1880
 
        # necessarily.)
1881
 
        self.assertEqual(len(self.all_names), len(_test_ids(randomized_suite)))
1882
 
 
1883
 
    def test_split_suit_by_condition(self):
1884
 
        self.all_names = _test_ids(self.suite)
1885
 
        condition = condition_id_re('test_filter_suite_by_r')
1886
 
        split_suite = split_suite_by_condition(self.suite, condition)
1887
 
        filtered_name = ('bzrlib.tests.test_selftest.TestSelftestFiltering.'
1888
 
            'test_filter_suite_by_re')
1889
 
        self.assertEqual([filtered_name], _test_ids(split_suite[0]))
1890
 
        self.assertFalse(filtered_name in _test_ids(split_suite[1]))
1891
 
        remaining_names = list(self.all_names)
1892
 
        remaining_names.remove(filtered_name)
1893
 
        self.assertEqual(remaining_names, _test_ids(split_suite[1]))
1894
 
 
1895
 
    def test_split_suit_by_re(self):
1896
 
        self.all_names = _test_ids(self.suite)
1897
 
        split_suite = split_suite_by_re(self.suite, 'test_filter_suite_by_r')
1898
 
        filtered_name = ('bzrlib.tests.test_selftest.TestSelftestFiltering.'
1899
 
            'test_filter_suite_by_re')
1900
 
        self.assertEqual([filtered_name], _test_ids(split_suite[0]))
1901
 
        self.assertFalse(filtered_name in _test_ids(split_suite[1]))
1902
 
        remaining_names = list(self.all_names)
1903
 
        remaining_names.remove(filtered_name)
1904
 
        self.assertEqual(remaining_names, _test_ids(split_suite[1]))
1905
 
 
1906
 
 
1907
 
class TestCheckInventoryShape(TestCaseWithTransport):
1908
 
 
1909
 
    def test_check_inventory_shape(self):
1910
 
        files = ['a', 'b/', 'b/c']
1911
 
        tree = self.make_branch_and_tree('.')
1912
 
        self.build_tree(files)
1913
 
        tree.add(files)
1914
 
        tree.lock_read()
1915
 
        try:
1916
 
            self.check_inventory_shape(tree.inventory, files)
1917
 
        finally:
1918
 
            tree.unlock()
1919
 
 
1920
 
 
1921
 
class TestBlackboxSupport(TestCase):
1922
 
    """Tests for testsuite blackbox features."""
1923
 
 
1924
 
    def test_run_bzr_failure_not_caught(self):
1925
 
        # When we run bzr in blackbox mode, we want any unexpected errors to
1926
 
        # propagate up to the test suite so that it can show the error in the
1927
 
        # usual way, and we won't get a double traceback.
1928
 
        e = self.assertRaises(
1929
 
            AssertionError,
1930
 
            self.run_bzr, ['assert-fail'])
1931
 
        # make sure we got the real thing, not an error from somewhere else in
1932
 
        # the test framework
1933
 
        self.assertEquals('always fails', str(e))
1934
 
        # check that there's no traceback in the test log
1935
 
        self.assertNotContainsRe(self._get_log(keep_log_file=True),
1936
 
            r'Traceback')
1937
 
 
1938
 
    def test_run_bzr_user_error_caught(self):
1939
 
        # Running bzr in blackbox mode, normal/expected/user errors should be
1940
 
        # caught in the regular way and turned into an error message plus exit
1941
 
        # code.
1942
 
        out, err = self.run_bzr(["log", "/nonexistantpath"], retcode=3)
1943
 
        self.assertEqual(out, '')
1944
 
        self.assertContainsRe(err,
1945
 
            'bzr: ERROR: Not a branch: ".*nonexistantpath/".\n')
1946
 
 
1947
 
 
1948
 
class TestTestLoader(TestCase):
1949
 
    """Tests for the test loader."""
1950
 
 
1951
 
    def _get_loader_and_module(self):
1952
 
        """Gets a TestLoader and a module with one test in it."""
1953
 
        loader = TestUtil.TestLoader()
1954
 
        module = {}
1955
 
        class Stub(TestCase):
1956
 
            def test_foo(self):
1957
 
                pass
1958
 
        class MyModule(object):
1959
 
            pass
1960
 
        MyModule.a_class = Stub
1961
 
        module = MyModule()
1962
 
        return loader, module
1963
 
 
1964
 
    def test_module_no_load_tests_attribute_loads_classes(self):
1965
 
        loader, module = self._get_loader_and_module()
1966
 
        self.assertEqual(1, loader.loadTestsFromModule(module).countTestCases())
1967
 
 
1968
 
    def test_module_load_tests_attribute_gets_called(self):
1969
 
        loader, module = self._get_loader_and_module()
1970
 
        # 'self' is here because we're faking the module with a class. Regular
1971
 
        # load_tests do not need that :)
1972
 
        def load_tests(self, standard_tests, module, loader):
1973
 
            result = loader.suiteClass()
1974
 
            for test in iter_suite_tests(standard_tests):
1975
 
                result.addTests([test, test])
1976
 
            return result
1977
 
        # add a load_tests() method which multiplies the tests from the module.
1978
 
        module.__class__.load_tests = load_tests
1979
 
        self.assertEqual(2, loader.loadTestsFromModule(module).countTestCases())
1980
 
 
1981
 
    def test_load_tests_from_module_name_smoke_test(self):
1982
 
        loader = TestUtil.TestLoader()
1983
 
        suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
1984
 
        self.assertEquals(['bzrlib.tests.test_sampler.DemoTest.test_nothing'],
1985
 
                          _test_ids(suite))
1986
 
 
1987
 
    def test_load_tests_from_module_name_with_bogus_module_name(self):
1988
 
        loader = TestUtil.TestLoader()
1989
 
        self.assertRaises(ImportError, loader.loadTestsFromModuleName, 'bogus')
1990
 
 
1991
 
 
1992
 
class TestTestIdList(tests.TestCase):
1993
 
 
1994
 
    def _create_id_list(self, test_list):
1995
 
        return tests.TestIdList(test_list)
1996
 
 
1997
 
    def _create_suite(self, test_id_list):
1998
 
 
1999
 
        class Stub(TestCase):
2000
 
            def test_foo(self):
2001
 
                pass
2002
 
 
2003
 
        def _create_test_id(id):
2004
 
            return lambda: id
2005
 
 
2006
 
        suite = TestUtil.TestSuite()
2007
 
        for id in test_id_list:
2008
 
            t  = Stub('test_foo')
2009
 
            t.id = _create_test_id(id)
2010
 
            suite.addTest(t)
2011
 
        return suite
2012
 
 
2013
 
    def _test_ids(self, test_suite):
2014
 
        """Get the ids for the tests in a test suite."""
2015
 
        return [t.id() for t in iter_suite_tests(test_suite)]
2016
 
 
2017
 
    def test_empty_list(self):
2018
 
        id_list = self._create_id_list([])
2019
 
        self.assertEquals({}, id_list.tests)
2020
 
        self.assertEquals({}, id_list.modules)
2021
 
 
2022
 
    def test_valid_list(self):
2023
 
        id_list = self._create_id_list(
2024
 
            ['mod1.cl1.meth1', 'mod1.cl1.meth2',
2025
 
             'mod1.func1', 'mod1.cl2.meth2',
2026
 
             'mod1.submod1',
2027
 
             'mod1.submod2.cl1.meth1', 'mod1.submod2.cl2.meth2',
2028
 
             ])
2029
 
        self.assertTrue(id_list.refers_to('mod1'))
2030
 
        self.assertTrue(id_list.refers_to('mod1.submod1'))
2031
 
        self.assertTrue(id_list.refers_to('mod1.submod2'))
2032
 
        self.assertTrue(id_list.includes('mod1.cl1.meth1'))
2033
 
        self.assertTrue(id_list.includes('mod1.submod1'))
2034
 
        self.assertTrue(id_list.includes('mod1.func1'))
2035
 
 
2036
 
    def test_bad_chars_in_params(self):
2037
 
        id_list = self._create_id_list(['mod1.cl1.meth1(xx.yy)'])
2038
 
        self.assertTrue(id_list.refers_to('mod1'))
2039
 
        self.assertTrue(id_list.includes('mod1.cl1.meth1(xx.yy)'))
2040
 
 
2041
 
    def test_module_used(self):
2042
 
        id_list = self._create_id_list(['mod.class.meth'])
2043
 
        self.assertTrue(id_list.refers_to('mod'))
2044
 
        self.assertTrue(id_list.refers_to('mod.class'))
2045
 
        self.assertTrue(id_list.refers_to('mod.class.meth'))
2046
 
 
2047
 
    def test_test_suite(self):
2048
 
        # This test is slow, so we do a single test with one test in each
2049
 
        # category
2050
 
        test_list = [
2051
 
            # testmod_names
2052
 
            'bzrlib.tests.blackbox.test_branch.TestBranch.test_branch',
2053
 
            'bzrlib.tests.test_selftest.TestTestIdList.test_test_suite',
2054
 
            # transport implementations
2055
 
            'bzrlib.tests.test_transport_implementations.TransportTests'
2056
 
            '.test_abspath(LocalURLServer)',
2057
 
            # modules_to_doctest
2058
 
            'bzrlib.timestamp.format_highres_date',
2059
 
            # plugins can't be tested that way since selftest may be run with
2060
 
            # --no-plugins
2061
 
            ]
2062
 
        suite = tests.test_suite(test_list)
2063
 
        self.assertEquals(test_list, _test_ids(suite))
2064
 
 
2065
 
    def test_test_suite_matches_id_list_with_unknown(self):
2066
 
        loader = TestUtil.TestLoader()
2067
 
        suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
2068
 
        test_list = ['bzrlib.tests.test_sampler.DemoTest.test_nothing',
2069
 
                     'bogus']
2070
 
        not_found, duplicates = tests.suite_matches_id_list(suite, test_list)
2071
 
        self.assertEquals(['bogus'], not_found)
2072
 
        self.assertEquals([], duplicates)
2073
 
 
2074
 
    def test_suite_matches_id_list_with_duplicates(self):
2075
 
        loader = TestUtil.TestLoader()
2076
 
        suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
2077
 
        dupes = loader.suiteClass()
2078
 
        for test in iter_suite_tests(suite):
2079
 
            dupes.addTest(test)
2080
 
            dupes.addTest(test) # Add it again
2081
 
 
2082
 
        test_list = ['bzrlib.tests.test_sampler.DemoTest.test_nothing',]
2083
 
        not_found, duplicates = tests.suite_matches_id_list(
2084
 
            dupes, test_list)
2085
 
        self.assertEquals([], not_found)
2086
 
        self.assertEquals(['bzrlib.tests.test_sampler.DemoTest.test_nothing'],
2087
 
                          duplicates)
2088
 
 
2089
 
 
2090
 
class TestLoadTestIdList(tests.TestCaseInTempDir):
2091
 
 
2092
 
    def _create_test_list_file(self, file_name, content):
2093
 
        fl = open(file_name, 'wt')
2094
 
        fl.write(content)
2095
 
        fl.close()
2096
 
 
2097
 
    def test_load_unknown(self):
2098
 
        self.assertRaises(errors.NoSuchFile,
2099
 
                          tests.load_test_id_list, 'i_do_not_exist')
2100
 
 
2101
 
    def test_load_test_list(self):
2102
 
        test_list_fname = 'test.list'
2103
 
        self._create_test_list_file(test_list_fname,
2104
 
                                    'mod1.cl1.meth1\nmod2.cl2.meth2\n')
2105
 
        tlist = tests.load_test_id_list(test_list_fname)
2106
 
        self.assertEquals(2, len(tlist))
2107
 
        self.assertEquals('mod1.cl1.meth1', tlist[0])
2108
 
        self.assertEquals('mod2.cl2.meth2', tlist[1])
2109
 
 
2110
 
    def test_load_dirty_file(self):
2111
 
        test_list_fname = 'test.list'
2112
 
        self._create_test_list_file(test_list_fname,
2113
 
                                    '  mod1.cl1.meth1\n\nmod2.cl2.meth2  \n'
2114
 
                                    'bar baz\n')
2115
 
        tlist = tests.load_test_id_list(test_list_fname)
2116
 
        self.assertEquals(4, len(tlist))
2117
 
        self.assertEquals('mod1.cl1.meth1', tlist[0])
2118
 
        self.assertEquals('', tlist[1])
2119
 
        self.assertEquals('mod2.cl2.meth2', tlist[2])
2120
 
        self.assertEquals('bar baz', tlist[3])
2121
 
 
2122
 
 
2123
 
class TestFilteredByModuleTestLoader(tests.TestCase):
2124
 
 
2125
 
    def _create_loader(self, test_list):
2126
 
        id_filter = tests.TestIdList(test_list)
2127
 
        loader = TestUtil.FilteredByModuleTestLoader(id_filter.refers_to)
2128
 
        return loader
2129
 
 
2130
 
    def test_load_tests(self):
2131
 
        test_list = ['bzrlib.tests.test_sampler.DemoTest.test_nothing']
2132
 
        loader = self._create_loader(test_list)
2133
 
 
2134
 
        suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
2135
 
        self.assertEquals(test_list, _test_ids(suite))
2136
 
 
2137
 
    def test_exclude_tests(self):
2138
 
        test_list = ['bogus']
2139
 
        loader = self._create_loader(test_list)
2140
 
 
2141
 
        suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
2142
 
        self.assertEquals([], _test_ids(suite))
2143
 
 
2144
 
 
2145
 
class TestFilteredByNameStartTestLoader(tests.TestCase):
2146
 
 
2147
 
    def _create_loader(self, name_start):
2148
 
        def needs_module(name):
2149
 
            return name.startswith(name_start) or name_start.startswith(name)
2150
 
        loader = TestUtil.FilteredByModuleTestLoader(needs_module)
2151
 
        return loader
2152
 
 
2153
 
    def test_load_tests(self):
2154
 
        test_list = ['bzrlib.tests.test_sampler.DemoTest.test_nothing']
2155
 
        loader = self._create_loader('bzrlib.tests.test_samp')
2156
 
 
2157
 
        suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
2158
 
        self.assertEquals(test_list, _test_ids(suite))
2159
 
 
2160
 
    def test_load_tests_inside_module(self):
2161
 
        test_list = ['bzrlib.tests.test_sampler.DemoTest.test_nothing']
2162
 
        loader = self._create_loader('bzrlib.tests.test_sampler.Demo')
2163
 
 
2164
 
        suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
2165
 
        self.assertEquals(test_list, _test_ids(suite))
2166
 
 
2167
 
    def test_exclude_tests(self):
2168
 
        test_list = ['bogus']
2169
 
        loader = self._create_loader('bogus')
2170
 
 
2171
 
        suite = loader.loadTestsFromModuleName('bzrlib.tests.test_sampler')
2172
 
        self.assertEquals([], _test_ids(suite))
 
1013
class TestSelftestCleanOutput(TestCaseInTempDir):
 
1014
 
 
1015
    def test_clean_output(self):
 
1016
        # test functionality of clean_selftest_output()
 
1017
        from bzrlib.tests import clean_selftest_output
 
1018
 
 
1019
        dirs = ('test0000.tmp', 'test0001.tmp', 'bzrlib', 'tests')
 
1020
        files = ('bzr', 'setup.py', 'test9999.tmp')
 
1021
        for i in dirs:
 
1022
            os.mkdir(i)
 
1023
        for i in files:
 
1024
            f = file(i, 'wb')
 
1025
            f.write('content of ')
 
1026
            f.write(i)
 
1027
            f.close()
 
1028
 
 
1029
        root = os.getcwdu()
 
1030
        before = os.listdir(root)
 
1031
        before.sort()
 
1032
        self.assertEquals(['bzr','bzrlib','setup.py',
 
1033
                           'test0000.tmp','test0001.tmp',
 
1034
                           'test9999.tmp','tests'],
 
1035
                           before)
 
1036
        clean_selftest_output(root, quiet=True)
 
1037
        after = os.listdir(root)
 
1038
        after.sort()
 
1039
        self.assertEquals(['bzr','bzrlib','setup.py',
 
1040
                           'test9999.tmp','tests'],
 
1041
                           after)