usawa

Unnamed repository; edit this file 'description' to name the repository.
Info | Log | Files | Refs | Submodules | LICENSE

commit 696dda6f989f88917a2aa330a1f72829092a1213
parent 53ae6759f6655f0561976b54e77b32dc6d213108
Author: lash <dev@holbrook.no>
Date:   Wed, 11 Feb 2026 15:31:40 +0000

Hello world socket server test

Diffstat:
Mdummy/tests/handler.py | 1-
Adummy/tests/server.py | 67+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mdummy/usawa/runnable/server.py | 5+----
Mdummy/usawa/service.py | 62+++++++++++++++++++++++++++++++++++++++++++++++++++++++-------
4 files changed, 123 insertions(+), 12 deletions(-)

diff --git a/dummy/tests/handler.py b/dummy/tests/handler.py @@ -83,6 +83,5 @@ class TestHandler(unittest.TestCase): handler.scan(b'\x00') - if __name__ == '__main__': unittest.main() diff --git a/dummy/tests/server.py b/dummy/tests/server.py @@ -0,0 +1,67 @@ +import logging +import datetime +import unittest +import os +import copy +import tempfile +import shutil +import uuid +import threading +import time + +import lxml.etree +from whee.mem import MemStore + +from usawa import DemoWallet, Ledger, Entry, EntryPart, ACL, UnitIndex +from usawa.store import LedgerStore +from usawa.service import Handler, UnixServer + +logging.basicConfig(level=logging.DEBUG) +logg = logging.getLogger() + +testdir = os.path.realpath(os.path.dirname(__file__)) + + +def zero_handler(v): + logg.debug('zero handler arg 0x{}'.format(v.hex())) + return 0 + + +def create_handler(): + handler = Handler() + handler.register(0, zero_handler) + return handler + + +class TestSocket(unittest.TestCase): + + def setUp(self): + self.uidx = UnitIndex('FOO') + self.uidx.add('USD') + self.store = MemStore() + self.wallet = DemoWallet() + self.acl = ACL.from_wallet(self.wallet) + self.ledger = Ledger(self.uidx, acl=self.acl) + self.workdir = tempfile.mkdtemp() + + + def tearDown(self): + shutil.rmtree(self.workdir) + + + def serve(self, srv): + srv.start() + + + def test_disconnect(self): + s = str(uuid.uuid4()) + srv_path = os.path.join(self.workdir, s) + srv = UnixServer(self.store, self.ledger, path=srv_path) + th = threading.Thread(target=self.serve, args=(srv,)) + th.start() + srv.stop() + th.join() + + +if __name__ == '__main__': + unittest.main() diff --git a/dummy/usawa/runnable/server.py b/dummy/usawa/runnable/server.py @@ -11,9 +11,6 @@ from whee.valkey import ValkeyStore logging.basicConfig(level=logging.DEBUG) logg = logging.getLogger() -READ_SIZE = 2048 -LISTEN_COUNT = 5 - def parse(v): logg.debug('parsingĀ {}'.format(v.hex())) @@ -35,7 +32,7 @@ def main(): ledger = Ledger.from_tree(ledger_tree, acl=acl) db = ValkeyStore('') - srv = SocketServer(db, ledger, acl=acl) + srv = TCPServer(db, ledger, acl=acl) #srv.start() diff --git a/dummy/usawa/service.py b/dummy/usawa/service.py @@ -5,6 +5,9 @@ from usawa.store import LedgerStore logg = logging.getLogger('handler') +READ_SIZE = 2048 +LISTEN_COUNT = 5 + class Handler: @@ -95,29 +98,51 @@ class Handler: class SocketServer: - + def __init__(self, db, ledger, acl=None): - self.scks = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.store = LedgerStore(db, ledger) self.acl = acl + self.scks = None + self.running = True + + + def stop(self): + if self.scks != None: + self.scks.shutdown(socket.SHUT_RD) + self.scks.close() + self.scks = None + self.running = False def start(self): - scks.bind(('', 32327,)) - scks.listen(LISTEN_COUNT) - while True: + self.scks.listen(LISTEN_COUNT) + while self.running: logg.debug('waiting for connection') - (sckc, address) = scks.accept() + sckc = None + address = None + if self.scks == None: + logg.warning('Socket gone. Bailing.') + break + try: + (sckc, address) = self.scks.accept() + except OSError: + logg.warning('Socket accept aborted. Bailing.') + break logg.info('connect: {}'.format(address)) #th = threading.Thread(target=self.receive, args=(sckc, address)) #th.start() self.receive(sckc, address) - + + + def default_handler(self, v): + return 0 + def receive(self, sckc, address): c = 0 data = bytearray() handler = Handler() + handler.register(0, self.default_handler) while True: b = sckc.recv(READ_SIZE) if len(b) == 0: @@ -129,3 +154,26 @@ class SocketServer: parse(bytes(data)) data.append(v) logg.debug('read {}: {}'.format(len(b), b.hex())) + + +class UnixServer(SocketServer): + + def __init__(self, db, ledger, acl=None, path='./usawa.socket'): + super(UnixServer, self).__init__(db, ledger, acl=acl) + self.scks = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + self.scks.bind(path) + + +class TCPServer(SocketServer): + + def __init__(self, db, ledger, acl=None, host='', port=32327): + super(TCPServer, self).__init__(db, ledger, acl=acl) + self.scks = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.scks.bind((host, port,)) + + +class TCPClient: + + def __init__(self, host, port=32327): + self.scks = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.connect((host, port,))