/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
1553.5.19 by Martin Pool
Run lockdir doctests
1
# Copyright (C) 2005, 2006 by Canonical Ltd
608 by Martin Pool
- Split selftests out into a new module and start changing them
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 as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
609 by Martin Pool
- cleanup test code
17
1535 by Martin Pool
todo idea from John
18
# TODO: Perhaps there should be an API to find out if bzr running under the
19
# test suite -- some plugins might want to avoid making intrusive changes if
20
# this is the case.  However, we want behaviour under to test to diverge as
21
# little as possible, so this should be used rarely if it's added at all.
22
# (Suggestion from j-a-meinel, 2005-11-24)
23
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
24
import codecs
1185.1.29 by Robert Collins
merge merge tweaks from aaron, which includes latest .dev
25
from cStringIO import StringIO
1185.16.16 by Martin Pool
- add TestCase.assertEqualDiffs helper
26
import difflib
27
import errno
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
28
import logging
29
import os
1185.16.16 by Martin Pool
- add TestCase.assertEqualDiffs helper
30
import re
31
import shutil
1530.1.17 by Robert Collins
Move check_mode to TestCase.assertMode to make it generally accessible.
32
import stat
1185.1.58 by Robert Collins
make selftest -v show the elapsed time for each test run.
33
import sys
1185.16.16 by Martin Pool
- add TestCase.assertEqualDiffs helper
34
import tempfile
35
import unittest
1185.1.58 by Robert Collins
make selftest -v show the elapsed time for each test run.
36
import time
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
37
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
38
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
39
import bzrlib.branch
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
40
import bzrlib.bzrdir as bzrdir
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
41
import bzrlib.commands
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
42
import bzrlib.errors as errors
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
43
import bzrlib.inventory
1185.67.6 by Aaron Bentley
Added tests and fixes for LockableFiles.put_utf8(); imported IterableFile
44
import bzrlib.iterablefile
1553.5.19 by Martin Pool
Run lockdir doctests
45
import bzrlib.lockdir
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
46
import bzrlib.merge3
47
import bzrlib.osutils
48
import bzrlib.osutils as osutils
49
import bzrlib.plugin
50
import bzrlib.store
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
51
import bzrlib.trace
1553.5.9 by Martin Pool
Add TestCaseWithTransport.get_transport and get_readonly_transport
52
from bzrlib.transport import urlescape, get_transport
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
53
import bzrlib.transport
1534.4.25 by Robert Collins
Add a --transport parameter to the test suite to set the default transport to be used in the test suite.
54
from bzrlib.transport.local import LocalRelpathServer
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
55
from bzrlib.transport.readonly import ReadonlyServer
1185.43.1 by Martin Pool
Remove direct logging calls from selftest
56
from bzrlib.trace import mutter
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
57
from bzrlib.tests.TestUtil import TestLoader, TestSuite
1514 by Robert Collins
Unbreak self.build_tree_shape in tests.
58
from bzrlib.tests.treeshape import build_tree_contents
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
59
from bzrlib.workingtree import WorkingTree, WorkingTreeFormat2
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
60
1534.4.25 by Robert Collins
Add a --transport parameter to the test suite to set the default transport to be used in the test suite.
61
default_transport = LocalRelpathServer
62
855 by Martin Pool
- Patch from John to allow plugins to add their own tests.
63
MODULES_TO_TEST = []
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
64
MODULES_TO_DOCTEST = [
65
                      bzrlib.branch,
66
                      bzrlib.commands,
67
                      bzrlib.errors,
68
                      bzrlib.inventory,
1185.67.6 by Aaron Bentley
Added tests and fixes for LockableFiles.put_utf8(); imported IterableFile
69
                      bzrlib.iterablefile,
1553.5.19 by Martin Pool
Run lockdir doctests
70
                      bzrlib.lockdir,
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
71
                      bzrlib.merge3,
1545.1.2 by Denys Duchier
order MODULES_TO_DOCTEST alphabetically
72
                      bzrlib.option,
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
73
                      bzrlib.osutils,
1545.1.2 by Denys Duchier
order MODULES_TO_DOCTEST alphabetically
74
                      bzrlib.store
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
75
                      ]
76
def packages_to_test():
1530.2.1 by Robert Collins
Start tests for api usage.
77
    """Return a list of packages to test.
78
79
    The packages are not globally imported so that import failures are
80
    triggered when running selftest, not when importing the command.
81
    """
82
    import bzrlib.doc
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
83
    import bzrlib.tests.blackbox
1534.4.23 by Robert Collins
Move branch implementations tests into a package.
84
    import bzrlib.tests.branch_implementations
1534.4.39 by Robert Collins
Basic BzrDir support.
85
    import bzrlib.tests.bzrdir_implementations
1534.1.29 by Robert Collins
Add a test environment for InterRepository objects, and remove the fetch corner case tests from test_repository.
86
    import bzrlib.tests.interrepository_implementations
1563.2.12 by Robert Collins
Checkpointing: created InterObject to factor out common inter object worker code, added InterVersionedFile and tests to allow making join work between any versionedfile.
87
    import bzrlib.tests.interversionedfile_implementations
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
88
    import bzrlib.tests.repository_implementations
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
89
    import bzrlib.tests.workingtree_implementations
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
90
    return [
1530.2.1 by Robert Collins
Start tests for api usage.
91
            bzrlib.doc,
1551.2.6 by Aaron Bentley
Restored blackbox tests [recommit]
92
            bzrlib.tests.blackbox,
1534.4.23 by Robert Collins
Move branch implementations tests into a package.
93
            bzrlib.tests.branch_implementations,
1534.4.39 by Robert Collins
Basic BzrDir support.
94
            bzrlib.tests.bzrdir_implementations,
1534.1.29 by Robert Collins
Add a test environment for InterRepository objects, and remove the fetch corner case tests from test_repository.
95
            bzrlib.tests.interrepository_implementations,
1563.2.12 by Robert Collins
Checkpointing: created InterObject to factor out common inter object worker code, added InterVersionedFile and tests to allow making join work between any versionedfile.
96
            bzrlib.tests.interversionedfile_implementations,
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
97
            bzrlib.tests.repository_implementations,
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
98
            bzrlib.tests.workingtree_implementations,
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
99
            ]
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
100
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
101
102
class _MyResult(unittest._TextTestResult):
1185.43.2 by Martin Pool
Nicer display of verbose test results and progress
103
    """Custom TestResult.
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
104
1185.33.54 by Martin Pool
[merge] test renames and other fixes (John)
105
    Shows output in a different format, including displaying runtime for tests.
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
106
    """
1185.62.21 by John Arbash Meinel
Allow bzr selftest --one to continue, even if we have a Skipped test.
107
    stop_early = False
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
108
1185.1.58 by Robert Collins
make selftest -v show the elapsed time for each test run.
109
    def _elapsedTime(self):
1185.43.2 by Martin Pool
Nicer display of verbose test results and progress
110
        return "%5dms" % (1000 * (time.time() - self._start_time))
1185.1.58 by Robert Collins
make selftest -v show the elapsed time for each test run.
111
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
112
    def startTest(self, test):
113
        unittest.TestResult.startTest(self, test)
1185.31.17 by John Arbash Meinel
Shorten test names in verbose mode in a logical way. Removed bzrlib.selftest prefix
114
        # In a short description, the important words are in
115
        # the beginning, but in an id, the important words are
116
        # at the end
