~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_selftest.py

  • Committer: Robert Collins
  • Date: 2006-03-02 03:12:34 UTC
  • mto: (1594.2.4 integration)
  • mto: This revision was merged to the branch mainline in revision 1596.
  • Revision ID: robertc@robertcollins.net-20060302031234-cf6b75961f27c5df
InterVersionedFile implemented.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2005 by Canonical Ltd
 
2
#
 
3
# This program is free software; you can redistribute it and/or modify
 
4
# it under the terms of the GNU General Public License version 2 as published by
 
5
# the Free Software Foundation.
 
6
#
 
7
# This program is distributed in the hope that it will be useful,
 
8
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
9
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
10
# GNU General Public License for more details.
 
11
#
 
12
# You should have received a copy of the GNU General Public License
 
13
# along with this program; if not, write to the Free Software
 
14
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
15
 
 
16
"""Tests for the test framework
 
17
"""
 
18
 
 
19
import os
 
20
import sys
 
21
import unittest
 
22
import warnings
 
23
 
 
24
import bzrlib
 
25
from bzrlib.tests import (
 
26
                          _load_module_by_name,
 
27
                          ChrootedTestCase,
 
28
                          TestCase,
 
29
                          TestCaseInTempDir,
 
30
                          TestCaseWithTransport,
 
31
                          TestSkipped,
 
32
                          TextTestRunner,
 
33
                          )
 
34
import bzrlib.errors as errors
 
35
 
 
36
 
 
37
class SelftestTests(TestCase):
 
38
 
 
39
    def test_import_tests(self):
 
40
        mod = _load_module_by_name('bzrlib.tests.test_selftest')
 
41
        self.assertEqual(mod.SelftestTests, SelftestTests)
 
42
 
 
43
    def test_import_test_failure(self):
 
44
        self.assertRaises(ImportError,
 
45
                          _load_module_by_name,
 
46
                          'bzrlib.no-name-yet')
 
47
 
 
48
 
 
49
class MetaTestLog(TestCase):
 
50
 
 
51
    def test_logging(self):
 
52
        """Test logs are captured when a test fails."""
 
53
        self.log('a test message')
 
54
        self._log_file.flush()
 
55
        self.assertContainsRe(self._get_log(), 'a test message\n')
 
56
 
 
57
 
 
58
class TestTreeShape(TestCaseInTempDir):
 
59
 
 
60
    def test_unicode_paths(self):
 
61
        filename = u'hell\u00d8'
 
62
        try:
 
63
            self.build_tree_contents([(filename, 'contents of hello')])
 
64
        except UnicodeEncodeError:
 
65
            raise TestSkipped("can't build unicode working tree in "
 
66
                "filesystem encoding %s" % sys.getfilesystemencoding())
 
67
        self.failUnlessExists(filename)
 
68
 
 
69
 
 
70
class TestSkippedTest(TestCase):
 
71
    """Try running a test which is skipped, make sure it's reported properly."""
 
72
 
 
73
    def test_skipped_test(self):
 
74
        # must be hidden in here so it's not run as a real test
 
75
        def skipping_test():
 
76
            raise TestSkipped('test intentionally skipped')
 
77
        runner = TextTestRunner(stream=self._log_file)
 
78
        test = unittest.FunctionTestCase(skipping_test)
 
79
        result = runner.run(test)
 
80
        self.assertTrue(result.wasSuccessful())
 
81
 
 
82
 
 
83
class TestTransportProviderAdapter(TestCase):
 
84
    """A group of tests that test the transport implementation adaption core.
 
85
 
 
86
    This is a meta test that the tests are applied to all available 
 
87
    transports.
 
88
 
 
89
    This will be generalised in the future which is why it is in this 
 
90
    test file even though it is specific to transport tests at the moment.
 
91
    """
 
92
 
 
93
    def test_get_transport_permutations(self):
 
94
        # this checks that we the module get_test_permutations call
 
95
        # is made by the adapter get_transport_test_permitations method.
 
96
        class MockModule(object):
 
97
            def get_test_permutations(self):
 
98
                return sample_permutation
 
99
        sample_permutation = [(1,2), (3,4)]
 
100
        from bzrlib.transport import TransportTestProviderAdapter
 
101
        adapter = TransportTestProviderAdapter()
 
102
        self.assertEqual(sample_permutation,
 
103
                         adapter.get_transport_test_permutations(MockModule()))
 
