77
75
self._log_file_name = name
77
def run(self, result):
78
self.apply_redirected(None, None, None,
79
unittest.TestCase.run, self, result)
79
81
def tearDown(self):
80
82
logging.getLogger('').removeHandler(self._log_hdlr)
81
83
bzrlib.trace.enable_default_logging()
90
93
"""Return as a string the log for this test"""
91
94
return open(self._log_file_name).read()
94
def capture(self, cmd):
95
"""Shortcut that splits cmd into words, runs, and returns stdout"""
96
return self.run_bzr_captured(cmd.split())[0]
98
def run_bzr_captured(self, argv, retcode=0):
99
"""Invoke bzr and return (result, stdout, stderr).
101
Useful for code that wants to check the contents of the
102
output, the way error messages are presented, etc.
96
def run_bzr(self, *args, **kwargs):
97
"""Invoke bzr, as if it were run from the command line.
104
99
This should be the main method for tests that want to exercise the
105
100
overall behavior of the bzr application (rather than a unit test
108
103
Much of the old code runs bzr by forking a new copy of Python, but
109
104
that is slower, harder to debug, and generally not necessary.
111
This runs bzr through the interface that catches and reports
112
errors, and with logging set to something approximating the
113
default, so that error reporting can be checked.
115
argv -- arguments to invoke bzr
116
retcode -- expected return code, or None for don't-care.
120
self.log('run bzr: %s', ' '.join(argv))
121
handler = logging.StreamHandler(stderr)
122
handler.setFormatter(bzrlib.trace.QuietFormatter())
123
handler.setLevel(logging.INFO)
124
logger = logging.getLogger('')
125
logger.addHandler(handler)
127
result = self.apply_redirected(None, stdout, stderr,
128
bzrlib.commands.run_bzr_catch_errors,
131
logger.removeHandler(handler)
132
out = stdout.getvalue()
133
err = stderr.getvalue()
135
self.log('output:\n%s', out)
137
self.log('errors:\n%s', err)
138
if retcode is not None:
139
self.assertEquals(result, retcode)
142
def run_bzr(self, *args, **kwargs):
143
"""Invoke bzr, as if it were run from the command line.
145
This should be the main method for tests that want to exercise the
146
overall behavior of the bzr application (rather than a unit test
147
or a functional test of the library.)
149
This sends the stdout/stderr results into the test's log,
150
where it may be useful for debugging. See also run_captured.
152
retcode = kwargs.pop('retcode', 0)
153
return self.run_bzr_captured(args, retcode)
106
retcode = kwargs.get('retcode', 0)
107
result = self.apply_redirected(None, None, None,
108
bzrlib.commands.run_bzr, args)
109
self.assertEquals(result, retcode)
155
112
def check_inventory_shape(self, inv, shape):
157
114
Compare an inventory to a list of expected names.
235
193
self.fail("contents of %s not as expected")
237
195
def _make_test_root(self):
238
200
if TestCaseInTempDir.TEST_ROOT is not None:
242
root = 'test%04d.tmp' % i
246
if e.errno == errno.EEXIST:
251
# successfully created
252
TestCaseInTempDir.TEST_ROOT = os.path.abspath(root)
202
TestCaseInTempDir.TEST_ROOT = os.path.abspath(
203
tempfile.mkdtemp(suffix='.tmp',
204
prefix=self._TEST_NAME + '-',
254
207
# make a fake bzr directory there to prevent any tests propagating
255
208
# up onto the source directory's real branch
256
209
os.mkdir(os.path.join(TestCaseInTempDir.TEST_ROOT, '.bzr'))
259
212
super(TestCaseInTempDir, self).setUp()
260
214
self._make_test_root()
261
215
self._currentdir = os.getcwdu()
262
216
self.test_dir = os.path.join(self.TEST_ROOT, self.id())
264
218
os.chdir(self.test_dir)
266
220
def tearDown(self):
267
222
os.chdir(self._currentdir)
268
223
super(TestCaseInTempDir, self).tearDown()
225
def _formcmd(self, cmd):
226
if isinstance(cmd, basestring):
229
cmd[0] = self.BZRPATH
230
if self.OVERRIDE_PYTHON:
231
cmd.insert(0, self.OVERRIDE_PYTHON)
232
self.log('$ %r' % cmd)
235
def runcmd(self, cmd, retcode=0):
236
"""Run one command and check the return code.
238
Returns a tuple of (stdout,stderr) strings.
240
If a single string is based, it is split into words.
241
For commands that are not simple space-separated words, please
242
pass a list instead."""
243
cmd = self._formcmd(cmd)
244
self.log('$ ' + ' '.join(cmd))
245
actual_retcode = subprocess.call(cmd, stdout=self._log_file,
246
stderr=self._log_file)
247
if retcode != actual_retcode:
248
raise CommandFailed("test failed: %r returned %d, expected %d"
249
% (cmd, actual_retcode, retcode))
251
def backtick(self, cmd, retcode=0):
252
"""Run a command and return its output"""
253
cmd = self._formcmd(cmd)
254
child = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=self._log_file)
255
outd, errd = child.communicate()
257
actual_retcode = child.wait()
259
outd = outd.replace('\r', '')
261
if retcode != actual_retcode:
262
raise CommandFailed("test failed: %r returned %d, expected %d"
263
% (cmd, actual_retcode, retcode))
270
269
def build_tree(self, shape):
271
270
"""Build a test tree according to a pattern.
298
299
def selftest(verbose=False, pattern=".*"):
299
return testsweet.run_suite(test_suite(), 'testbzr', verbose=verbose, pattern=pattern)
300
return run_suite(test_suite(), 'testbzr', verbose=verbose, pattern=pattern)
302
303
def test_suite():
304
305
import bzrlib, bzrlib.store, bzrlib.inventory, bzrlib.branch
305
306
import bzrlib.osutils, bzrlib.commands, bzrlib.merge3, bzrlib.plugin
306
307
from doctest import DocTestSuite
308
313
global MODULES_TO_TEST, MODULES_TO_DOCTEST
315
320
'bzrlib.selftest.versioning',
316
321
'bzrlib.selftest.whitebox',
317
322
'bzrlib.selftest.testmerge3',
318
'bzrlib.selftest.testmerge',
319
323
'bzrlib.selftest.testhashcache',
320
324
'bzrlib.selftest.teststatus',
321
325
'bzrlib.selftest.testlog',
322
326
'bzrlib.selftest.blackbox',
323
327
'bzrlib.selftest.testrevisionnamespaces',
324
328
'bzrlib.selftest.testbranch',
325
'bzrlib.selftest.testremotebranch',
326
329
'bzrlib.selftest.testrevision',
327
'bzrlib.selftest.test_revision_info',
328
330
'bzrlib.selftest.test_merge_core',
329
331
'bzrlib.selftest.test_smart_add',
330
332
'bzrlib.selftest.testdiff',