diff --git a/src/python/src/_adapter/_c_test.py b/src/python/src/_adapter/_c_test.py index 19c91ffe018dbce47a7b395e4e875cb8854f9b34..210ac1fff78632f9ef7f122fce60c390a15238c3 100644 --- a/src/python/src/_adapter/_c_test.py +++ b/src/python/src/_adapter/_c_test.py @@ -92,7 +92,7 @@ class _CTest(unittest.TestCase): _c.init() completion_queue = _c.CompletionQueue() - server = _c.Server(completion_queue) + server = _c.Server(completion_queue, None) server.add_http2_addr('[::]:0') server.start() server.stop() @@ -102,7 +102,7 @@ class _CTest(unittest.TestCase): service_tag = object() completion_queue = _c.CompletionQueue() - server = _c.Server(completion_queue) + server = _c.Server(completion_queue, None) server.add_http2_addr('[::]:0') server.start() server.service(service_tag) @@ -119,7 +119,7 @@ class _CTest(unittest.TestCase): del completion_queue completion_queue = _c.CompletionQueue() - server = _c.Server(completion_queue) + server = _c.Server(completion_queue, None) server.add_http2_addr('[::]:0') server.start() thread = threading.Thread(target=completion_queue.get, args=(_FUTURE,)) @@ -162,6 +162,31 @@ class _CTest(unittest.TestCase): _c.shut_down() + @unittest.skip('TODO(nathaniel): find and use real-enough test credentials') + def test_secure_server(self): + _c.init() + + server_credentials = _c.ServerCredentials( + 'root certificate', (('private key', 'certificate chain'),)) + + completion_queue = _c.CompletionQueue() + server = _c.Server(completion_queue, server_credentials) + server.add_http2_addr('[::]:0') + server.start() + thread = threading.Thread(target=completion_queue.get, args=(_FUTURE,)) + thread.start() + time.sleep(1) + server.stop() + completion_queue.stop() + for _ in range(_IDEMPOTENCE_DEMONSTRATION): + event = completion_queue.get(time.time() + _TIMEOUT) + self.assertIs(event.kind, _datatypes.Event.Kind.STOP) + thread.join() + del server + del completion_queue + + _c.shut_down() + if __name__ == '__main__': unittest.main() diff --git a/src/python/src/_adapter/_low_test.py b/src/python/src/_adapter/_low_test.py index 57b3be66a0ee10c546e417f66f224d218deff2a5..899ccf53c8ab5618ac1b56d021bdfb0c5cc5c822 100644 --- a/src/python/src/_adapter/_low_test.py +++ b/src/python/src/_adapter/_low_test.py @@ -82,7 +82,7 @@ class EchoTest(unittest.TestCase): self.host = 'localhost' self.server_completion_queue = _low.CompletionQueue() - self.server = _low.Server(self.server_completion_queue) + self.server = _low.Server(self.server_completion_queue, None) port = self.server.add_http2_addr('[::]:0') self.server.start() @@ -260,7 +260,7 @@ class CancellationTest(unittest.TestCase): self.host = 'localhost' self.server_completion_queue = _low.CompletionQueue() - self.server = _low.Server(self.server_completion_queue) + self.server = _low.Server(self.server_completion_queue, None) port = self.server.add_http2_addr('[::]:0') self.server.start() diff --git a/src/python/src/_adapter/_server.c b/src/python/src/_adapter/_server.c index d2730d9ae877316da4b462478fc03ec70c98e573..503be61ab48ea7a20883fe25d790248fa9327505 100644 --- a/src/python/src/_adapter/_server.c +++ b/src/python/src/_adapter/_server.c @@ -38,18 +38,30 @@ #include "_adapter/_completion_queue.h" #include "_adapter/_error.h" +#include "_adapter/_server_credentials.h" static int pygrpc_server_init(Server *self, PyObject *args, PyObject *kwds) { const PyObject *completion_queue; - if (!(PyArg_ParseTuple(args, "O!", &pygrpc_CompletionQueueType, - &completion_queue))) { + PyObject *server_credentials; + if (!(PyArg_ParseTuple(args, "O!O", &pygrpc_CompletionQueueType, + &completion_queue, &server_credentials))) { + self->c_server = NULL; + return -1; + } + if (server_credentials == Py_None) { + self->c_server = grpc_server_create( + ((CompletionQueue *)completion_queue)->c_completion_queue, NULL); + return 0; + } else if (PyObject_TypeCheck(server_credentials, + &pygrpc_ServerCredentialsType)) { + self->c_server = grpc_secure_server_create( + ((ServerCredentials *)server_credentials)->c_server_credentials, + ((CompletionQueue *)completion_queue)->c_completion_queue, NULL); + return 0; + } else { self->c_server = NULL; return -1; } - - self->c_server = grpc_server_create( - ((CompletionQueue *)completion_queue)->c_completion_queue, NULL); - return 0; } static void pygrpc_server_dealloc(Server *self) { diff --git a/src/python/src/_adapter/fore.py b/src/python/src/_adapter/fore.py index c307e7ce63ad560cc5a152c7e95466189fa91f17..2f102751f2ee6c2437d4b2b489e0c1e267c9190d 100644 --- a/src/python/src/_adapter/fore.py +++ b/src/python/src/_adapter/fore.py @@ -265,7 +265,7 @@ class ForeLink(ticket_interfaces.ForeLink): """ with self._condition: self._completion_queue = _low.CompletionQueue() - self._server = _low.Server(self._completion_queue) + self._server = _low.Server(self._completion_queue, None) port = self._server.add_http2_addr( '[::]:%d' % (0 if self._port is None else self._port)) self._server.start()