aboutsummaryrefslogtreecommitdiff
path: root/qa
diff options
context:
space:
mode:
Diffstat (limited to 'qa')
-rwxr-xr-xqa/pull-tester/rpc-tests.sh5
-rwxr-xr-xqa/rpc-tests/conflictedbalance.sh147
-rwxr-xr-xqa/rpc-tests/fundrawtransaction.py37
-rwxr-xr-xqa/rpc-tests/rawtransactions.py1
-rwxr-xr-xqa/rpc-tests/rest.py39
-rwxr-xr-xqa/rpc-tests/send.sh31
-rwxr-xr-xqa/rpc-tests/txn_clone.py4
-rw-r--r--qa/rpc-tests/util.sh103
8 files changed, 46 insertions, 321 deletions
diff --git a/qa/pull-tester/rpc-tests.sh b/qa/pull-tester/rpc-tests.sh
index b282082395..72a282bc00 100755
--- a/qa/pull-tester/rpc-tests.sh
+++ b/qa/pull-tester/rpc-tests.sh
@@ -19,10 +19,8 @@ testScripts=(
'wallet.py'
'listtransactions.py'
'mempool_resurrect_test.py'
- 'txn_doublespend.py'
'txn_doublespend.py --mineblock'
'txn_clone.py'
- 'txn_clone.py --mineblock'
'getchaintips.py'
'rawtransactions.py'
'rest.py'
@@ -44,6 +42,8 @@ testScriptsExt=(
'bipdersig.py'
'getblocktemplate_longpoll.py'
'getblocktemplate_proposals.py'
+ 'txn_doublespend.py'
+ 'txn_clone.py --mineblock'
'pruning.py'
'forknotify.py'
'invalidateblock.py'
@@ -54,7 +54,6 @@ testScriptsExt=(
'smartfees.py'
'maxblocksinflight.py'
'invalidblockrequest.py'
- 'rawtransactions.py'
# 'forknotify.py'
'p2p-acceptblock.py'
);
diff --git a/qa/rpc-tests/conflictedbalance.sh b/qa/rpc-tests/conflictedbalance.sh
deleted file mode 100755
index 7e44097374..0000000000
--- a/qa/rpc-tests/conflictedbalance.sh
+++ /dev/null
@@ -1,147 +0,0 @@
-#!/usr/bin/env bash
-# Copyright (c) 2014 The Bitcoin Core developers
-# Distributed under the MIT software license, see the accompanying
-# file COPYING or http://www.opensource.org/licenses/mit-license.php.
-
-# Test marking of spent outputs
-
-# Create a transaction graph with four transactions,
-# A/B/C/D
-# C spends A
-# D spends B and C
-
-# Then simulate C being mutated, to create C'
-# that is mined.
-# A is still (correctly) considered spent.
-# B should be treated as unspent
-
-if [ $# -lt 1 ]; then
- echo "Usage: $0 path_to_binaries"
- echo "e.g. $0 ../../src"
- echo "Env vars BITCOIND and BITCOINCLI may be used to specify the exact binaries used"
- exit 1
-fi
-
-set -f
-
-BITCOIND=${BITCOIND:-${1}/bitcoind}
-CLI=${BITCOINCLI:-${1}/bitcoin-cli}
-
-DIR="${BASH_SOURCE%/*}"
-SENDANDWAIT="${DIR}/send.sh"
-if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi
-. "$DIR/util.sh"
-
-D=$(mktemp -d test.XXXXX)
-
-# Two nodes; one will play the part of merchant, the
-# other an evil transaction-mutating miner.
-
-D1=${D}/node1
-CreateDataDir $D1 port=11000 rpcport=11001
-B1ARGS="-datadir=$D1 -debug=mempool"
-$BITCOIND $B1ARGS &
-B1PID=$!
-
-D2=${D}/node2
-CreateDataDir $D2 port=11010 rpcport=11011
-B2ARGS="-datadir=$D2 -debug=mempool"
-$BITCOIND $B2ARGS &
-B2PID=$!
-
-# Wait until both nodes are at the same block number
-function WaitBlocks {
- while :
- do
- sleep 1
- declare -i BLOCKS1=$( GetBlocks $B1ARGS )
- declare -i BLOCKS2=$( GetBlocks $B2ARGS )
- if (( BLOCKS1 == BLOCKS2 ))
- then
- break
- fi
- done
-}
-
-# Wait until node has $N peers
-function WaitPeers {
- while :
- do
- declare -i PEERS=$( $CLI $1 getconnectioncount )
- if (( PEERS == "$2" ))
- then
- break
- fi
- sleep 1
- done
-}
-
-echo "Generating test blockchain..."
-
-# Start with B2 connected to B1:
-$CLI $B2ARGS addnode 127.0.0.1:11000 onetry
-WaitPeers "$B1ARGS" 1
-
-# 2 block, 50 XBT each == 100 XBT
-# These will be transactions "A" and "B"
-$CLI $B1ARGS generate 2
-
-WaitBlocks
-# 100 blocks, 0 mature == 0 XBT
-$CLI $B2ARGS generate 100
-WaitBlocks
-
-CheckBalance "$B1ARGS" 100
-CheckBalance "$B2ARGS" 0
-
-# restart B2 with no connection
-$CLI $B2ARGS stop > /dev/null 2>&1
-wait $B2PID
-$BITCOIND $B2ARGS &
-B2PID=$!
-
-B1ADDRESS=$( $CLI $B1ARGS getnewaddress )
-B2ADDRESS=$( $CLI $B2ARGS getnewaddress )
-
-# Transaction C: send-to-self, spend A
-TXID_C=$( $CLI $B1ARGS sendtoaddress $B1ADDRESS 50.0)
-
-# Transaction D: spends B and C
-TXID_D=$( $CLI $B1ARGS sendtoaddress $B2ADDRESS 100.0)
-
-CheckBalance "$B1ARGS" 0
-
-# Mutate TXID_C and add it to B2's memory pool:
-RAWTX_C=$( $CLI $B1ARGS getrawtransaction $TXID_C )
-
-# ... mutate C to create C'
-L=${RAWTX_C:82:2}
-NEWLEN=$( printf "%x" $(( 16#$L + 1 )) )
-MUTATEDTX_C=${RAWTX_C:0:82}${NEWLEN}4c${RAWTX_C:84}
-# ... give mutated tx1 to B2:
-MUTATEDTXID=$( $CLI $B2ARGS sendrawtransaction $MUTATEDTX_C )
-
-echo "TXID_C: " $TXID_C
-echo "Mutated: " $MUTATEDTXID
-
-# Re-connect nodes, and have both nodes mine some blocks:
-$CLI $B2ARGS addnode 127.0.0.1:11000 onetry
-WaitPeers "$B1ARGS" 1
-
-# Having B2 mine the next block puts the mutated
-# transaction C in the chain:
-$CLI $B2ARGS generate 1
-WaitBlocks
-
-# B1 should still be able to spend 100, because D is conflicted
-# so does not count as a spend of B
-CheckBalance "$B1ARGS" 100
-
-$CLI $B2ARGS stop > /dev/null 2>&1
-wait $B2PID
-$CLI $B1ARGS stop > /dev/null 2>&1
-wait $B1PID
-
-echo "Tests successful, cleaning up"
-rm -rf $D
-exit 0
diff --git a/qa/rpc-tests/fundrawtransaction.py b/qa/rpc-tests/fundrawtransaction.py
index e859b26433..80f1d1e128 100755
--- a/qa/rpc-tests/fundrawtransaction.py
+++ b/qa/rpc-tests/fundrawtransaction.py
@@ -30,6 +30,7 @@ class RawTransactionsTest(BitcoinTestFramework):
feeTolerance = Decimal(0.00000002) #if the fee's positive delta is higher than this value tests will fail, neg. delta always fail the tests
self.nodes[2].generate(1)
+ self.sync_all()
self.nodes[0].generate(101)
self.sync_all()
self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(),1.5);
@@ -46,17 +47,10 @@ class RawTransactionsTest(BitcoinTestFramework):
outputs = { self.nodes[0].getnewaddress() : 1.0 }
rawtx = self.nodes[2].createrawtransaction(inputs, outputs)
dec_tx = self.nodes[2].decoderawtransaction(rawtx)
-
rawtxfund = self.nodes[2].fundrawtransaction(rawtx)
fee = rawtxfund['fee']
dec_tx = self.nodes[2].decoderawtransaction(rawtxfund['hex'])
- totalOut = 0
- for out in dec_tx['vout']:
- totalOut += out['value']
-
- assert_equal(len(dec_tx['vin']), 1) #one vin coin
- assert_equal(dec_tx['vin'][0]['scriptSig']['hex'], '')
- assert_equal(fee + totalOut, 1.5) #the 1.5BTC coin must be taken
+ assert_equal(len(dec_tx['vin']) > 0, True) #test if we have enought inputs
##############################
# simple test with two coins #
@@ -69,14 +63,7 @@ class RawTransactionsTest(BitcoinTestFramework):
rawtxfund = self.nodes[2].fundrawtransaction(rawtx)
fee = rawtxfund['fee']
dec_tx = self.nodes[2].decoderawtransaction(rawtxfund['hex'])
- totalOut = 0
- for out in dec_tx['vout']:
- totalOut += out['value']
-
- assert_equal(len(dec_tx['vin']), 2) #one vin coin
- assert_equal(dec_tx['vin'][0]['scriptSig']['hex'], '')
- assert_equal(dec_tx['vin'][1]['scriptSig']['hex'], '')
- assert_equal(fee + totalOut, 2.5) #the 1.5BTC+1.0BTC coins must have be taken
+ assert_equal(len(dec_tx['vin']) > 0, True) #test if we have enough inputs
##############################
# simple test with two coins #
@@ -89,13 +76,8 @@ class RawTransactionsTest(BitcoinTestFramework):
rawtxfund = self.nodes[2].fundrawtransaction(rawtx)
fee = rawtxfund['fee']
dec_tx = self.nodes[2].decoderawtransaction(rawtxfund['hex'])
- totalOut = 0
- for out in dec_tx['vout']:
- totalOut += out['value']
-
- assert_equal(len(dec_tx['vin']), 1) #one vin coin
+ assert_equal(len(dec_tx['vin']) > 0, True)
assert_equal(dec_tx['vin'][0]['scriptSig']['hex'], '')
- assert_equal(fee + totalOut, 5.0) #the 5.0BTC coin must have be taken
################################
@@ -113,11 +95,8 @@ class RawTransactionsTest(BitcoinTestFramework):
for out in dec_tx['vout']:
totalOut += out['value']
- assert_equal(len(dec_tx['vin']), 2) #one vin coin
+ assert_equal(len(dec_tx['vin']) > 0, True)
assert_equal(dec_tx['vin'][0]['scriptSig']['hex'], '')
- assert_equal(dec_tx['vin'][1]['scriptSig']['hex'], '')
- assert_equal(fee + totalOut, 6.0) #the 5.0BTC + 1.0BTC coins must have be taken
-
#########################################################################
@@ -220,8 +199,6 @@ class RawTransactionsTest(BitcoinTestFramework):
assert_equal(matchingOuts, 1)
assert_equal(len(dec_tx['vout']), 2)
- assert_equal(fee + totalOut, 2.5) #this tx must use the 1.0BTC and the 1.5BTC coin
-
###########################################
# test a fundrawtransaction with two VINs #
@@ -264,8 +241,6 @@ class RawTransactionsTest(BitcoinTestFramework):
matchingIns+=1
assert_equal(matchingIns, 2) #we now must see two vins identical to vins given as params
- assert_equal(fee + totalOut, 7.5) #this tx must use the 1.0BTC and the 1.5BTC coin
-
#########################################################
# test a fundrawtransaction with two VINs and two vOUTs #
@@ -300,8 +275,6 @@ class RawTransactionsTest(BitcoinTestFramework):
assert_equal(matchingOuts, 2)
assert_equal(len(dec_tx['vout']), 3)
- assert_equal(fee + totalOut, 7.5) #this tx must use the 1.0BTC and the 1.5BTC coin
-
##############################################
# test a fundrawtransaction with invalid vin #
diff --git a/qa/rpc-tests/rawtransactions.py b/qa/rpc-tests/rawtransactions.py
index 1378514c84..173faf736e 100755
--- a/qa/rpc-tests/rawtransactions.py
+++ b/qa/rpc-tests/rawtransactions.py
@@ -40,6 +40,7 @@ class RawTransactionsTest(BitcoinTestFramework):
#prepare some coins for multiple *rawtransaction commands
self.nodes[2].generate(1)
+ self.sync_all()
self.nodes[0].generate(101)
self.sync_all()
self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(),1.5);
diff --git a/qa/rpc-tests/rest.py b/qa/rpc-tests/rest.py
index 6c51b2fcd9..1a2d326cc3 100755
--- a/qa/rpc-tests/rest.py
+++ b/qa/rpc-tests/rest.py
@@ -235,12 +235,43 @@ class RESTTest (BitcoinTestFramework):
assert_equal(response_header_str.encode("hex")[0:160], response_header_hex_str[0:160])
# check json format
- json_string = http_get_call(url.hostname, url.port, '/rest/block/'+bb_hash+self.FORMAT_SEPARATOR+'json')
- json_obj = json.loads(json_string)
- assert_equal(json_obj['hash'], bb_hash)
+ block_json_string = http_get_call(url.hostname, url.port, '/rest/block/'+bb_hash+self.FORMAT_SEPARATOR+'json')
+ block_json_obj = json.loads(block_json_string)
+ assert_equal(block_json_obj['hash'], bb_hash)
+
+ # compare with json block header
+ response_header_json = http_get_call(url.hostname, url.port, '/rest/headers/1/'+bb_hash+self.FORMAT_SEPARATOR+"json", "", True)
+ assert_equal(response_header_json.status, 200)
+ response_header_json_str = response_header_json.read()
+ json_obj = json.loads(response_header_json_str)
+ assert_equal(len(json_obj), 1) #ensure that there is one header in the json response
+ assert_equal(json_obj[0]['hash'], bb_hash) #request/response hash should be the same
+
+ #compare with normal RPC block response
+ rpc_block_json = self.nodes[0].getblock(bb_hash)
+ assert_equal(json_obj[0]['hash'], rpc_block_json['hash'])
+ assert_equal(json_obj[0]['confirmations'], rpc_block_json['confirmations'])
+ assert_equal(json_obj[0]['height'], rpc_block_json['height'])
+ assert_equal(json_obj[0]['version'], rpc_block_json['version'])
+ assert_equal(json_obj[0]['merkleroot'], rpc_block_json['merkleroot'])
+ assert_equal(json_obj[0]['time'], rpc_block_json['time'])
+ assert_equal(json_obj[0]['nonce'], rpc_block_json['nonce'])
+ assert_equal(json_obj[0]['bits'], rpc_block_json['bits'])
+ assert_equal(json_obj[0]['difficulty'], rpc_block_json['difficulty'])
+ assert_equal(json_obj[0]['chainwork'], rpc_block_json['chainwork'])
+ assert_equal(json_obj[0]['previousblockhash'], rpc_block_json['previousblockhash'])
+
+ #see if we can get 5 headers in one response
+ self.nodes[1].generate(5)
+ self.sync_all()
+ response_header_json = http_get_call(url.hostname, url.port, '/rest/headers/5/'+bb_hash+self.FORMAT_SEPARATOR+"json", "", True)
+ assert_equal(response_header_json.status, 200)
+ response_header_json_str = response_header_json.read()
+ json_obj = json.loads(response_header_json_str)
+ assert_equal(len(json_obj), 5) #now we should have 5 header objects
# do tx test
- tx_hash = json_obj['tx'][0]['txid'];
+ tx_hash = block_json_obj['tx'][0]['txid'];
json_string = http_get_call(url.hostname, url.port, '/rest/tx/'+tx_hash+self.FORMAT_SEPARATOR+"json")
json_obj = json.loads(json_string)
assert_equal(json_obj['txid'], tx_hash)
diff --git a/qa/rpc-tests/send.sh b/qa/rpc-tests/send.sh
deleted file mode 100755
index 2d54cc6ded..0000000000
--- a/qa/rpc-tests/send.sh
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/bin/bash
-# Copyright (c) 2014 The Bitcoin Core developers
-# Distributed under the MIT software license, see the accompanying
-# file COPYING or http://www.opensource.org/licenses/mit-license.php.
-TIMEOUT=10
-SIGNAL=HUP
-PIDFILE=.send.pid
-if [ $# -eq 0 ]; then
- echo -e "Usage:\t$0 <cmd>"
- echo -e "\tRuns <cmd> and wait ${TIMEOUT} seconds or until SIG${SIGNAL} is received."
- echo -e "\tReturns: 0 if SIG${SIGNAL} is received, 1 otherwise."
- echo -e "Or:\t$0 -STOP"
- echo -e "\tsends SIG${SIGNAL} to running send.sh"
- exit 0
-fi
-
-if [ $1 = "-STOP" ]; then
- if [ -s ${PIDFILE} ]; then
- kill -s ${SIGNAL} $(<$PIDFILE 2>/dev/null) 2>/dev/null
- fi
- exit 0
-fi
-
-trap '[[ ${PID} ]] && kill ${PID}' ${SIGNAL}
-trap 'rm -f ${PIDFILE}' EXIT
-echo $$ > ${PIDFILE}
-"$@"
-sleep ${TIMEOUT} & PID=$!
-wait ${PID} && exit 1
-
-exit 0
diff --git a/qa/rpc-tests/txn_clone.py b/qa/rpc-tests/txn_clone.py
index 0d276ecc91..e8ced0e5bb 100755
--- a/qa/rpc-tests/txn_clone.py
+++ b/qa/rpc-tests/txn_clone.py
@@ -125,6 +125,8 @@ class TxnMallTest(BitcoinTestFramework):
# Reconnect the split network, and sync chain:
connect_nodes(self.nodes[1], 2)
+ self.nodes[2].sendrawtransaction(fund_bar_tx["hex"])
+ self.nodes[2].sendrawtransaction(tx2["hex"])
self.nodes[2].generate(1) # Mine another block to make sure we sync
sync_blocks(self.nodes)
@@ -136,7 +138,7 @@ class TxnMallTest(BitcoinTestFramework):
# Verify expected confirmations
assert_equal(tx1["confirmations"], -1)
assert_equal(tx1_clone["confirmations"], 2)
- assert_equal(tx2["confirmations"], 0)
+ assert_equal(tx2["confirmations"], 1)
# Check node0's total balance; should be same as before the clone, + 100 BTC for 2 matured,
# less possible orphaned matured subsidy
diff --git a/qa/rpc-tests/util.sh b/qa/rpc-tests/util.sh
deleted file mode 100644
index c2b7004308..0000000000
--- a/qa/rpc-tests/util.sh
+++ /dev/null
@@ -1,103 +0,0 @@
-#!/usr/bin/env bash
-# Copyright (c) 2014 The Bitcoin Core developers
-# Distributed under the MIT software license, see the accompanying
-# file COPYING or http://www.opensource.org/licenses/mit-license.php.
-
-# Functions used by more than one test
-
-function echoerr {
- echo "$@" 1>&2;
-}
-
-# Usage: ExtractKey <key> "<json_object_string>"
-# Warning: this will only work for the very-well-behaved
-# JSON produced by bitcoind, do NOT use it to try to
-# parse arbitrary/nested/etc JSON.
-function ExtractKey {
- echo $2 | tr -d ' "{}\n' | awk -v RS=',' -F: "\$1 ~ /$1/ { print \$2}"
-}
-
-function CreateDataDir {
- DIR=$1
- mkdir -p $DIR
- CONF=$DIR/bitcoin.conf
- echo "regtest=1" >> $CONF
- echo "keypool=2" >> $CONF
- echo "rpcuser=rt" >> $CONF
- echo "rpcpassword=rt" >> $CONF
- echo "rpcwait=1" >> $CONF
- echo "walletnotify=${SENDANDWAIT} -STOP" >> $CONF
- shift
- while (( "$#" )); do
- echo $1 >> $CONF
- shift
- done
-}
-
-function AssertEqual {
- if (( $( echo "$1 == $2" | bc ) == 0 ))
- then
- echoerr "AssertEqual: $1 != $2"
- declare -f CleanUp > /dev/null 2>&1
- if [[ $? -eq 0 ]] ; then
- CleanUp
- fi
- exit 1
- fi
-}
-
-# CheckBalance -datadir=... amount account minconf
-function CheckBalance {
- declare -i EXPECT="$2"
- B=$( $CLI $1 getbalance $3 $4 )
- if (( $( echo "$B == $EXPECT" | bc ) == 0 ))
- then
- echoerr "bad balance: $B (expected $2)"
- declare -f CleanUp > /dev/null 2>&1
- if [[ $? -eq 0 ]] ; then
- CleanUp
- fi
- exit 1
- fi
-}
-
-# Use: Address <datadir> [account]
-function Address {
- $CLI $1 getnewaddress $2
-}
-
-# Send from to amount
-function Send {
- from=$1
- to=$2
- amount=$3
- address=$(Address $to)
- txid=$( ${SENDANDWAIT} $CLI $from sendtoaddress $address $amount )
-}
-
-# Use: Unspent <datadir> <n'th-last-unspent> <var>
-function Unspent {
- local r=$( $CLI $1 listunspent | awk -F'[ |:,"]+' "\$2 ~ /$3/ { print \$3 }" | tail -n $2 | head -n 1)
- echo $r
-}
-
-# Use: CreateTxn1 <datadir> <n'th-last-unspent> <destaddress>
-# produces hex from signrawtransaction
-function CreateTxn1 {
- TXID=$(Unspent $1 $2 txid)
- AMOUNT=$(Unspent $1 $2 amount)
- VOUT=$(Unspent $1 $2 vout)
- RAWTXN=$( $CLI $1 createrawtransaction "[{\"txid\":\"$TXID\",\"vout\":$VOUT}]" "{\"$3\":$AMOUNT}")
- ExtractKey hex "$( $CLI $1 signrawtransaction $RAWTXN )"
-}
-
-# Use: SendRawTxn <datadir> <hex_txn_data>
-function SendRawTxn {
- ${SENDANDWAIT} $CLI $1 sendrawtransaction $2
-}
-
-# Use: GetBlocks <datadir>
-# returns number of blocks from getinfo
-function GetBlocks {
- $CLI $1 getblockcount
-}