From 0ea0c413c03822690f985b871ed1c13230f9a471 Mon Sep 17 00:00:00 2001 From: F483 Date: Thu, 25 Jun 2015 14:38:39 +0200 Subject: [PATCH] fixed tools/client and added tests --- tests/test_client.py | 64 +++++++++++++++++++++++++++++++ tools/client.py | 91 ++++++++++++++++++++++++++------------------ 2 files changed, 118 insertions(+), 37 deletions(-) create mode 100644 tests/test_client.py diff --git a/tests/test_client.py b/tests/test_client.py new file mode 100644 index 0000000..030eba4 --- /dev/null +++ b/tests/test_client.py @@ -0,0 +1,64 @@ +import os +import unittest +from multiprocessing import Process +from dataserv.app import app, db +from tools import client +import time + +port = "8000" +host="127.0.0.1" +url = "http://%s:%s" % (host, port) +dbpath = 'dataserv.db' # TODO get from config +address_alpha = "13wENBbYbNW9KczZSQXyVogzB15jyVmmKS" +address_beta = "15JPEyzUgBKYJSrtHQ9g5kVbm8hghLhv1b" +address_gamma = "1DauYnqSjZbRSfUoderYgTLdjCjBuyENWA" + + +def start_test_server(): + + # remove previous db + try: + os.remove(dbpath) + except OSError: + pass # file does not exist + + # create schema + db.create_all() + + # start server + app.run(host=host, port=int(port), debug=True) + + +class TestClient(unittest.TestCase): + + def setUp(self): + self.server = Process(target=start_test_server) + self.server.start() + time.sleep(5) + + def tearDown(self): + self.server.terminate() + self.server.join() + + def test_register(self): + self.assertTrue(client.register(address_alpha, url=url)) + + def test_already_registered(self): + def callback(): + client.register(address_beta, url=url) + client.register(address_beta, url=url) + self.assertRaises(client.AddressAlreadyRegistered, callback) + + def test_register_invalid_address(self): + def callback(): + client.register("xyz", url=url) + self.assertRaises(client.InvalidAddress, callback) + + def test_ping_invalid_address(self): + def callback(): + client.ping("xyz", url=url) + self.assertRaises(client.InvalidAddress, callback) + + +if __name__ == '__main__': + unittest.main() diff --git a/tools/client.py b/tools/client.py index d908ac8..040a493 100644 --- a/tools/client.py +++ b/tools/client.py @@ -4,13 +4,42 @@ import urllib.request -# config vars -url = "http://104.236.104.117" -address = "YOUR ADDRESS HERE" -alive_delay = 15 # seconds +class AddressAlreadyRegistered(Exception): + def __init__(self, address, url): + msg = "Address {0} already registered at {1}!".format(address, url) + super(AddressAlreadyRegistered, self).__init__(msg) -def registration(): + +class FarmerNotFound(Exception): + + def __init__(self, url): + msg = "Farmer not found at {0}!".format(url) + super(FarmerNotFound, self).__init__(msg) + + +class FarmerError(Exception): + + def __init__(self, url): + msg = "Farmer error at {0}!".format(url) + super(FarmerError, self).__init__(msg) + + +class InvalidAddress(Exception): + + def __init__(self, address): + msg = "Address {0} not valid!".format(address) + super(InvalidAddress, self).__init__(msg) + + +class ConnectionError(Exception): + + def __init__(self, url): + msg = "Could not connect to server {0}!".format(url) + super(ConnectionError, self).__init__(msg) + + +def register(address, url="http://104.236.104.117"): """Attempt to register the config address.""" try: @@ -22,55 +51,43 @@ def registration(): except urllib.error.HTTPError as e: if e.code == 409: - print("Address {0} already registered.".format(address)) - return True - + raise AddressAlreadyRegistered(address, url) + elif e.code == 404: + raise FarmerNotFound(url) elif e.code == 400: - print("Address is not valid.") - return False - + raise InvalidAddress(address) # TODO test + elif e.code == 500: + raise FarmerError(url) + else: + raise e except urllib.error.URLError: - print("Could not connect to server.") - time.sleep(15) - return True + raise ConnectionError(url) - except ConnectionResetError: - print("Could not connect to server.") - time.sleep(15) - return True - -def keep_alive(delay): +def ping(address, url="http://104.236.104.117"): """Attempt keep-alive with the server.""" try: api_call = "{0}/api/ping/{1}".format(url, address) response = urllib.request.urlopen(api_call) print("Pinging {0} with address {1}.".format(url, address)) - time.sleep(delay) return True except urllib.error.HTTPError as e: if e.code == 400: - print("Address is not valid.") - + raise InvalidAddress(address) # TODO test elif e.code == 404: - print("Farmer not found.") - + raise FarmerNotFound(url) elif e.code == 500: - print("Server Error.") - + raise FarmerError(url) + else: + raise e except urllib.error.URLError: - print("Could not connect to server.") + raise ConnectionError(url) - except ConnectionResetError: - print("Could not connect to server.") - return False +def keep_alive(address, delay=15): + register(address) + while ping(address): + time.sleep(delay) -if __name__ == "__main__": - # attempt to register user - while registration(): - # keep-alive with server - while keep_alive(alive_delay): - pass