~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_selftest.py

  • Committer: Vincent Ladeuil
  • Date: 2008-01-03 08:49:38 UTC
  • mfrom: (3111.1.31 175524)
  • mto: This revision was merged to the branch mainline in revision 3158.
  • Revision ID: v.ladeuil+lp@free.fr-20080103084938-7kvurk5uvde2ui54
Fix bug #175524, http test servers are 1.1 compliant

Show diffs side-by-side

added added

removed removed

Lines of Context:
35
35
    )
36
36
from bzrlib.progress import _BaseProgressBar
37
37
from bzrlib.repofmt import weaverepo
38
 
from bzrlib.symbol_versioning import zero_ten, zero_eleven
 
38
from bzrlib.symbol_versioning import (
 
39
    one_zero,
 
40
    zero_eleven,
 
41
    zero_ten,
 
42
    )
39
43
from bzrlib.tests import (
40
44
                          ChrootedTestCase,
41
45
                          ExtendedTestResult,
45
49
                          TestCaseInTempDir,
46
50
                          TestCaseWithMemoryTransport,
47
51
                          TestCaseWithTransport,
 
52
                          TestNotApplicable,
48
53
                          TestSkipped,
49
54
                          TestSuite,
50
55
                          TestUtil,
51
56
                          TextTestRunner,
52
57
                          UnavailableFeature,
53
 
                          clean_selftest_output,
 
58
                          condition_id_re,
 
59
                          condition_isinstance,
 
60
                          exclude_tests_by_condition,
 
61
                          exclude_tests_by_re,
 
62
                          filter_suite_by_condition,
 
63
                          filter_suite_by_re,
54
64
                          iter_suite_tests,
55
 
                          filter_suite_by_re,
 
65
                          preserve_input,
 
66
                          randomize_suite,
56
67
                          sort_suite_by_re,
 
68
                          split_suite_by_re,
57
69
                          test_lsprof,
58
70
                          test_suite,
59
71
                          )
114
126
            def get_test_permutations(self):
115
127
                return sample_permutation
116
128
        sample_permutation = [(1,2), (3,4)]
117
 
        from bzrlib.transport import TransportTestProviderAdapter
 
129
        from bzrlib.tests.test_transport_implementations \
 
130
            import TransportTestProviderAdapter
118
131
        adapter = TransportTestProviderAdapter()
119
132
        self.assertEqual(sample_permutation,
120
133
                         adapter.get_transport_test_permutations(MockModule()))
125
138
        # - we assume if this matches its probably doing the right thing
126
139
        # especially in combination with the tests for setting the right
127
140
        # classes below.
128
 
        from bzrlib.transport import (TransportTestProviderAdapter,
129
 
                                      _get_transport_modules
130
 
                                      )
 
141
        from bzrlib.tests.test_transport_implementations \
 
142
            import TransportTestProviderAdapter
 
143
        from bzrlib.transport import _get_transport_modules
131
144
        modules = _get_transport_modules()
132
145
        permutation_count = 0
133
146
        for module in modules:
150
163
        # This test used to know about all the possible transports and the
151
164
        # order they were returned but that seems overly brittle (mbp
152
165
        # 20060307)
153
 
        input_test = TestTransportProviderAdapter(
154
 
            "test_adapter_sets_transport_class")
155
 
        from bzrlib.transport import TransportTestProviderAdapter
156
 
        suite = TransportTestProviderAdapter().adapt(input_test)
157
 
        tests = list(iter(suite))
158
 
        self.assertTrue(len(tests) > 6)
 
166
        from bzrlib.tests.test_transport_implementations \
 
167
            import TransportTestProviderAdapter
 
168
        scenarios = TransportTestProviderAdapter().scenarios
159
169
        # there are at least that many builtin transports
160
 
        one_test = tests[0]
