~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_selftest.py

  • Committer: Aaron Bentley
  • Date: 2006-02-16 18:52:17 UTC
  • mto: (1558.1.4 Aaron's integration)
  • mto: This revision was merged to the branch mainline in revision 1565.
  • Revision ID: abentley@panoramicfeedback.com-20060216185217-c766d147d91191d8
Added progress bars to merge

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 TestWorkingTreeProviderAdapter(TestCase):
 
310
    """A group of tests that test the workingtree implementation 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.workingtree import WorkingTreeTestProviderAdapter
 
316
        input_test = TestWorkingTreeProviderAdapter(
 
317
            "test_adapted_tests")
 
318
        server1 = "a"
 
319
        server2 = "b"
 
320
        formats = [("c", "C"), ("d", "D")]
 
321
        adapter = WorkingTreeTestProviderAdapter(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].workingtree_format, formats[0][0])
 
326
        self.assertEqual(tests[0].bzrdir_format, formats[0][1])
 
327
        self.assertEqual(tests[0].transport_server, server1)
 
328
        self.assertEqual(tests[0].transport_readonly_server, server2)
 
329
        self.assertEqual(tests[1].workingtree_format, formats[1][0])
 
330
        self.assertEqual(tests[1].bzrdir_format, formats[1][1])
 
331
        self.assertEqual(tests[1].transport_server, server1)
 
332
        self.assertEqual(tests[1].transport_readonly_server, server2)
 
333
 
 
334
 
 
335
class TestTestCaseWithTransport(TestCaseWithTransport):
 
336
    """Tests for the convenience functions TestCaseWithTransport introduces."""
 
337
 
 
338
    def test_get_readonly_url_none(self):
 
339
        from bzrlib.transport import get_transport
 
340
        from bzrlib.transport.memory import MemoryServer
 
341
        from bzrlib.transport.readonly import ReadonlyTransportDecorator
 
342
        self.transport_server = MemoryServer
 
343
        self.transport_readonly_server = None
 
344
        # calling get_readonly_transport() constructs a decorator on the url
 
345
        # for the server
 
346
        url = self.get_readonly_url()
 
347
        url2 = self.get_readonly_url('foo/bar')
 
348
        t = get_transport(url)
 
349
        t2 = get_transport(url2)
 
350
        self.failUnless(isinstance(t, ReadonlyTransportDecorator))
 
351
        self.failUnless(isinstance(t2, ReadonlyTransportDecorator))
 
352
        self.assertEqual(t2.base[:-1], t.abspath('foo/bar'))
 
353
 
 
354
    def test_get_readonly_url_http(self):
 
355
        from bzrlib.transport import get_transport
 
356
        from bzrlib.transport.local import LocalRelpathServer
 
357
        from bzrlib.transport.http import HttpServer, HttpTransport
 
358
        self.transport_server = LocalRelpathServer
 
359
        self.transport_readonly_server = HttpServer
 
360
        # calling get_readonly_transport() gives us a HTTP server instance.
 
361
        url = self.get_readonly_url()
 
362
        url2 = self.get_readonly_url('foo/bar')
 
363
        t = get_transport(url)
 
364
        t2 = get_transport(url2)
 
365
        self.failUnless(isinstance(t, HttpTransport))
 
366
        self.failUnless(isinstance(t2, HttpTransport))
 
367
        self.assertEqual(t2.base[:-1], t.abspath('foo/bar'))
 
368
 
 
369
 
 
370
class TestChrootedTest(ChrootedTestCase):
 
371
 
 
372
    def test_root_is_root(self):
 
373
        from bzrlib.transport import get_transport
 
374
        t = get_transport(self.get_readonly_url())
 
375
        url = t.base
 
376
        self.assertEqual(url, t.clone('..').base)