Browse Source
pull/4/head45bfa13
PARTIAL: typofixes (found by misspell_fixer) (Veres Lajos)21c406e
add support for miniupnpc api version 14 (Pavel Vasin)13bd5a7
rpc-tests: re-enable rpc-tests for Windows (Cory Fields)ccc4ad6
net: Set SO_REUSEADDR for Windows too (Cory Fields)1f6772e
add unit test for CNetAddr::GetGroup. (Alex Morcos)13642a5
Fix masking of irrelevant bits in address groups. (Alex Morcos)6b51b9b
Replace boost::reverse_lock with our own. (Casey Rodarmor)626c5e6
Make sure we re-acquire lock if a task throws (Casey Rodarmor)4877053
Add missing files to files.md (fanquake)f171fee
Handle leveldb::DestroyDB() errors on wipe failure (Adam Weiss)c5b89fe
Fix race condition on test node shutdown (Casey Rodarmor)4a37410
Handle no chain tip available in InvalidChainFound() (Ross Nicoll)f6d29a6
Use unique name for AlertNotify tempfile (Casey Rodarmor)e6adac7
Delay initial pruning until after wallet init (Adam Weiss)e0020d4
Make sure LogPrint strings are line-terminated (J Ross Nicoll)7ff9d12
Make sure LogPrintf strings are line-terminated (Wladimir J. van der Laan)5a39133
build: fix libressl detection (Cory Fields)f6355e6
Avoid leaking file descriptors in RegisterLoad (Casey Rodarmor)60457d3
locking: fix a few small issues uncovered by -Wthread-safety (Cory Fields)a496e11
Remove bash test note from rpc-tests readme (fanquake)49c6a64
tests: Remove old sh-based test framework (Wladimir J. van der Laan)a37567d
Add autogen.sh to source tarball. (randy-waterhouse)1f4d7cf
travis: for travis generating an extra build (Cory Fields)
![laanwj@gmail.com](/assets/img/avatar_default.png)
40 changed files with 268 additions and 398 deletions
@ -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 |
@ -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 |
@ -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 |
|||
} |
@ -0,0 +1,31 @@ |
|||
// Copyright (c) 2015 The Bitcoin Core developers
|
|||
// Distributed under the MIT software license, see the accompanying
|
|||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|||
|
|||
#ifndef BITCOIN_REVERSELOCK_H |
|||
#define BITCOIN_REVERSELOCK_H |
|||
|
|||
/**
|
|||
* An RAII-style reverse lock. Unlocks on construction and locks on destruction. |
|||
*/ |
|||
template<typename Lock> |
|||
class reverse_lock |
|||
{ |
|||
public: |
|||
|
|||
explicit reverse_lock(Lock& lock) : lock(lock) { |
|||
lock.unlock(); |
|||
} |
|||
|
|||
~reverse_lock() { |
|||
lock.lock(); |
|||
} |
|||
|
|||
private: |
|||
reverse_lock(reverse_lock const&); |
|||
reverse_lock& operator=(reverse_lock const&); |
|||
|
|||
Lock& lock; |
|||
}; |
|||
|
|||
#endif // BITCOIN_REVERSELOCK_H
|
@ -0,0 +1,64 @@ |
|||
// Copyright (c) 2015 The Bitcoin Core developers
|
|||
// Distributed under the MIT software license, see the accompanying
|
|||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|||
|
|||
#include "reverselock.h" |
|||
#include "test/test_bitcoin.h" |
|||
|
|||
#include <boost/test/unit_test.hpp> |
|||
|
|||
BOOST_FIXTURE_TEST_SUITE(reverselock_tests, BasicTestingSetup) |
|||
|
|||
BOOST_AUTO_TEST_CASE(reverselock_basics) |
|||
{ |
|||
boost::mutex mutex; |
|||
boost::unique_lock<boost::mutex> lock(mutex); |
|||
|
|||
BOOST_CHECK(lock.owns_lock()); |
|||
{ |
|||
reverse_lock<boost::unique_lock<boost::mutex> > rlock(lock); |
|||
BOOST_CHECK(!lock.owns_lock()); |
|||
} |
|||
BOOST_CHECK(lock.owns_lock()); |
|||
} |
|||
|
|||
BOOST_AUTO_TEST_CASE(reverselock_errors) |
|||
{ |
|||
boost::mutex mutex; |
|||
boost::unique_lock<boost::mutex> lock(mutex); |
|||
|
|||
// Make sure trying to reverse lock an unlocked lock fails
|
|||
lock.unlock(); |
|||
|
|||
BOOST_CHECK(!lock.owns_lock()); |
|||
|
|||
bool failed = false; |
|||
try { |
|||
reverse_lock<boost::unique_lock<boost::mutex> > rlock(lock); |
|||
} catch(...) { |
|||
failed = true; |
|||
} |
|||
|
|||
BOOST_CHECK(failed); |
|||
BOOST_CHECK(!lock.owns_lock()); |
|||
|
|||
// Make sure trying to lock a lock after it has been reverse locked fails
|
|||
failed = false; |
|||
bool locked = false; |
|||
|
|||
lock.lock(); |
|||
BOOST_CHECK(lock.owns_lock()); |
|||
|
|||
try { |
|||
reverse_lock<boost::unique_lock<boost::mutex> > rlock(lock); |
|||
lock.lock(); |
|||
locked = true; |
|||
} catch(...) { |
|||
failed = true; |
|||
} |
|||
|
|||
BOOST_CHECK(locked && failed); |
|||
BOOST_CHECK(lock.owns_lock()); |
|||
} |
|||
|
|||
BOOST_AUTO_TEST_SUITE_END() |
Loading…
Reference in new issue