Skip to content

Commit 70c1333

Browse files
committed
Replace self.mock_* pairs by self.mocked_* context managers
Make sure cleanup happens
1 parent 6d80fee commit 70c1333

21 files changed

+596
-893
lines changed

easybuild/base/testing.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -206,30 +206,30 @@ def get_stderr(self):
206206
return sys.stderr.getvalue()
207207

208208
@contextmanager
209-
def mocked_stdout(self):
209+
def mocked_stdout(self, force_tty=False):
210210
"""Context manager to mock stdout"""
211211
self.mock_stdout(True)
212212
try:
213213
yield sys.stdout
214214
finally:
215-
self.mock_stdout(False)
215+
self.mock_stdout(False, force_tty=force_tty)
216216

217217
@contextmanager
218-
def mocked_stderr(self):
218+
def mocked_stderr(self, force_tty=False):
219219
"""Context manager to mock stdout"""
220220
self.mock_stderr(True)
221221
try:
222222
yield sys.stderr
223223
finally:
224-
self.mock_stderr(False)
224+
self.mock_stderr(False, force_tty=force_tty)
225225

226226
@contextmanager
227-
def mocked_stdout_stderr(self, mock_stdout=True, mock_stderr=True):
227+
def mocked_stdout_stderr(self, mock_stdout=True, mock_stderr=True, force_tty=False):
228228
"""Context manager to mock stdout and stderr"""
229229
if mock_stdout:
230-
self.mock_stdout(True)
230+
self.mock_stdout(True, force_tty=force_tty)
231231
if mock_stderr:
232-
self.mock_stderr(True)
232+
self.mock_stderr(True, force_tty=force_tty)
233233
try:
234234
if mock_stdout and mock_stderr:
235235
yield sys.stdout, sys.stderr

test/framework/build_log.py

Lines changed: 50 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -111,19 +111,18 @@ def test_easybuildlog(self):
111111
# test basic log methods
112112
logToFile(tmplog, enable=True)
113113
log = getLogger('test_easybuildlog')
114-
self.mock_stderr(True)
115-
log.setLevelName('DEBUG')
116-
log.debug("123 debug")
117-
log.info("foobar info")
118-
log.warning("justawarning")
119-
log.deprecated("anotherwarning", newer_ver)
120-
log.deprecated("onemorewarning", '1.0', '2.0')
121-
log.deprecated("lastwarning", '1.0', max_ver='2.0')
122-
log.deprecated("thisisnotprinted", '1.0', max_ver='2.0', silent=True)
123-
log.error("kaput")
124-
log.error("err: %s", 'msg: %s')
125-
stderr = self.get_stderr()
126-
self.mock_stderr(False)
114+
with self.mocked_stderr():
115+
log.setLevelName('DEBUG')
116+
log.debug("123 debug")
117+
log.info("foobar info")
118+
log.warning("justawarning")
119+
log.deprecated("anotherwarning", newer_ver)
120+
log.deprecated("onemorewarning", '1.0', '2.0')
121+
log.deprecated("lastwarning", '1.0', max_ver='2.0')
122+
log.deprecated("thisisnotprinted", '1.0', max_ver='2.0', silent=True)
123+
log.error("kaput")
124+
log.error("err: %s", 'msg: %s')
125+
stderr = self.get_stderr()
127126

128127
more_info = "see https://docs.easybuild.io/deprecated-functionality/ for more information"
129128
common_warning = "\nWARNING: Deprecated functionality, will no longer work in"
@@ -188,9 +187,8 @@ def test_easybuildlog(self):
188187
logToFile(tmplog, enable=True)
189188