1185.33.54 by Martin Pool
[merge] test renames and other fixes (John)
117
        SHOW_DESCRIPTIONS = False
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
118
        if self.showAll:
1185.33.60 by Martin Pool
Use full terminal width for verbose test output.
119
            width = osutils.terminal_width()
120
            name_width = width - 15
121
            what = None
122
            if SHOW_DESCRIPTIONS:
123
                what = test.shortDescription()
124
                if what:
125
                    if len(what) > name_width:
126
                        what = what[:name_width-3] + '...'
127
            if what is None:
128
                what = test.id()
129
                if what.startswith('bzrlib.tests.'):
130
                    what = what[13:]
131
                if len(what) > name_width:
132
                    what = '...' + what[3-name_width:]
133
            what = what.ljust(name_width)
134
            self.stream.write(what)
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
135
        self.stream.flush()
1185.1.58 by Robert Collins
make selftest -v show the elapsed time for each test run.
136
        self._start_time = time.time()
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
137
138
    def addError(self, test, err):
1185.33.95 by Martin Pool
New TestSkipped facility, and tests for it.
139
        if isinstance(err[1], TestSkipped):
140
            return self.addSkipped(test, err)    
1185.1.58 by Robert Collins
make selftest -v show the elapsed time for each test run.
141
        unittest.TestResult.addError(self, test, err)
142
        if self.showAll:
143
            self.stream.writeln("ERROR %s" % self._elapsedTime())
144
        elif self.dots:
145
            self.stream.write('E')
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
146
        self.stream.flush()
1185.62.21 by John Arbash Meinel
Allow bzr selftest --one to continue, even if we have a Skipped test.
147
        if self.stop_early:
148
            self.stop()
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
149
150
    def addFailure(self, test, err):
1185.1.58 by Robert Collins
make selftest -v show the elapsed time for each test run.
151
        unittest.TestResult.addFailure(self, test, err)
152
        if self.showAll:
1185.43.2 by Martin Pool
Nicer display of verbose test results and progress
153
            self.stream.writeln(" FAIL %s" % self._elapsedTime())
1185.1.58 by Robert Collins
make selftest -v show the elapsed time for each test run.
154
        elif self.dots:
155
            self.stream.write('F')
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
156
        self.stream.flush()
1185.62.21 by John Arbash Meinel
Allow bzr selftest --one to continue, even if we have a Skipped test.
157
        if self.stop_early:
158
            self.stop()
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
159
160
    def addSuccess(self, test):
161
        if self.showAll:
1185.43.2 by Martin Pool
Nicer display of verbose test results and progress
162
            self.stream.writeln('   OK %s' % self._elapsedTime())
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
163
        elif self.dots:
164
            self.stream.write('~')
165
        self.stream.flush()
166
        unittest.TestResult.addSuccess(self, test)
167
1185.33.96 by Martin Pool
Fix up display of reasons why tests were skipped.
168
    def addSkipped(self, test, skip_excinfo):
1185.33.95 by Martin Pool
New TestSkipped facility, and tests for it.
169
        if self.showAll:
1185.33.96 by Martin Pool
Fix up display of reasons why tests were skipped.
170
            print >>self.stream, ' SKIP %s' % self._elapsedTime()
171
            print >>self.stream, '     %s' % skip_excinfo[1]
1185.33.95 by Martin Pool
New TestSkipped facility, and tests for it.
172
        elif self.dots:
173
            self.stream.write('S')
174
        self.stream.flush()
175
        # seems best to treat this as success from point-of-view of unittest
176
        # -- it actually does nothing so it barely matters :)
177
        unittest.TestResult.addSuccess(self, test)
178
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
179
    def printErrorList(self, flavour, errors):
180
        for test, err in errors:
181
            self.stream.writeln(self.separator1)
1530.1.3 by Robert Collins
transport implementations now tested consistently.
182
            self.stream.writeln("%s: %s" % (flavour, self.getDescription(test)))
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
183
            if getattr(test, '_get_log', None) is not None:
1185.33.95 by Martin Pool
New TestSkipped facility, and tests for it.
184
                print >>self.stream
185
                print >>self.stream, \
1530.1.3 by Robert Collins
transport implementations now tested consistently.
186
                        ('vvvv[log from %s]' % test.id()).ljust(78,'-')
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
187
                print >>self.stream, test._get_log()
1185.33.95 by Martin Pool
New TestSkipped facility, and tests for it.
188
                print >>self.stream, \
1530.1.3 by Robert Collins
transport implementations now tested consistently.
189
                        ('^^^^[log from %s]' % test.id()).ljust(78,'-')
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
190
            self.stream.writeln(self.separator2)
191
            self.stream.writeln("%s" % err)
192
193
194
class TextTestRunner(unittest.TextTestRunner):
1185.16.58 by mbp at sourcefrog
- run all selftests by default
195
    stop_on_failure = False
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
196
197
    def _makeResult(self):
198
        result = _MyResult(self.stream, self.descriptions, self.verbosity)
1185.62.21 by John Arbash Meinel
Allow bzr selftest --one to continue, even if we have a Skipped test.
199
        result.stop_early = self.stop_on_failure
1185.16.58 by mbp at sourcefrog
- run all selftests by default
200
        return result
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
201
202
1393.1.46 by Martin Pool
- bzr selftest arguments can be partial ids of tests to run
203
def iter_suite_tests(suite):
204
    """Return all tests in a suite, recursing through nested suites"""
205
    for item in suite._tests:
206
        if isinstance(item, unittest.TestCase):
207
            yield item
208
        elif isinstance(item, unittest.TestSuite):
209
            for r in iter_suite_tests(item):
210
                yield r
211
        else:
212
            raise Exception('unknown object %r inside test suite %r'
213
                            % (item, suite))
214
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
215
216
class TestSkipped(Exception):
217
    """Indicates that a test was intentionally skipped, rather than failing."""
218
    # XXX: Not used yet
219
220
1147 by Martin Pool
- split builtin commands into separate module bzrlib.builtins;
221
class CommandFailed(Exception):
222
    pass
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
223
224
class TestCase(unittest.TestCase):
225
    """Base class for bzr unit tests.
226
    
227
    Tests that need access to disk resources should subclass 
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
228
    TestCaseInTempDir not TestCase.
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
229
230
    Error and debug log messages are redirected from their usual
231
    location into a temporary file, the contents of which can be
1185.16.109 by mbp at sourcefrog
Clean up test log files when tests complete.
232
    retrieved by _get_log().  We use a real OS file, not an in-memory object,
233
    so that it can also capture file IO.  When the test completes this file
234
    is read into memory and removed from disk.
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
235
       
236
    There are also convenience functions to invoke bzr's command-line
1185.16.108 by mbp at sourcefrog
Add TestCase.addCleanup method.
237
    routine, and to build and check bzr trees.
238
   
239
    In addition to the usual method of overriding tearDown(), this class also
240
    allows subclasses to register functions into the _cleanups list, which is
241
    run in order as the object is torn down.  It's less likely this will be
242
    accidentally overlooked.
243
    """
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
244
245
    BZRPATH = 'bzr'
1185.16.14 by Martin Pool
- make TestCase._get_log work even if setup was aborted
246
    _log_file_name = None
1185.16.109 by mbp at sourcefrog
Clean up test log files when tests complete.
247
    _log_contents = ''
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
248
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
249
    def __init__(self, methodName='testMethod'):
250
        super(TestCase, self).__init__(methodName)
