server.py (3904B)
1 import logging 2 import datetime 3 import unittest 4 import os 5 import copy 6 import tempfile 7 import shutil 8 import uuid 9 import threading 10 import time 11 12 import lxml.etree 13 from whee.mem import MemStore 14 15 from usawa import DemoWallet, Ledger, Entry, EntryPart, ACL, UnitIndex 16 from usawa.store import LedgerStore, pfx_entry 17 from usawa.service import Handler, UnixServer, UnixClient 18 19 logging.basicConfig(level=logging.DEBUG) 20 logg = logging.getLogger() 21 22 testdir = os.path.realpath(os.path.dirname(__file__)) 23 24 hash_of_foo = b'7fbba6e0636f890e56fbbf3283e524c6fa3204ae298382d624741d0dc6638326e282c41be5e4254d8820772c5518a2c5a8c0c7f7eda19594a7eb539453e1ed7' 25 26 27 def zero_handler(v): 28 logg.debug('zero handler arg 0x{}'.format(v.hex())) 29 return b'\x00' 30 31 32 def create_handler(): 33 handler = Handler() 34 handler.register(0, zero_handler) 35 return handler 36 37 38 class TestSocket(unittest.TestCase): 39 40 def setUp(self): 41 self.uidx = UnitIndex('FOO') 42 self.uidx.add('USD') 43 self.db = MemStore() 44 self.wallet = DemoWallet() 45 self.acl = ACL.from_wallet(self.wallet) 46 self.ledger = Ledger(self.uidx, acl=self.acl, wallet=self.wallet) 47 self.workdir = tempfile.mkdtemp() 48 self.store = LedgerStore(self.db, self.ledger) 49 50 51 def tearDown(self): 52 shutil.rmtree(self.workdir) 53 54 55 def serve(self, srv): 56 srv.start() 57 58 59 def test_disconnect(self): 60 s = str(uuid.uuid4()) 61 srv_path = os.path.join(self.workdir, s) 62 srv = UnixServer(self.store, self.ledger, path=srv_path) 63 th = threading.Thread(target=self.serve, args=(srv,)) 64 th.start() 65 client = UnixClient(path=srv_path) 66 #client.get(b'\x00\x01\x02') 67 client.close() 68 srv.stop() 69 th.join() 70 71 72 def test_socket_entry_get(self): 73 s = 'FOO' 74 x = EntryPart(s, 'income', 'foo', 1337, debit=True) 75 y = EntryPart(s, 'asset', 'foo', 1337) 76 entry = Entry(self.ledger.peek(), datetime.datetime.now(), parent=self.ledger.current()) 77 entry.add_part(x, debit=True) 78 entry.add_part(y) 79 entry.sign(self.wallet) 80 self.store.add_entry(entry, update_ledger=True) 81 82 s = str(uuid.uuid4()) 83 srv_path = os.path.join(self.workdir, s) 84 srv = UnixServer(self.db, self.ledger, path=srv_path) 85 th = threading.Thread(target=self.serve, args=(srv,)) 86 th.start() 87 client = UnixClient(path=srv_path) 88 89 k = pfx_entry(self.ledger, entry) 90 client.get(k) 91 client.close() 92 srv.stop() 93 th.join() 94 95 96 def test_socket_entry_getnotfound(self): 97 s = str(uuid.uuid4()) 98 srv_path = os.path.join(self.workdir, s) 99 srv = UnixServer(self.db, self.ledger, path=srv_path) 100 th = threading.Thread(target=self.serve, args=(srv,)) 101 th.start() 102 client = UnixClient(path=srv_path) 103 104 with self.assertRaises(FileNotFoundError): 105 client.get(hash_of_foo) 106 client.close() 107 srv.stop() 108 th.join() 109 110 111 112 def test_socket_entry_putget(self): 113 s = 'FOO' 114 x = EntryPart(s, 'income', 'foo', 1337, debit=True) 115 y = EntryPart(s, 'asset', 'foo', 1337) 116 entry = Entry(self.ledger.peek(), datetime.datetime.now(), parent=self.ledger.current()) 117 entry.add_part(x, debit=True) 118 entry.add_part(y) 119 120 s = str(uuid.uuid4()) 121 srv_path = os.path.join(self.workdir, s) 122 srv = UnixServer(self.db, self.ledger, path=srv_path) 123 th = threading.Thread(target=self.serve, args=(srv,)) 124 th.start() 125 client = UnixClient(path=srv_path) 126 127 k = pfx_entry(self.ledger, entry) 128 v = entry.wrap(wallet=self.wallet) 129 client.put(k, v) 130 r = client.get(k) 131 client.close() 132 srv.stop() 133 th.join() 134 Entry.unwrap(r, acl=self.acl) 135 136 137 if __name__ == '__main__': 138 unittest.main()