Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion examples/language-analyzer.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

import time
from lookout.sdk import pb
from lookout.sdk.service_data import DataStub
from lookout.sdk.grpc import to_grpc_address, create_channel, create_server, \
LogUnaryServerInterceptor, LogStreamServerInterceptor, \
LogUnaryClientInterceptor, LogStreamClientInterceptor
Expand Down Expand Up @@ -35,7 +36,7 @@ def notify_review_event(self, request, context):
LogUnaryClientInterceptor(log_fn),
LogStreamClientInterceptor(log_fn),
]) as channel:
stub = pb.DataStub(channel)
stub = DataStub(channel)

# Add some log fields that will be available to the data server
# using `context.add_log_fields`.
Expand Down
3 changes: 1 addition & 2 deletions python/lookout/sdk/pb.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,10 @@
from lookout.sdk.service_analyzer_pb2_grpc import AnalyzerStub, \
add_AnalyzerServicer_to_server as add_analyzer_to_server
from lookout.sdk.service_analyzer_pb2 import Comment, EventResponse
from lookout.sdk.service_data_pb2_grpc import DataServicer, \
from lookout.sdk.service_data_pb2_grpc import DataServicer, DataStub, \
add_DataServicer_to_server as add_dataservicer_to_server
from lookout.sdk.service_data_pb2 import Change, ChangesRequest, File, \
FilesRequest
from lookout.sdk.service_data import DataStub
from lookout.sdk.service_analyzer import AnalyzerServicer

__all__ = [
Expand Down
3 changes: 2 additions & 1 deletion python/lookout/sdk/service_analyzer.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,9 @@ def __new__(cls, clsname, bases, dct):
if name.startswith("__"):
continue

default_func = dct.get(name, func)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I knew it's 1 line change!

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeah I was ignoring if the method is actually defined 😅.

snake_case_name = cls._to_snake_case(name)
new_attrs[snake_case_name] = dct.get(snake_case_name, func)
new_attrs[snake_case_name] = dct.get(snake_case_name, default_func)
new_attrs[name] = wrap_context(new_attrs[snake_case_name])

return super(AnalyzerServicerMetaclass, cls).__new__(
Expand Down
Empty file.
39 changes: 39 additions & 0 deletions python/lookout/sdk/test/mixins.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import socket
from contextlib import closing


def find_free_port():
with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as s:
s.bind(('', 0))
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
return s.getsockname()[1]


class LogFnTracker:

def __init__(self):
self.counter = {"unary": 0, "stream": 0}
self.logs = []

def unary(self, log_fields, msg):
self._record(log_fields, msg, "unary")

def stream(self, log_fields, msg):
self._record(log_fields, msg, "stream")

def _record(self, log_fields, msg, key):
self.counter[key] += 1
self.logs.append((log_fields.fields.copy(), msg))


class TestWithRunningServicerMixin:

def setUp(self):
self._tracker = LogFnTracker()
self._target = "0.0.0.0:{}".format(find_free_port())
self._server = self.build_server()
self._server.add_insecure_port(self._target)
self._server.start()

def tearDown(self):
self._server.stop(0)
41 changes: 41 additions & 0 deletions python/tests/test_grpc.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import unittest

from lookout.sdk.grpc import create_channel, create_server
from lookout.sdk import event_pb2
from lookout.sdk import pb
from lookout.sdk.test import mixins


class DummyAnalyzer(pb.AnalyzerServicer):

def NotifyReviewEvent(self, request, context):
return pb.EventResponse(comments=[pb.Comment(text='review')])

def NotifyPushEvent(self, request, context):
return pb.EventResponse(comments=[pb.Comment(text='push')])


class TestGRPCAnalyzerApi(mixins.TestWithRunningServicerMixin,
unittest.TestCase):

def build_server(self):
server = create_server(10)
pb.add_analyzer_to_server(DummyAnalyzer(), server)

return server

def test_review(self):
with create_channel(self._target) as channel:
stub = pb.AnalyzerStub(channel)
resp = stub.NotifyReviewEvent(event_pb2.ReviewEvent())

self.assertEqual(len(resp.comments), 1)
self.assertEqual(resp.comments[0].text, 'review')

def test_push(self):
with create_channel(self._target) as channel:
stub = pb.AnalyzerStub(channel)
resp = stub.NotifyPushEvent(event_pb2.PushEvent())

self.assertEqual(len(resp.comments), 1)
self.assertEqual(resp.comments[0].text, 'push')
47 changes: 5 additions & 42 deletions python/tests/test_logger_interceptors.py
Original file line number Diff line number Diff line change
@@ -1,25 +1,18 @@
import socket
from concurrent.futures import ThreadPoolExecutor
from contextlib import closing

import unittest

import grpc

from lookout.sdk import pb
from lookout.sdk.service_data import DataStub
from lookout.sdk.grpc import create_channel, create_server, \
LogUnaryServerInterceptor, \
LogStreamServerInterceptor, \
LogUnaryClientInterceptor, \
LogStreamClientInterceptor
from lookout.sdk import event_pb2


def find_free_port():
with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as s:
s.bind(('', 0))
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
return s.getsockname()[1]
from lookout.sdk.test import mixins


class DummyAnalyzer(pb.AnalyzerServicer):
Expand All @@ -40,37 +33,7 @@ def GetFiles(self, request, context):
return pb.File()


class LogFnTracker:

def __init__(self):
self.counter = {"unary": 0, "stream": 0}
self.logs = []

def unary(self, log_fields, msg):
self._record(log_fields, msg, "unary")

def stream(self, log_fields, msg):
self._record(log_fields, msg, "stream")

def _record(self, log_fields, msg, key):
self.counter[key] += 1
self.logs.append((log_fields.fields.copy(), msg))


class TestWithRunningServicerMixin:

def setUp(self):
self._tracker = LogFnTracker()
self._target = "0.0.0.0:{}".format(find_free_port())
self._server = self.build_server()
self._server.add_insecure_port(self._target)
self._server.start()

def tearDown(self):
self._server.stop(0)


class TestServerLoggerInterceptors(TestWithRunningServicerMixin,
class TestServerLoggerInterceptors(mixins.TestWithRunningServicerMixin,
unittest.TestCase):

def build_server(self):
Expand Down Expand Up @@ -117,7 +80,7 @@ def test_interceptors_called(self):
self.assertEqual(second_unary[1], "gRPC unary server call finished")


class TestClientLoggerInterceptors(TestWithRunningServicerMixin,
class TestClientLoggerInterceptors(mixins.TestWithRunningServicerMixin,
unittest.TestCase):

def build_server(self):
Expand All @@ -131,7 +94,7 @@ def test_interceptors_called(self):
LogUnaryClientInterceptor(self._tracker.unary),
LogStreamClientInterceptor(self._tracker.stream),
]) as channel:
stub = pb.DataStub(channel)
stub = DataStub(channel)
stub.get_changes(None, pb.ChangesRequest())

self.assertEqual(self._tracker.counter, {"unary": 0, "stream": 2})
Expand Down