From ca35c847a203b264edb57a2d6d3a2700ac69dcde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Braulio=20Valdivielso=20Mart=C3=ADnez?= Date: Thu, 3 Mar 2016 21:52:59 +0100 Subject: [PATCH] Moved testserver to tests/ --- tests/testserver/.server.py.swo | Bin 0 -> 12288 bytes tests/testserver/__init__.py | 0 tests/testserver/server.py | 107 ++++++++++++++++++++++++++++++++ 3 files changed, 107 insertions(+) create mode 100644 tests/testserver/.server.py.swo create mode 100644 tests/testserver/__init__.py create mode 100644 tests/testserver/server.py diff --git a/tests/testserver/.server.py.swo b/tests/testserver/.server.py.swo new file mode 100644 index 0000000000000000000000000000000000000000..940c6b1d913a7e002873b66969af9f95bc6379ef GIT binary patch literal 12288 zcmeHNO^6&t6s}bvMvaPIMJuz&&cbZ>Yz#!AtA=Qd8vk&UgIQ^6dTMq$>FI8}syCU7 zf_f7#ddo>c5D)R7HxD@p!GpQzSudg@=t({My{i7(*&jCqgg_O1U9xHNyz+DT zrc5@dE2PrO*YuS6hRl82dD*m@>UyVuQ{YAvDD-IQ(F3O+IkeoTW#&5v`Th5uzL6E( zT&I9jz$xGqa0)mDoB~b(r+`!7CR0FXbL?$!zNO@SyzJ*@`tncLIR%^oP64NYQ@|<{1v;CtXJ;9cMy;91}y zfC0bW&Db^I6QBSz5CRVae;r`#Ti{FJeP94Q4?GS$2K;>&V?O~u0^b4e0j~o-&;f1( zZUw%%ld&&=%fKbz1K=!h1lSM!atC8qfvub06YX6Pk?tG}qPk#+FMloNmjml$M*}3*((XzIL-k5ZBsiAic({<;?FZP|Jw`_?SBdCj~< z+oiJ+CF?<{MUPWitk~M1=vL^l*c2QEPjj{{UNX)cMa0zOfeDLvn4(tmPhOX9P4cQO2McTYTCz}6XvUAHIPr;IIwg~JJwD3&J2{?QU46x0_Lljf zexJYm!d5qPz?8(f-?R-4?=dsmhrDZoYJJ)nGNpCBSuw|>L)zPUf!!>Coe%&tXi z_ULpv{OMvcnc|9|qrnRW5%?&@C+x%N-FO;+A2S7Bo$*;>bW21N6MAjJHx&v(YW&JQ R=oc#Yai#m&6elEM{{pZ=xYGat literal 0 HcmV?d00001 diff --git a/tests/testserver/__init__.py b/tests/testserver/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/testserver/server.py b/tests/testserver/server.py new file mode 100644 index 00000000..153775bd --- /dev/null +++ b/tests/testserver/server.py @@ -0,0 +1,107 @@ +#!/usr/bin/python + +import threading +import socket +import select + + +def consume_socket_content(sock, timeout=0.5): + chunks = 65536 + content = "" + more_to_read = select.select([sock], [], [], timeout)[0] + + while more_to_read: + new_content = sock.recv(chunks) + + if not new_content: + break + + content += new_content + # stop reading if no new data is received for a while + more_to_read = select.select([sock], [], [], timeout)[0] + + return content + + + +class Server(threading.Thread): + """ Dummy server using for unit testing """ + WAIT_EVENT_TIMEOUT = 5 + + def __init__(self, handler, host='localhost', port=0, requests_to_handle=1, wait_to_close_event=None): + threading.Thread.__init__(self) + + self.handler = handler + self.handler_results = [] + + self.host = host + self.port = port + self.requests_to_handle = requests_to_handle + + self.wait_to_close_event = wait_to_close_event + self.ready_event = threading.Event() + self.stop_event = threading.Event() + + @classmethod + def text_response_server(cls, text, request_timeout=0.5, **kwargs): + def text_response_handler(sock): + request_content = consume_socket_content(sock, timeout=request_timeout) + sock.send(text.encode('utf-8')) + + return request_content + + + server = Server(text_response_handler, **kwargs) + return server + + @classmethod + def basic_response_server(cls, **kwargs): + server = cls.text_response_server( + "HTTP/1.1 200 OK\r\n" + + "Content-Length: 0\r\n\r\n", **kwargs + ) + return server + + def run(self): + try: + sock = self._create_socket_and_bind() + # in case self.port = 0 + self.port = sock.getsockname()[1] + self.ready_event.set() + self._handle_requests(sock) + + if self.wait_to_close_event: + self.wait_to_close_event.wait(self.WAIT_EVENT_TIMEOUT) + finally: + self.ready_event.set() # just in case of exception + sock.close() + self.stop_event.set() + + def _create_socket_and_bind(self): + sock = socket.socket() + sock.bind((self.host, self.port)) + sock.listen(0) + return sock + + def _handle_requests(self, server_sock): + for _ in range(self.requests_to_handle): + sock = server_sock.accept()[0] + handler_result = self.handler(sock) + + self.handler_results.append(handler_result) + + def __enter__(self): + self.start() + self.ready_event.wait(self.WAIT_EVENT_TIMEOUT) + return self.host, self.port + + def __exit__(self, exc_type, exc_value, traceback): + if exc_type is None: + self.stop_event.wait(self.WAIT_EVENT_TIMEOUT) + else: + if self.wait_to_close_event: + # avoid server from waiting for event timeouts + # if an exception is found in the main thread + self.wait_to_close_event.set() + return False # allow exceptions to propagate +