14 """Client-side fork interop tests as a unit test."""
32 _CLIENT_FORK_SCRIPT_TEMPLATE =
"""if True:
35 from grpc._cython import cygrpc
36 from tests.fork import methods
38 cygrpc._GRPC_ENABLE_FORK_SUPPORT = True
39 os.environ['GRPC_POLL_STRATEGY'] = 'epoll1'
40 methods.TestCase.%s.run_test({
41 'server_host': 'localhost',
46 _SUBPROCESS_TIMEOUT_S = 30
50 sys.platform.startswith(
"linux"),
51 "not supported on windows, and fork+exec networking blocked on mac")
52 @unittest.skipUnless(six.PY2,
"https://github.com/grpc/grpc/issues/18075")
56 start_server_script =
"""if True:
61 from src.proto.grpc.testing import test_pb2_grpc
62 from tests.interop import service as interop_service
63 from tests.unit import test_common
65 server = test_common.test_server()
66 test_pb2_grpc.add_TestServiceServicer_to_server(
67 interop_service.TestService(), server)
68 port = server.add_insecure_port('[::]:0')
75 streams = tuple(tempfile.TemporaryFile()
for _
in range(2))
77 [sys.executable,
'-c', start_server_script],
80 timer = threading.Timer(_SUBPROCESS_TIMEOUT_S,
86 s = streams[0].readline()
93 raise Exception(
'Failed to get port from server')
120 methods.TestCase.IN_PROGRESS_BIDI_SAME_CHANNEL_ASYNC_CALL)
124 methods.TestCase.IN_PROGRESS_BIDI_SAME_CHANNEL_BLOCKING_CALL)
128 methods.TestCase.IN_PROGRESS_BIDI_NEW_CHANNEL_ASYNC_CALL)
132 methods.TestCase.IN_PROGRESS_BIDI_NEW_CHANNEL_BLOCKING_CALL)
138 script = _CLIENT_FORK_SCRIPT_TEMPLATE % (test_case.name, self.
_port)
139 streams = tuple(tempfile.TemporaryFile()
for _
in range(2))
140 process = subprocess.Popen([sys.executable,
'-c', script],
143 timer = threading.Timer(_SUBPROCESS_TIMEOUT_S, process.kill)
148 for stream
in streams:
150 outputs.append(stream.read())
152 0, process.returncode,
153 'process failed with exit code %d (stdout: "%s", stderr: "%s")' %
154 (process.returncode, outputs[0], outputs[1]))
157 if __name__ ==
'__main__':
158 unittest.main(verbosity=2)