commit 696dda6f989f88917a2aa330a1f72829092a1213
parent 53ae6759f6655f0561976b54e77b32dc6d213108
Author: lash <dev@holbrook.no>
Date: Wed, 11 Feb 2026 15:31:40 +0000
Hello world socket server test
Diffstat:
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,))