Skip to content

Commit

Permalink
tests
Browse files Browse the repository at this point in the history
  • Loading branch information
Stan Misiurev committed Jan 22, 2019
1 parent 65345fd commit 28a8b1c
Show file tree
Hide file tree
Showing 17 changed files with 309 additions and 47 deletions.
2 changes: 1 addition & 1 deletion django_grpc/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = '0.1.3'
__version__ = '0.1.4'
23 changes: 6 additions & 17 deletions django_grpc/management/commands/grpcserver.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,8 @@
from django.core.management.base import BaseCommand
from concurrent import futures
from django.utils import autoreload
from django.utils.module_loading import import_string

from django_grpc.utils import extract_handlers
from django_grpc.utils import add_servicers, extract_handlers, create_server


class Command(BaseCommand):
Expand All @@ -18,7 +17,7 @@ def add_arguments(self, parser):
parser.add_argument('--max_workers', type=int, help="Number of workers")
parser.add_argument('--port', type=int, default=50051, help="Port number to listen")
parser.add_argument('--autoreload', action='store_true', default=False)
parser.add_argument('--list-handlers', action='store_true', default=False, "Print all registered endpoints")
parser.add_argument('--list-handlers', action='store_true', default=False, help="Print all registered endpoints")

def handle(self, *args, **options):
if options['autoreload'] is True:
Expand All @@ -30,16 +29,13 @@ def handle(self, *args, **options):
def _serve(self, max_workers, port, *args, **kwargs):
autoreload.raise_last_exception()
self.stdout.write("Starting server at %s" % datetime.datetime.now())
# create a gRPC server
server = grpc.server(futures.ThreadPoolExecutor(max_workers=max_workers))

self._add_servicers(server)
server.add_insecure_port('[::]:%s' % port)

server = create_server(max_workers, port)
server.start()

self.stdout.write("Server is listening port %s" % port)

if kwargs['list-handlers'] is True:
if kwargs['list_handlers'] is True:
for handler in extract_handlers(server):
self.stdout.write(self.style.INFO(handler))

Expand All @@ -52,12 +48,5 @@ def _serve(self, max_workers, port, *args, **kwargs):
server.stop(0)
sys.exit(0)

def _add_servicers(self, server):
"""
Add servicers to the server
"""
from django.conf import settings
for path in settings.GRPC_SERVICERS:
callback = import_string(path)
callback(server)


27 changes: 26 additions & 1 deletion django_grpc/utils.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,28 @@
from concurrent import futures

import grpc
from django.utils.module_loading import import_string


def create_server(max_workers, port):
# create a gRPC server
server = grpc.server(futures.ThreadPoolExecutor(max_workers=max_workers))

add_servicers(server)
server.add_insecure_port('[::]:%s' % port)
return server


def add_servicers(server):
"""
Add servicers to the server
"""
from django.conf import settings
for path in settings.GRPC_SERVICERS:
callback = import_string(path)
callback(server)


def extract_handlers(server):
for it in server._state.generic_handlers[0]._method_handlers.values():
yield it.unary_unary.__name__
yield it.unary_unary.__qualname__
2 changes: 2 additions & 0 deletions requirements_test.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,5 @@ codecov>=2.0.0


# Additional test requirements go here
pytest
pytest-mock
2 changes: 1 addition & 1 deletion setup.cfg
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[bumpversion]
current_version = 0.1.3
current_version = 0.1.4
commit = True
tag = True

Expand Down
17 changes: 17 additions & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import threading
from time import sleep

import pytest
from django.core.management import call_command



@pytest.fixture
def grpc_server_async():
srv = threading.Thread(target=call_grpc_server_command, args=[{"max_workers": 3, "port": 50080, "autoreload": False}])
srv.start()
sleep(5)

yield

srv.join()
10 changes: 10 additions & 0 deletions tests/manage.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "tests.settings")

from django.core.management import execute_from_command_line

execute_from_command_line(sys.argv)
Empty file added tests/sampleapp/__init__.py
Empty file.
134 changes: 134 additions & 0 deletions tests/sampleapp/helloworld_pb2.py

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

46 changes: 46 additions & 0 deletions tests/sampleapp/helloworld_pb2_grpc.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
import grpc

from tests.sampleapp import helloworld_pb2


class GreeterStub(object):
"""The greeting service definition.
"""

def __init__(self, channel):
"""Constructor.
Args:
channel: A grpc.Channel.
"""
self.SayHello = channel.unary_unary(
'/helloworld.Greeter/SayHello',
request_serializer=helloworld_pb2.HelloRequest.SerializeToString,
response_deserializer=helloworld_pb2.HelloReply.FromString,
)


class GreeterServicer(object):
"""The greeting service definition.
"""

def SayHello(self, request, context):
"""Sends a greeting
"""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')


def add_GreeterServicer_to_server(servicer, server):
rpc_method_handlers = {
'SayHello': grpc.unary_unary_rpc_method_handler(
servicer.SayHello,
request_deserializer=helloworld_pb2.HelloRequest.FromString,
response_serializer=helloworld_pb2.HelloReply.SerializeToString,
),
}
generic_handler = grpc.method_handlers_generic_handler(
'helloworld.Greeter', rpc_method_handlers)
server.add_generic_rpc_handlers((generic_handler,))
7 changes: 7 additions & 0 deletions tests/sampleapp/servicer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from tests.sampleapp import helloworld_pb2_grpc, helloworld_pb2


class Greeter(helloworld_pb2_grpc.GreeterServicer):
def SayHello(self, request, context):
return helloworld_pb2.HelloReply(message='Hello, %s!' % request.name)

8 changes: 8 additions & 0 deletions tests/sampleapp/utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from tests.sampleapp import helloworld_pb2_grpc
from tests.sampleapp.servicer import Greeter


def register_servicer(server):
""" Callback for django_grpc """
helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server)

10 changes: 10 additions & 0 deletions tests/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,13 @@
MIDDLEWARE = ()
else:
MIDDLEWARE_CLASSES = ()


INSTALLED_APPS = [
'django_grpc',
'tests.sampleapp',
]

GRPC_SERVICERS = (
'tests.sampleapp.utils.register_servicer',
)
25 changes: 0 additions & 25 deletions tests/test_models.py

This file was deleted.

20 changes: 20 additions & 0 deletions tests/test_server.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import threading
from time import sleep

import pytest
from django.core.management import call_command


def call_grpc_server_command(options):
call_command("grpcserver", **options)


def test_management_command(mocker):
mocker.patch.object('')

srv = threading.Thread(target=call_grpc_server_command, args=[{"max_workers": 3, "port": 50080, "autoreload": False}])
srv.start()
sleep(5)

Loading

0 comments on commit 28a8b1c

Please sign in to comment.