251
        self._cleanups = []
252
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
253
    def setUp(self):
254
        unittest.TestCase.setUp(self)
1185.16.110 by mbp at sourcefrog
Refactor test setup/teardown into cleanup callbacks
255
        self._cleanEnvironment()
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
256
        bzrlib.trace.disable_default_logging()
1185.16.109 by mbp at sourcefrog
Clean up test log files when tests complete.
257
        self._startLogFile()
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
258
1185.16.16 by Martin Pool
- add TestCase.assertEqualDiffs helper
259
    def _ndiff_strings(self, a, b):
1185.16.67 by Martin Pool
- assertEqualDiff handles strings without trailing newline
260
        """Return ndiff between two strings containing lines.
261
        
262
        A trailing newline is added if missing to make the strings
263
        print properly."""
264
        if b and b[-1] != '\n':
265
            b += '\n'
266
        if a and a[-1] != '\n':
267
            a += '\n'
1185.16.21 by Martin Pool
- tweak diff shown by assertEqualDiff
268
        difflines = difflib.ndiff(a.splitlines(True),
269
                                  b.splitlines(True),
270
                                  linejunk=lambda x: False,
271
                                  charjunk=lambda x: False)
272
        return ''.join(difflines)
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
273
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
274
    def assertEqualDiff(self, a, b, message=None):
1185.16.16 by Martin Pool
- add TestCase.assertEqualDiffs helper
275
        """Assert two texts are equal, if not raise an exception.
276
        
277
        This is intended for use with multi-line strings where it can 
278
        be hard to find the differences by eye.
279
        """
280
        # TODO: perhaps override assertEquals to call this for strings?
281
        if a == b:
282
            return
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
283
        if message is None:
284
            message = "texts not equal:\n"
285
        raise AssertionError(message + 
1185.16.16 by Martin Pool
- add TestCase.assertEqualDiffs helper
286
                             self._ndiff_strings(a, b))      
1185.31.40 by John Arbash Meinel
Added osutils.mkdtemp()
287
        
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
288
    def assertEqualMode(self, mode, mode_test):
289
        self.assertEqual(mode, mode_test,
290
                         'mode mismatch %o != %o' % (mode, mode_test))
291
1185.31.40 by John Arbash Meinel
Added osutils.mkdtemp()
292
    def assertStartsWith(self, s, prefix):
293
        if not s.startswith(prefix):
294
            raise AssertionError('string %r does not start with %r' % (s, prefix))
295
296
    def assertEndsWith(self, s, suffix):
297
        if not s.endswith(prefix):
298
            raise AssertionError('string %r does not end with %r' % (s, suffix))
1185.16.42 by Martin Pool
- Add assertContainsRe
299
300
    def assertContainsRe(self, haystack, needle_re):
301
        """Assert that a contains something matching a regular expression."""
302
        if not re.search(needle_re, haystack):
303
            raise AssertionError('pattern "%s" not found in "%s"'
304
                    % (needle_re, haystack))
1442.1.70 by Robert Collins
Add assertFileEqual to TestCaseInTempDir.
305
1553.5.3 by Martin Pool
[patch] Rename TestCase.AssertSubset to assertSubset for consistency (Jan Hudec)
306
    def assertSubset(self, sublist, superlist):
1185.46.8 by Aaron Bentley
bzr add reports ignored patterns.
307
        """Assert that every entry in sublist is present in superlist."""
308
        missing = []
309
        for entry in sublist:
310
            if entry not in superlist:
311
                missing.append(entry)
312
        if len(missing) > 0:
313
            raise AssertionError("value(s) %r not present in container %r" % 
314
                                 (missing, superlist))
315
1185.68.1 by Aaron Bentley
test transactions
316
    def assertIs(self, left, right):
317
        if not (left is right):
318
            raise AssertionError("%r is not %r." % (left, right))
319
1530.1.21 by Robert Collins
Review feedback fixes.
320
    def assertTransportMode(self, transport, path, mode):
1530.1.17 by Robert Collins
Move check_mode to TestCase.assertMode to make it generally accessible.
321
        """Fail if a path does not have mode mode.
322
        
323
        If modes are not supported on this platform, the test is skipped.
324
        """
325
        if sys.platform == 'win32':
326
            return
327
        path_stat = transport.stat(path)
328
        actual_mode = stat.S_IMODE(path_stat.st_mode)
329
        self.assertEqual(mode, actual_mode,
330
            'mode of %r incorrect (%o != %o)' % (path, mode, actual_mode))
331
1185.16.109 by mbp at sourcefrog
Clean up test log files when tests complete.
332
    def _startLogFile(self):
333
        """Send bzr and test log messages to a temporary file.
334
335
        The file is removed as the test is torn down.
336
        """
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
337
        fileno, name = tempfile.mkstemp(suffix='.log', prefix='testbzr')
1185.52.1 by James Henstridge
Don't encode unicode messages to UTF-8 in mutter() (the stream writer does it).
338
        encoder, decoder, stream_reader, stream_writer = codecs.lookup('UTF-8')
339
        self._log_file = stream_writer(os.fdopen(fileno, 'w+'))
1534.4.25 by Robert Collins
Add a --transport parameter to the test suite to set the default transport to be used in the test suite.
340
        self._log_nonce = bzrlib.trace.enable_test_log(self._log_file)
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
341
        self._log_file_name = name
1185.16.109 by mbp at sourcefrog
Clean up test log files when tests complete.
342
        self.addCleanup(self._finishLogFile)
343
344
    def _finishLogFile(self):
345
        """Finished with the log file.
346
347
        Read contents into memory, close, and delete.
348
        """
1534.4.25 by Robert Collins
Add a --transport parameter to the test suite to set the default transport to be used in the test suite.
349
        bzrlib.trace.disable_test_log(self._log_nonce)
1185.16.109 by mbp at sourcefrog
Clean up test log files when tests complete.
350
        self._log_file.seek(0)
351
        self._log_contents = self._log_file.read()
1185.16.122 by Martin Pool
[patch] Close test log file before deleting, needed on Windows
352
        self._log_file.close()
1185.16.109 by mbp at sourcefrog
Clean up test log files when tests complete.
353
        os.remove(self._log_file_name)
354
        self._log_file = self._log_file_name = None
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
355
1185.16.108 by mbp at sourcefrog
Add TestCase.addCleanup method.
356
    def addCleanup(self, callable):
357
        """Arrange to run a callable when this case is torn down.
358
359
        Callables are run in the reverse of the order they are registered, 
360
        ie last-in first-out.
361
        """
1185.16.109 by mbp at sourcefrog
Clean up test log files when tests complete.
362
        if callable in self._cleanups:
363
            raise ValueError("cleanup function %r already registered on %s" 
364
                    % (callable, self))
1185.16.108 by mbp at sourcefrog
Add TestCase.addCleanup method.
365
        self._cleanups.append(callable)
366
1185.16.110 by mbp at sourcefrog
Refactor test setup/teardown into cleanup callbacks
367
    def _cleanEnvironment(self):
1185.38.3 by John Arbash Meinel
Refactored environment cleaning code
368
        new_env = {
369
            'HOME': os.getcwd(),
370
            'APPDATA': os.getcwd(),
371
            'BZREMAIL': None,
372
            'EMAIL': None,
373
        }
1185.38.4 by John Arbash Meinel
Making old_env a private member
374
        self.__old_env = {}
