Browse Source

Added block disconnecting test cases for keva.

cn
Jianping Wu 6 years ago
parent
commit
1e187fea9d
  1. 2
      src/keva/main.cpp
  2. 34
      src/wallet/rpckeva.cpp
  3. 36
      test/functional/feature_keva.py

2
src/keva/main.cpp

@ -293,7 +293,7 @@ CheckKevaTransaction (const CTransaction& tx, unsigned nHeight,
return true; return true;
} }
assert(tx.IsKevacoin ()); assert(tx.IsKevacoin());
if (nameOut == -1) { if (nameOut == -1) {
return state.Invalid (error ("%s: Kevacoin tx %s has no keva outputs", __func__, txid)); return state.Invalid (error ("%s: Kevacoin tx %s has no keva outputs", __func__, txid));
} }

34
src/wallet/rpckeva.cpp

@ -120,7 +120,7 @@ UniValue keva_list_namespaces(const JSONRPCRequest& request)
"\nArguments:\n" "\nArguments:\n"
"\nResult:\n" "\nResult:\n"
"[\n" "[\n"
" xxxxx: display_name (string) namespace id : (string) display name\n" " { namespaceId: <namespce Id>, displayName: <display name> }\n"
" ...\n" " ...\n"
"]\n" "]\n"
"\nExamples:\n" "\nExamples:\n"
@ -133,28 +133,26 @@ UniValue keva_list_namespaces(const JSONRPCRequest& request)
std::map<std::string, std::string> mapObjects; std::map<std::string, std::string> mapObjects;
{ {
LOCK2 (cs_main, pwallet->cs_wallet); LOCK2 (cs_main, pwallet->cs_wallet);
for (const auto& item : pwallet->mapWallet) for (const auto& item : pwallet->mapWallet) {
{
const CWalletTx& tx = item.second; const CWalletTx& tx = item.second;
if (!tx.tx->IsKevacoin ()) if (!tx.tx->IsKevacoin()) {
continue; continue;
}
CKevaScript kevaOp; CKevaScript kevaOp;
int nOut = -1; int nOut = -1;
for (unsigned i = 0; i < tx.tx->vout.size(); ++i) for (unsigned i = 0; i < tx.tx->vout.size(); ++i) {
{ const CKevaScript cur(tx.tx->vout[i].scriptPubKey);
const CKevaScript cur(tx.tx->vout[i].scriptPubKey); if (cur.isKevaOp()) {
if (cur.isKevaOp ()) if (nOut != -1) {
{ LogPrintf ("ERROR: wallet contains tx with multiple name outputs");
if (nOut != -1) { } else {
LogPrintf ("ERROR: wallet contains tx with multiple name outputs"); kevaOp = cur;
} else { nOut = i;
kevaOp = cur; }
nOut = i;
}
}
} }
}
if (nOut == -1) { if (nOut == -1) {
continue; continue;
@ -172,7 +170,7 @@ UniValue keva_list_namespaces(const JSONRPCRequest& request)
continue; continue;
} }
const bool mine = IsMine(*pwallet, kevaOp.getAddress ()); const bool mine = IsMine(*pwallet, kevaOp.getAddress());
CKevaData data; CKevaData data;
if (mine && pcoinsTip->GetNamespace(nameSpace, data)) { if (mine && pcoinsTip->GetNamespace(nameSpace, data)) {
std::string displayName = ValtypeToString(data.getValue()); std::string displayName = ValtypeToString(data.getValue());

36
test/functional/feature_keva.py

@ -38,22 +38,42 @@ class KevaTest(BitcoinTestFramework):
assert(len(response) == 2) assert(len(response) == 2)
self.sync_all() self.sync_all()
def run_test_disconnect_block(self, namespaceId): def run_test_disconnect_block(self):
displayName = 'namespace_to_test'
response = self.nodes[0].keva_namespace(displayName)
namespaceId = response['namespaceId']
self.nodes[0].generate(1)
key = 'This is the test key' key = 'This is the test key'
value = 'This is the test value' value1 = 'This is the test value 1'
self.nodes[0].keva_put(namespaceId, key, value) value2 = 'This is the test value 1'
self.nodes[0].keva_put(namespaceId, key, value1)
self.nodes[0].generate(1) self.nodes[0].generate(1)
response = self.nodes[0].keva_get(namespaceId, key) response = self.nodes[0].keva_get(namespaceId, key)
assert(response['value'] == value) assert(response['value'] == value1)
self.nodes[0].keva_put(namespaceId, key, value2)
self.nodes[0].generate(1)
response = self.nodes[0].keva_get(namespaceId, key)
assert(response['value'] == value2)
# Disconnect the block # Disconnect the block
self.sync_all() self.sync_all()
self.nodes[0].invalidateblock(self.nodes[0].getbestblockhash()) self.nodes[0].invalidateblock(self.nodes[0].getbestblockhash())
self.nodes[1].invalidateblock(self.nodes[1].getbestblockhash()) self.nodes[1].invalidateblock(self.nodes[1].getbestblockhash())
self.sync_all() self.sync_all()
response = self.nodes[0].keva_get(namespaceId, key) response = self.nodes[0].keva_get(namespaceId, key)
assert(response['value'] == value1)
# Disconnect the block again
self.sync_all()
self.nodes[0].invalidateblock(self.nodes[0].getbestblockhash())
self.nodes[1].invalidateblock(self.nodes[1].getbestblockhash())
self.sync_all()
response = self.nodes[0].keva_get(namespaceId, key)
assert(response['value'] == '') assert(response['value'] == '')
response = self.nodes[0].keva_get(namespaceId, '_KEVA_NS_')
assert(response['value'] == displayName)
self.log.info("Test undeleting after disconnecting blocks") self.log.info("Test undeleting after disconnecting blocks")
self.nodes[0].generate(1)
keyToDelete = 'This is the test key to delete' keyToDelete = 'This is the test key to delete'
valueToDelete = 'This is the test value of the key' valueToDelete = 'This is the test value of the key'
self.nodes[0].keva_put(namespaceId, keyToDelete, valueToDelete) self.nodes[0].keva_put(namespaceId, keyToDelete, valueToDelete)
@ -81,7 +101,6 @@ class KevaTest(BitcoinTestFramework):
self.nodes[0].generate(1) self.nodes[0].generate(1)
response = self.nodes[0].keva_list_namespaces() response = self.nodes[0].keva_list_namespaces()
found = False found = False
print(response)
for ns in response: for ns in response:
if (ns['namespaceId'] == newNamespaceId): if (ns['namespaceId'] == newNamespaceId):
found = True found = True
@ -91,6 +110,11 @@ class KevaTest(BitcoinTestFramework):
self.nodes[0].invalidateblock(self.nodes[0].getbestblockhash()) self.nodes[0].invalidateblock(self.nodes[0].getbestblockhash())
self.nodes[1].invalidateblock(self.nodes[1].getbestblockhash()) self.nodes[1].invalidateblock(self.nodes[1].getbestblockhash())
self.sync_all() self.sync_all()
# The namespace display name should not be set.
response = self.nodes[0].keva_get(newNamespaceId, '_KEVA_NS_')
assert(response['value'] == '')
# The namespace should not appear in the result of keva_list_namespaces
response = self.nodes[0].keva_list_namespaces()
found = False found = False
for ns in response: for ns in response:
if (ns['namespaceId'] == newNamespaceId): if (ns['namespaceId'] == newNamespaceId):
@ -179,7 +203,7 @@ class KevaTest(BitcoinTestFramework):
assert(response['value'] == newValue) assert(response['value'] == newValue)
self.log.info("Test disconnecting blocks") self.log.info("Test disconnecting blocks")
self.run_test_disconnect_block(namespaceId) self.run_test_disconnect_block()
if __name__ == '__main__': if __name__ == '__main__':

Loading…
Cancel
Save