| 
					
				 | 
			
			
				@@ -14,66 +14,86 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 """Test of gRPC Python's interaction with the python logging module""" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import unittest 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import six 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-from six.moves import reload_module 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import logging 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import grpc 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import functools 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import subprocess 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import sys 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+INTERPRETER = sys.executable 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-def patch_stderr(f): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    @functools.wraps(f) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def _impl(*args, **kwargs): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        old_stderr = sys.stderr 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        sys.stderr = six.StringIO() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            f(*args, **kwargs) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        finally: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            sys.stderr = old_stderr 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+class LoggingTest(unittest.TestCase): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    return _impl 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def test_logger_not_occupied(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        script = """if True: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            import logging 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            import grpc 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-def isolated_logging(f): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if len(logging.getLogger().handlers) != 0: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                raise Exception('expected 0 logging handlers') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    @functools.wraps(f) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def _impl(*args, **kwargs): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        reload_module(logging) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        reload_module(grpc) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            f(*args, **kwargs) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        finally: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            reload_module(logging) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        self._verifyScriptSucceeds(script) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    return _impl 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def test_handler_found(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        script = """if True: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            import logging 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            import grpc 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        out, err = self._verifyScriptSucceeds(script) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        self.assertEqual(0, len(err), 'unexpected output to stderr') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-class LoggingTest(unittest.TestCase): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def test_can_configure_logger(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        script = """if True: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            import logging 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            import six 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    @isolated_logging 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def test_logger_not_occupied(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.assertEqual(0, len(logging.getLogger().handlers)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            import grpc 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    @patch_stderr 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    @isolated_logging 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def test_handler_found(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.assertEqual(0, len(sys.stderr.getvalue())) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    @isolated_logging 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    def test_can_configure_logger(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        intended_stream = six.StringIO() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        logging.basicConfig(stream=intended_stream) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.assertEqual(1, len(logging.getLogger().handlers)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.assertIs(logging.getLogger().handlers[0].stream, intended_stream) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            intended_stream = six.StringIO() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            logging.basicConfig(stream=intended_stream) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if len(logging.getLogger().handlers) != 1: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                raise Exception('expected 1 logging handler') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if logging.getLogger().handlers[0].stream is not intended_stream: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                raise Exception('wrong handler stream') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        self._verifyScriptSucceeds(script) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    @isolated_logging 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     def test_grpc_logger(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.assertIn("grpc", logging.Logger.manager.loggerDict) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        root_logger = logging.getLogger("grpc") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.assertEqual(1, len(root_logger.handlers)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        self.assertIsInstance(root_logger.handlers[0], logging.NullHandler) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        script = """if True: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            import logging 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            import grpc 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if "grpc" not in logging.Logger.manager.loggerDict: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                raise Exception('grpc logger not found') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            root_logger = logging.getLogger("grpc") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if len(root_logger.handlers) != 1: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                raise Exception('expected 1 root logger handler') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if not isinstance(root_logger.handlers[0], logging.NullHandler): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                raise Exception('expected logging.NullHandler') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        self._verifyScriptSucceeds(script) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def _verifyScriptSucceeds(self, script): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        process = subprocess.Popen( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            [INTERPRETER, '-c', script], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            stdout=subprocess.PIPE, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            stderr=subprocess.PIPE) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        out, err = process.communicate() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        self.assertEqual( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            0, process.returncode, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'process failed with exit code %d (stdout: %s, stderr: %s)' % 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            (process.returncode, out, err)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return out, err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 if __name__ == '__main__': 
			 |