104
 
 
105
    def test_adapter_checks_all_modules(self):
 
106
        # this checks that the adapter returns as many permurtations as
 
107
        # there are in all the registered# transport modules for there
 
108
        # - we assume if this matches its probably doing the right thing
 
109
        # especially in combination with the tests for setting the right
 
110
        # classes below.
 
111
        from bzrlib.transport import (TransportTestProviderAdapter,
 
112
                                      _get_transport_modules
 
113
                                      )
 
114
        modules = _get_transport_modules()
 
115
        permutation_count = 0
 
116
        for module in modules:
 
117
            try:
 
118
                permutation_count += len(reduce(getattr, 
 
119
                    (module + ".get_test_permutations").split('.')[1:],
 
120
                     __import__(module))())
 
121
            except errors.DependencyNotPresent:
 
122
                pass
 
123
        input_test = TestTransportProviderAdapter(
 
124
            "test_adapter_sets_transport_class")
 
125
        adapter = TransportTestProviderAdapter()
 
126
        self.assertEqual(permutation_count,
 
127
                         len(list(iter(adapter.adapt(input_test)))))
 
128
 
 
129
    def test_adapter_sets_transport_class(self):
 
130
        # when the adapter adapts a test it needs to 
 
131
        # place one of the permutations from the transport
 
132
        # providers in each test case copy. This checks
 
133
        # that it does not just use the same one all the time.
 
134
        # and that the id is set correctly so that debugging is
 
135
        # easy.
 
136
        # 
 
137
        # An instance of this test is actually used as the input
 
138
        # for adapting it to all the available transports
 
139
        # (or i think so - ??? mbp)
 
140
        from bzrlib.transport.local import (LocalTransport,
 
141
                                            LocalRelpathServer,
 
142
                                            LocalAbspathServer,
 
143
                                            LocalURLServer
 
144
                                            )
 
145
        try:
 
146
            from bzrlib.transport.sftp import (SFTPTransport,
 
147
                                               SFTPAbsoluteServer,
 
148
                                               SFTPHomeDirServer,
 
149
                                               SFTPSiblingAbsoluteServer,
 
150
                                               )
 
151
        except errors.ParamikoNotPresent, e:
 
152
            warnings.warn(str(e))
 
153
            has_paramiko = False
 
154
        else:
 
155
            has_paramiko = True
 
156
        from bzrlib.transport.http import (HttpTransport,
 
157
                                           HttpServer
 
158
                                           )
 
159
        from bzrlib.transport.ftp import FtpTransport
 
160
        from bzrlib.transport.memory import (MemoryTransport,
 
161
                                             MemoryServer
 
162
                                             )
 
163
        from bzrlib.transport import TransportTestProviderAdapter
 
164
        # FIXME. What we want is a factory for the things
 
165
        # needed to test the implementation. I.e. for transport we want:
 
166
        # the class that connections should get; a local server factory
 
167
        # so we would want the following permutations:
 
168
        # LocalTransport relpath-factory
 
169
        # LocalTransport abspath-factory
 
170
        # LocalTransport file://-factory
 
171
        # SFTPTransport homedir-factory
 
172
        # SFTPTransport abssolute-factory
 
173
        # HTTPTransport http-factory
 
174
        # HTTPTransport https-factory
 
175
        # etc, but we are currently lacking in this, so print out that
 
176
        # this should be fixed.
 
177
        input_test = TestTransportProviderAdapter(
 
178
            "test_adapter_sets_transport_class")
 
179
        suite = TransportTestProviderAdapter().adapt(input_test)
 
180
        # tests are generated in collation order. 
 
181
        # XXX: but i'm not sure the order should really be part of the 
 
182
        # contract of the adapter, should it -- mbp 20060201
 
183
        test_iter = iter(suite)
 
184
        http_test = test_iter.next()
 
185
        local_relpath_test = test_iter.next()
 
186
        local_abspath_test = test_iter.next()
 
187
        local_urlpath_test = test_iter.next()
 
188
        memory_test = test_iter.next()
 
189
        readonly_test = test_iter.next()
 
190
        if has_paramiko:
 
191
            sftp_abs_test = test_iter.next()
 
192
            sftp_homedir_test = test_iter.next()
 
193
            sftp_sibling_abs_test = test_iter.next()
 
194
        # ftp_test = test_iter.next()
 
195
        # should now be at the end of the test
 
196
        self.assertRaises(StopIteration, test_iter.next)
 
