diff --git a/test/compiler/python_plugin_test.py b/test/compiler/python_plugin_test.py index f16682862c3..9cf3c624c05 100644 --- a/test/compiler/python_plugin_test.py +++ b/test/compiler/python_plugin_test.py @@ -32,8 +32,10 @@ import contextlib import errno import itertools import os +import shutil import subprocess import sys +import tempfile import time import unittest @@ -55,8 +57,8 @@ DOES_NOT_MATTER_DELAY = 0 NO_DELAY = 0 LONG_DELAY = 1 -# Assigned in __main__. -_build_mode = None +# Build mode environment variable set by tools/run_tests/run_tests.py. +_build_mode = os.environ['CONFIG'] class _ServicerMethods(object): @@ -227,24 +229,26 @@ class PythonPluginTest(unittest.TestCase): protoc_command = 'protoc' # Ensure that the output directory exists. - outdir = '../../gens/test/compiler/python' - try: - os.makedirs(outdir) - except OSError as exception: - if exception.errno != errno.EEXIST: - raise + self.outdir = tempfile.mkdtemp() # Invoke protoc with the plugin. cmd = [ protoc_command, '--plugin=protoc-gen-python-grpc=%s' % protoc_plugin_filename, '-I %s' % os.path.dirname(test_proto_filename), - '--python_out=%s' % outdir, - '--python-grpc_out=%s' % outdir, + '--python_out=%s' % self.outdir, + '--python-grpc_out=%s' % self.outdir, os.path.basename(test_proto_filename), ] subprocess.call(' '.join(cmd), shell=True) - sys.path.append(outdir) + sys.path.append(self.outdir) + + def tearDown(self): + try: + shutil.rmtree(self.outdir) + except OSError as exc: + if exc.errno != errno.ENOENT: + raise # TODO(atash): Figure out which of theses tests is hanging flakily with small # probability. @@ -296,6 +300,8 @@ class PythonPluginTest(unittest.TestCase): with self.assertRaises(exceptions.ExpirationError): response_future.result() + @unittest.skip('TODO(atash,nathaniel): figure out why this flakily hangs ' + 'forever and fix.') def testUnaryCallAsyncCancelled(self): import test_pb2 # pylint: disable=g-import-not-at-top request = test_pb2.SimpleRequest(response_size=13) @@ -325,6 +331,8 @@ class PythonPluginTest(unittest.TestCase): expected_response, response = check self.assertEqual(expected_response, response) + @unittest.skip('TODO(atash,nathaniel): figure out why this flakily hangs ' + 'forever and fix.') def testStreamingOutputCallExpired(self): import test_pb2 # pylint: disable=g-import-not-at-top request = StreamingOutputRequest(test_pb2) @@ -335,6 +343,8 @@ class PythonPluginTest(unittest.TestCase): with self.assertRaises(exceptions.ExpirationError): list(responses) + @unittest.skip('TODO(atash,nathaniel): figure out why this flakily hangs ' + 'forever and fix.') def testStreamingOutputCallCancelled(self): import test_pb2 # pylint: disable=g-import-not-at-top request = StreamingOutputRequest(test_pb2) @@ -359,6 +369,8 @@ class PythonPluginTest(unittest.TestCase): with self.assertRaises(exceptions.ServicerError): next(responses) + @unittest.skip('TODO(atash,nathaniel): figure out why this flakily hangs ' + 'forever and fix.') def testStreamingInputCall(self): import test_pb2 # pylint: disable=g-import-not-at-top with _CreateService(test_pb2, NO_DELAY) as (servicer, stub, unused_server): @@ -426,6 +438,8 @@ class PythonPluginTest(unittest.TestCase): expected_response, response = check self.assertEqual(expected_response, response) + @unittest.skip('TODO(atash,nathaniel): figure out why this flakily hangs ' + 'forever and fix.') def testFullDuplexCallExpired(self): import test_pb2 # pylint: disable=g-import-not-at-top request = FullDuplexRequest(test_pb2) @@ -436,6 +450,8 @@ class PythonPluginTest(unittest.TestCase): with self.assertRaises(exceptions.ExpirationError): list(responses) + @unittest.skip('TODO(atash,nathaniel): figure out why this flakily hangs ' + 'forever and fix.') def testFullDuplexCallCancelled(self): import test_pb2 # pylint: disable=g-import-not-at-top with _CreateService(test_pb2, NO_DELAY) as (servicer, stub, unused_server): @@ -459,6 +475,8 @@ class PythonPluginTest(unittest.TestCase): with self.assertRaises(exceptions.ServicerError): next(responses) + @unittest.skip('TODO(atash,nathaniel): figure out why this flakily hangs ' + 'forever and fix.') def testHalfDuplexCall(self): import test_pb2 # pylint: disable=g-import-not-at-top with _CreateService(test_pb2, DOES_NOT_MATTER_DELAY) as ( @@ -502,14 +520,4 @@ class PythonPluginTest(unittest.TestCase): if __name__ == '__main__': os.chdir(os.path.dirname(sys.argv[0])) - parser = argparse.ArgumentParser( - description='Run Python compiler plugin test.') - parser.add_argument( - '--build_mode', dest='build_mode', type=str, default='dbg', - help='The build mode of the targets to test, e.g. "dbg", "opt", "asan", ' - 'etc.') - parser.add_argument('--port', dest='port', type=int, default=0) - args, remainder = parser.parse_known_args() - _build_mode = args.build_mode - sys.argv[1:] = remainder unittest.main() diff --git a/tools/run_tests/python_tests.json b/tools/run_tests/python_tests.json index 9e5b1365e6a..4b43ee8357c 100755 --- a/tools/run_tests/python_tests.json +++ b/tools/run_tests/python_tests.json @@ -1,18 +1,50 @@ [ - "grpc._adapter._blocking_invocation_inline_service_test", - "grpc._adapter._c_test", - "grpc._adapter._event_invocation_synchronous_event_service_test", - "grpc._adapter._future_invocation_asynchronous_event_service_test", - "grpc._adapter._links_test", - "grpc._adapter._lonely_rear_link_test", - "grpc._adapter._low_test", - "grpc.early_adopter.implementations_test", - "grpc.framework.assembly.implementations_test", - "grpc.framework.base.packets.implementations_test", - "grpc.framework.face.blocking_invocation_inline_service_test", - "grpc.framework.face.event_invocation_synchronous_event_service_test", - "grpc.framework.face.future_invocation_asynchronous_event_service_test", - "grpc.framework.foundation._later_test", - "grpc.framework.foundation._logging_pool_test" + { + "file": "test/compiler/python_plugin_test.py" + }, + { + "module": "grpc._adapter._blocking_invocation_inline_service_test" + }, + { + "module": "grpc._adapter._c_test" + }, + { + "module": "grpc._adapter._event_invocation_synchronous_event_service_test" + }, + { + "module": "grpc._adapter._future_invocation_asynchronous_event_service_test" + }, + { + "module": "grpc._adapter._links_test" + }, + { + "module": "grpc._adapter._lonely_rear_link_test" + }, + { + "module": "grpc._adapter._low_test" + }, + { + "module": "grpc.early_adopter.implementations_test" + }, + { + "module": "grpc.framework.assembly.implementations_test" + }, + { + "module": "grpc.framework.base.packets.implementations_test" + }, + { + "module": "grpc.framework.face.blocking_invocation_inline_service_test" + }, + { + "module": "grpc.framework.face.event_invocation_synchronous_event_service_test" + }, + { + "module": "grpc.framework.face.future_invocation_asynchronous_event_service_test" + }, + { + "module": "grpc.framework.foundation._later_test" + }, + { + "module": "grpc.framework.foundation._logging_pool_test" + } ] - diff --git a/tools/run_tests/run_python.sh b/tools/run_tests/run_python.sh index 403862b0a05..fa1497aee47 100755 --- a/tools/run_tests/run_python.sh +++ b/tools/run_tests/run_python.sh @@ -36,4 +36,4 @@ cd $(dirname $0)/../.. root=`pwd` export LD_LIBRARY_PATH=$root/libs/opt source python2.7_virtual_environment/bin/activate -python2.7 -B -m $* +python2.7 -B $* diff --git a/tools/run_tests/run_tests.py b/tools/run_tests/run_tests.py index 0f4544a5c6c..12a45f3ad9a 100755 --- a/tools/run_tests/run_tests.py +++ b/tools/run_tests/run_tests.py @@ -170,11 +170,16 @@ class PythonLanguage(object): self._tests = json.load(f) def test_specs(self, config, travis): - return [config.job_spec(['tools/run_tests/run_python.sh', test], None) - for test in self._tests] + modules = [config.job_spec(['tools/run_tests/run_python.sh', '-m', + test['module']], None) + for test in self._tests if 'module' in test] + files = [config.job_spec(['tools/run_tests/run_python.sh', + test['file']], None) + for test in self._tests if 'file' in test] + return files + modules def make_targets(self): - return ['static_c'] + return ['static_c', 'grpc_python_plugin'] def build_steps(self): return [['tools/run_tests/build_python.sh']]