190189
# also test use of 'more_info' named argument for log.deprecated
191-
self.mock_stderr(True)
192-
log.deprecated("\nthis is just a test\n", newer_ver, more_info="(see URLGOESHERE for more information)")
193-
self.mock_stderr(False)
190+
with self.mocked_stderr():
191+
log.deprecated("\nthis is just a test\n", newer_ver, more_info="(see URLGOESHERE for more information)")
194192
logtxt = read_file(tmplog)
195193
expected_logtxt = '\n'.join([
196194
"[WARNING] :: Deprecated functionality, will no longer work in EasyBuild v10000001: ",
@@ -211,18 +209,17 @@ def test_log_levels(self):
211209
logToFile(tmplog, enable=True)
212210
log = getLogger('test_easybuildlog')
213211

214-
self.mock_stderr(True) # avoid that some log statement spit out stuff to stderr while tests are running
215-
for level in ['ERROR', 'WARNING', 'INFO', 'DEBUG', 'DEVEL']:
216-
log.setLevelName(level)
217-
log.raiseError = False
218-
log.error('kaput')
219-
log.deprecated('almost kaput', '10000000000000')
220-
log.raiseError = True
221-
log.warning('this is a warning')
222-
log.info('fyi')
223-
log.debug('gdb')
224-
log.devel('tmi')
225-
self.mock_stderr(False)
212+
with self.mocked_stderr(): # avoid that some log statement spit out stuff to stderr while tests are running
213+
for level in ['ERROR', 'WARNING', 'INFO', 'DEBUG', 'DEVEL']:
214+
log.setLevelName(level)
215+
log.raiseError = False
216+
log.error('kaput')
217+
log.deprecated('almost kaput', '10000000000000')
218+
log.raiseError = True
219+
log.warning('this is a warning')
220+
log.info('fyi')
221+
log.debug('gdb')
222+
log.devel('tmi')
226223

227224
logToFile(tmplog, enable=False)
228225
logtxt = read_file(tmplog)
@@ -249,13 +246,10 @@ def test_print_warning(self):
249246
"""Test print_warning"""
250247
def run_check(args, silent=False, expected_stderr='', **kwargs):
251248
"""Helper function to check stdout/stderr produced via print_warning."""
252-
self.mock_stderr(True)
253-
self.mock_stdout(True)
254-
print_warning(*args, silent=silent, **kwargs)
255-
stderr = self.get_stderr()
256-
stdout = self.get_stdout()
257-
self.mock_stdout(False)
258-
self.mock_stderr(False)
249+
with self.mocked_stdout_stderr():
250+
print_warning(*args, silent=silent, **kwargs)
251+
stderr = self.get_stderr()
252+
stdout = self.get_stdout()
259253
self.assertEqual(stdout, '')
260254
self.assertEqual(stderr, expected_stderr)
261255

@@ -308,13 +302,10 @@ def test_print_msg(self):
308302
"""Test print_msg"""
309303
def run_check(msg, args, expected_stdout='', expected_stderr='', **kwargs):
310304
"""Helper function to check stdout/stderr produced via print_msg."""
311-
self.mock_stdout(True)
312-
self.mock_stderr(True)
313-
print_msg(msg, *args, **kwargs)
314-
stdout = self.get_stdout()
315-
stderr = self.get_stderr()
316-
self.mock_stdout(False)
317-
self.mock_stderr(False)
305+
with self.mocked_stdout_stderr():
306+
print_msg(msg, *args, **kwargs)
307+
stdout = self.get_stdout()
308+
stderr = self.get_stderr()
318309
self.assertEqual(stdout, expected_stdout)
319310
self.assertEqual(stderr, expected_stderr)
320311

@@ -347,13 +338,10 @@ def test_print_msg_rich(self):
347338

348339
def run_check(msg, args, expected_stdout='', expected_stderr='', **kwargs):
349340
"""Helper function to check stdout/stderr produced via print_msg."""
350-
self.mock_stdout(True, force_tty=True)
351-
self.mock_stderr(True, force_tty=True)
352-
print_msg(msg, *args, **kwargs)
353-
stdout = self.get_stdout()
354-
stderr = self.get_stderr()
355-
self.mock_stdout(False)
356-
self.mock_stderr(False)
341+
with self.mocked_stdout_stderr(force_tty=True):
342+
print_msg(msg, *args, **kwargs)
343+
stdout = self.get_stdout()
344+
stderr = self.get_stderr()
357345
# Check that the expected output stdout/stderr is being colorized
358346
# In order to allow using more styles/schemes (or even to account to changes in the rich default)
359347
# We only check for \x1b[0m which is the ANSI reset code that should be present in the output to undo
@@ -386,13 +374,10 @@ def test_dry_run_msg(self):
386374
"""Test dry_run_msg"""
387375
def run_check(msg, args, expected_stdout='', **kwargs):
388376
"""Helper function to check stdout/stderr produced via dry_run_msg."""
389-
self.mock_stdout(True)
390-
self.mock_stderr(True)
391-
dry_run_msg(msg, *args, **kwargs)
392-
stdout = self.get_stdout()
393-
stderr = self.get_stderr()
394-
self.mock_stdout(False)
395-
self.mock_stderr(False)
377+
with self.mocked_stdout_stderr():
378+
dry_run_msg(msg, *args, **kwargs)
379+
stdout = self.get_stdout()
380+
stderr = self.get_stderr()
396381
self.assertEqual(stdout, expected_stdout)
397382
self.assertEqual(stderr, '')
398383

@@ -407,13 +392,10 @@ def test_dry_run_warning(self):
407392
"""Test dry_run_warningmsg"""
408393
def run_check(msg, args, expected_stdout='', **kwargs):
409394
"""Helper function to check stdout/stderr produced via dry_run_warningmsg."""
410-
self.mock_stdout(True)
411-
self.mock_stderr(True)
412-
dry_run_warning(msg, *args, **kwargs)
413-
stdout = self.get_stdout()
414-
stderr = self.get_stderr()
415-
self.mock_stdout(False)
416-
self.mock_stderr(False)
395+
with self.mocked_stdout_stderr():
396+
dry_run_warning(msg, *args, **kwargs)
397+
stdout = self.get_stdout()
398+
stderr = self.get_stderr()
417399
self.assertEqual(stdout, expected_stdout)
418400
self.assertEqual(stderr, '')
419401

@@ -458,10 +440,9 @@ def test_init_logging(self):
458440
stop_logging(logfile)
459441

460442
# by default, path to tmp log file is printed
461-
self.mock_stdout(True)
462-
log, logfile = init_logging(None)
463-
stdout = self.get_stdout()
464-
self.mock_stdout(False)
443+
with self.mocked_stdout():
444+
log, logfile = init_logging(None)
445+
stdout = self.get_stdout()
465446
self.assertExists(logfile)
466447
self.assertEqual(os.path.dirname(logfile), tmpdir)
467448
self.assertIsInstance(log, EasyBuildLog)
@@ -470,9 +451,8 @@ def test_init_logging(self):
470451
stop_logging(logfile)
471452

472453
# logging to stdout implies no log file
473-
self.mock_stdout(True)
474-
log, logfile = init_logging(None, logtostdout=True)
475-
self.mock_stdout(False)
454+
with self.mocked_stdout():
455+
log, logfile = init_logging(None, logtostdout=True)
476456
self.assertEqual(logfile, None)
477457
self.assertIsInstance(log, EasyBuildLog)
478458

test/framework/containers.py

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -74,13 +74,10 @@ class ContainersTest(EnhancedTestCase):
7474

7575
def run_main(self, args, raise_error=True):
7676
"""Helper function to run main with arguments specified in 'args' and return stdout/stderr."""
77-
self.mock_stdout(True)
78-
self.mock_stderr(True)
79-
self.eb_main(args, raise_error=raise_error, verbose=True, do_build=True)
80-
stdout = self.get_stdout().strip()
81-
stderr = self.get_stderr().strip()
82-
self.mock_stdout(False)
83-
self.mock_stderr(False)
77+
with self.mocked_stdout_stderr():
78+
self.eb_main(args, raise_error=raise_error, verbose=True, do_build=True)
79+
stdout = self.get_stdout().strip()
80+
stderr = self.get_stderr().strip()
8481

8582
return stdout, stderr
8683

@@ -337,9 +334,8 @@ def test_end2end_singularity_image(self):
337334
# test again with container image already existing
338335

339336
error_pattern = "Container image already exists at %s, not overwriting it without --force" % cont_img
340-
self.mock_stdout(True)
341-
self.assertErrorRegex(EasyBuildError, error_pattern, self.run_main, args, raise_error=True)
342-
self.mock_stdout(False)
337+
with self.mocked_stdout():
338+
self.assertErrorRegex(EasyBuildError, error_pattern, self.run_main, args, raise_error=True)
343339

344340
args.append('--force')
345341
stdout, stderr = self.run_main(args)
@@ -397,11 +393,12 @@ def test_end2end_dockerfile(self):
397393

398394
error_pattern = "Container recipe at %s/containers/Dockerfile.toy-0.0 already exists, " \
399395
"not overwriting it without --force" % self.test_prefix
400-
self.assertErrorRegex(EasyBuildError,
401-
error_pattern,
402-
self.run_main,
403-
base_args + ['--container-config=centos:7'],
404-
raise_error=True)
396+
with self.mocked_stdout():
397+
self.assertErrorRegex(EasyBuildError,
398+
error_pattern,
399+
self.run_main,
400+
base_args + ['--container-config=centos:7'],
401+
raise_error=True)
405402

406403
remove_file(os.path.join(self.test_prefix, 'containers', 'Dockerfile.toy-0.0'))
407404

test/framework/docs.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1349,13 +1349,10 @@ def test_help(self):
13491349
Test output produced by --help, with various output formats
13501350
"""
13511351
def get_eb_help_output(arg=''):
1352-
self.mock_stderr(True)
1353-
self.mock_stdout(True)
1354-
self.eb_main(['--help', arg])
1355-
stderr = self.get_stderr()
1356-
stdout = self.get_stdout()
1357-
self.mock_stderr(False)
1358-
self.mock_stdout(False)
1352+
with self.mocked_stdout_stderr():
1353+
self.eb_main(['--help', arg])
1354+
stderr = self.get_stderr()
1355+
stdout = self.get_stdout()
13591356

13601357
self.assertFalse(stderr)
13611358
return stdout

0 commit comments

Comments
 (0)