diff -r 1940b72b0a02 Lib/test/support/__init__.py --- a/Lib/test/support/__init__.py Tue Nov 08 20:34:22 2016 +0200 +++ b/Lib/test/support/__init__.py Fri Nov 11 16:31:53 2016 +0100 @@ -90,7 +90,7 @@ "bigmemtest", "bigaddrspacetest", "cpython_only", "get_attribute", "requires_IEEE_754", "skip_unless_xattr", "requires_zlib", "anticipate_failure", "load_package_tests", "detect_api_mismatch", - "check__all__", + "check__all__", "requires_multiprocessing_queue", # sys "is_jython", "is_android", "check_impl_detail", "unix_shell", # network @@ -1744,6 +1744,24 @@ msg = msg.format(' or '.join(guardnames)) return unittest.skip(msg) +_have_mp_queue = None +def requires_multiprocessing_queue(): + global _have_mp_queue + if _have_mp_queue is None: + import multiprocessing + # Without a functioning shared semaphore implementation attempts to + # instantiate a Queue will result in an ImportError (issue #3770). + try: + multiprocessing.Queue() + _have_mp_queue = True + except ImportError: + _have_mp_queue = False + if _have_mp_queue: + return _id + else: + return unittest.skip("requires a functioning shared semaphore" + " implementation") + def _parse_guards(guards): # Returns a tuple ({platform_name: run_me}, default_value) if not guards: diff -r 1940b72b0a02 Lib/test/test_logging.py --- a/Lib/test/test_logging.py Tue Nov 08 20:34:22 2016 +0200 +++ b/Lib/test/test_logging.py Fri Nov 11 16:31:53 2016 +0100 @@ -3124,6 +3124,7 @@ self.assertEqual(mock_handle.call_count, 5 * self.repeat, 'correct number of handled log messages') + @support.requires_multiprocessing_queue() @patch.object(logging.handlers.QueueListener, 'handle') def test_handle_called_with_mp_queue(self, mock_handle): for i in range(self.repeat): @@ -3140,6 +3141,7 @@ except queue.Empty: return [] + @support.requires_multiprocessing_queue() def test_no_messages_in_queue_after_stop(self): """ Five messages are logged then the QueueListener is stopped. This