1185.16.110 by mbp at sourcefrog
Refactor test setup/teardown into cleanup callbacks
375
        self.addCleanup(self._restoreEnvironment)
1185.38.3 by John Arbash Meinel
Refactored environment cleaning code
376
        for name, value in new_env.iteritems():
377
            self._captureVar(name, value)
378
379
380
    def _captureVar(self, name, newvalue):
381
        """Set an environment variable, preparing it to be reset when finished."""
1185.38.4 by John Arbash Meinel
Making old_env a private member
382
        self.__old_env[name] = os.environ.get(name, None)
1185.38.3 by John Arbash Meinel
Refactored environment cleaning code
383
        if newvalue is None:
384
            if name in os.environ:
385
                del os.environ[name]
386
        else:
387
            os.environ[name] = newvalue
1185.16.110 by mbp at sourcefrog
Refactor test setup/teardown into cleanup callbacks
388
1185.38.2 by John Arbash Meinel
[patch] Aaron Bentley's HOME fix.
389
    @staticmethod
390
    def _restoreVar(name, value):
391
        if value is None:
1185.38.3 by John Arbash Meinel
Refactored environment cleaning code
392
            if name in os.environ:
393
                del os.environ[name]
1185.38.2 by John Arbash Meinel
[patch] Aaron Bentley's HOME fix.
394
        else:
395
            os.environ[name] = value
396
1185.16.110 by mbp at sourcefrog
Refactor test setup/teardown into cleanup callbacks
397
    def _restoreEnvironment(self):
1185.38.4 by John Arbash Meinel
Making old_env a private member
398
        for name, value in self.__old_env.iteritems():
1185.38.3 by John Arbash Meinel
Refactored environment cleaning code
399
            self._restoreVar(name, value)
1185.16.110 by mbp at sourcefrog
Refactor test setup/teardown into cleanup callbacks
400
401
    def tearDown(self):
1185.16.108 by mbp at sourcefrog
Add TestCase.addCleanup method.
402
        self._runCleanups()
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
403
        unittest.TestCase.tearDown(self)
404
1185.16.108 by mbp at sourcefrog
Add TestCase.addCleanup method.
405
    def _runCleanups(self):
406
        """Run registered cleanup functions. 
407
408
        This should only be called from TestCase.tearDown.
409
        """
1541 by Martin Pool
doc
410
        # TODO: Perhaps this should keep running cleanups even if 
411
        # one of them fails?
1185.33.74 by Martin Pool
pychecker cleanups
412
        for cleanup_fn in reversed(self._cleanups):
413
            cleanup_fn()
1185.16.108 by mbp at sourcefrog
Add TestCase.addCleanup method.
414
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
415
    def log(self, *args):
1185.43.1 by Martin Pool
Remove direct logging calls from selftest
416
        mutter(*args)
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
417
418
    def _get_log(self):
419
        """Return as a string the log for this test"""
1185.16.14 by Martin Pool
- make TestCase._get_log work even if setup was aborted
420
        if self._log_file_name:
421
            return open(self._log_file_name).read()
422
        else:
1185.16.109 by mbp at sourcefrog
Clean up test log files when tests complete.
423
            return self._log_contents
1185.43.1 by Martin Pool
Remove direct logging calls from selftest
424
        # TODO: Delete the log after it's been read in
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
425
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
426
    def capture(self, cmd, retcode=0):
1185.3.26 by Martin Pool
- remove remaining external executions of bzr
427
        """Shortcut that splits cmd into words, runs, and returns stdout"""
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
428
        return self.run_bzr_captured(cmd.split(), retcode=retcode)[0]
1185.3.26 by Martin Pool
- remove remaining external executions of bzr
429
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
430
    def run_bzr_captured(self, argv, retcode=0):
1185.22.7 by Michael Ellerman
Fix error in run_bzr_captured() doco
431
        """Invoke bzr and return (stdout, stderr).
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
432
433
        Useful for code that wants to check the contents of the
434
        output, the way error messages are presented, etc.
435
436
        This should be the main method for tests that want to exercise the
437
        overall behavior of the bzr application (rather than a unit test
438
        or a functional test of the library.)
439
440
        Much of the old code runs bzr by forking a new copy of Python, but
441
        that is slower, harder to debug, and generally not necessary.
442
1185.3.20 by Martin Pool
- run_bzr_captured also includes logged errors in
443
        This runs bzr through the interface that catches and reports
444
        errors, and with logging set to something approximating the
445
        default, so that error reporting can be checked.
446
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
447
        argv -- arguments to invoke bzr
448
        retcode -- expected return code, or None for don't-care.
449
        """
450
        stdout = StringIO()
451
        stderr = StringIO()
452
        self.log('run bzr: %s', ' '.join(argv))
1185.43.5 by Martin Pool
Update log message quoting
453
        # FIXME: don't call into logging here
1185.3.20 by Martin Pool
- run_bzr_captured also includes logged errors in
454
        handler = logging.StreamHandler(stderr)
455
        handler.setFormatter(bzrlib.trace.QuietFormatter())
456
        handler.setLevel(logging.INFO)
457
        logger = logging.getLogger('')
458
        logger.addHandler(handler)
459
        try:
460
            result = self.apply_redirected(None, stdout, stderr,
461
                                           bzrlib.commands.run_bzr_catch_errors,
462
                                           argv)
463
        finally:
464
            logger.removeHandler(handler)
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
465
        out = stdout.getvalue()
466
        err = stderr.getvalue()
467
        if out:
468
            self.log('output:\n%s', out)
469
        if err:
470
            self.log('errors:\n%s', err)
471
        if retcode is not None:
472
            self.assertEquals(result, retcode)
473
        return out, err
474
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
475
    def run_bzr(self, *args, **kwargs):
1119 by Martin Pool
doc
476
        """Invoke bzr, as if it were run from the command line.
477
478
        This should be the main method for tests that want to exercise the
479
        overall behavior of the bzr application (rather than a unit test
480
        or a functional test of the library.)
481
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
482
        This sends the stdout/stderr results into the test's log,
483
        where it may be useful for debugging.  See also run_captured.
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
484
        """
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
485
        retcode = kwargs.pop('retcode', 0)
1185.3.21 by Martin Pool
TestBase.run_bzr doesn't need to be deprecated
486
        return self.run_bzr_captured(args, retcode)
1185.3.18 by Martin Pool
- add new helper TestBase.run_bzr_captured
487
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
488
    def check_inventory_shape(self, inv, shape):
1291 by Martin Pool
- add test for moving files between directories
489
        """Compare an inventory to a list of expected names.
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
490
491
        Fail if they are not precisely equal.
492
        """
493
        extras = []
494
        shape = list(shape)             # copy
495
        for path, ie in inv.entries():
496
            name = path.replace('\\', '/')
497
            if ie.kind == 'dir':
498
                name = name + '/'
499
            if name in shape:
500
                shape.remove(name)
501
            else:
502
                extras.append(name)
503
        if shape:
504
            self.fail("expected paths not found in inventory: %r" % shape)
505
        if extras:
506
            self.fail("unexpected paths found in inventory: %r" % extras)
507
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
508
    def apply_redirected(self, stdin=None, stdout=None, stderr=None,
509
                         a_callable=None, *args, **kwargs):
510
        """Call callable with redirected std io pipes.
511
512
        Returns the return code."""
513
        if not callable(a_callable):
514
            raise ValueError("a_callable must be callable.")
515
        if stdin is None:
516
            stdin = StringIO("")