197
        self.assertEqual(LocalTransport, local_relpath_test.transport_class)
 
198
        self.assertEqual(LocalRelpathServer, local_relpath_test.transport_server)
 
199
        
 
200
        self.assertEqual(LocalTransport, local_abspath_test.transport_class)
 
201
        self.assertEqual(LocalAbspathServer, local_abspath_test.transport_server)
 
202
 
 
203
        self.assertEqual(LocalTransport, local_urlpath_test.transport_class)
 
204
        self.assertEqual(LocalURLServer, local_urlpath_test.transport_server)
 
205
 
 
206
        if has_paramiko:
 
207
            self.assertEqual(SFTPTransport, sftp_abs_test.transport_class)
 
208
            self.assertEqual(SFTPAbsoluteServer, sftp_abs_test.transport_server)
 
209
            self.assertEqual(SFTPTransport, sftp_homedir_test.transport_class)
 
210
            self.assertEqual(SFTPHomeDirServer, sftp_homedir_test.transport_server)
 
211
            self.assertEqual(SFTPTransport, sftp_sibling_abs_test.transport_class)
 
212
            self.assertEqual(SFTPSiblingAbsoluteServer,
 
213
                             sftp_sibling_abs_test.transport_server)
 
214
 
 
215
        self.assertEqual(HttpTransport, http_test.transport_class)
 
216
        self.assertEqual(HttpServer, http_test.transport_server)
 
217
        # self.assertEqual(FtpTransport, ftp_test.transport_class)
 
218
 
 
219
        self.assertEqual(MemoryTransport, memory_test.transport_class)
 
220
        self.assertEqual(MemoryServer, memory_test.transport_server)
 
221
        
 
222
        # we could test all of them for .id, but two is probably sufficient.
 
223
        self.assertEqual("bzrlib.tests.test_selftest."
 
224
                         "TestTransportProviderAdapter."
 
225
                         "test_adapter_sets_transport_class(MemoryServer)",
 
226
                         memory_test.id())
 
227
        self.assertEqual("bzrlib.tests.test_selftest."
 
228
                         "TestTransportProviderAdapter."
 
229
                         "test_adapter_sets_transport_class(LocalRelpathServer)",
 
230
                         local_relpath_test.id())
 
231
 
 
232
 
 
233
class TestBranchProviderAdapter(TestCase):
 
234
    """A group of tests that test the branch implementation test adapter."""
 
235
 
 
236
    def test_adapted_tests(self):
 
237
        # check that constructor parameters are passed through to the adapted
 
238
        # test.
 
239
        from bzrlib.branch import BranchTestProviderAdapter
 
240
        input_test = TestBranchProviderAdapter(
 
241
            "test_adapted_tests")
 
242
        server1 = "a"
 
243
        server2 = "b"
 
244
        formats = [("c", "C"), ("d", "D")]
 
245
        adapter = BranchTestProviderAdapter(server1, server2, formats)
 
246
        suite = adapter.adapt(input_test)
 
247
        tests = list(iter(suite))
 
248
        self.assertEqual(2, len(tests))
 
249
        self.assertEqual(tests[0].branch_format, formats[0][0])
 
250
        self.assertEqual(tests[0].bzrdir_format, formats[0][1])
 
251
        self.assertEqual(tests[0].transport_server, server1)
 
252
        self.assertEqual(tests[0].transport_readonly_server, server2)
 
253
        self.assertEqual(tests[1].branch_format, formats[1][0])
 
254
        self.assertEqual(tests[1].bzrdir_format, formats[1][1])
 
255
        self.assertEqual(tests[1].transport_server, server1)
 
256
        self.assertEqual(tests[1].transport_readonly_server, server2)
 
257
 
 
258
 
 
259
class TestBzrDirProviderAdapter(TestCase):
 
