From deee515b155c70baafa8c581dbf71e2f44bf52ae Mon Sep 17 00:00:00 2001 From: Bastian Schroll Date: Fri, 21 Sep 2018 22:02:07 +0200 Subject: [PATCH 1/9] broadcasting func - get conn infos from server --- boswatch/network/broadcast.py | 87 +++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 boswatch/network/broadcast.py diff --git a/boswatch/network/broadcast.py b/boswatch/network/broadcast.py new file mode 100644 index 0000000..0d4e547 --- /dev/null +++ b/boswatch/network/broadcast.py @@ -0,0 +1,87 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +"""! + ____ ____ ______ __ __ __ _____ + / __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / + / __ / / / /\__ \| | /| / / __ `/ __/ ___/ __ \ /_ < + / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / +/_____/\____//____/ |__/|__/\__,_/\__/\___/_/ /_/ /____/ + German BOS Information Script + by Bastian Schroll + +@file: broadcast.py +@date: 21.09.2018 +@author: Bastian Schroll +@description: UDP broadcast server and client class +""" +import logging +import socket + +logging.debug("- %s loaded", __name__) + + +class BroadcastClient: + + def __init__(self, port=5000): + self._broadcastPort = port + + self._serverIP = "" + self._serverPort = 0 + + self._socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) + self._socket.settimeout(3) + + def sendBroadcast(self): + while True: + try: + + logging.debug("send magic ") + self._socket.sendto("".encode(), ('255.255.255.255', self._broadcastPort)) + payload, address = self._socket.recvfrom(1024) + payload = str(payload, "UTF-8") + + if payload.startswith(""): + logging.debug("received magic ") + self._serverIP = address[0] + self._serverPort = int(payload.split(";")[1]) + logging.info("got connection info: %s:%d", self._serverIP, self._serverPort) + return True + except socket.timeout: + logging.warning("retry sending magic") + continue + except: + logging.exception("error on getting connection info") + return False + + @property + def serverIP(self): + return self._serverIP + + @property + def serverPort(self): + return self._serverPort + + +class BroadcastServer: + """!General class comment""" + + def __init__(self, port=5000): + """!init comment""" + self._socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + self._socket.bind(('', port)) + + def listen(self): + try: + logging.debug("start listening for magic") + while True: + payload, address = self._socket.recvfrom(1024) + payload = str(payload, "UTF-8") + if payload == "": + logging.debug("received magic from: %s", address[0]) + logging.debug("send connection info in magic ") + self._socket.sendto(";8080".encode(), address) # todo give the TCPServer port + return True + except: + logging.exception("error while listening for clients") From bec034827f4ba2efc946ee26f12a3688a6fae22d Mon Sep 17 00:00:00 2001 From: Bastian Schroll Date: Fri, 21 Sep 2018 22:36:11 +0200 Subject: [PATCH 2/9] some improvements - run server in thread - improve some logging msg --- boswatch/network/broadcast.py | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/boswatch/network/broadcast.py b/boswatch/network/broadcast.py index 0d4e547..c2b4842 100644 --- a/boswatch/network/broadcast.py +++ b/boswatch/network/broadcast.py @@ -16,6 +16,7 @@ """ import logging import socket +import threading logging.debug("- %s loaded", __name__) @@ -36,14 +37,13 @@ class BroadcastClient: def sendBroadcast(self): while True: try: - - logging.debug("send magic ") + logging.debug("send magic as broadcast") self._socket.sendto("".encode(), ('255.255.255.255', self._broadcastPort)) payload, address = self._socket.recvfrom(1024) payload = str(payload, "UTF-8") if payload.startswith(""): - logging.debug("received magic ") + logging.debug("received magic from: %s", address[0]) self._serverIP = address[0] self._serverPort = int(payload.split(";")[1]) logging.info("got connection info: %s:%d", self._serverIP, self._serverPort) @@ -71,16 +71,37 @@ class BroadcastServer: """!init comment""" self._socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self._socket.bind(('', port)) + self._serverThread = None + self._serverIsRunning = False - def listen(self): + def start(self): + try: + logging.debug("start udp broadcast server") + self._serverThread = threading.Thread(target=self._listen) + self._serverThread.name = "BroadServ" + self._serverThread.daemon = True + self._serverIsRunning = True + self._serverThread.start() + except: + logging.exception("cannot start udp broadcast server thread") + + def stop(self): + try: + logging.debug("stop udp broadcast server") + self._serverIsRunning = False + self._serverThread.join() + except: + logging.exception("cannot stop udp broadcast server thread") + + def _listen(self): try: logging.debug("start listening for magic") - while True: + while self._serverIsRunning: payload, address = self._socket.recvfrom(1024) payload = str(payload, "UTF-8") if payload == "": logging.debug("received magic from: %s", address[0]) - logging.debug("send connection info in magic ") + logging.info("send connection info in magic to: %s", address[0]) self._socket.sendto(";8080".encode(), address) # todo give the TCPServer port return True except: From 1b7341c07e68e47442993a64be04177999d882a4 Mon Sep 17 00:00:00 2001 From: Bastian Schroll Date: Sat, 22 Sep 2018 08:39:41 +0200 Subject: [PATCH 3/9] resolve todo and add some docu --- boswatch/network/broadcast.py | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/boswatch/network/broadcast.py b/boswatch/network/broadcast.py index c2b4842..334c995 100644 --- a/boswatch/network/broadcast.py +++ b/boswatch/network/broadcast.py @@ -24,6 +24,9 @@ logging.debug("- %s loaded", __name__) class BroadcastClient: def __init__(self, port=5000): + """!Create an BroadcastClient instance + + @param port: port to send broadcast packets (5000)""" self._broadcastPort = port self._serverIP = "" @@ -32,9 +35,13 @@ class BroadcastClient: self._socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) - self._socket.settimeout(3) + self._socket.settimeout(5) def sendBroadcast(self): + """!Send broadcastpackets + + This function will block until the connection Info + from server will be received.""" while True: try: logging.debug("send magic as broadcast") @@ -49,7 +56,7 @@ class BroadcastClient: logging.info("got connection info: %s:%d", self._serverIP, self._serverPort) return True except socket.timeout: - logging.warning("retry sending magic") + logging.warning("no server found - retry sending magic") continue except: logging.exception("error on getting connection info") @@ -57,22 +64,28 @@ class BroadcastClient: @property def serverIP(self): + """!Property to get the server IP after successful broadcast""" return self._serverIP @property def serverPort(self): + """!Property to get the server Port after successful broadcast""" return self._serverPort class BroadcastServer: - """!General class comment""" - def __init__(self, port=5000): - """!init comment""" + def __init__(self, servePort=8080,listenPort=5000): + """!Create an BroadcastServer instance + + @param listenPort: port to listen for broadcast packets (5000)""" self._socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - self._socket.bind(('', port)) + self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) + self._socket.bind(('', listenPort)) self._serverThread = None self._serverIsRunning = False + self._servePort = servePort def start(self): try: @@ -102,7 +115,7 @@ class BroadcastServer: if payload == "": logging.debug("received magic from: %s", address[0]) logging.info("send connection info in magic to: %s", address[0]) - self._socket.sendto(";8080".encode(), address) # todo give the TCPServer port + self._socket.sendto(";".encode() + str(self._servePort).encode(), address) return True except: logging.exception("error while listening for clients") From 9c091fb1f7cc9a73aa8dd3db1b1383cae5fccab4 Mon Sep 17 00:00:00 2001 From: Bastian Schroll Date: Sat, 22 Sep 2018 22:58:19 +0200 Subject: [PATCH 4/9] add more docu --- boswatch/network/broadcast.py | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/boswatch/network/broadcast.py b/boswatch/network/broadcast.py index 334c995..4fd3f11 100644 --- a/boswatch/network/broadcast.py +++ b/boswatch/network/broadcast.py @@ -22,6 +22,7 @@ logging.debug("- %s loaded", __name__) class BroadcastClient: + """!BroadcastClient class""" def __init__(self, port=5000): """!Create an BroadcastClient instance @@ -41,7 +42,13 @@ class BroadcastClient: """!Send broadcastpackets This function will block until the connection Info - from server will be received.""" + from server will be received. + + - send the magic packet on broadcast address. + - wait for a magic packet. + - extract the connection data from the magic packet and return + + @return True or False""" while True: try: logging.debug("send magic as broadcast") @@ -74,6 +81,7 @@ class BroadcastClient: class BroadcastServer: + """!BroadcastServer class""" def __init__(self, servePort=8080,listenPort=5000): """!Create an BroadcastServer instance @@ -88,6 +96,9 @@ class BroadcastServer: self._servePort = servePort def start(self): + """!Start the broadcast server in a new thread + + @return True or False""" try: logging.debug("start udp broadcast server") self._serverThread = threading.Thread(target=self._listen) @@ -95,27 +106,40 @@ class BroadcastServer: self._serverThread.daemon = True self._serverIsRunning = True self._serverThread.start() + return True except: logging.exception("cannot start udp broadcast server thread") + return False def stop(self): + """!Stop the broadcast server + + @return True or False""" try: logging.debug("stop udp broadcast server") self._serverIsRunning = False self._serverThread.join() + return True except: logging.exception("cannot stop udp broadcast server thread") + return False def _listen(self): + """!Broadcast server worker thread + + This function listen for magic packets on broadcast + address and send the connection info to the clients. + + - listen for the magic packet + - send connection info in an macig packet""" try: logging.debug("start listening for magic") while self._serverIsRunning: - payload, address = self._socket.recvfrom(1024) + payload, address = self._socket.recvfrom(1024) # fixme recv is blocking, evtl we can use to wait for readable data payload = str(payload, "UTF-8") if payload == "": logging.debug("received magic from: %s", address[0]) logging.info("send connection info in magic to: %s", address[0]) self._socket.sendto(";".encode() + str(self._servePort).encode(), address) - return True except: logging.exception("error while listening for clients") From 16c5388d3d1cf40a1e4c16847972d6ee2432809b Mon Sep 17 00:00:00 2001 From: Bastian Schroll Date: Sun, 23 Sep 2018 17:49:53 +0200 Subject: [PATCH 5/9] some improvements --- boswatch/network/broadcast.py | 51 ++++++++++++++++++++++------------- bw_server.py | 10 +++++++ 2 files changed, 42 insertions(+), 19 deletions(-) diff --git a/boswatch/network/broadcast.py b/boswatch/network/broadcast.py index 4fd3f11..00d072b 100644 --- a/boswatch/network/broadcast.py +++ b/boswatch/network/broadcast.py @@ -17,6 +17,7 @@ import logging import socket import threading +import time logging.debug("- %s loaded", __name__) @@ -36,22 +37,25 @@ class BroadcastClient: self._socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) - self._socket.settimeout(5) + self._socket.settimeout(3) - def sendBroadcast(self): + def getConnInfo(self, retry=0): """!Send broadcastpackets - This function will block until the connection Info - from server will be received. + This function will send broadcast package(s) + to get connection info from the server. - send the magic packet on broadcast address. - wait for a magic packet. - extract the connection data from the magic packet and return + @param retry: Count of retry - 0 is infinite (0) + @return True or False""" - while True: + sendPackages = 1 + while sendPackages <= retry or retry == 0: try: - logging.debug("send magic as broadcast") + logging.debug("send magic as broadcast - #%d", sendPackages) self._socket.sendto("".encode(), ('255.255.255.255', self._broadcastPort)) payload, address = self._socket.recvfrom(1024) payload = str(payload, "UTF-8") @@ -60,14 +64,16 @@ class BroadcastClient: logging.debug("received magic from: %s", address[0]) self._serverIP = address[0] self._serverPort = int(payload.split(";")[1]) - logging.info("got connection info: %s:%d", self._serverIP, self._serverPort) + logging.info("got connection info from server: %s:%d", self._serverIP, self._serverPort) return True - except socket.timeout: - logging.warning("no server found - retry sending magic") - continue + except socket.timeout: # nothing received - retry + logging.debug("no magic packet received") + sendPackages += 1 except: logging.exception("error on getting connection info") - return False + + return False + @property def serverIP(self): @@ -90,6 +96,7 @@ class BroadcastServer: self._socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) + self._socket.settimeout(2) self._socket.bind(('', listenPort)) self._serverThread = None self._serverIsRunning = False @@ -111,14 +118,17 @@ class BroadcastServer: logging.exception("cannot start udp broadcast server thread") return False - def stop(self): + def stopp(self): """!Stop the broadcast server + Due to the timeout of the socket, + stopping the thread can be delayed by two seconds + @return True or False""" try: logging.debug("stop udp broadcast server") self._serverIsRunning = False - self._serverThread.join() + # self._serverThread.join() return True except: logging.exception("cannot stop udp broadcast server thread") @@ -132,14 +142,17 @@ class BroadcastServer: - listen for the magic packet - send connection info in an macig packet""" - try: - logging.debug("start listening for magic") - while self._serverIsRunning: - payload, address = self._socket.recvfrom(1024) # fixme recv is blocking, evtl we can use to wait for readable data + logging.debug("start listening for magic") + while self._serverIsRunning: + try: + payload, address = self._socket.recvfrom(1024) payload = str(payload, "UTF-8") if payload == "": logging.debug("received magic from: %s", address[0]) logging.info("send connection info in magic to: %s", address[0]) self._socket.sendto(";".encode() + str(self._servePort).encode(), address) - except: - logging.exception("error while listening for clients") + except socket.timeout: + continue # timeout is accepted (not block at recvfrom()) + except: + logging.exception("error while listening for clients") + logging.debug("udp broadcast server stopped") diff --git a/bw_server.py b/bw_server.py index 6b215d6..bc0eed5 100644 --- a/bw_server.py +++ b/bw_server.py @@ -51,12 +51,22 @@ try: from boswatch.descriptor.descriptor import Descriptor from boswatch.filter.doubeFilter import DoubleFilter from boswatch.utils import header + from boswatch.network.broadcast import BroadcastClient + from boswatch.network.broadcast import BroadcastServer except Exception as e: # pragma: no cover logging.exception("cannot import modules") print("cannot import modules") print(e) exit(1) +# Test for the broadcast connection info function +server = BroadcastServer() +client = BroadcastClient() +server.start() +client.getConnInfo() +print(client.serverIP, client.serverPort) +server.stop() + try: header.logoToLog() header.infoToLog() From 59f6ec073270d2fc0e907081df0aeb377b7cca72 Mon Sep 17 00:00:00 2001 From: Bastian Schroll Date: Sun, 23 Sep 2018 21:22:22 +0200 Subject: [PATCH 6/9] check running state, add prop for running state --- boswatch/network/broadcast.py | 41 +++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/boswatch/network/broadcast.py b/boswatch/network/broadcast.py index 00d072b..b842008 100644 --- a/boswatch/network/broadcast.py +++ b/boswatch/network/broadcast.py @@ -55,7 +55,7 @@ class BroadcastClient: sendPackages = 1 while sendPackages <= retry or retry == 0: try: - logging.debug("send magic as broadcast - #%d", sendPackages) + logging.debug("send magic as broadcast - Try: %d", sendPackages) self._socket.sendto("".encode(), ('255.255.255.255', self._broadcastPort)) payload, address = self._socket.recvfrom(1024) payload = str(payload, "UTF-8") @@ -107,29 +107,37 @@ class BroadcastServer: @return True or False""" try: - logging.debug("start udp broadcast server") - self._serverThread = threading.Thread(target=self._listen) - self._serverThread.name = "BroadServ" - self._serverThread.daemon = True - self._serverIsRunning = True - self._serverThread.start() - return True + if not self._serverIsRunning: + logging.debug("start udp broadcast server") + self._serverThread = threading.Thread(target=self._listen) + self._serverThread.name = "BroadServ" + self._serverThread.daemon = True + self._serverIsRunning = True + self._serverThread.start() + return True + else: + logging.warning("udp broadcast server always started") + return True except: logging.exception("cannot start udp broadcast server thread") return False - def stopp(self): + def stop(self): """!Stop the broadcast server Due to the timeout of the socket, - stopping the thread can be delayed by two seconds + stopping the thread can be delayed by two seconds. + But function returns immediately. @return True or False""" try: - logging.debug("stop udp broadcast server") - self._serverIsRunning = False - # self._serverThread.join() - return True + if not self._serverIsRunning: + logging.debug("stop udp broadcast server") + self._serverIsRunning = False + return True + else: + logging.warning("udp broadcast server always stopped") + return True except: logging.exception("cannot stop udp broadcast server thread") return False @@ -156,3 +164,8 @@ class BroadcastServer: except: logging.exception("error while listening for clients") logging.debug("udp broadcast server stopped") + + @property + def isRunning(self): + """!Property of broadcast server running state""" + return self._serverIsRunning From 26af2ef18b5c87b48be64e858a8296b3a5441c92 Mon Sep 17 00:00:00 2001 From: Bastian Schroll Date: Sun, 23 Sep 2018 21:27:40 +0200 Subject: [PATCH 7/9] fix in runningState management --- boswatch/network/broadcast.py | 18 ++++++++++-------- bw_server.py | 4 ++++ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/boswatch/network/broadcast.py b/boswatch/network/broadcast.py index b842008..27ab130 100644 --- a/boswatch/network/broadcast.py +++ b/boswatch/network/broadcast.py @@ -71,7 +71,6 @@ class BroadcastClient: sendPackages += 1 except: logging.exception("error on getting connection info") - return False @@ -99,7 +98,7 @@ class BroadcastServer: self._socket.settimeout(2) self._socket.bind(('', listenPort)) self._serverThread = None - self._serverIsRunning = False + self._serverShutdown = False self._servePort = servePort def start(self): @@ -107,12 +106,12 @@ class BroadcastServer: @return True or False""" try: - if not self._serverIsRunning: + if not self._serverThread: logging.debug("start udp broadcast server") self._serverThread = threading.Thread(target=self._listen) self._serverThread.name = "BroadServ" self._serverThread.daemon = True - self._serverIsRunning = True + self._serverShutdown = False self._serverThread.start() return True else: @@ -131,9 +130,9 @@ class BroadcastServer: @return True or False""" try: - if not self._serverIsRunning: + if self._serverThread: logging.debug("stop udp broadcast server") - self._serverIsRunning = False + self._serverShutdown = True return True else: logging.warning("udp broadcast server always stopped") @@ -151,7 +150,7 @@ class BroadcastServer: - listen for the magic packet - send connection info in an macig packet""" logging.debug("start listening for magic") - while self._serverIsRunning: + while not self._serverShutdown: try: payload, address = self._socket.recvfrom(1024) payload = str(payload, "UTF-8") @@ -163,9 +162,12 @@ class BroadcastServer: continue # timeout is accepted (not block at recvfrom()) except: logging.exception("error while listening for clients") + self._serverThread = None logging.debug("udp broadcast server stopped") @property def isRunning(self): """!Property of broadcast server running state""" - return self._serverIsRunning + if self._serverThread: + return True + return False diff --git a/bw_server.py b/bw_server.py index bc0eed5..4eee08d 100644 --- a/bw_server.py +++ b/bw_server.py @@ -63,9 +63,13 @@ except Exception as e: # pragma: no cover server = BroadcastServer() client = BroadcastClient() server.start() +print(server.isRunning) client.getConnInfo() print(client.serverIP, client.serverPort) server.stop() +print(server.isRunning) +time.sleep(2) +print(server.isRunning) try: header.logoToLog() From 22588caac55d1bb9f40fdef322cd57a0370f4dd4 Mon Sep 17 00:00:00 2001 From: Bastian Schroll Date: Tue, 25 Sep 2018 18:50:52 +0200 Subject: [PATCH 8/9] add unittest --- boswatch/network/broadcast.py | 18 ++++----- test/test_broadcast.py | 70 +++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 9 deletions(-) create mode 100644 test/test_broadcast.py diff --git a/boswatch/network/broadcast.py b/boswatch/network/broadcast.py index 27ab130..3cf98b9 100644 --- a/boswatch/network/broadcast.py +++ b/boswatch/network/broadcast.py @@ -17,7 +17,6 @@ import logging import socket import threading -import time logging.debug("- %s loaded", __name__) @@ -40,7 +39,7 @@ class BroadcastClient: self._socket.settimeout(3) def getConnInfo(self, retry=0): - """!Send broadcastpackets + """!Get the connection info from server over udp broadcast This function will send broadcast package(s) to get connection info from the server. @@ -52,11 +51,12 @@ class BroadcastClient: @param retry: Count of retry - 0 is infinite (0) @return True or False""" - sendPackages = 1 - while sendPackages <= retry or retry == 0: + sendPackages = 0 + while sendPackages < retry or retry == 0: try: logging.debug("send magic as broadcast - Try: %d", sendPackages) self._socket.sendto("".encode(), ('255.255.255.255', self._broadcastPort)) + sendPackages += 1 payload, address = self._socket.recvfrom(1024) payload = str(payload, "UTF-8") @@ -68,9 +68,9 @@ class BroadcastClient: return True except socket.timeout: # nothing received - retry logging.debug("no magic packet received") - sendPackages += 1 - except: + except: # pragma: no cover logging.exception("error on getting connection info") + logging.warning("cannot fetch connection info after %d tries", sendPackages) return False @@ -117,7 +117,7 @@ class BroadcastServer: else: logging.warning("udp broadcast server always started") return True - except: + except: # pragma: no cover logging.exception("cannot start udp broadcast server thread") return False @@ -137,7 +137,7 @@ class BroadcastServer: else: logging.warning("udp broadcast server always stopped") return True - except: + except: # pragma: no cover logging.exception("cannot stop udp broadcast server thread") return False @@ -160,7 +160,7 @@ class BroadcastServer: self._socket.sendto(";".encode() + str(self._servePort).encode(), address) except socket.timeout: continue # timeout is accepted (not block at recvfrom()) - except: + except: # pragma: no cover logging.exception("error while listening for clients") self._serverThread = None logging.debug("udp broadcast server stopped") diff --git a/test/test_broadcast.py b/test/test_broadcast.py new file mode 100644 index 0000000..c8e561b --- /dev/null +++ b/test/test_broadcast.py @@ -0,0 +1,70 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +"""! + ____ ____ ______ __ __ __ _____ + / __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ / + / __ / / / /\__ \| | /| / / __ `/ __/ ___/ __ \ /_ < + / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ / +/_____/\____//____/ |__/|__/\__,_/\__/\___/_/ /_/ /____/ + German BOS Information Script + by Bastian Schroll + +@file: test_broadcast.py +@date: 25.09.2018 +@author: Bastian Schroll +@description: Unittests for BOSWatch. File must be _run as "pytest" unittest +""" +import logging +import time +import pytest + +from boswatch.network.broadcast import BroadcastServer +from boswatch.network.broadcast import BroadcastClient + + +class Test_Timer: + """!Unittest for the timer class""" + + def setup_method(self, method): + logging.debug("[TEST] %s.%s", type(self).__name__, method.__name__) + + @pytest.fixture(scope="function") + def useBroadcastServer(self): + """!Server a BroadcastServer instance""" + self.broadcastServer = BroadcastServer() + yield 1 # server the server instance + if self.broadcastServer.isRunning: + assert self.broadcastServer.stop() + while self.broadcastServer.isRunning: + pass + + @pytest.fixture(scope="function") + def useBroadcastClient(self): + """!Server a BroadcastClient instance""" + self.broadcastClient = BroadcastClient() + yield 1 # server the server instance + + # tests start here + + def test_serverStartStop(self, useBroadcastServer): + assert self.broadcastServer.start() + assert self.broadcastServer.isRunning + assert self.broadcastServer.stop() + + def test_serverDoubleStart(self, useBroadcastServer): + assert self.broadcastServer.start() + assert self.broadcastServer.start() + assert self.broadcastServer.stop() + + def test_serverStopNotStarted(self, useBroadcastServer): + assert self.broadcastServer.stop() + + def test_clientWithoutServer(self, useBroadcastClient): + assert not self.broadcastClient.getConnInfo(1) + + def test_serverClientFetchConnInfo(self, useBroadcastServer, useBroadcastClient): + assert self.broadcastServer.start() + assert self.broadcastClient.getConnInfo() + assert self.broadcastServer.stop() + assert self.broadcastClient.serverIP + assert self.broadcastClient.serverPort From ffb8bba460c1e703c49e17e0bef7b6333cbb0f70 Mon Sep 17 00:00:00 2001 From: Bastian Schroll Date: Tue, 25 Sep 2018 19:00:07 +0200 Subject: [PATCH 9/9] fix some small pep8 err --- boswatch/network/broadcast.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/boswatch/network/broadcast.py b/boswatch/network/broadcast.py index 3cf98b9..cfaf0d4 100644 --- a/boswatch/network/broadcast.py +++ b/boswatch/network/broadcast.py @@ -73,7 +73,6 @@ class BroadcastClient: logging.warning("cannot fetch connection info after %d tries", sendPackages) return False - @property def serverIP(self): """!Property to get the server IP after successful broadcast""" @@ -88,9 +87,10 @@ class BroadcastClient: class BroadcastServer: """!BroadcastServer class""" - def __init__(self, servePort=8080,listenPort=5000): + def __init__(self, servePort=8080, listenPort=5000): """!Create an BroadcastServer instance + @param servePort: port to serve as connection info (8080) @param listenPort: port to listen for broadcast packets (5000)""" self._socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)