blob: ea122111caa9f844f205a46d025a31ed96f65890 [file] [log] [blame]
Fred Drakeb8ab8b62004-06-17 20:14:50 +00001"""Support code for distutils test cases."""
Tarek Ziadéc1375d52009-02-14 14:35:51 +00002import os
Fred Drakeb8ab8b62004-06-17 20:14:50 +00003import shutil
4import tempfile
5
Fred Drakeedcac8f2004-08-03 18:53:07 +00006from distutils import log
Tarek Ziadé31d46072009-09-21 13:55:19 +00007from distutils.log import DEBUG, INFO, WARN, ERROR, FATAL
Tarek Ziadébaf51802009-03-31 21:37:16 +00008from distutils.core import Distribution
Tarek Ziadé29bbb962009-05-10 12:02:35 +00009from test.support import EnvironmentVarGuard
Fred Drakeedcac8f2004-08-03 18:53:07 +000010
11class LoggingSilencer(object):
12
13 def setUp(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +000014 super().setUp()
Fred Drakeedcac8f2004-08-03 18:53:07 +000015 self.threshold = log.set_threshold(log.FATAL)
Tarek Ziadé5af55c62009-05-16 16:52:13 +000016 # catching warnings
17 # when log will be replaced by logging
18 # we won't need such monkey-patch anymore
19 self._old_log = log.Log._log
20 log.Log._log = self._log
21 self.logs = []
Fred Drakeedcac8f2004-08-03 18:53:07 +000022
23 def tearDown(self):
24 log.set_threshold(self.threshold)
Tarek Ziadé5af55c62009-05-16 16:52:13 +000025 log.Log._log = self._old_log
Guido van Rossumcd16bf62007-06-13 18:07:49 +000026 super().tearDown()
Fred Drakeedcac8f2004-08-03 18:53:07 +000027
Tarek Ziadé5af55c62009-05-16 16:52:13 +000028 def _log(self, level, msg, args):
Tarek Ziadé31d46072009-09-21 13:55:19 +000029 if level not in (DEBUG, INFO, WARN, ERROR, FATAL):
30 raise ValueError('%s wrong log level' % str(level))
Tarek Ziadé5af55c62009-05-16 16:52:13 +000031 self.logs.append((level, msg, args))
32
33 def get_logs(self, *levels):
34 def _format(msg, args):
35 if len(args) == 0:
36 return msg
37 return msg % args
38 return [_format(msg, args) for level, msg, args
39 in self.logs if level in levels]
40
41 def clear_logs(self):
42 self.logs = []
Fred Drakeb8ab8b62004-06-17 20:14:50 +000043
44class TempdirManager(object):
45 """Mix-in class that handles temporary directories for test cases.
46
47 This is intended to be used with unittest.TestCase.
48 """
49
50 def setUp(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +000051 super().setUp()
Fred Drakeb8ab8b62004-06-17 20:14:50 +000052 self.tempdirs = []
53
54 def tearDown(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +000055 super().tearDown()
Fred Drakeb8ab8b62004-06-17 20:14:50 +000056 while self.tempdirs:
57 d = self.tempdirs.pop()
Tarek Ziadéc1375d52009-02-14 14:35:51 +000058 shutil.rmtree(d, os.name in ('nt', 'cygwin'))
Fred Drakeb8ab8b62004-06-17 20:14:50 +000059
60 def mkdtemp(self):
61 """Create a temporary directory that will be cleaned up.
62
63 Returns the path of the directory.
64 """
65 d = tempfile.mkdtemp()
66 self.tempdirs.append(d)
67 return d
68
Tarek Ziadébaf51802009-03-31 21:37:16 +000069 def write_file(self, path, content='xxx'):
Tarek Ziadé0d0506e2009-02-16 21:49:12 +000070 """Writes a file in the given path.
71
72
73 path can be a string or a sequence.
74 """
75 if isinstance(path, (list, tuple)):
76 path = os.path.join(*path)
77 f = open(path, 'w')
78 try:
79 f.write(content)
80 finally:
81 f.close()
Fred Drakeb8ab8b62004-06-17 20:14:50 +000082
Tarek Ziadébaf51802009-03-31 21:37:16 +000083 def create_dist(self, pkg_name='foo', **kw):
84 """Will generate a test environment.
85
86 This function creates:
87 - a Distribution instance using keywords
88 - a temporary directory with a package structure
89
90 It returns the package directory and the distribution
91 instance.
92 """
93 tmp_dir = self.mkdtemp()
94 pkg_dir = os.path.join(tmp_dir, pkg_name)
95 os.mkdir(pkg_dir)
96 dist = Distribution(attrs=kw)
97
98 return pkg_dir, dist
99
Fred Drakeb8ab8b62004-06-17 20:14:50 +0000100class DummyCommand:
101 """Class to store options for retrieval via set_undefined_options()."""
102
103 def __init__(self, **kwargs):
104 for kw, val in kwargs.items():
105 setattr(self, kw, val)
106
107 def ensure_finalized(self):
108 pass
Tarek Ziadé29bbb962009-05-10 12:02:35 +0000109
110class EnvironGuard(object):
111
112 def setUp(self):
113 super(EnvironGuard, self).setUp()
114 self.environ = EnvironmentVarGuard()
115
116 def tearDown(self):
117 self.environ.__exit__()
118 super(EnvironGuard, self).tearDown()