517
        if stdout is None:
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
518
            if getattr(self, "_log_file", None) is not None:
974.1.70 by Aaron Bentley
Fixed selftest spewage (Brian M. Carlson)
519
                stdout = self._log_file
520
            else:
521
                stdout = StringIO()
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
522
        if stderr is None:
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
523
            if getattr(self, "_log_file", None is not None):
974.1.70 by Aaron Bentley
Fixed selftest spewage (Brian M. Carlson)
524
                stderr = self._log_file
525
            else:
526
                stderr = StringIO()
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
527
        real_stdin = sys.stdin
528
        real_stdout = sys.stdout
529
        real_stderr = sys.stderr
530
        try:
531
            sys.stdout = stdout
532
            sys.stderr = stderr
533
            sys.stdin = stdin
1160 by Martin Pool
- tiny refactoring
534
            return a_callable(*args, **kwargs)
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
535
        finally:
536
            sys.stdout = real_stdout
537
            sys.stderr = real_stderr
538
            sys.stdin = real_stdin
539
540
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
541
BzrTestBase = TestCase
542
543
     
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
544
class TestCaseInTempDir(TestCase):
545
    """Derived class that runs a test within a temporary directory.
546
547
    This is useful for tests that need to create a branch, etc.
548
549
    The directory is created in a slightly complex way: for each
550
    Python invocation, a new temporary top-level directory is created.
551
    All test cases create their own directory within that.  If the
552
    tests complete successfully, the directory is removed.
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
553
554
    InTempDir is an old alias for FunctionalTestCase.
555
    """
556
557
    TEST_ROOT = None
558
    _TEST_NAME = 'test'
559
    OVERRIDE_PYTHON = 'python'
560
561
    def check_file_contents(self, filename, expect):
562
        self.log("check contents of file %s" % filename)
563
        contents = file(filename, 'r').read()
564
        if contents != expect:
565
            self.log("expected: %r" % expect)
566
            self.log("actually: %r" % contents)
1185.1.41 by Robert Collins
massive patch from Alexander Belchenko - many PEP8 fixes, removes unused function uuid
567
            self.fail("contents of %s not as expected" % filename)
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
568
569
    def _make_test_root(self):
1141 by Martin Pool
- rename FunctionalTest to TestCaseInTempDir
570
        if TestCaseInTempDir.TEST_ROOT is not None:
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
571
            return
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
572
        i = 0
573
        while True:
1185.16.147 by Martin Pool
[patch] Test base directory must be unicode (from Alexander)
574
            root = u'test%04d.tmp' % i
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
575
            try:
576
                os.mkdir(root)
577
            except OSError, e:
578
                if e.errno == errno.EEXIST:
579
                    i += 1
580
                    continue
581
                else:
582
                    raise
583
            # successfully created
1185.31.37 by John Arbash Meinel
Switched os.path.abspath and os.path.realpath to osutils.* (still passes on cygwin)
584
            TestCaseInTempDir.TEST_ROOT = osutils.abspath(root)
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
585
            break
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
586
        # make a fake bzr directory there to prevent any tests propagating
587
        # up onto the source directory's real branch
1534.1.29 by Robert Collins
Add a test environment for InterRepository objects, and remove the fetch corner case tests from test_repository.
588
        bzrdir.BzrDir.create_standalone_workingtree(TestCaseInTempDir.TEST_ROOT)
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
589
590
    def setUp(self):
1185.16.110 by mbp at sourcefrog
Refactor test setup/teardown into cleanup callbacks
591
        super(TestCaseInTempDir, self).setUp()
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
592
        self._make_test_root()
1185.16.110 by mbp at sourcefrog
Refactor test setup/teardown into cleanup callbacks
593
        _currentdir = os.getcwdu()
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
594
        short_id = self.id().replace('bzrlib.tests.', '') \
1218 by Martin Pool
- fix up import
595
                   .replace('__main__.', '')
1185.31.33 by John Arbash Meinel
A couple more path.join statements needed changing.
596
        self.test_dir = osutils.pathjoin(self.TEST_ROOT, short_id)
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
597
        os.mkdir(self.test_dir)
598
        os.chdir(self.test_dir)
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
599
        os.environ['HOME'] = self.test_dir
1185.31.39 by John Arbash Meinel
Replacing os.getcwdu() with osutils.getcwd(),
600
        os.environ['APPDATA'] = self.test_dir
1185.16.110 by mbp at sourcefrog
Refactor test setup/teardown into cleanup callbacks
601
        def _leaveDirectory():
602
            os.chdir(_currentdir)
603
        self.addCleanup(_leaveDirectory)
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
604
        
1530.1.3 by Robert Collins
transport implementations now tested consistently.
605
    def build_tree(self, shape, line_endings='native', transport=None):
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
606
        """Build a test tree according to a pattern.
607
608
        shape is a sequence of file specifications.  If the final
609
        character is '/', a directory is created.
610
611
        This doesn't add anything to a branch.
1185.38.7 by John Arbash Meinel
Updated build_tree to use fixed line-endings for tests which read the file contents and compare
612
        :param line_endings: Either 'binary' or 'native'
613
                             in binary mode, exact contents are written
614
                             in native mode, the line endings match the
615
                             default platform endings.
1530.1.3 by Robert Collins
transport implementations now tested consistently.
616
617
        :param transport: A transport to write to, for building trees on 
618
                          VFS's. If the transport is readonly or None,
619
                          "." is opened automatically.
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
620
        """
621
        # XXX: It's OK to just create them using forward slashes on windows?
1530.1.3 by Robert Collins
transport implementations now tested consistently.
622
        if transport is None or transport.is_readonly():
1553.5.9 by Martin Pool
Add TestCaseWithTransport.get_transport and get_readonly_transport
623
            transport = get_transport(".")
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
624
        for name in shape:
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
625
            self.assert_(isinstance(name, basestring))
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
626
            if name[-1] == '/':
1530.1.3 by Robert Collins
transport implementations now tested consistently.
627
                transport.mkdir(urlescape(name[:-1]))
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
628
            else:
1185.38.7 by John Arbash Meinel
Updated build_tree to use fixed line-endings for tests which read the file contents and compare
629
                if line_endings == 'binary':
1530.1.3 by Robert Collins
transport implementations now tested consistently.
630
                    end = '\n'
1185.38.7 by John Arbash Meinel
Updated build_tree to use fixed line-endings for tests which read the file contents and compare
631
                elif line_endings == 'native':
1530.1.3 by Robert Collins
transport implementations now tested consistently.
632
                    end = os.linesep
1185.38.7 by John Arbash Meinel
Updated build_tree to use fixed line-endings for tests which read the file contents and compare
633
                else:
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
634
                    raise errors.BzrError('Invalid line ending request %r' % (line_endings,))
1530.1.3 by Robert Collins
transport implementations now tested consistently.
635
                content = "contents of %s%s" % (name, end)
636
                transport.put(urlescape(name), StringIO(content))
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
637
1185.16.53 by Martin Pool
- annotate improvements from Goffreddo, with extra bug fixes and tests
638
    def build_tree_contents(self, shape):
1514 by Robert Collins
Unbreak self.build_tree_shape in tests.
639
        build_tree_contents(shape)
1185.16.53 by Martin Pool
- annotate improvements from Goffreddo, with extra bug fixes and tests
640
1405 by Robert Collins
remove some of the upgrade code that was duplicated with inventory_entry, and give all inventory entries a weave
641
    def failUnlessExists(self, path):
