[106] | 1 | import shutil
|
---|
| 2 | import tempfile
|
---|
| 3 | import unittest
|
---|
| 4 |
|
---|
| 5 |
|
---|
| 6 | class SetupStack(object):
|
---|
| 7 |
|
---|
| 8 | def __init__(self):
|
---|
| 9 | self._on_teardown = []
|
---|
| 10 |
|
---|
| 11 | def add_teardown(self, teardown):
|
---|
| 12 | self._on_teardown.append(teardown)
|
---|
| 13 |
|
---|
| 14 | def tear_down(self):
|
---|
| 15 | for func in reversed(self._on_teardown):
|
---|
| 16 | func()
|
---|
| 17 |
|
---|
| 18 |
|
---|
| 19 | class TearDownConvenience(object):
|
---|
| 20 |
|
---|
| 21 | def __init__(self, setup_stack=None):
|
---|
| 22 | self._own_setup_stack = setup_stack is None
|
---|
| 23 | if setup_stack is None:
|
---|
| 24 | setup_stack = SetupStack()
|
---|
| 25 | self._setup_stack = setup_stack
|
---|
| 26 |
|
---|
| 27 | # only call this convenience method if no setup_stack was supplied to c'tor
|
---|
| 28 | def tear_down(self):
|
---|
| 29 | assert self._own_setup_stack
|
---|
| 30 | self._setup_stack.tear_down()
|
---|
| 31 |
|
---|
| 32 |
|
---|
| 33 | class TempDirMaker(TearDownConvenience):
|
---|
| 34 |
|
---|
| 35 | def make_temp_dir(self):
|
---|
| 36 | temp_dir = tempfile.mkdtemp(prefix="tmp-%s-" % self.__class__.__name__)
|
---|
| 37 | def tear_down():
|
---|
| 38 | shutil.rmtree(temp_dir)
|
---|
| 39 | self._setup_stack.add_teardown(tear_down)
|
---|
| 40 | return temp_dir
|
---|
| 41 |
|
---|
| 42 |
|
---|
| 43 | class MonkeyPatcher(TearDownConvenience):
|
---|
| 44 |
|
---|
| 45 | def monkey_patch(self, obj, name, value):
|
---|
| 46 | orig_value = getattr(obj, name)
|
---|
| 47 | setattr(obj, name, value)
|
---|
| 48 | def reverse_patch():
|
---|
| 49 | setattr(obj, name, orig_value)
|
---|
| 50 | self._setup_stack.add_teardown(reverse_patch)
|
---|
| 51 |
|
---|
| 52 |
|
---|
| 53 | class TestCase(unittest.TestCase):
|
---|
| 54 |
|
---|
| 55 | def setUp(self):
|
---|
| 56 | self._setup_stack = SetupStack()
|
---|
| 57 |
|
---|
| 58 | def tearDown(self):
|
---|
| 59 | self._setup_stack.tear_down()
|
---|
| 60 |
|
---|
| 61 | def make_temp_dir(self, *args, **kwds):
|
---|
| 62 | return TempDirMaker(self._setup_stack).make_temp_dir(*args, **kwds)
|
---|
| 63 |
|
---|
| 64 | def monkey_patch(self, *args, **kwds):
|
---|
| 65 | return MonkeyPatcher(self._setup_stack).monkey_patch(*args, **kwds)
|
---|
| 66 |
|
---|
| 67 | def assert_contains(self, container, containee):
|
---|
| 68 | self.assertTrue(containee in container, "%r not in %r" %
|
---|
| 69 | (containee, container))
|
---|
| 70 |
|
---|
| 71 | def assert_less_than(self, got, expected):
|
---|
| 72 | self.assertTrue(got < expected, "%r >= %r" %
|
---|
| 73 | (got, expected))
|
---|