#!/usr/bin/env python3
-import contextlib
+# © Copyright 2021-2022, Scott Gasch
+
+"""logging_utils unittest."""
+
+import os
+import sys
import tempfile
import unittest
-import bootstrap
import logging_utils as lutils
import string_utils as sutils
+import unittest_utils as uu
class TestLoggingUtils(unittest.TestCase):
-
def test_output_context(self):
unique_suffix = sutils.generate_uuid(True)
filename = f'/tmp/logging_utils_test.{unique_suffix}'
secret_message = f'This is a test, {unique_suffix}.'
with tempfile.SpooledTemporaryFile(mode='r+') as tmpfile1:
- with tempfile.SpooledTemporaryFile(mode='r+') as tmpfile2:
- with contextlib.redirect_stdout(tmpfile1):
- with lutils.OutputContext(
- lutils.OutputMultiplexer.Destination.FILENAME |
- lutils.OutputMultiplexer.Destination.FILEHANDLE |
- lutils.OutputMultiplexer.Destination.STDOUT,
- filename = filename,
- handle = tmpfile2,
- ) as mplex:
- mplex.print(secret_message, end='')
- with open(filename, 'r') as rf:
- self.assertEqual(rf.readline(), secret_message)
- tmpfile2.seek(0)
- tmp = tmpfile2.readline()
- self.assertEqual(tmp, secret_message)
+ with uu.RecordStdout() as record:
+ with lutils.OutputMultiplexerContext(
+ lutils.OutputMultiplexer.Destination.FILENAMES
+ | lutils.OutputMultiplexer.Destination.FILEHANDLES
+ | lutils.OutputMultiplexer.Destination.LOG_INFO,
+ filenames=[filename, '/dev/null'],
+ handles=[tmpfile1, sys.stdout],
+ ) as mplex:
+ mplex.print(secret_message, end='')
+
+ # Make sure it was written to the filename.
+ with open(filename, 'r') as rf:
+ self.assertEqual(rf.readline(), secret_message)
+ os.unlink(filename)
+
+ # Make sure it was written to stdout.
+ tmp = record().readline()
+ self.assertEqual(tmp, secret_message)
+
+ # Make sure it was written to the filehandle.
tmpfile1.seek(0)
tmp = tmpfile1.readline()
self.assertEqual(tmp, secret_message)
+ def test_record_streams(self):
+ with uu.RecordMultipleStreams(sys.stderr, sys.stdout) as record:
+ print("This is a test!")
+ print("This is one too.", file=sys.stderr)
+ self.assertEqual(record().readlines(), ["This is a test!\n", "This is one too.\n"])
+
if __name__ == '__main__':
- unittest.main = bootstrap.initialize(unittest.main)
unittest.main()