260
    """A group of tests that test the bzr dir implementation 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.bzrdir import BzrDirTestProviderAdapter
 
266
        input_test = TestBzrDirProviderAdapter(
 
267
            "test_adapted_tests")
 
268
        server1 = "a"
 
269
        server2 = "b"
 
270
        formats = ["c", "d"]
 
271
        adapter = BzrDirTestProviderAdapter(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].bzrdir_format, formats[0])
 
276
        self.assertEqual(tests[0].transport_server, server1)
 
277
        self.assertEqual(tests[0].transport_readonly_server, server2)
 
278
        self.assertEqual(tests[1].bzrdir_format, formats[1])
 
279
        self.assertEqual(tests[1].transport_server, server1)
 
280
        self.assertEqual(tests[1].transport_readonly_server, server2)
 
281
 
 
282
 
 
283
class TestRepositoryProviderAdapter(TestCase):
 
284
    """A group of tests that test the repository implementation test adapter."""
 
285
 
 
286
    def test_adapted_tests(self):
 
287
        # check that constructor parameters are passed through to the adapted
 
288
        # test.
 
289
        from bzrlib.repository import RepositoryTestProviderAdapter
 
290
        input_test = TestRepositoryProviderAdapter(
 
291
            "test_adapted_tests")
 
292
        server1 = "a"
 
293
        server2 = "b"
 
294
        formats = [("c", "C"), ("d", "D")]
 
295
        adapter = RepositoryTestProviderAdapter(server1, server2, formats)
 
296
        suite = adapter.adapt(input_test)
 
297
        tests = list(iter(suite))
 
298
        self.assertEqual(2, len(tests))
 
299
        self.assertEqual(tests[0].bzrdir_format, formats[0][1])
 
300
        self.assertEqual(tests[0].repository_format, formats[0][0])
 
301
        self.assertEqual(tests[0].transport_server, server1)
 
302
        self.assertEqual(tests[0].transport_readonly_server, server2)
 
303
        self.assertEqual(tests[1].bzrdir_format, formats[1][1])
 
304
        self.assertEqual(tests[1].repository_format, formats[1][0])
 
305
        self.assertEqual(tests[1].transport_server, server1)
 
306
        self.assertEqual(tests[1].transport_readonly_server, server2)
 
307
 
 
308
 
 
309
class TestInterRepositoryProviderAdapter(TestCase):
 
310
    """A group of tests that test the InterRepository test adapter."""
 
311
 
 
312
    def test_adapted_tests(self):
 
313
        # check that constructor parameters are passed through to the adapted
 
314
        # test.
 
315
        from bzrlib.repository import InterRepositoryTestProviderAdapter
 
316
        input_test = TestInterRepositoryProviderAdapter(
 
317
            "test_adapted_tests")
 
318
        server1 = "a"
 
319
        server2 = "b"
 
320
        formats = [(str, "C1", "C2"), (str, "D1", "D2")]
 
321
        adapter = InterRepositoryTestProviderAdapter(server1, server2, formats)
 
322
        suite = adapter.adapt(input_test)
 
323
        tests = list(iter(suite))
 
324
        self.assertEqual(2, len(tests))
 
325
        self.assertEqual(tests[0].interrepo_class, formats[0][0])
 
326
        self.assertEqual(tests[0].repository_format, formats[0][1])
 
327
        self.assertEqual(tests[0].repository_format_to, formats[0][2])
 
328
        self.assertEqual(tests[0].transport_server, server1)
 
329
        self.assertEqual(tests[0].transport_readonly_server, server2)
 
330
        self.assertEqual(tests[0].interrepo_class, formats[1][0])
 
331
        self.assertEqual(tests[1].repository_format, formats[1][1])
 
332
        self.assertEqual(tests[1].repository_format_to, formats[1][2])
 
333
        self.assertEqual(tests[1].transport_server, server1)
 
334
        self.assertEqual(tests[1].transport_readonly_server, server2)
 
335
 
 
336
 
 
337
class TestInterVersionedFileProviderAdapter(TestCase):
 
338
    """A group of tests that test the InterVersionedFile test adapter."""
 
339
 
 
340
    def test_adapted_tests(self):
 
341
        # check that constructor parameters are passed through to the adapted
 
342
        # test.
 
343
        from bzrlib.versionedfile import InterVersionedFileTestProviderAdapter
 
344
        input_test = TestInterRepositoryProviderAdapter(
 
345
            "test_adapted_tests")
 
346
        server1 = "a"
 
347
        server2 = "b"
 
348
        formats = [(str, "C1", "C2"), (str, "D1", "D2")]
 
349
        adapter = InterVersionedFileTestProviderAdapter(server1, server2, formats)
 
350
        suite = adapter.adapt(input_test)
 
351
        tests = list(iter(suite))
 
352
        self.assertEqual(2, len(tests))
 
353
        self.assertEqual(tests[0].interversionedfile_class, formats[0][0])
 
354
        self.assertEqual(tests[0].versionedfile_factory, formats[0][1])
 
355
        self.assertEqual(tests[0].versionedfile_factory_to, formats[0][2])
 
356
        self.assertEqual(tests[0].transport_server, server1)
 
357
        self.assertEqual(tests[0].transport_readonly_server, server2)
 
358
        self.assertEqual(tests[0].interversionedfile_class, formats[1][0])
 
359
        self.assertEqual(tests[1].versionedfile_factory, formats[1][1])
 
360
        self.assertEqual(tests[1].versionedfile_factory_to, formats[1][2])
 
361
        self.assertEqual(tests[1].transport_server, server1)
 
362
        self.assertEqual(tests[1].transport_readonly_server, server2)
 
363
 
 
364
 
 
365
class TestWorkingTreeProviderAdapter(TestCase):
 
366
    """A group of tests that test the workingtree implementation test adapter."""
 
367
 
 
368
    def test_adapted_tests(self):
 
369
        # check that constructor parameters are passed through to the adapted
 
370
        # test.
 
371
        from bzrlib.workingtree import WorkingTreeTestProviderAdapter
 
372
        input_test = TestWorkingTreeProviderAdapter(
 
373
            "test_adapted_tests")
 
374
        server1 = "a"
 
375
        server2 = "b"
 
376
        formats = [("c", "C"), ("d", "D")]
 
377
        adapter = WorkingTreeTestProviderAdapter(server1, server2, formats)
 
378
        suite = adapter.adapt(input_test)
 
379
        tests = list(iter(suite))
 
380
        self.assertEqual(2, len(tests))
 
381
        self.assertEqual(tests[0].workingtree_format, formats[0][0])
 
382
        self.assertEqual(tests[0].bzrdir_format, formats[0][1])
 
383
        self.assertEqual(tests[0].transport_server, server1)
 
384
        self.assertEqual(tests[0].transport_readonly_server, server2)
 
385
        self.assertEqual(tests[1].workingtree_format, formats[1][0])
 
386
        self.assertEqual(tests[1].bzrdir_format, formats[1][1])
 
387
        self.assertEqual(tests[1].transport_server, server1)
 
388
        self.assertEqual(tests[1].transport_readonly_server, server2)
 
389
 
 
390
 
 
391
class TestTestCaseWithTransport(TestCaseWithTransport):
 
392
    """Tests for the convenience functions TestCaseWithTransport introduces."""
 
393
 
 
394
    def test_get_readonly_url_none(self):
 
395
        from bzrlib.transport import get_transport
 
396
        from bzrlib.transport.memory import MemoryServer
 
397
        from bzrlib.transport.readonly import ReadonlyTransportDecorator
 
398
        self.transport_server = MemoryServer
 
399
        self.transport_readonly_server = None
 
400
        # calling get_readonly_transport() constructs a decorator on the url
 
401
        # for the server
 
402
        url = self.get_readonly_url()
 
403
        url2 = self.get_readonly_url('foo/bar')
 
404
        t = get_transport(url)
 
405
        t2 = get_transport(url2)
 
406
        self.failUnless(isinstance(t, ReadonlyTransportDecorator))
 
407
        self.failUnless(isinstance(t2, ReadonlyTransportDecorator))
 
408
        self.assertEqual(t2.base[:-1], t.abspath('foo/bar'))
 
409
 
 
410
    def test_get_readonly_url_http(self):
 
411
        from bzrlib.transport import get_transport
 
412
        from bzrlib.transport.local import LocalRelpathServer
 
413
        from bzrlib.transport.http import HttpServer, HttpTransport
 
414
        self.transport_server = LocalRelpathServer
 
415
        self.transport_readonly_server = HttpServer
 
416
        # calling get_readonly_transport() gives us a HTTP server instance.
 
417
        url = self.get_readonly_url()
 
418
        url2 = self.get_readonly_url('foo/bar')
 
419
        t = get_transport(url)
 
420
        t2 = get_transport(url2)
 
421
        self.failUnless(isinstance(t, HttpTransport))
 
422
        self.failUnless(isinstance(t2, HttpTransport))
 
423
        self.assertEqual(t2.base[:-1], t.abspath('foo/bar'))
 
424
 
 
425
 
 
426
class TestChrootedTest(ChrootedTestCase):
 
427
 
 
428
    def test_root_is_root(self):
 
429
        from bzrlib.transport import get_transport
 
430
        t = get_transport(self.get_readonly_url())
 
431
        url = t.base
 
432
        self.assertEqual(url, t.clone('..').base)