usawa

Signed, immutable accounting.
Info | Log | Files | Refs | Submodules | LICENSE

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()