1
"""Testing helpers and base classes for better isolation."""
3
from contextlib import contextmanager
10
from mock import patch
17
stdout = StringIO.StringIO()
18
with patch('sys.stdout', stdout):
20
if stdout.getvalue() != '':
22
'Value written to stdout: {}'.format(stdout.getvalue()))
25
def use_context(test_case, context):
26
result = context.__enter__()
27
test_case.addCleanup(context.__exit__, None, None, None)
31
class TestCase(unittest.TestCase):
32
"""TestCase provides a better isolated version of unittest.TestCase."""
34
log_level = logging.INFO
38
super(TestCase, self).setUp()
40
def _must_not_Popen(*args, **kwargs):
41
"""Tests may patch Popen but should never call it."""
42
self.fail("subprocess.Popen(*{!r}, **{!r}) called".format(
45
self.addCleanup(setattr, subprocess, "Popen", subprocess.Popen)
46
subprocess.Popen = _must_not_Popen
48
self.addCleanup(setattr, os, "environ", os.environ)
49
os.environ = dict(self.test_environ)
51
setup_test_logging(self, self.log_level)
54
class FakeHomeTestCase(TestCase):
55
"""FakeHomeTestCase creates an isolated home dir for Juju to use."""
58
super(FakeHomeTestCase, self).setUp()
59
self.home_dir = use_context(self, utility.temp_dir())
60
os.environ["HOME"] = self.home_dir
61
os.environ["PATH"] = os.path.join(self.home_dir, ".local", "bin")
62
os.mkdir(os.path.join(self.home_dir, ".juju"))
65
def setup_test_logging(testcase, level=None):
66
log = logging.getLogger()
67
testcase.addCleanup(setattr, log, 'handlers', log.handlers)
69
testcase.log_stream = StringIO.StringIO()
70
handler = logging.StreamHandler(testcase.log_stream)
71
handler.setFormatter(logging.Formatter("%(levelname)s %(message)s"))
72
log.addHandler(handler)
74
testcase.addCleanup(log.setLevel, log.level)
79
setup_test_logging.__test__ = False
83
def parse_error(test_case):
84
stderr = StringIO.StringIO()
85
with test_case.assertRaises(SystemExit):
86
with patch('sys.stderr', stderr):
91
def temp_os_env(key, value):
92
org_value = os.environ.get(key, '')
93
os.environ[key] = value
97
os.environ[key] = org_value