def test_log(self): class CatchHandler(logging.NullHandler): """ Handler used just to confirm that a logging event happened """ def __init__(self, *args, **kwargs): super(CatchHandler, self).__init__(*args, **kwargs) self.caught_record = False def handle(self, record): self.caught_record = True read_fd, write_fd = os.pipe() result = process.CmdResult() logger = logging.getLogger("FDDrainerTests.test_log") handler = CatchHandler() logger.addHandler(handler) logger.setLevel(logging.DEBUG) fd_drainer = process.FDDrainer(read_fd, result, "test", logger=logger, verbose=True) fd_drainer.start() os.write(write_fd, b"should go to the log\n") os.close(write_fd) fd_drainer.flush() self.assertEqual(fd_drainer.data.getvalue(), b"should go to the log\n") self.assertTrue(handler.caught_record)
def test_flush_on_handler_with_no_fileno(self): handler = logging.StreamHandler(io.StringIO()) log = logging.getLogger("test_flush_on_handler_with_no_fileno") log.addHandler(handler) read_fd, write_fd = os.pipe() result = process.CmdResult() fd_drainer = process.FDDrainer(read_fd, result, name="test", stream_logger=log) fd_drainer.start() os.close(write_fd) fd_drainer.flush()
def test_drain_from_pipe_fd(self): read_fd, write_fd = os.pipe() result = process.CmdResult() fd_drainer = process.FDDrainer(read_fd, result, "test") fd_drainer.start() for content in (b"foo", b"bar", b"baz", b"foo\nbar\nbaz\n\n"): os.write(write_fd, content) os.write(write_fd, b"finish") os.close(write_fd) fd_drainer.flush() self.assertEqual(fd_drainer.data.getvalue(), b"foobarbazfoo\nbar\nbaz\n\nfinish")
def test_replace_incorrect_characters_in_log(self): data = io.StringIO() handler = logging.StreamHandler(data) log = logging.getLogger("test_replace_incorrect_characters_in_log") log.addHandler(handler) log.setLevel(logging.DEBUG) read_fd, write_fd = os.pipe() result = process.CmdResult(encoding='ascii') fd_drainer = process.FDDrainer(read_fd, result, name="test", stream_logger=log, verbose=True) fd_drainer.start() os.write(write_fd, b"Avok\xc3\xa1do") os.close(write_fd) fd_drainer._thread.join(60) self.assertFalse(fd_drainer._thread.is_alive()) # \n added by StreamLogger self.assertEqual(data.getvalue(), u"Avok\ufffd\ufffddo\n")
def test_flush_on_closed_handler(self): handler = logging.StreamHandler(io.StringIO()) log = logging.getLogger("test_flush_on_closed_handler") log.addHandler(handler) read_fd, write_fd = os.pipe() result = process.CmdResult() fd_drainer = process.FDDrainer(read_fd, result, name="test", stream_logger=log) fd_drainer.start() os.close(write_fd) self.assertIsNotNone(fd_drainer._stream_logger) one_stream_closed = False for handler in fd_drainer._stream_logger.handlers: stream = getattr(handler, 'stream', None) if stream is not None: if hasattr(stream, 'close'): # force closing the handler's stream to check if # flush will adapt to it stream.close() one_stream_closed = True self.assertTrue(one_stream_closed) fd_drainer.flush()