642
        """Fail unless path, which may be abs or relative, exists."""
1448 by Robert Collins
revert symlinks correctly
643
        self.failUnless(osutils.lexists(path))
1185.31.40 by John Arbash Meinel
Added osutils.mkdtemp()
644
645
    def failIfExists(self, path):
646
        """Fail if path, which may be abs or relative, exists."""
647
        self.failIf(osutils.lexists(path))
1405 by Robert Collins
remove some of the upgrade code that was duplicated with inventory_entry, and give all inventory entries a weave
648
        
1442.1.70 by Robert Collins
Add assertFileEqual to TestCaseInTempDir.
649
    def assertFileEqual(self, content, path):
650
        """Fail if path does not contain 'content'."""
651
        self.failUnless(osutils.lexists(path))
652
        self.assertEqualDiff(content, open(path, 'r').read())
1185.31.40 by John Arbash Meinel
Added osutils.mkdtemp()
653
1123 by Martin Pool
* move bzr-specific code from testsweet into bzrlib.selftest
654
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
655
class TestCaseWithTransport(TestCaseInTempDir):
656
    """A test case that provides get_url and get_readonly_url facilities.
657
658
    These back onto two transport servers, one for readonly access and one for
659
    read write access.
660
661
    If no explicit class is provided for readonly access, a
662
    ReadonlyTransportDecorator is used instead which allows the use of non disk
663
    based read write transports.
664
665
    If an explicit class is provided for readonly access, that server and the 
666
    readwrite one must both define get_url() as resolving to os.getcwd().
667
    """
668
669
    def __init__(self, methodName='testMethod'):
670
        super(TestCaseWithTransport, self).__init__(methodName)
671
        self.__readonly_server = None
672
        self.__server = None
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
673
        self.transport_server = default_transport
1534.4.13 by Robert Collins
Give a reasonable warning on attempts to upgrade a readonly url.
674
        self.transport_readonly_server = None
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
675
1534.4.11 by Robert Collins
Convert test_open_containing from being a Remote test to being the more accurate Chrooted test.
676
    def get_readonly_url(self, relpath=None):
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
677
        """Get a URL for the readonly transport.
678
679
        This will either be backed by '.' or a decorator to the transport 
680
        used by self.get_url()
1534.4.11 by Robert Collins
Convert test_open_containing from being a Remote test to being the more accurate Chrooted test.
681
        relpath provides for clients to get a path relative to the base url.
682
        These should only be downwards relative, not upwards.
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
683
        """
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
684
        base = self.get_readonly_server().get_url()
685
        if relpath is not None:
686
            if not base.endswith('/'):
687
                base = base + '/'
688
            base = base + relpath
689
        return base
690
691
    def get_readonly_server(self):
692
        """Get the server instance for the readonly transport
693
694
        This is useful for some tests with specific servers to do diagnostics.
695
        """
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
696
        if self.__readonly_server is None:
697
            if self.transport_readonly_server is None:
698
                # readonly decorator requested
699
                # bring up the server
700
                self.get_url()
701
                self.__readonly_server = ReadonlyServer()
702
                self.__readonly_server.setUp(self.__server)
703
            else:
704
                self.__readonly_server = self.transport_readonly_server()
705
                self.__readonly_server.setUp()
706
            self.addCleanup(self.__readonly_server.tearDown)
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
707
        return self.__readonly_server
708
709
    def get_server(self):
710
        """Get the read/write server instance.
711
712
        This is useful for some tests with specific servers that need
713
        diagnostics.
714
        """
715
        if self.__server is None:
716
            self.__server = self.transport_server()
717
            self.__server.setUp()
718
            self.addCleanup(self.__server.tearDown)
719
        return self.__server
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
720
1534.4.11 by Robert Collins
Convert test_open_containing from being a Remote test to being the more accurate Chrooted test.
721
    def get_url(self, relpath=None):
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
722
        """Get a URL for the readwrite transport.
723
724
        This will either be backed by '.' or to an equivalent non-file based
725
        facility.
1534.4.11 by Robert Collins
Convert test_open_containing from being a Remote test to being the more accurate Chrooted test.
726
        relpath provides for clients to get a path relative to the base url.
727
        These should only be downwards relative, not upwards.
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
728
        """
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
729
        base = self.get_server().get_url()
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
730
        if relpath is not None and relpath != '.':
1534.4.11 by Robert Collins
Convert test_open_containing from being a Remote test to being the more accurate Chrooted test.
731
            if not base.endswith('/'):
732
                base = base + '/'
733
            base = base + relpath
734
        return base
735
1553.5.9 by Martin Pool
Add TestCaseWithTransport.get_transport and get_readonly_transport
736
    def get_transport(self):
737
        """Return a writeable transport for the test scratch space"""
738
        t = get_transport(self.get_url())
739
        self.assertFalse(t.is_readonly())
740
        return t
741
742
    def get_readonly_transport(self):
743
        """Return a readonly transport for the test scratch space
744
        
745
        This can be used to test that operations which should only need
746
        readonly access in fact do not try to write.
747
        """
748
        t = get_transport(self.get_readonly_url())
749
        self.assertTrue(t.is_readonly())
750
        return t
751
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
752
    def make_branch(self, relpath):
753
        """Create a branch on the transport at relpath."""
1534.4.41 by Robert Collins
Branch now uses BzrDir reasonably sanely.
754
        repo = self.make_repository(relpath)
755
        return repo.bzrdir.create_branch()
756
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
757
    def make_bzrdir(self, relpath):
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
758
        try:
759
            url = self.get_url(relpath)
760
            segments = relpath.split('/')
761
            if segments and segments[-1] not in ('', '.'):
762
                parent = self.get_url('/'.join(segments[:-1]))
1553.5.9 by Martin Pool
Add TestCaseWithTransport.get_transport and get_readonly_transport
763
                t = get_transport(parent)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
764
                try:
765
                    t.mkdir(segments[-1])
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
766
                except errors.FileExists:
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
767
                    pass
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
768
            return bzrlib.bzrdir.BzrDir.create(url)
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
769
        except errors.UninitializableFormat:
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
770
            raise TestSkipped("Format %s is not initializable.")
771
1534.6.6 by Robert Collins
Move find_repository to bzrdir, its not quite ideal there but its simpler and until someone chooses to vary the search by branch type its completely sufficient.
772
    def make_repository(self, relpath, shared=False):
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
773
        """Create a repository on our default transport at relpath."""
774
        made_control = self.make_bzrdir(relpath)
1534.6.6 by Robert Collins
Move find_repository to bzrdir, its not quite ideal there but its simpler and until someone chooses to vary the search by branch type its completely sufficient.
775
        return made_control.create_repository(shared=shared)
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
776
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
777
    def make_branch_and_tree(self, relpath):
778
        """Create a branch on the transport and a tree locally.
779
780
        Returns the tree.
781
        """
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
782
        # TODO: always use the local disk path for the working tree,
783
        # this obviously requires a format that supports branch references
784
        # so check for that by checking bzrdir.BzrDirFormat.get_default_format()
785
        # RBC 20060208
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
786
        b = self.make_branch(relpath)
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
787
        try:
788
            return b.bzrdir.create_workingtree()
789
        except errors.NotLocalUrl:
790
            # new formats - catch No tree error and create
791
            # a branch reference and a checkout.
792
            # old formats at that point - raise TestSkipped.
793
            # TODO: rbc 20060208