161
 
        self.assertTrue(issubclass(one_test.transport_class, 
 
170
        self.assertTrue(len(scenarios) > 6)
 
171
        one_scenario = scenarios[0]
 
172
        self.assertIsInstance(one_scenario[0], str)
 
173
        self.assertTrue(issubclass(one_scenario[1]["transport_class"],
162
174
                                   bzrlib.transport.Transport))
163
 
        self.assertTrue(issubclass(one_test.transport_server, 
 
175
        self.assertTrue(issubclass(one_scenario[1]["transport_server"],
164
176
                                   bzrlib.transport.Server))
165
177
 
166
178
 
167
179
class TestBranchProviderAdapter(TestCase):
168
180
    """A group of tests that test the branch implementation test adapter."""
169
181
 
170
 
    def test_adapted_tests(self):
 
182
    def test_constructor(self):
171
183
        # check that constructor parameters are passed through to the adapted
172
184
        # test.
173
 
        from bzrlib.branch import BranchTestProviderAdapter
174
 
        input_test = TestBranchProviderAdapter(
175
 
            "test_adapted_tests")
 
185
        from bzrlib.tests.branch_implementations import BranchTestProviderAdapter
176
186
        server1 = "a"
177
187
        server2 = "b"
178
188
        formats = [("c", "C"), ("d", "D")]
179
189
        adapter = BranchTestProviderAdapter(server1, server2, formats)
180
 
        suite = adapter.adapt(input_test)
181
 
        tests = list(iter(suite))
182
 
        self.assertEqual(2, len(tests))
183
 
        self.assertEqual(tests[0].branch_format, formats[0][0])
184
 
        self.assertEqual(tests[0].bzrdir_format, formats[0][1])
185
 
        self.assertEqual(tests[0].transport_server, server1)
186
 
        self.assertEqual(tests[0].transport_readonly_server, server2)
187
 
        self.assertEqual(tests[1].branch_format, formats[1][0])
188
 
        self.assertEqual(tests[1].bzrdir_format, formats[1][1])
189
 
        self.assertEqual(tests[1].transport_server, server1)
190
 
        self.assertEqual(tests[1].transport_readonly_server, server2)
 
190
        self.assertEqual(2, len(adapter.scenarios))
 
191
        self.assertEqual([
 
192
            ('str',
 
193
             {'branch_format': 'c',
 
194
              'bzrdir_format': 'C',
 
195
              'transport_readonly_server': 'b',
 
196
              'transport_server': 'a'}),
 
197
            ('str',
 
198
             {'branch_format': 'd',
 
199
              'bzrdir_format': 'D',
 
200
              'transport_readonly_server': 'b',
 
201
              'transport_server': 'a'})],
 
202
            adapter.scenarios)
191
203
 
192
204
 
193
205
class TestBzrDirProviderAdapter(TestCase):
196
208
    def test_adapted_tests(self):
197
209
        # check that constructor parameters are passed through to the adapted
198
210
        # test.
199
 
        from bzrlib.bzrdir import BzrDirTestProviderAdapter
200
 
        input_test = TestBzrDirProviderAdapter(
201
 
            "test_adapted_tests")
 
211
        from bzrlib.tests.bzrdir_implementations import BzrDirTestProviderAdapter
202
212
        vfs_factory = "v"
203
213
        server1 = "a"
204
214
        server2 = "b"
205
215
        formats = ["c", "d"]
206
216
        adapter = BzrDirTestProviderAdapter(vfs_factory,
207
217
            server1, server2, formats)
208
 
        suite = adapter.adapt(input_test)
209
 
        tests = list(iter(suite))
210
 
        self.assertEqual(2, len(tests))
211
 
        self.assertEqual(tests[0].bzrdir_format, formats[0])
212
 
        self.assertEqual(tests[0].vfs_transport_factory, vfs_factory)
213
 
        self.assertEqual(tests[0].transport_server, server1)
214
 
        self.assertEqual(tests[0].transport_readonly_server, server2)
215
 
        self.assertEqual(tests[1].bzrdir_format, formats[1])
216
 
        self.assertEqual(tests[1].vfs_transport_factory, vfs_factory)
217
 
        self.assertEqual(tests[1].transport_server, server1)
218
 
        self.assertEqual(tests[1].transport_readonly_server, server2)
 
218
        self.assertEqual([
 
219
            ('str',
 
220
             {'bzrdir_format': 'c',
 
221
              'transport_readonly_server': 'b',
 
222
              'transport_server': 'a',
 
223
              'vfs_transport_factory': 'v'}),
 
224
            ('str',
 
225
             {'bzrdir_format': 'd',
 
226
              'transport_readonly_server': 'b',
 
227
              'transport_server': 'a',
 
228
              'vfs_transport_factory': 'v'})],
 
229
            adapter.scenarios)
219
230
 
220
231
 
221
232
class TestRepositoryProviderAdapter(TestCase):
222
233
    """A group of tests that test the repository implementation test adapter."""
223
234
 
224
 
    def test_adapted_tests(self):
225
 
        # check that constructor parameters are passed through to the adapted
226
 
        # test.
227
 
        from bzrlib.repository import RepositoryTestProviderAdapter
228
 
        input_test = TestRepositoryProviderAdapter(
229
 
            "test_adapted_tests")
 
235
    def test_constructor(self):
 
236
        # check that constructor parameters are passed through to the
 
237
        # scenarios.
 
238
        from bzrlib.tests.repository_implementations import RepositoryTestProviderAdapter
230
239
        server1 = "a"
231
240
        server2 = "b"
232
241
        formats = [("c", "C"), ("d", "D")]
233
242
        adapter = RepositoryTestProviderAdapter(server1, server2, formats)
234
 
        suite = adapter.adapt(input_test)
235
 
        tests = list(iter(suite))
236
 
        self.assertEqual(2, len(tests))
237
 
        self.assertEqual(tests[0].bzrdir_format, formats[0][1])
238
 
        self.assertEqual(tests[0].repository_format, formats[0][0])
239
 
        self.assertEqual(tests[0].transport_server, server1)
240
 
        self.assertEqual(tests[0].transport_readonly_server, server2)
241
 
        self.assertEqual(tests[1].bzrdir_format, formats[1][1])
242
 
        self.assertEqual(tests[1].repository_format, formats[1][0])
243
 
        self.assertEqual(tests[1].transport_server, server1)
244
 
        self.assertEqual(tests[1].transport_readonly_server, server2)
 
243
        self.assertEqual([
 
244
            ('str',
 
245
             {'bzrdir_format': 'C',
 
246
              'repository_format': 'c',
 
247
              'transport_readonly_server': 'b',
 
248
              'transport_server': 'a'}),
 
249
            ('str',
 
250
             {'bzrdir_format': 'D',
 
251
              'repository_format': 'd',
 
252
              'transport_readonly_server': 'b',
 
253
              'transport_server': 'a'})],
 
254
            adapter.scenarios)
245
255
 
246
256
    def test_setting_vfs_transport(self):
247
257
        """The vfs_transport_factory can be set optionally."""
248
 
        from bzrlib.repository import RepositoryTestProviderAdapter
249
 
        input_test = TestRepositoryProviderAdapter(
250
 
            "test_adapted_tests")
251
 
        formats = [("c", "C")]
 
258
        from bzrlib.tests.repository_implementations import RepositoryTestProviderAdapter
 
259
        formats = [("a", "b"), ("c", "d")]
252
260
        adapter = RepositoryTestProviderAdapter(None, None, formats,
253
261
            vfs_transport_factory="vfs")
254
 
        suite = adapter.adapt(input_test)
255
 
        tests = list(iter(suite))
256
 
        self.assertEqual(1, len(tests))
257
 
        self.assertEqual(tests[0].vfs_transport_factory, "vfs")
 
262
        self.assertEqual([
 
263
            ('str',
 
264
             {'bzrdir_format': 'b',
 
265
              'repository_format': 'a',
 
266
              'transport_readonly_server': None,
 
267
              'transport_server': None,
 
268
              'vfs_transport_factory': 'vfs'}),
 
269
            ('str',
 
270
             {'bzrdir_format': 'd',
 
271
              'repository_format': 'c',
 
272
              'transport_readonly_server': None,
 
273
              'transport_server': None,
 
274
              'vfs_transport_factory': 'vfs'})],
 
275
            adapter.scenarios)
 
276
 
 
277
    def test_formats_to_scenarios(self):
 
278
        """The adapter can generate all the scenarios needed."""
 
279
        from bzrlib.tests.repository_implementations import RepositoryTestProviderAdapter
 
280
        no_vfs_adapter = RepositoryTestProviderAdapter("server", "readonly",
 
281
            [], None)
 
282
        vfs_adapter = RepositoryTestProviderAdapter("server", "readonly",
 
283
            [], vfs_transport_factory="vfs")
 
284
        # no_vfs generate scenarios without vfs_transport_factor
 
285
        formats = [("c", "C"), (1, "D")]
 
286
        self.assertEqual([
 
287
            ('str',
 
288
             {'bzrdir_format': 'C',
 
289
              'repository_format': 'c',
 
290
              'transport_readonly_server': 'readonly',
 
291
              'transport_server': 'server'}),
 
292
            ('int',
 
293
             {'bzrdir_format': 'D',
 
294
              'repository_format': 1,
 
295
              'transport_readonly_server': 'readonly',
 
296
              'transport_server': 'server'})],
 
297
            no_vfs_adapter.formats_to_scenarios(formats))
 
298
        self.assertEqual([
 
299
            ('str',
 
300
             {'bzrdir_format': 'C',
 
301
              'repository_format': 'c',
 
302
              'transport_readonly_server': 'readonly',
 
303
              'transport_server': 'server',
 
304
              'vfs_transport_factory': 'vfs'}),
 
305
            ('int',
 
306
             {'bzrdir_format': 'D',
 
307
              'repository_format': 1,
 
308
              'transport_readonly_server': 'readonly',
 
309
              'transport_server': 'server',
 
310
              'vfs_transport_factory': 'vfs'})],
 
311
            vfs_adapter.formats_to_scenarios(formats))
 
312
 
 
313
 
 
314
class TestTestScenarioApplier(TestCase):
 
315
    """Tests for the test adaption facilities."""
 
316
 
 
317
    def test_adapt_applies_scenarios(self):
 
318
        from bzrlib.tests.repository_implementations import TestScenarioApplier
 
319
        input_test = TestTestScenarioApplier("test_adapt_test_to_scenario")
 
320
        adapter = TestScenarioApplier()
 
321
        adapter.scenarios = [("1", "dict"), ("2", "settings")]
 
322
        calls = []
 
323
        def capture_call(test, scenario):
 
324
            calls.append((test, scenario))
 
325
            return test
 
326
        adapter.adapt_test_to_scenario = capture_call
 
327
        adapter.adapt(input_test)
 
328
        self.assertEqual([(input_test, ("1", "dict")),
 
329
            (input_test, ("2", "settings"))], calls)
 
330
 
 
331
    def test_adapt_test_to_scenario(self):
 
332
        from bzrlib.tests.repository_implementations import TestScenarioApplier
 
333
        input_test = TestTestScenarioApplier("test_adapt_test_to_scenario")
 
334
        adapter = TestScenarioApplier()
 
335
        # setup two adapted tests
 
336
        adapted_test1 = adapter.adapt_test_to_scenario(input_test,
 
337
            ("new id",
 
338
            {"bzrdir_format":"bzr_format",
 
339
             "repository_format":"repo_fmt",
 
340
             "transport_server":"transport_server",
 
341
             "transport_readonly_server":"readonly-server"}))
 
342
        adapted_test2 = adapter.adapt_test_to_scenario(input_test,
 
343
            ("new id 2", {"bzrdir_format":None}))
 
344
        # input_test should have been altered.
 
345
        self.assertRaises(AttributeError, getattr, input_test, "bzrdir_format")
 
346
        # the new tests are mutually incompatible, ensuring it has 
 
347
        # made new ones, and unspecified elements in the scenario
 
348
        # should not have been altered.
 
349
        self.assertEqual("bzr_format", adapted_test1.bzrdir_format)
 
350
        self.assertEqual("repo_fmt", adapted_test1.repository_format)
 
351
        self.assertEqual("transport_server", adapted_test1.transport_server)
 
352
        self.assertEqual("readonly-server",
 
353
            adapted_test1.transport_readonly_server)
 
354
        self.assertEqual(
 
355
            "bzrlib.tests.test_selftest.TestTestScenarioApplier."
 
356
            "test_adapt_test_to_scenario(new id)",
 
357
            adapted_test1.id())
 
358
        self.assertEqual(None, adapted_test2.bzrdir_format)
 
359
        self.assertEqual(
 
360
            "bzrlib.tests.test_selftest.TestTestScenarioApplier."
 
361
            "test_adapt_test_to_scenario(new id 2)",
 
362
            adapted_test2.id())
258
363
 
259
364
 
260
365
class TestInterRepositoryProviderAdapter(TestCase):
263
368
    def test_adapted_tests(self):
264
369
        # check that constructor parameters are passed through to the adapted
265
370
        # test.
266
 
        from bzrlib.repository import InterRepositoryTestProviderAdapter
267
 
        input_test = TestInterRepositoryProviderAdapter(
268
 
            "test_adapted_tests")
 
371
        from bzrlib.tests.interrepository_implementations import \
 
372
            InterRepositoryTestProviderAdapter
269
373
        server1 = "a"
270
374
        server2 = "b"
271
375
        formats = [(str, "C1", "C2"), (int, "D1", "D2")]
272
376
        adapter = InterRepositoryTestProviderAdapter(server1, server2, formats)
273
 
        suite = adapter.adapt(input_test)
274
 
        tests = list(iter(suite))
275
 
        self.assertEqual(2, len(tests))
276
 
        self.assertEqual(tests[0].interrepo_class, formats[0][0])
277
 
        self.assertEqual(tests[0].repository_format, formats[0][1])
278
 
        self.assertEqual(tests[0].repository_format_to, formats[0][2])
279
 
        self.assertEqual(tests[0].transport_server, server1)
280
 
        self.assertEqual(tests[0].transport_readonly_server, server2)
281
 
        self.assertEqual(tests[1].interrepo_class, formats[1][0])
282
 
        self.assertEqual(tests[1].repository_format, formats[1][1])
283
 
        self.assertEqual(tests[1].repository_format_to, formats[1][2])
284
 
        self.assertEqual(tests[1].transport_server, server1)
285
 
        self.assertEqual(tests[1].transport_readonly_server, server2)
 
377
        self.assertEqual([
 
378
            ('str',
 
379
             {'interrepo_class': str,
 
380
              'repository_format': 'C1',
 
381
              'repository_format_to': 'C2',
 
382
              'transport_readonly_server': 'b',
 
383
              'transport_server': 'a'}),
 
384
            ('int',
 
385
             {'interrepo_class': int,
 
386
              'repository_format': 'D1',
 
387
              'repository_format_to': 'D2',
 
388
              'transport_readonly_server': 'b',
 
389
              'transport_server': 'a'})],
 
390
            adapter.formats_to_scenarios(formats))
286
391
 
287
392
 
288
393
class TestInterVersionedFileProviderAdapter(TestCase):
289
394
    """A group of tests that test the InterVersionedFile test adapter."""
290
395
 
291
 
    def test_adapted_tests(self):
 
396
    def test_scenarios(self):
292
397
        # check that constructor parameters are passed through to the adapted
293
398
        # test.
294
 
        from bzrlib.versionedfile import InterVersionedFileTestProviderAdapter
295
 
        input_test = TestInterRepositoryProviderAdapter(
296
 
            "test_adapted_tests")
 
399
        from bzrlib.tests.interversionedfile_implementations \
 
400
            import InterVersionedFileTestProviderAdapter
297
401
        server1 = "a"
298
402
        server2 = "b"
299
403
        formats = [(str, "C1", "C2"), (int, "D1", "D2")]
300
404
        adapter = InterVersionedFileTestProviderAdapter(server1, server2, formats)
301
 
        suite = adapter.adapt(input_test)
302
 
        tests = list(iter(suite))
303
 
        self.assertEqual(2, len(tests))
304
 
        self.assertEqual(tests[0].interversionedfile_class, formats[0][0])
305
 
        self.assertEqual(tests[0].versionedfile_factory, formats[0][1])
306
 
        self.assertEqual(tests[0].versionedfile_factory_to, formats[0][2])
307
 
        self.assertEqual(tests[0].transport_server, server1)
308
 
        self.assertEqual(tests[0].transport_readonly_server, server2)
309
 
        self.assertEqual(tests[1].interversionedfile_class, formats[1][0])
310
 
        self.assertEqual(tests[1].versionedfile_factory, formats[1][1])
311
 
        self.assertEqual(tests[1].versionedfile_factory_to, formats[1][2])
312
 
        self.assertEqual(tests[1].transport_server, server1)
313
 
        self.assertEqual(tests[1].transport_readonly_server, server2)
 
405
        self.assertEqual([
 
406
            ('str',
 
407
             {'interversionedfile_class':str,
 
408
              'transport_readonly_server': 'b',
 
409
              'transport_server': 'a',
 
410
              'versionedfile_factory': 'C1',
 
411
              'versionedfile_factory_to': 'C2'}),
 
412
            ('int',
 
413
             {'interversionedfile_class': int,
 
414
              'transport_readonly_server': 'b',
 
415
              'transport_server': 'a',
 
416
              'versionedfile_factory': 'D1',
 
417
              'versionedfile_factory_to': 'D2'})],
 
418
            adapter.scenarios)
314
419
 
315
420
 
316
421
class TestRevisionStoreProviderAdapter(TestCase):
317
422
    """A group of tests that test the RevisionStore test adapter."""
318
423
 
319
 
    def test_adapted_tests(self):
 
424
    def test_scenarios(self):
320
425
        # check that constructor parameters are passed through to the adapted
321
426
        # test.
322
 
        from bzrlib.store.revision import RevisionStoreTestProviderAdapter
323
 
        input_test = TestRevisionStoreProviderAdapter(
324
 
            "test_adapted_tests")
 
427
        from bzrlib.tests.revisionstore_implementations \
 
428
            import RevisionStoreTestProviderAdapter
325
429
        # revision stores need a store factory - i.e. RevisionKnit
326
430
        #, a readonly and rw transport 
327
431
        # transport servers:
329
433
        server2 = "b"
330
434
        store_factories = ["c", "d"]
331
435
        adapter = RevisionStoreTestProviderAdapter(server1, server2, store_factories)
332
 
        suite = adapter.adapt(input_test)
333
 
        tests = list(iter(suite))
334
 
        self.assertEqual(2, len(tests))
335
 
        self.assertEqual(tests[0].store_factory, store_factories[0][0])
336
 
        self.assertEqual(tests[0].transport_server, server1)
337
 
        self.assertEqual(tests[0].transport_readonly_server, server2)
338
 
        self.assertEqual(tests[1].store_factory, store_factories[1][0])
339
 
        self.assertEqual(tests[1].transport_server, server1)
340
 
        self.assertEqual(tests[1].transport_readonly_server, server2)
 
436
        self.assertEqual([
 
437
            ('c',
 
438
             {'store_factory': 'c',
 
439
              'transport_readonly_server': 'b',
 
440
              'transport_server': 'a'}),
 
441
            ('d',
 
442
             {'store_factory': 'd',
 
443
              'transport_readonly_server': 'b',
 
444
              'transport_server': 'a'})],
 
445
            adapter.scenarios)
341
446
 
342
447
 
343
448
class TestWorkingTreeProviderAdapter(TestCase):
344
449
    """A group of tests that test the workingtree implementation test adapter."""
345
450
 
346
 
    def test_adapted_tests(self):
 
451
    def test_scenarios(self):
347
452
        # check that constructor parameters are passed through to the adapted
348
453
        # test.
349
 
        from bzrlib.workingtree import WorkingTreeTestProviderAdapter
350
 
        input_test = TestWorkingTreeProviderAdapter(
351
 
            "test_adapted_tests")
 
454
        from bzrlib.tests.workingtree_implementations \
 
455
            import WorkingTreeTestProviderAdapter
352
456
        server1 = "a"
353
457
        server2 = "b"
354
458
        formats = [("c", "C"), ("d", "D")]
355
459
        adapter = WorkingTreeTestProviderAdapter(server1, server2, formats)
356
 
        suite = adapter.adapt(input_test)
357
 
        tests = list(iter(suite))
358
 
        self.assertEqual(2, len(tests))
359
 
        self.assertEqual(tests[0].workingtree_format, formats[0][0])
360
 
        self.assertEqual(tests[0].bzrdir_format, formats[0][1])
361
 
        self.assertEqual(tests[0].transport_server, server1)
362
 
        self.assertEqual(tests[0].transport_readonly_server, server2)
363
 
        self.assertEqual(tests[1].workingtree_format, formats[1][0])
364
 
        self.assertEqual(tests[1].bzrdir_format, formats[1][1])
365
 
        self.assertEqual(tests[1].transport_server, server1)
366
 
        self.assertEqual(tests[1].transport_readonly_server, server2)
 
460
        self.assertEqual([
 
461
            ('str',
 
462
             {'bzrdir_format': 'C',
 
463
              'transport_readonly_server': 'b',
 
464
              'transport_server': 'a',
 
465
              'workingtree_format': 'c'}),
 
466
            ('str',
 
467
             {'bzrdir_format': 'D',
 
468
              'transport_readonly_server': 'b',
 
469
              'transport_server': 'a',
 
470
              'workingtree_format': 'd'})],
 
471
            adapter.scenarios)
367
472
 
368
473
 
369
474
class TestTreeProviderAdapter(TestCase):
425
530
        # because each optimiser can be direction specific, we need to test
426
531
        # each optimiser in its chosen direction.
427
532
        # unlike the TestProviderAdapter we dont want to automatically add a
428
 
        # parameterised one for WorkingTree - the optimisers will tell us what
 
533
        # parameterized one for WorkingTree - the optimisers will tell us what
429
534
        # ones to add.
430
535
        from bzrlib.tests.tree_implementations import (
431
536
            return_parameter,
468
573
    def test_home_is_not_working(self):
469
574
        self.assertNotEqual(self.test_dir, self.test_home_dir)
470
575
        cwd = osutils.getcwd()
471
 
        self.assertEqual(self.test_dir, cwd)
472
 
        self.assertEqual(self.test_home_dir, os.environ['HOME'])
 
576
        self.assertIsSameRealPath(self.test_dir, cwd)
 
577
        self.assertIsSameRealPath(self.test_home_dir, os.environ['HOME'])
473
578
 
474
579
 
475
580
class TestTestCaseWithMemoryTransport(TestCaseWithMemoryTransport):
483
588
        few tests should need to do that), and having a missing dir as home is
484
589
        an effective way to ensure that this is the case.
485
590
        """
486
 
        self.assertEqual(self.TEST_ROOT + "/MemoryTransportMissingHomeDir",
 
591
        self.assertIsSameRealPath(
 
592
            self.TEST_ROOT + "/MemoryTransportMissingHomeDir",
487
593
            self.test_home_dir)
488
 
        self.assertEqual(self.test_home_dir, os.environ['HOME'])
 
594
        self.assertIsSameRealPath(self.test_home_dir, os.environ['HOME'])
489
595
        
490
596
    def test_cwd_is_TEST_ROOT(self):
491
 
        self.assertEqual(self.test_dir, self.TEST_ROOT)
 
597
        self.assertIsSameRealPath(self.test_dir, self.TEST_ROOT)
492
598
        cwd = osutils.getcwd()
493
 
        self.assertEqual(self.test_dir, cwd)
 
599
        self.assertIsSameRealPath(self.test_dir, cwd)
494
600
 
495
601
    def test_make_branch_and_memory_tree(self):
496
602
        """In TestCaseWithMemoryTransport we should not make the branch on disk.
516
622
        self.assertEqual(format.repository_format.__class__,
517
623
            tree.branch.repository._format.__class__)
518
624
 
 
625
    def test_safety_net(self):
 
626
        """No test should modify the safety .bzr directory.
 
627
 
 
628
        We just test that the _check_safety_net private method raises
 
629
        AssertionError, it's easier than building a test suite with the same
 
630
        test.
 
631
        """
 
632
        # Oops, a commit in the current directory (i.e. without local .bzr
 
633
        # directory) will crawl up the hierarchy to find a .bzr directory.
 
634
        self.run_bzr(['commit', '-mfoo', '--unchanged'])
 
635
        # But we have a safety net in place.
 
636
        self.assertRaises(AssertionError, self._check_safety_net)
 
637
 
519
638
 
520
639
class TestTestCaseWithTransport(TestCaseWithTransport):
521
640
    """Tests for the convenience functions TestCaseWithTransport introduces."""
537
656
        self.assertEqual(t2.base[:-1], t.abspath('foo/bar'))
538
657
 
539
658
    def test_get_readonly_url_http(self):
540
 
        from bzrlib.tests.HttpServer import HttpServer
 
659
        from bzrlib.tests.http_server import HttpServer
541
660
        from bzrlib.transport import get_transport
542
661
        from bzrlib.transport.local import LocalURLServer
543
662
        from bzrlib.transport.http import HttpTransportBase
611
730
 
612
731
class TestTestResult(TestCase):
613
732
 
614
 
    def test_elapsed_time_with_benchmarking(self):
 
733
    def check_timing(self, test_case, expected_re):
615
734
        result = bzrlib.tests.TextTestResult(self._log_file,
616
 
                                        descriptions=0,
617
 
                                        verbosity=1,
618
 
                                        )
619
 
        result._recordTestStartTime()
620
 
        time.sleep(0.003)
621
 
        result.extractBenchmarkTime(self)
622
 
        timed_string = result._testTimeString()
623
 
        # without explicit benchmarking, we should get a simple time.
624
 
        self.assertContainsRe(timed_string, "^ +[0-9]+ms$")
 
735
                descriptions=0,
 
736
                verbosity=1,
 
737
                )
 
738
        test_case.run(result)
 
739
        timed_string = result._testTimeString(test_case)
 
740
        self.assertContainsRe(timed_string, expected_re)
 
741
 
 
742
    def test_test_reporting(self):
 
743
        class ShortDelayTestCase(TestCase):
 
744
            def test_short_delay(self):
 
745
                time.sleep(0.003)
 
746
            def test_short_benchmark(self):
 
747
                self.time(time.sleep, 0.003)
 
748
        self.check_timing(ShortDelayTestCase('test_short_delay'),
 
749
                          r"^ +[0-9]+ms$")
625
750
        # if a benchmark time is given, we want a x of y style result.
626
 
        self.time(time.sleep, 0.001)
627
 
        result.extractBenchmarkTime(self)
628
 
        timed_string = result._testTimeString()
629
 
        self.assertContainsRe(
630
 
            timed_string, "^ +[0-9]+ms/ +[0-9]+ms$")
631
 
        # extracting the time from a non-bzrlib testcase sets to None
632
 
        result._recordTestStartTime()
633
 
        result.extractBenchmarkTime(
634
 
            unittest.FunctionTestCase(self.test_elapsed_time_with_benchmarking))
635
 
        timed_string = result._testTimeString()
636
 
        self.assertContainsRe(timed_string, "^ +[0-9]+ms$")
637
 
        # cheat. Yes, wash thy mouth out with soap.
638
 
        self._benchtime = None
 
751
        self.check_timing(ShortDelayTestCase('test_short_benchmark'),
 
752
                          r"^ +[0-9]+ms/ +[0-9]+ms$")
639
753
 
 
754
    def test_unittest_reporting_unittest_class(self):
 
755
        # getting the time from a non-bzrlib test works ok
 
756
        class ShortDelayTestCase(unittest.TestCase):
 
757
            def test_short_delay(self):
 
758
                time.sleep(0.003)
 
759
        self.check_timing(ShortDelayTestCase('test_short_delay'),
 
760
                          r"^ +[0-9]+ms$")
 
761
        
640
762
    def test_assigned_benchmark_file_stores_date(self):
641
763
        output = StringIO()
642
764
        result = bzrlib.tests.TextTestResult(self._log_file,
645
767
                                        bench_history=output
646
768
                                        )
647
769
        output_string = output.getvalue()
648
 
        
649
770
        # if you are wondering about the regexp please read the comment in
650
771
        # test_bench_history (bzrlib.tests.test_selftest.TestRunner)
651
772
        # XXX: what comment?  -- Andrew Bennetts
681
802
 
682
803
    def test_lsprofiling(self):
683
804
        """Verbose test result prints lsprof statistics from test cases."""
684
 
        self.requireFeature(test_lsprof.LSProf())
 
805
        self.requireFeature(test_lsprof.LSProfFeature)
685
806
        result_stream = StringIO()
686
807
        result = bzrlib.tests.VerboseTestResult(
687
808
            unittest._WritelnDecorator(result_stream),
750
871
            )
751
872
        test = self.get_passing_test()
752
873
        result.startTest(test)
753
 
        result.extractBenchmarkTime(test)
754
874
        prefix = len(result_stream.getvalue())
755
875
        # the err parameter has the shape:
756
876
        # (class, exception object, traceback)
776
896
        test = self.get_passing_test()
777
897
        # this seeds the state to handle reporting the test.
778
898
        result.startTest(test)
779
 
        result.extractBenchmarkTime(test)
780
899
        # the err parameter has the shape:
781
900
        # (class, exception object, traceback)
782
901
        # KnownFailures dont get their tracebacks shown though, so we
841
960
        test = self.get_passing_test()
842
961
        feature = Feature()
843
962
        result.startTest(test)
844
 
        result.extractBenchmarkTime(test)
845
963
        prefix = len(result_stream.getvalue())
846
964
        result.report_unsupported(test, feature)
847
965
        output = result_stream.getvalue()[prefix:]
861
979
        feature = Feature()
862
980
        # this seeds the state to handle reporting the test.
863
981
        result.startTest(test)
864
 
        result.extractBenchmarkTime(test)
865
982
        result.report_unsupported(test, feature)
866
983
        # no output on unsupported features
867
984
        self.assertEqual(
898
1015
        # and not count as an error
899
1016
        self.assertEqual(0, result.error_count)
900
1017
 
 
1018
    def test_strict_with_unsupported_feature(self):
 
1019
        result = bzrlib.tests.TextTestResult(self._log_file, descriptions=0,
 
1020
                                             verbosity=1)
 
1021
        test = self.get_passing_test()
 
1022
        feature = "Unsupported Feature"
 
1023
        result.addNotSupported(test, feature)
 
1024
        self.assertFalse(result.wasStrictlySuccessful())
 
1025
        self.assertEqual(None, result._extractBenchmarkTime(test))
 
1026
 
 
1027
    def test_strict_with_known_failure(self):
 
1028
        result = bzrlib.tests.TextTestResult(self._log_file, descriptions=0,
 
1029
                                             verbosity=1)
 
1030
        test = self.get_passing_test()
 
1031
        err = (KnownFailure, KnownFailure('foo'), None)
 
1032
        result._addKnownFailure(test, err)
 
1033
        self.assertFalse(result.wasStrictlySuccessful())
 
1034
        self.assertEqual(None, result._extractBenchmarkTime(test))
 
1035
 
 
1036
    def test_strict_with_success(self):
 
1037
        result = bzrlib.tests.TextTestResult(self._log_file, descriptions=0,
 
1038
                                             verbosity=1)
 
1039
        test = self.get_passing_test()
 
1040
        result.addSuccess(test)
 
1041
        self.assertTrue(result.wasStrictlySuccessful())
 
1042
        self.assertEqual(None, result._extractBenchmarkTime(test))
 
1043
 
901
1044
 
902
1045
class TestRunner(TestCase):
903
1046
 
1016
1159
        # Check if cleanup was called the right number of times.
1017
1160
        self.assertEqual(0, test.counter)
1018
1161
 
 
1162
    def test_not_applicable(self):
 
1163
        # run a test that is skipped because it's not applicable
 
1164
        def not_applicable_test():
 
1165
            from bzrlib.tests import TestNotApplicable
 
1166
            raise TestNotApplicable('this test never runs')
 
1167
        out = StringIO()
 
1168
        runner = TextTestRunner(stream=out, verbosity=2)
 
1169
        test = unittest.FunctionTestCase(not_applicable_test)
 
1170
        result = self.run_test_runner(runner, test)
 
1171
        self._log_file.write(out.getvalue())
 
1172
        self.assertTrue(result.wasSuccessful())
 
1173
        self.assertTrue(result.wasStrictlySuccessful())
 
1174
        self.assertContainsRe(out.getvalue(),
 
1175
                r'(?m)not_applicable_test   * N/A')
 
1176
        self.assertContainsRe(out.getvalue(),
 
1177
                r'(?m)^    this test never runs')
 
1178
 
 
1179
    def test_not_applicable_demo(self):
 
1180
        # just so you can see it in the test output
 
1181
        raise TestNotApplicable('this test is just a demonstation')
 
1182
 
1019
1183
    def test_unsupported_features_listed(self):
1020
1184
        """When unsupported features are encountered they are detailed."""
1021
1185
        class Feature1(Feature):
1128
1292
class TestTestCase(TestCase):
1129
1293
    """Tests that test the core bzrlib TestCase."""
1130
1294
 
 
1295
    def test_debug_flags_sanitised(self):
 
1296
        """The bzrlib debug flags should be sanitised by setUp."""
 
1297
        # we could set something and run a test that will check
 
1298
        # it gets santised, but this is probably sufficient for now:
 
1299
        # if someone runs the test with -Dsomething it will error.
 
1300
        self.assertEqual(set(), bzrlib.debug.debug_flags)
 
1301
 
1131
1302
    def inner_test(self):
1132
1303
        # the inner child test
1133
1304
        note("inner_test")
1193
1364
        
1194
1365
        Each self.time() call is individually and separately profiled.
1195
1366
        """
1196
 
        self.requireFeature(test_lsprof.LSProf())
 
1367
        self.requireFeature(test_lsprof.LSProfFeature)
1197
1368
        # overrides the class member with an instance member so no cleanup 
1198
1369
        # needed.
1199
1370
        self._gather_lsprof_in_benchmarks = True
1363
1534
        self.callDeprecated([], testfunc, be_deprecated=False)
1364
1535
 
1365
1536
 
 
1537
class TestWarningTests(TestCase):
 
1538
    """Tests for calling methods that raise warnings."""
 
1539
 
 
1540
    def test_callCatchWarnings(self):
 
1541
        def meth(a, b):
 
1542
            warnings.warn("this is your last warning")
 
1543
            return a + b
 
1544
        wlist, result = self.callCatchWarnings(meth, 1, 2)
 
1545
        self.assertEquals(3, result)
 
1546
        # would like just to compare them, but UserWarning doesn't implement
 
1547
        # eq well
 
1548
        w0, = wlist
 
1549
        self.assertIsInstance(w0, UserWarning)
 
1550
        self.assertEquals("this is your last warning", str(w0))
 
1551
 
 
1552
 
1366
1553
class TestConvenienceMakers(TestCaseWithTransport):
1367
1554
    """Test for the make_* convenience functions."""
1368
1555
 
1412
1599
        self.assertEqual([True], factory_called)
1413
1600
 
1414
1601
 
1415
 
class TestSelftestCleanOutput(TestCaseInTempDir):
1416
 
 
1417
 
    def test_clean_output(self):
1418
 
        # test functionality of clean_selftest_output()
1419
 
        self.build_tree(['test0000.tmp/', 'test0001.tmp/',
1420
 
                         'bzrlib/', 'tests/',
1421
 
                         'bzr', 'setup.py', 'test9999.tmp'])
1422
 
 
1423
 
        root = os.getcwdu()
1424
 
        before = os.listdir(root)
1425
 
        before.sort()
1426
 
        self.assertEquals(['bzr','bzrlib','setup.py',
1427
 
                           'test0000.tmp','test0001.tmp',
1428
 
                           'test9999.tmp','tests'],
1429
 
                           before)
1430
 
        clean_selftest_output(root, quiet=True)
1431
 
        after = os.listdir(root)
1432
 
        after.sort()
1433
 
        self.assertEquals(['bzr','bzrlib','setup.py',
1434
 
                           'test9999.tmp','tests'],
1435
 
                           after)
1436
 
 
1437
 
    def test_clean_readonly(self):
1438
 
        # test for delete read-only files
1439
 
        self.build_tree(['test0000.tmp/', 'test0000.tmp/foo'])
1440
 
        osutils.make_readonly('test0000.tmp/foo')
1441
 
        root = os.getcwdu()
1442
 
        before = os.listdir(root);  before.sort()
1443
 
        self.assertEquals(['test0000.tmp'], before)
1444
 
        clean_selftest_output(root, quiet=True)
1445
 
        after = os.listdir(root);   after.sort()
1446
 
        self.assertEquals([], after)
1447
 
 
1448
 
 
1449
1602
class TestKnownFailure(TestCase):
1450
1603
 
1451
1604
    def test_known_failure(self):
1516
1669
        self.loader = TestUtil.TestLoader()
1517
1670
        self.suite.addTest(self.loader.loadTestsFromModuleNames([
1518
1671
            'bzrlib.tests.test_selftest']))
1519
 
        self.all_names = [t.id() for t in iter_suite_tests(self.suite)]
 
1672
        self.all_names = self._test_ids(self.suite)
 
1673
 
 
1674
    def _test_ids(self, test_suite):
 
1675
        """Get the ids for the tests in a test suite."""
 
1676
        return [t.id() for t in iter_suite_tests(test_suite)]
 
1677
 
 
1678
    def test_condition_id_re(self):
 
1679
        test_name = ('bzrlib.tests.test_selftest.TestSelftestFiltering.'
 
1680
            'test_condition_id_re')
 
1681
        filtered_suite = filter_suite_by_condition(self.suite,
 
1682
            condition_id_re('test_condition_id_re'))
 
1683
        self.assertEqual([test_name], self._test_ids(filtered_suite))
 
1684
 
 
1685
    def test_condition_isinstance(self):
 
1686
        filtered_suite = filter_suite_by_condition(self.suite,
 
1687
            condition_isinstance(self.__class__))
 
1688
        class_pattern = 'bzrlib.tests.test_selftest.TestSelftestFiltering.'
 
1689
        re_filtered = filter_suite_by_re(self.suite, class_pattern)
 
1690
        self.assertEqual(self._test_ids(re_filtered),
 
1691
            self._test_ids(filtered_suite))
 
1692
 
 
1693
    def test_exclude_tests_by_condition(self):
 
1694
        excluded_name = ('bzrlib.tests.test_selftest.TestSelftestFiltering.'
 
1695
            'test_exclude_tests_by_condition')
 
1696
        filtered_suite = exclude_tests_by_condition(self.suite,
 
1697
            lambda x:x.id() == excluded_name)
 
1698
        self.assertEqual(len(self.all_names) - 1,
 
1699
            filtered_suite.countTestCases())
 
1700
        self.assertFalse(excluded_name in self._test_ids(filtered_suite))
 
1701
        remaining_names = list(self.all_names)
 
1702
        remaining_names.remove(excluded_name)
 
1703
        self.assertEqual(remaining_names, self._test_ids(filtered_suite))
 
1704
 
 
1705
    def test_exclude_tests_by_re(self):
 
1706
        self.all_names = self._test_ids(self.suite)
 
1707
        filtered_suite = exclude_tests_by_re(self.suite, 'exclude_tests_by_re')
 
1708
        excluded_name = ('bzrlib.tests.test_selftest.TestSelftestFiltering.'
 
1709
            'test_exclude_tests_by_re')
 
1710
        self.assertEqual(len(self.all_names) - 1,
 
1711
            filtered_suite.countTestCases())
 
1712
        self.assertFalse(excluded_name in self._test_ids(filtered_suite))
 
1713
        remaining_names = list(self.all_names)
 
1714
        remaining_names.remove(excluded_name)
 
1715
        self.assertEqual(remaining_names, self._test_ids(filtered_suite))
 
1716
 
 
1717
    def test_filter_suite_by_condition(self):
 
1718
        test_name = ('bzrlib.tests.test_selftest.TestSelftestFiltering.'
 
1719
            'test_filter_suite_by_condition')
 
1720
        filtered_suite = filter_suite_by_condition(self.suite,
 
1721
            lambda x:x.id() == test_name)
 
1722
        self.assertEqual([test_name], self._test_ids(filtered_suite))
1520
1723
 
1521
1724
    def test_filter_suite_by_re(self):
1522
 
        filtered_suite = filter_suite_by_re(self.suite, 'test_filter')
1523
 
        filtered_names = [t.id() for t in iter_suite_tests(filtered_suite)]
 
1725
        filtered_suite = filter_suite_by_re(self.suite, 'test_filter_suite_by_r')
 
1726
        filtered_names = self._test_ids(filtered_suite)
1524
1727
        self.assertEqual(filtered_names, ['bzrlib.tests.test_selftest.'
1525
1728
            'TestSelftestFiltering.test_filter_suite_by_re'])
1526
 
            
 
1729
 
 
1730
    def test_preserve_input(self):
 
1731
        # NB: Surely this is something in the stdlib to do this?
 
1732
        self.assertTrue(self.suite is preserve_input(self.suite))
 
1733
        self.assertTrue("@#$" is preserve_input("@#$"))
 
1734
 
 
1735
    def test_randomize_suite(self):
 
1736
        randomized_suite = randomize_suite(self.suite)
 
1737
        # randomizing should not add or remove test names.
 
1738
        self.assertEqual(set(self._test_ids(self.suite)),
 
1739
            set(self._test_ids(randomized_suite)))
 
1740
        # Technically, this *can* fail, because random.shuffle(list) can be
 
1741
        # equal to list. Trying multiple times just pushes the frequency back.
 
1742
        # As its len(self.all_names)!:1, the failure frequency should be low
 
1743
        # enough to ignore. RBC 20071021.
 
1744
        # It should change the order.
 
1745
        self.assertNotEqual(self.all_names, self._test_ids(randomized_suite))
 
1746
        # But not the length. (Possibly redundant with the set test, but not
 
1747
        # necessarily.)
 
1748
        self.assertEqual(len(self.all_names),
 
1749
            len(self._test_ids(randomized_suite)))
 
1750
 
1527
1751
    def test_sort_suite_by_re(self):
1528
 
        sorted_suite = sort_suite_by_re(self.suite, 'test_filter')
1529
 
        sorted_names = [t.id() for t in iter_suite_tests(sorted_suite)]
 
1752
        sorted_suite = self.applyDeprecated(one_zero,
 
1753
            sort_suite_by_re, self.suite, 'test_filter_suite_by_r')
 
1754
        sorted_names = self._test_ids(sorted_suite)
1530
1755
        self.assertEqual(sorted_names[0], 'bzrlib.tests.test_selftest.'
1531
1756
            'TestSelftestFiltering.test_filter_suite_by_re')
1532
1757
        self.assertEquals(sorted(self.all_names), sorted(sorted_names))
1533
1758
 
 
1759
    def test_split_suit_by_re(self):
 
1760
        self.all_names = self._test_ids(self.suite)
 
1761
        split_suite = split_suite_by_re(self.suite, 'test_filter_suite_by_r')
 
1762
        filtered_name = ('bzrlib.tests.test_selftest.TestSelftestFiltering.'
 
1763
            'test_filter_suite_by_re')
 
1764
        self.assertEqual([filtered_name], self._test_ids(split_suite[0]))
 
1765
        self.assertFalse(filtered_name in self._test_ids(split_suite[1]))
 
1766
        remaining_names = list(self.all_names)
 
1767
        remaining_names.remove(filtered_name)
 
1768
        self.assertEqual(remaining_names, self._test_ids(split_suite[1]))
 
1769
 
 
1770
 
 
1771
class TestCheckInventoryShape(TestCaseWithTransport):
 
1772
 
 
1773
    def test_check_inventory_shape(self):
 
1774
        files = ['a', 'b/', 'b/c']
 
1775
        tree = self.make_branch_and_tree('.')
 
1776
        self.build_tree(files)
 
1777
        tree.add(files)
 
1778
        tree.lock_read()
 
1779
        try:
 
1780
            self.check_inventory_shape(tree.inventory, files)
 
1781
        finally:
 
1782
            tree.unlock()
 
1783
 
 
1784
 
 
1785
class TestBlackboxSupport(TestCase):
 
1786
    """Tests for testsuite blackbox features."""
 
1787
 
 
1788
    def test_run_bzr_failure_not_caught(self):
 
1789
        # When we run bzr in blackbox mode, we want any unexpected errors to
 
1790
        # propagate up to the test suite so that it can show the error in the
 
1791
        # usual way, and we won't get a double traceback.
 
1792
        e = self.assertRaises(
 
1793
            AssertionError,
 
1794
            self.run_bzr, ['assert-fail'])
 
1795
        # make sure we got the real thing, not an error from somewhere else in
 
1796
        # the test framework
 
1797
        self.assertEquals('always fails', str(e))
 
1798
        # check that there's no traceback in the test log
 
1799
        self.assertNotContainsRe(self._get_log(keep_log_file=True),
 
1800
            r'Traceback')
 
1801
 
 
1802
    def test_run_bzr_user_error_caught(self):
 
1803
        # Running bzr in blackbox mode, normal/expected/user errors should be
 
1804
        # caught in the regular way and turned into an error message plus exit
 
1805
        # code.
 
1806
        out, err = self.run_bzr(["log", "/nonexistantpath"], retcode=3)
 
1807
        self.assertEqual(out, '')
 
1808
        self.assertEqual(err, 'bzr: ERROR: Not a branch: "/nonexistantpath/".\n')
 
1809
 
 
1810
 
 
1811
class TestTestLoader(TestCase):
 
1812
    """Tests for the test loader."""
 
1813
 
 
1814
    def _get_loader_and_module(self):
 
1815
        """Gets a TestLoader and a module with one test in it."""
 
1816
        loader = TestUtil.TestLoader()
 
1817
        module = {}
 
1818
        class Stub(TestCase):
 
1819
            def test_foo(self):
 
1820
                pass
 
1821
        class MyModule(object):
 
1822
            pass
 
1823
        MyModule.a_class = Stub
 
1824
        module = MyModule()
 
1825
        return loader, module
 
1826
 
 
1827
    def test_module_no_load_tests_attribute_loads_classes(self):
 
1828
        loader, module = self._get_loader_and_module()
 
1829
        self.assertEqual(1, loader.loadTestsFromModule(module).countTestCases())
 
1830
 
 
1831
    def test_module_load_tests_attribute_gets_called(self):
 
1832
        loader, module = self._get_loader_and_module()
 
1833
        # 'self' is here because we're faking the module with a class. Regular
 
1834
        # load_tests do not need that :)
 
1835
        def load_tests(self, standard_tests, module, loader):
 
1836
            result = loader.suiteClass()
 
1837
            for test in iter_suite_tests(standard_tests):
 
1838
                result.addTests([test, test])
 
1839
            return result
 
1840
        # add a load_tests() method which multiplies the tests from the module.
 
1841
        module.__class__.load_tests = load_tests
 
1842
        self.assertEqual(2, loader.loadTestsFromModule(module).countTestCases())
 
1843