~bzr-pqm/bzr/bzr.dev

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