15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
from testsweet import TestCase, run_suite, InTempDir
19
import bzrlib.commands
22
MODULES_TO_DOCTEST = []
25
class BzrTestBase(InTempDir):
26
"""bzr-specific test base class"""
27
def run_bzr(self, *args, **kwargs):
28
retcode = kwargs.get('retcode', 0)
29
self.assertEquals(bzrlib.commands.run_bzr(args), retcode)
18
from unittest import TestResult, TestCase
22
from subprocess import call, Popen, PIPE
23
except ImportError, e:
24
sys.stderr.write("testbzr: sorry, this test suite requires the subprocess module\n"
25
"this is shipped with python2.4 and available separately for 2.3\n")
29
class CommandFailed(Exception):
33
class TestBase(TestCase):
34
"""Base class for bzr test cases.
36
Just defines some useful helper functions; doesn't actually test
40
# TODO: Special methods to invoke bzr, so that we can run it
41
# through a specified Python intepreter
43
OVERRIDE_PYTHON = None # to run with alternative python 'python'
47
def formcmd(self, cmd):
48
if isinstance(cmd, basestring):
53
if self.OVERRIDE_PYTHON:
54
cmd.insert(0, self.OVERRIDE_PYTHON)
56
self.log('$ %r' % cmd)
61
def runcmd(self, cmd, retcode=0):
62
"""Run one command and check the return code.
64
Returns a tuple of (stdout,stderr) strings.
66
If a single string is based, it is split into words.
67
For commands that are not simple space-separated words, please
68
pass a list instead."""
69
cmd = self.formcmd(cmd)
71
self.log('$ ' + ' '.join(cmd))
72
actual_retcode = call(cmd, stdout=self.TEST_LOG, stderr=self.TEST_LOG)
74
if retcode != actual_retcode:
75
raise CommandFailed("test failed: %r returned %d, expected %d"
76
% (cmd, actual_retcode, retcode))
79
def backtick(self, cmd, retcode=0):
80
cmd = self.formcmd(cmd)
81
child = Popen(cmd, stdout=PIPE, stderr=self.TEST_LOG)
82
outd, errd = child.communicate()
84
actual_retcode = child.wait()
86
outd = outd.replace('\r', '')
88
if retcode != actual_retcode:
89
raise CommandFailed("test failed: %r returned %d, expected %d"
90
% (cmd, actual_retcode, retcode))
98
"""Log a message to a progress file"""
99
print >>self.TEST_LOG, msg
102
class InTempDir(TestBase):
103
"""Base class for tests run in a temporary branch."""
106
self.test_dir = os.path.join(self.TEST_ROOT, self.__class__.__name__)
107
os.mkdir(self.test_dir)
108
os.chdir(self.test_dir)
32
def selftest(verbose=False):
112
os.chdir(self.TEST_ROOT)
118
class _MyResult(TestResult):
122
No special behaviour for now.
124
def startTest(self, test):
125
print str(test).ljust(60),
126
TestResult.startTest(self, test)
128
def stopTest(self, test):
130
TestResult.stopTest(self, test)
133
def addError(self, test, err):
135
TestResult.addError(self, test, err)
137
def addFailure(self, test, err):
139
TestResult.addFailure(self, test, err)
141
def addSuccess(self, test):
143
TestResult.addSuccess(self, test)
33
148
from unittest import TestLoader, TestSuite
34
import bzrlib, bzrlib.store, bzrlib.inventory, bzrlib.branch
35
import bzrlib.osutils, bzrlib.commands, bzrlib.merge3, bzrlib.plugin
150
import bzrlib.selftest.whitebox
151
import bzrlib.selftest.blackbox
36
152
from doctest import DocTestSuite
43
global MODULES_TO_TEST, MODULES_TO_DOCTEST
46
['bzrlib.selftest.whitebox',
47
'bzrlib.selftest.versioning',
48
'bzrlib.selftest.testinv',
49
'bzrlib.selftest.testmerge3',
50
'bzrlib.selftest.testhashcache',
51
'bzrlib.selftest.teststatus',
52
'bzrlib.selftest.testlog',
53
'bzrlib.selftest.blackbox',
54
'bzrlib.selftest.testrevisionnamespaces',
55
'bzrlib.selftest.testbranch',
56
'bzrlib.selftest.testrevision',
58
'bzrlib.selftest.testdiff',
61
# XXX: should also test bzrlib.merge_core, but they seem to be out
62
# of date with the code.
64
for m in (bzrlib.store, bzrlib.inventory, bzrlib.branch,
65
bzrlib.osutils, bzrlib.commands, bzrlib.merge3):
66
if m not in MODULES_TO_DOCTEST:
67
MODULES_TO_DOCTEST.append(m)
70
TestCase.BZRPATH = os.path.join(os.path.realpath(os.path.dirname(bzrlib.__path__[0])), 'bzr')
71
print '%-30s %s' % ('bzr binary', TestCase.BZRPATH)
75
160
suite = TestSuite()
77
suite.addTest(TestLoader().loadTestsFromNames(testmod_names))
79
for m in MODULES_TO_TEST:
80
suite.addTest(TestLoader().loadTestsFromModule(m))
82
for m in (MODULES_TO_DOCTEST):
163
for m in bzrlib.selftest.whitebox, :
164
suite.addTest(tl.loadTestsFromModule(m))
166
suite.addTest(bzrlib.selftest.blackbox.suite())
168
for m in bzrlib.store, bzrlib.inventory, bzrlib.branch, bzrlib.osutils, \
83
170
suite.addTest(DocTestSuite(m))
85
for p in bzrlib.plugin.all_plugins:
86
if hasattr(p, 'test_suite'):
87
suite.addTest(p.test_suite())
89
import bzrlib.merge_core
90
suite.addTest(unittest.makeSuite(bzrlib.merge_core.MergeTest, 'test_'))
92
return run_suite(suite, 'testbzr', verbose=verbose)
175
_show_results(result)
177
return result.wasSuccessful()
180
def _setup_test_log():
184
log_filename = os.path.abspath('testbzr.log')
185
TestBase.TEST_LOG = open(log_filename, 'wt', buffering=1) # line buffered
187
print >>TestBase.TEST_LOG, "bzr tests run at " + time.ctime()
188
print '%-30s %s' % ('test log', log_filename)
191
def _setup_test_dir():
195
TestBase.ORIG_DIR = os.getcwdu()
196
TestBase.TEST_ROOT = os.path.abspath("testbzr.tmp")
198
print '%-30s %s' % ('running tests in', TestBase.TEST_ROOT)
200
if os.path.exists(TestBase.TEST_ROOT):
201
shutil.rmtree(TestBase.TEST_ROOT)
202
os.mkdir(TestBase.TEST_ROOT)
203
os.chdir(TestBase.TEST_ROOT)
205
# make a fake bzr directory there to prevent any tests propagating
206
# up onto the source directory's real branch
207
os.mkdir(os.path.join(TestBase.TEST_ROOT, '.bzr'))
211
def _show_results(result):
212
for case, tb in result.errors:
213
_show_test_failure('ERROR', case, tb)
215
for case, tb in result.failures:
216
_show_test_failure('FAILURE', case, tb)
219
print '%4d tests run' % result.testsRun
220
print '%4d errors' % len(result.errors)
221
print '%4d failures' % len(result.failures)
225
def _show_test_failure(kind, case, tb):
226
print (kind + '! ').ljust(60, '-')
229
print ''.ljust(60, '-')