794
            return WorkingTreeFormat2().initialize(bzrdir.BzrDir.open(relpath))
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
795
1534.4.10 by Robert Collins
Add TestCaseWithTransport class that provides tests with read and write transport pairs.
796
1534.4.31 by Robert Collins
cleanedup test_outside_wt
797
class ChrootedTestCase(TestCaseWithTransport):
798
    """A support class that provides readonly urls outside the local namespace.
799
800
    This is done by checking if self.transport_server is a MemoryServer. if it
801
    is then we are chrooted already, if it is not then an HttpServer is used
802
    for readonly urls.
803
804
    TODO RBC 20060127: make this an option to TestCaseWithTransport so it can
805
                       be used without needed to redo it when a different 
806
                       subclass is in use ?
807
    """
808
809
    def setUp(self):
810
        super(ChrootedTestCase, self).setUp()
811
        if not self.transport_server == bzrlib.transport.memory.MemoryServer:
812
            self.transport_readonly_server = bzrlib.transport.http.HttpServer
813
814
1393.1.46 by Martin Pool
- bzr selftest arguments can be partial ids of tests to run
815
def filter_suite_by_re(suite, pattern):
1185.33.74 by Martin Pool
pychecker cleanups
816
    result = TestSuite()
1393.1.46 by Martin Pool
- bzr selftest arguments can be partial ids of tests to run
817
    filter_re = re.compile(pattern)
818
    for test in iter_suite_tests(suite):
1185.1.57 by Robert Collins
nuke --pattern to selftest, replace with regexp.search calls.
819
        if filter_re.search(test.id()):
1393.1.46 by Martin Pool
- bzr selftest arguments can be partial ids of tests to run
820
            result.addTest(test)
821
    return result
822
823
1185.16.58 by mbp at sourcefrog
- run all selftests by default
824
def run_suite(suite, name='test', verbose=False, pattern=".*",
1534.4.25 by Robert Collins
Add a --transport parameter to the test suite to set the default transport to be used in the test suite.
825
              stop_on_failure=False, keep_output=False,
826
              transport=None):
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
827
    TestCaseInTempDir._TEST_NAME = name
828
    if verbose:
829
        verbosity = 2
830
    else:
831
        verbosity = 1
832
    runner = TextTestRunner(stream=sys.stdout,
833
                            descriptions=0,
834
                            verbosity=verbosity)
1185.16.58 by mbp at sourcefrog
- run all selftests by default
835
    runner.stop_on_failure=stop_on_failure
1393.1.46 by Martin Pool
- bzr selftest arguments can be partial ids of tests to run
836
    if pattern != '.*':
837
        suite = filter_suite_by_re(suite, pattern)
838
    result = runner.run(suite)
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
839
    # This is still a little bogus, 
840
    # but only a little. Folk not using our testrunner will
841
    # have to delete their temp directories themselves.
1185.35.20 by Aaron Bentley
Only keep test failure directories if --keep-output is specified
842
    if result.wasSuccessful() or not keep_output:
1393.1.6 by Martin Pool
- fold testsweet into bzrlib.selftest
843
        if TestCaseInTempDir.TEST_ROOT is not None:
844
            shutil.rmtree(TestCaseInTempDir.TEST_ROOT) 
845
    else:
846
        print "Failed tests working directories are in '%s'\n" % TestCaseInTempDir.TEST_ROOT
847
    return result.wasSuccessful()
848
849
1185.35.20 by Aaron Bentley
Only keep test failure directories if --keep-output is specified
850
def selftest(verbose=False, pattern=".*", stop_on_failure=True,
1534.4.25 by Robert Collins
Add a --transport parameter to the test suite to set the default transport to be used in the test suite.
851
             keep_output=False,
852
             transport=None):
1204 by Martin Pool
doc
853
    """Run the whole test suite under the enhanced runner"""
1534.4.25 by Robert Collins
Add a --transport parameter to the test suite to set the default transport to be used in the test suite.
854
    global default_transport
855
    if transport is None:
856
        transport = default_transport
857
    old_transport = default_transport
858
    default_transport = transport
859
    suite = test_suite()
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
860
    try:
861
        return run_suite(suite, 'testbzr', verbose=verbose, pattern=pattern,
1534.4.25 by Robert Collins
Add a --transport parameter to the test suite to set the default transport to be used in the test suite.
862
                     stop_on_failure=stop_on_failure, keep_output=keep_output,
863
                     transport=transport)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
864
    finally:
865
        default_transport = old_transport
866
1092.1.17 by Robert Collins
remove TEST_CLASSES dead code and provide a bzrlib.test_suite() convenience method
867
868
869
def test_suite():
1204 by Martin Pool
doc
870
    """Build and return TestSuite for the whole program."""
721 by Martin Pool
- framework for running external commands from unittest suite
871
    from doctest import DocTestSuite
