From 1e2ae4f054c20f54238997987416dcff0f3b0f3a Mon Sep 17 00:00:00 2001 From: Brian Quinlan Date: Wed, 6 Oct 2010 13:05:45 +0000 Subject: [PATCH] Fixes 9903: test_concurrent_futures writes on stderr --- Lib/concurrent/futures/_base.py | 5 ++-- Lib/test/test_concurrent_futures.py | 44 ++++++++++++++++++----------- 2 files changed, 30 insertions(+), 19 deletions(-) diff --git a/Lib/concurrent/futures/_base.py b/Lib/concurrent/futures/_base.py index ba4cbc7478b..8136d89dc90 100644 --- a/Lib/concurrent/futures/_base.py +++ b/Lib/concurrent/futures/_base.py @@ -40,9 +40,8 @@ # Logger for internal use by the futures package. LOGGER = logging.getLogger("concurrent.futures") -_handler = logging.StreamHandler() -LOGGER.addHandler(_handler) -del _handler +STDERR_HANDLER = logging.StreamHandler() +LOGGER.addHandler(STDERR_HANDLER) class Error(Exception): """Base class for all future-related exceptions.""" diff --git a/Lib/test/test_concurrent_futures.py b/Lib/test/test_concurrent_futures.py index c36f123c382..6427368fd67 100644 --- a/Lib/test/test_concurrent_futures.py +++ b/Lib/test/test_concurrent_futures.py @@ -9,6 +9,8 @@ # without thread support. test.support.import_module('threading') +import io +import logging import multiprocessing import sys import threading @@ -21,7 +23,8 @@ from concurrent import futures from concurrent.futures._base import ( - PENDING, RUNNING, CANCELLED, CANCELLED_AND_NOTIFIED, FINISHED, Future, wait) + PENDING, RUNNING, CANCELLED, CANCELLED_AND_NOTIFIED, FINISHED, Future, + LOGGER, STDERR_HANDLER, wait) import concurrent.futures.process def create_future(state=PENDING, exception=None, result=None): @@ -617,24 +620,33 @@ def fn(callback_future): self.assertTrue(was_cancelled) def test_done_callback_raises(self): - raising_was_called = False - fn_was_called = False + LOGGER.removeHandler(STDERR_HANDLER) + logging_stream = io.StringIO() + handler = logging.StreamHandler(logging_stream) + LOGGER.addHandler(handler) + try: + raising_was_called = False + fn_was_called = False - def raising_fn(callback_future): - nonlocal raising_was_called - raising_was_called = True - raise Exception('doh!') + def raising_fn(callback_future): + nonlocal raising_was_called + raising_was_called = True + raise Exception('doh!') - def fn(callback_future): - nonlocal fn_was_called - fn_was_called = True + def fn(callback_future): + nonlocal fn_was_called + fn_was_called = True - f = Future() - f.add_done_callback(raising_fn) - f.add_done_callback(fn) - f.set_result(5) - self.assertTrue(raising_was_called) - self.assertTrue(fn_was_called) + f = Future() + f.add_done_callback(raising_fn) + f.add_done_callback(fn) + f.set_result(5) + self.assertTrue(raising_was_called) + self.assertTrue(fn_was_called) + self.assertIn('Exception: doh!', logging_stream.getvalue()) + finally: + LOGGER.removeHandler(handler) + LOGGER.addHandler(STDERR_HANDLER) def test_done_callback_already_successful(self): callback_result = None