mirror of
https://github.com/aljazceru/plugins.git
synced 2025-12-19 14:14:20 +01:00
datastore: change keys into an array.
We store this internally as hex, since shelve insists on string keys. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
committed by
Christian Decker
parent
2ec769e05b
commit
0b9e6c9517
@@ -1,12 +1,14 @@
|
||||
import os
|
||||
import shelve
|
||||
import time
|
||||
import pytest
|
||||
from pyln.testing.fixtures import * # noqa: F401,F403
|
||||
from pyln.client import RpcError
|
||||
from pyln.testing.utils import only_one, wait_for
|
||||
|
||||
plugin_path = os.path.join(os.path.dirname(__file__), "datastore.py")
|
||||
|
||||
|
||||
# Test taken from lightning/tests/test_misc.py
|
||||
def test_datastore(node_factory):
|
||||
l1 = node_factory.get_node(options={'plugin': plugin_path})
|
||||
@@ -18,7 +20,7 @@ def test_datastore(node_factory):
|
||||
|
||||
# Add entries.
|
||||
somedata = b'somedata'.hex()
|
||||
somedata_expect = {'key': 'somekey',
|
||||
somedata_expect = {'key': ['somekey'],
|
||||
'generation': 0,
|
||||
'hex': somedata,
|
||||
'string': 'somedata'}
|
||||
@@ -56,7 +58,7 @@ def test_datastore(node_factory):
|
||||
l1.rpc.datastore(key='otherkey', hex=somedata, mode="must-append")
|
||||
|
||||
otherdata = b'otherdata'.hex()
|
||||
otherdata_expect = {'key': 'otherkey',
|
||||
otherdata_expect = {'key': ['otherkey'],
|
||||
'generation': 0,
|
||||
'hex': otherdata,
|
||||
'string': 'otherdata'}
|
||||
@@ -79,7 +81,7 @@ def test_datastore(node_factory):
|
||||
assert l1.rpc.listdatastore() == {'datastore': [otherdata_expect]}
|
||||
|
||||
# if it's not a string, won't print
|
||||
badstring_expect = {'key': 'badstring',
|
||||
badstring_expect = {'key': ['badstring'],
|
||||
'generation': 0,
|
||||
'hex': '00'}
|
||||
assert l1.rpc.datastore(key='badstring', hex='00') == badstring_expect
|
||||
@@ -136,19 +138,74 @@ def test_upgrade(node_factory):
|
||||
'datastore.dat')))
|
||||
|
||||
vals = l1.rpc.listdatastore()['datastore']
|
||||
assert (vals == [{'key': 'foo',
|
||||
'generation': 0,
|
||||
'hex': b'foodata'.hex(),
|
||||
'string': 'foodata'},
|
||||
{'key': 'bar',
|
||||
'generation': 0,
|
||||
'hex': b'bardata'.hex(),
|
||||
'string': 'bardata'}]
|
||||
or vals == [{'key': 'bar',
|
||||
'generation': 0,
|
||||
'hex': b'bardata'.hex(),
|
||||
'string': 'bardata'},
|
||||
{'key': 'foo',
|
||||
'generation': 0,
|
||||
'hex': b'foodata'.hex(),
|
||||
'string': 'foodata'}])
|
||||
assert vals == [{'key': ['bar'],
|
||||
'generation': 0,
|
||||
'hex': b'bardata'.hex(),
|
||||
'string': 'bardata'},
|
||||
{'key': ['foo'],
|
||||
'generation': 0,
|
||||
'hex': b'foodata'.hex(),
|
||||
'string': 'foodata'}]
|
||||
|
||||
|
||||
def test_datastore_keylist(node_factory):
|
||||
l1 = node_factory.get_node(options={'plugin': plugin_path})
|
||||
time.sleep(5)
|
||||
|
||||
# Starts empty
|
||||
assert l1.rpc.listdatastore() == {'datastore': []}
|
||||
assert l1.rpc.listdatastore(['a']) == {'datastore': []}
|
||||
assert l1.rpc.listdatastore(['a', 'b']) == {'datastore': []}
|
||||
|
||||
# Cannot add child to existing!
|
||||
l1.rpc.datastore(key='a', string='aval')
|
||||
with pytest.raises(RpcError, match='1206.*Parent key \[a\] exists'):
|
||||
l1.rpc.datastore(key=['a', 'b'], string='abval',
|
||||
mode='create-or-replace')
|
||||
# Listing subkey gives DNE.
|
||||
assert l1.rpc.listdatastore(['a', 'b']) == {'datastore': []}
|
||||
l1.rpc.deldatastore(key=['a'])
|
||||
|
||||
# Create child key.
|
||||
l1.rpc.datastore(key=['a', 'b'], string='abval')
|
||||
assert l1.rpc.listdatastore() == {'datastore': [{'key': ['a']}]}
|
||||
assert l1.rpc.listdatastore(key=['a']) == {'datastore': [{'key': ['a', 'b'],
|
||||
'generation': 0,
|
||||
'string': 'abval',
|
||||
'hex': b'abval'.hex()}]}
|
||||
|
||||
# Cannot create key over that
|
||||
with pytest.raises(RpcError, match='has children'):
|
||||
l1.rpc.datastore(key='a', string='aval', mode='create-or-replace')
|
||||
|
||||
# Can create another key.
|
||||
l1.rpc.datastore(key=['a', 'b2'], string='ab2val')
|
||||
assert l1.rpc.listdatastore() == {'datastore': [{'key': ['a']}]}
|
||||
assert l1.rpc.listdatastore(key=['a']) == {'datastore': [{'key': ['a', 'b'],
|
||||
'string': 'abval',
|
||||
'generation': 0,
|
||||
'hex': b'abval'.hex()},
|
||||
{'key': ['a', 'b2'],
|
||||
'string': 'ab2val',
|
||||
'generation': 0,
|
||||
'hex': b'ab2val'.hex()}]}
|
||||
|
||||
# Can create subkey.
|
||||
l1.rpc.datastore(key=['a', 'b3', 'c'], string='ab2val')
|
||||
assert l1.rpc.listdatastore() == {'datastore': [{'key': ['a']}]}
|
||||
assert l1.rpc.listdatastore(key=['a']) == {'datastore': [{'key': ['a', 'b'],
|
||||
'string': 'abval',
|
||||
'generation': 0,
|
||||
'hex': b'abval'.hex()},
|
||||
{'key': ['a', 'b2'],
|
||||
'string': 'ab2val',
|
||||
'generation': 0,
|
||||
'hex': b'ab2val'.hex()},
|
||||
{'key': ['a', 'b3']}]}
|
||||
|
||||
# Can update subkey
|
||||
l1.rpc.datastore(key=['a', 'b3', 'c'], string='2', mode='must-append')
|
||||
assert l1.rpc.listdatastore(key=['a', 'b3', 'c']) == {'datastore': [{'key': ['a', 'b3', 'c'],
|
||||
'string': 'ab2val2',
|
||||
'generation': 1,
|
||||
'hex': b'ab2val2'.hex()}]}
|
||||
|
||||
Reference in New Issue
Block a user