872
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
873
    global MODULES_TO_DOCTEST
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
874
1185.51.1 by Martin Pool
Better message when failing to import a test suite.
875
    testmod_names = [ \
1518 by Robert Collins
Merge from mbp.
876
                   'bzrlib.tests.test_ancestry',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
877
                   'bzrlib.tests.test_annotate',
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
878
                   'bzrlib.tests.test_api',
1518 by Robert Collins
Merge from mbp.
879
                   'bzrlib.tests.test_bad_files',
1185.50.21 by John Arbash Meinel
Added a test for basis-inventory, which should have happened before.
880
                   'bzrlib.tests.test_basis_inventory',
1518 by Robert Collins
Merge from mbp.
881
                   'bzrlib.tests.test_branch',
1534.4.39 by Robert Collins
Basic BzrDir support.
882
                   'bzrlib.tests.test_bzrdir',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
883
                   'bzrlib.tests.test_command',
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
884
                   'bzrlib.tests.test_commit',
885
                   'bzrlib.tests.test_commit_merge',
886
                   'bzrlib.tests.test_config',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
887
                   'bzrlib.tests.test_conflicts',
1551.3.11 by Aaron Bentley
Merge from Robert
888
                   'bzrlib.tests.test_decorators',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
889
                   'bzrlib.tests.test_diff',
1551.3.11 by Aaron Bentley
Merge from Robert
890
                   'bzrlib.tests.test_doc_generate',
1534.4.47 by Robert Collins
Split out repository into .bzr/repository
891
                   'bzrlib.tests.test_errors',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
892
                   'bzrlib.tests.test_fetch',
1518 by Robert Collins
Merge from mbp.
893
                   'bzrlib.tests.test_gpg',
894
                   'bzrlib.tests.test_graph',
895
                   'bzrlib.tests.test_hashcache',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
896
                   'bzrlib.tests.test_http',
1518 by Robert Collins
Merge from mbp.
897
                   'bzrlib.tests.test_identitymap',
898
                   'bzrlib.tests.test_inv',
1563.2.4 by Robert Collins
First cut at including the knit implementation of versioned_file.
899
                   'bzrlib.tests.test_knit',
1553.5.12 by Martin Pool
New LockDir locking mechanism
900
                   'bzrlib.tests.test_lockdir',
1185.67.4 by Aaron Bentley
Throw if we try to write to a LockableFiles with no write lock
901
                   'bzrlib.tests.test_lockable_files',
1518 by Robert Collins
Merge from mbp.
902
                   'bzrlib.tests.test_log',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
903
                   'bzrlib.tests.test_merge',
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
904
                   'bzrlib.tests.test_merge3',
1518 by Robert Collins
Merge from mbp.
905
                   'bzrlib.tests.test_merge_core',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
906
                   'bzrlib.tests.test_missing',
1518 by Robert Collins
Merge from mbp.
907
                   'bzrlib.tests.test_msgeditor',
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
908
                   'bzrlib.tests.test_nonascii',
1518 by Robert Collins
Merge from mbp.
909
                   'bzrlib.tests.test_options',
1185.50.20 by John Arbash Meinel
merge permissions branch, also fixup tests so they are lined up with bzr.dev to help prevent conflicts.
910
                   'bzrlib.tests.test_osutils',
1185.58.1 by John Arbash Meinel
Added new permissions test (currently don't pass)
911
                   'bzrlib.tests.test_permissions',
1515 by Robert Collins
* Plugins with the same name in different directories in the bzr plugin
912
                   'bzrlib.tests.test_plugins',
1534.4.40 by Robert Collins
Add RepositoryFormats and allow bzrdir.open or create _repository to be used.
913
                   'bzrlib.tests.test_repository',
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
914
                   'bzrlib.tests.test_revision',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
915
                   'bzrlib.tests.test_revisionnamespaces',
1518 by Robert Collins
Merge from mbp.
916
                   'bzrlib.tests.test_revprops',
1185.47.1 by Martin Pool
[broken] start converting basic_io to more rfc822-like format
917
                   'bzrlib.tests.test_rio',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
918
                   'bzrlib.tests.test_sampler',
1185.51.1 by Martin Pool
Better message when failing to import a test suite.
919
                   'bzrlib.tests.test_selftest',
1185.33.89 by Martin Pool
[patch] add a selftest test that the setup build script works (Alexander Belchenko)
920
                   'bzrlib.tests.test_setup',
1185.50.20 by John Arbash Meinel
merge permissions branch, also fixup tests so they are lined up with bzr.dev to help prevent conflicts.
921
                   'bzrlib.tests.test_sftp_transport',
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
922
                   'bzrlib.tests.test_smart_add',
1522 by Robert Collins
Test for the number of uses of self.working_tree() in branch.py
923
                   'bzrlib.tests.test_source',
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
924
                   'bzrlib.tests.test_store',
1534.2.1 by Robert Collins
Implement deprecated_method
925
                   'bzrlib.tests.test_symbol_versioning',
1518 by Robert Collins
Merge from mbp.
926
                   'bzrlib.tests.test_testament',
927
                   'bzrlib.tests.test_trace',
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
928
                   'bzrlib.tests.test_transactions',
1534.7.1 by Aaron Bentley
Got creation of a versioned file working
929
                   'bzrlib.tests.test_transform',
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
930
                   'bzrlib.tests.test_transport',
931
                   'bzrlib.tests.test_tsort',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
932
                   'bzrlib.tests.test_ui',
933
                   'bzrlib.tests.test_uncommit',
934
                   'bzrlib.tests.test_upgrade',
1563.2.1 by Robert Collins
Merge in a variation of the versionedfile api from versioned-file.
935
                   'bzrlib.tests.test_versionedfile',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
936
                   'bzrlib.tests.test_weave',
937
                   'bzrlib.tests.test_whitebox',
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
938
                   'bzrlib.tests.test_workingtree',
1185.33.91 by Martin Pool
[merge] improved 'missing' command from aaron
939
                   'bzrlib.tests.test_xml',
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
940
                   ]
1530.1.3 by Robert Collins
transport implementations now tested consistently.
941
    test_transport_implementations = [
942
        'bzrlib.tests.test_transport_implementations']
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
943
1185.31.33 by John Arbash Meinel
A couple more path.join statements needed changing.
944
    TestCase.BZRPATH = osutils.pathjoin(
945
            osutils.realpath(osutils.dirname(bzrlib.__path__[0])), 'bzr')
1185.31.57 by John Arbash Meinel
[merge] bzr.dev
946
    print '%10s: %s' % ('bzr', osutils.realpath(sys.argv[0]))
1185.51.1 by Martin Pool
Better message when failing to import a test suite.
947
    print '%10s: %s' % ('bzrlib', bzrlib.__path__[0])
744 by Martin Pool
- show nicer descriptions while running tests
948
    print
721 by Martin Pool
- framework for running external commands from unittest suite
949
    suite = TestSuite()
1185.51.1 by Martin Pool
Better message when failing to import a test suite.
950
    # python2.4's TestLoader.loadTestsFromNames gives very poor 
951
    # errors if it fails to load a named module - no indication of what's
952
    # actually wrong, just "no such module".  We should probably override that
953
    # class, but for the moment just load them ourselves. (mbp 20051202)
954
    loader = TestLoader()
1530.1.3 by Robert Collins
transport implementations now tested consistently.
955
    from bzrlib.transport import TransportTestProviderAdapter
956
    adapter = TransportTestProviderAdapter()
1534.4.23 by Robert Collins
Move branch implementations tests into a package.
957
    adapt_modules(test_transport_implementations, adapter, loader, suite)
1185.51.1 by Martin Pool
Better message when failing to import a test suite.
958
    for mod_name in testmod_names:
959
        mod = _load_module_by_name(mod_name)
960
        suite.addTest(loader.loadTestsFromModule(mod))
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
961
    for package in packages_to_test():
962
        suite.addTest(package.test_suite())
855 by Martin Pool
- Patch from John to allow plugins to add their own tests.
963
    for m in MODULES_TO_TEST:
1185.51.1 by Martin Pool
Better message when failing to import a test suite.
964
        suite.addTest(loader.loadTestsFromModule(m))
855 by Martin Pool
- Patch from John to allow plugins to add their own tests.
965
    for m in (MODULES_TO_DOCTEST):
721 by Martin Pool
- framework for running external commands from unittest suite
966
        suite.addTest(DocTestSuite(m))
1516 by Robert Collins
* bzrlib.plugin.all_plugins has been changed from an attribute to a
967
    for name, plugin in bzrlib.plugin.all_plugins().items():
1534.4.3 by Robert Collins
Implement BranchTestProviderAdapter, so tests now run across all branch formats.
968
        if getattr(plugin, 'test_suite', None) is not None:
1516 by Robert Collins
* bzrlib.plugin.all_plugins has been changed from an attribute to a
969
            suite.addTest(plugin.test_suite())
1092.1.17 by Robert Collins
remove TEST_CLASSES dead code and provide a bzrlib.test_suite() convenience method
970
    return suite
764 by Martin Pool
- log messages from a particular test are printed if that test fails
971
1185.51.1 by Martin Pool
Better message when failing to import a test suite.
972
1534.4.23 by Robert Collins
Move branch implementations tests into a package.
973
def adapt_modules(mods_list, adapter, loader, suite):
974
    """Adapt the modules in mods_list using adapter and add to suite."""
975
    for mod_name in mods_list:
976
        mod = _load_module_by_name(mod_name)
977
        for test in iter_suite_tests(loader.loadTestsFromModule(mod)):
978
            suite.addTests(adapter.adapt(test))
979
980
1185.51.1 by Martin Pool
Better message when failing to import a test suite.
981
def _load_module_by_name(mod_name):
982
    parts = mod_name.split('.')
983
    module = __import__(mod_name)
984
    del parts[0]
985
    # for historical reasons python returns the top-level module even though
986
    # it loads the submodule; we need to walk down to get the one we want.
987
    while parts:
988
        module = getattr(module, parts.pop(0))
989
    return module