Jianping Wu
6 years ago
4 changed files with 113 additions and 11 deletions
@ -0,0 +1,96 @@ |
|||||||
|
#!/usr/bin/env python3 |
||||||
|
# Copyright (c) 2016-2017 The Bitcoin Core developers |
||||||
|
# Copyright (c) 2018-2019 The Kevacoin Core developers |
||||||
|
# Distributed under the MIT software license, see the accompanying |
||||||
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php. |
||||||
|
"""Test the Key-Value Store.""" |
||||||
|
|
||||||
|
from test_framework.blocktools import witness_script, send_to_witness |
||||||
|
from test_framework.test_framework import BitcoinTestFramework |
||||||
|
from test_framework.util import * |
||||||
|
from test_framework.authproxy import JSONRPCException |
||||||
|
from io import BytesIO |
||||||
|
import re |
||||||
|
|
||||||
|
|
||||||
|
class KevaTest(BitcoinTestFramework): |
||||||
|
def set_test_params(self): |
||||||
|
self.setup_clean_chain = True |
||||||
|
self.num_nodes = 3 |
||||||
|
|
||||||
|
def setup_network(self): |
||||||
|
super().setup_network() |
||||||
|
connect_nodes(self.nodes[0], 2) |
||||||
|
self.sync_all() |
||||||
|
|
||||||
|
def run_test(self): |
||||||
|
self.nodes[0].generate(161) #block 161 |
||||||
|
response = self.nodes[0].keva_namespace('first_namespace') |
||||||
|
namespaceId = response['namespaceId'] |
||||||
|
|
||||||
|
self.log.info("Test basic put and get operations") |
||||||
|
key = 'First Key' |
||||||
|
value = 'This is the first value!' |
||||||
|
self.nodes[0].keva_put(namespaceId, key, value) |
||||||
|
response = self.nodes[0].keva_pending() |
||||||
|
assert(response[0]['op'] == 'keva_namespace') |
||||||
|
assert(response[1]['op'] == 'keva_put') |
||||||
|
response = self.nodes[0].keva_get(namespaceId, key) |
||||||
|
assert(response['value'] == value) |
||||||
|
|
||||||
|
self.nodes[0].generate(1) |
||||||
|
response = self.nodes[0].keva_pending() |
||||||
|
assert(len(response) == 0) |
||||||
|
|
||||||
|
self.log.info("Test batch of put operations without exceeding the mempool chain limit") |
||||||
|
prefix = 'first-set-of-keys-' |
||||||
|
for i in range(24): |
||||||
|
key = prefix + str(i) |
||||||
|
value = ('value-' + str(i) + '-') * 300 |
||||||
|
self.nodes[0].keva_put(namespaceId, key, value) |
||||||
|
|
||||||
|
response = self.nodes[0].keva_pending() |
||||||
|
assert(len(response) == 24) |
||||||
|
|
||||||
|
self.nodes[0].generate(1) |
||||||
|
response = self.nodes[0].keva_pending() |
||||||
|
assert(len(response) == 0) |
||||||
|
|
||||||
|
# This will throw "too-long-mempool-chain" exception |
||||||
|
self.log.info("Test batch of put operations that exceeds the mempool chain limit") |
||||||
|
throwException = False |
||||||
|
secondPrefix = 'second-set-of-keys-' |
||||||
|
try: |
||||||
|
for i in range(30): |
||||||
|
key = secondPrefix + '|' + str(i) |
||||||
|
value = '-value-' * 320 + '|' + str(i) |
||||||
|
self.nodes[0].keva_put(namespaceId, key, value) |
||||||
|
except JSONRPCException: |
||||||
|
throwException = True |
||||||
|
|
||||||
|
assert(throwException) |
||||||
|
|
||||||
|
self.nodes[0].generate(1) |
||||||
|
response = self.nodes[0].keva_pending() |
||||||
|
assert(len(response) == 0) |
||||||
|
|
||||||
|
self.log.info("Verify keva_filter works properly") |
||||||
|
response = self.nodes[0].keva_filter(namespaceId, secondPrefix) |
||||||
|
assert(len(response) == 25) |
||||||
|
|
||||||
|
for i in range(25): |
||||||
|
m = re.search('\|(\d+)', response[i]['key']) |
||||||
|
keyId = m.group(0) |
||||||
|
m = re.search('\|(\d+)', response[i]['value']) |
||||||
|
valueId = m.group(0) |
||||||
|
assert(keyId == valueId) |
||||||
|
|
||||||
|
self.log.info("Test keva_delete") |
||||||
|
keyToDelete = secondPrefix + '|13' |
||||||
|
self.nodes[0].keva_delete(namespaceId, keyToDelete) |
||||||
|
self.nodes[0].generate(1) |
||||||
|
response = self.nodes[0].keva_get(namespaceId, keyToDelete) |
||||||
|
assert(response['value'] == '') |
||||||
|
|
||||||
|
if __name__ == '__main__': |
||||||
|
KevaTest().main() |
Loading…
Reference in new issue