14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
from cStringIO import StringIO
20
from bzrlib.cleanup import (
19
from ..cleanup import (
23
23
OperationWithCleanups,
25
from bzrlib.tests import TestCase
25
from ..sixish import (
28
from . import TestCase
80
83
"""The -Dcleanup debug flag causes cleanup errors to be reported to the
84
87
trace.push_log_file(log)
85
88
debug.debug_flags.add('cleanup')
86
89
self.assertFalse(_run_cleanup(self.failing_cleanup))
87
90
self.assertContainsRe(
89
"bzr: warning: Cleanup failed:.*failing_cleanup goes boom")
92
"brz: warning: Cleanup failed:.*failing_cleanup goes boom")
91
94
def test_prior_error_cleanup_succeeds(self):
92
95
"""Calling _run_cleanup from a finally block will not interfere with an
193
196
return [(raise_a, (), {}), (raise_b, (), {})]
195
198
def test_multiple_cleanup_failures_debug_flag(self):
197
200
trace.push_log_file(log)
198
201
debug.debug_flags.add('cleanup')
199
202
cleanups = self.make_two_failing_cleanup_funcs()
200
203
self.assertRaises(ErrorA, _do_with_cleanups, cleanups,
201
204
self.trivial_func)
202
205
self.assertContainsRe(
203
log.getvalue(), "bzr: warning: Cleanup failed:.*Error B\n")
204
self.assertEqual(1, log.getvalue().count('bzr: warning:'),
206
log.getvalue(), "brz: warning: Cleanup failed:.*Error B\n")
207
self.assertEqual(1, log.getvalue().count('brz: warning:'),
207
210
def test_func_and_cleanup_errors_debug_flag(self):
209
212
trace.push_log_file(log)
210
213
debug.debug_flags.add('cleanup')
211
214
cleanups = self.make_two_failing_cleanup_funcs()
212
215
self.assertRaises(ZeroDivisionError, _do_with_cleanups, cleanups,
213
216
self.failing_func)
214
217
self.assertContainsRe(
215
log.getvalue(), "bzr: warning: Cleanup failed:.*Error A\n")
218
log.getvalue(), "brz: warning: Cleanup failed:.*Error A\n")
216
219
self.assertContainsRe(
217
log.getvalue(), "bzr: warning: Cleanup failed:.*Error B\n")
218
self.assertEqual(2, log.getvalue().count('bzr: warning:'))
220
log.getvalue(), "brz: warning: Cleanup failed:.*Error B\n")
221
self.assertEqual(2, log.getvalue().count('brz: warning:'))
220
223
def test_func_may_mutate_cleanups(self):
221
224
"""The main func may mutate the cleanups before it returns.
238
241
"""The -Dcleanup debug flag causes cleanup errors to be reported to the
242
245
trace.push_log_file(log)
243
246
debug.debug_flags.add('cleanup')
244
247
self.assertRaises(ZeroDivisionError, _do_with_cleanups,
245
248
[(self.failing_cleanup, (), {})], self.failing_func)
246
249
self.assertContainsRe(
248
"bzr: warning: Cleanup failed:.*failing_cleanup goes boom")
249
self.assertEqual(1, log.getvalue().count('bzr: warning:'))
251
"brz: warning: Cleanup failed:.*failing_cleanup goes boom")
252
self.assertEqual(1, log.getvalue().count('brz: warning:'))
252
255
class ErrorA(Exception): pass
276
279
[('func called', 'foo'), 'cleanup 1', 'cleanup 2', 'cleanup 3',
277
280
'cleanup 4'], call_log)
283
class SampleWithCleanups(ObjectWithCleanups):
288
class TestObjectWithCleanups(TestCase):
290
def test_object_with_cleanups(self):
292
s = SampleWithCleanups()
293
s.add_cleanup(a.append, 42)
295
self.assertEqual(a, [42])