Browse Source
0.102191eac
add tests to travis (Cory Fields)7667850
tests: replace the old (unused since Travis) tests with new rpc test scripts (Cory Fields)fa7f8cd
tests: remove old pull-tester scripts (Cory Fields)5122ea7
tests: fix forknotify.py on windows (Cory Fields)7a41614
tests: allow rpc-tests to get filenames for bitcoind and bitcoin-cli from the environment (Cory Fields)f635269
tests: enable alertnotify test for Windows (Cory Fields)
Wladimir J. van der Laan
10 years ago
18 changed files with 89 additions and 344 deletions
@ -1,102 +0,0 @@ |
|||||||
#!/bin/bash |
|
||||||
# Copyright (c) 2013-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. |
|
||||||
# |
|
||||||
# Param1: The prefix to mingw staging |
|
||||||
# Param2: Path to java comparison tool |
|
||||||
# Param3: Number of make jobs. Defaults to 1. |
|
||||||
|
|
||||||
# Exit immediately if anything fails: |
|
||||||
set -e |
|
||||||
set -o xtrace |
|
||||||
|
|
||||||
MINGWPREFIX=$1 |
|
||||||
JAVA_COMPARISON_TOOL=$2 |
|
||||||
RUN_EXPENSIVE_TESTS=$3 |
|
||||||
JOBS=${4-1} |
|
||||||
OUT_DIR=${5-} |
|
||||||
|
|
||||||
if [ $# -lt 2 ]; then |
|
||||||
echo "Usage: $0 [mingw-prefix] [java-comparison-tool] <make jobs> <save output dir>" |
|
||||||
exit 1 |
|
||||||
fi |
|
||||||
|
|
||||||
DISTDIR=@PACKAGE@-@VERSION@ |
|
||||||
|
|
||||||
# Cross-compile for windows first (breaking the mingw/windows build is most common) |
|
||||||
cd @abs_top_srcdir@ |
|
||||||
make distdir |
|
||||||
mkdir -p win32-build |
|
||||||
rsync -av $DISTDIR/ win32-build/ |
|
||||||
rm -r $DISTDIR |
|
||||||
cd win32-build |
|
||||||
|
|
||||||
if [ $RUN_EXPENSIVE_TESTS = 1 ]; then |
|
||||||
./configure --disable-silent-rules --disable-ccache --prefix=$MINGWPREFIX --host=i586-mingw32msvc --with-qt-bindir=$MINGWPREFIX/host/bin --with-qt-plugindir=$MINGWPREFIX/plugins --with-qt-incdir=$MINGWPREFIX/include --with-boost=$MINGWPREFIX --with-protoc-bindir=$MINGWPREFIX/host/bin CPPFLAGS=-I$MINGWPREFIX/include LDFLAGS=-L$MINGWPREFIX/lib --with-comparison-tool="$JAVA_COMPARISON_TOOL" |
|
||||||
else |
|
||||||
./configure --disable-silent-rules --disable-ccache --prefix=$MINGWPREFIX --host=i586-mingw32msvc --with-qt-bindir=$MINGWPREFIX/host/bin --with-qt-plugindir=$MINGWPREFIX/plugins --with-qt-incdir=$MINGWPREFIX/include --with-boost=$MINGWPREFIX --with-protoc-bindir=$MINGWPREFIX/host/bin CPPFLAGS=-I$MINGWPREFIX/include LDFLAGS=-L$MINGWPREFIX/lib |
|
||||||
fi |
|
||||||
make -j$JOBS |
|
||||||
|
|
||||||
# And compile for Linux: |
|
||||||
cd @abs_top_srcdir@ |
|
||||||
make distdir |
|
||||||
mkdir -p linux-build |
|
||||||
rsync -av $DISTDIR/ linux-build/ |
|
||||||
rm -r $DISTDIR |
|
||||||
cd linux-build |
|
||||||
if [ $RUN_EXPENSIVE_TESTS = 1 ]; then |
|
||||||
./configure --disable-silent-rules --disable-ccache --with-comparison-tool="$JAVA_COMPARISON_TOOL" --enable-comparison-tool-reorg-tests |
|
||||||
else |
|
||||||
./configure --disable-silent-rules --disable-ccache --with-comparison-tool="$JAVA_COMPARISON_TOOL" |
|
||||||
fi |
|
||||||
make -j$JOBS |
|
||||||
|
|
||||||
# link interesting binaries to parent out/ directory, if it exists. Do this before |
|
||||||
# running unit tests (we want bad binaries to be easy to find) |
|
||||||
if [ -d "$OUT_DIR" -a -w "$OUT_DIR" ]; then |
|
||||||
set +e |
|
||||||
# Windows: |
|
||||||
cp @abs_top_srcdir@/win32-build/src/bitcoind.exe $OUT_DIR/bitcoind.exe |
|
||||||
cp @abs_top_srcdir@/win32-build/src/test/test_bitcoin.exe $OUT_DIR/test_bitcoin.exe |
|
||||||
cp @abs_top_srcdir@/win32-build/src/qt/bitcoind-qt.exe $OUT_DIR/bitcoin-qt.exe |
|
||||||
# Linux: |
|
||||||
cp @abs_top_srcdir@/linux-build/src/bitcoind $OUT_DIR/bitcoind |
|
||||||
cp @abs_top_srcdir@/linux-build/src/test/test_bitcoin $OUT_DIR/test_bitcoin |
|
||||||
cp @abs_top_srcdir@/linux-build/src/qt/bitcoind-qt $OUT_DIR/bitcoin-qt |
|
||||||
set -e |
|
||||||
fi |
|
||||||
|
|
||||||
# Run unit tests and blockchain-tester on Linux: |
|
||||||
cd @abs_top_srcdir@/linux-build |
|
||||||
make check |
|
||||||
|
|
||||||
# Run RPC integration test on Linux: |
|
||||||
@abs_top_srcdir@/qa/rpc-tests/wallet.sh @abs_top_srcdir@/linux-build/src |
|
||||||
@abs_top_srcdir@/qa/rpc-tests/listtransactions.py --srcdir @abs_top_srcdir@/linux-build/src |
|
||||||
@abs_top_srcdir@/qa/rpc-tests/forknotify.py --srcdir @abs_top_srcdir@/linux-build/src |
|
||||||
# Clean up cache/ directory that the python regression tests create |
|
||||||
rm -rf cache |
|
||||||
|
|
||||||
if [ $RUN_EXPENSIVE_TESTS = 1 ]; then |
|
||||||
# Run unit tests and blockchain-tester on Windows: |
|
||||||
cd @abs_top_srcdir@/win32-build |
|
||||||
make check |
|
||||||
fi |
|
||||||
|
|
||||||
# Clean up builds (pull-tester machine doesn't have infinite disk space) |
|
||||||
cd @abs_top_srcdir@/linux-build |
|
||||||
make clean |
|
||||||
cd @abs_top_srcdir@/win32-build |
|
||||||
make clean |
|
||||||
|
|
||||||
# TODO: Fix code coverage builds on pull-tester machine |
|
||||||
# # Test code coverage |
|
||||||
# cd @abs_top_srcdir@ |
|
||||||
# make distdir |
|
||||||
# mv $DISTDIR linux-coverage-build |
|
||||||
# cd linux-coverage-build |
|
||||||
# ./configure --enable-lcov --disable-silent-rules --disable-ccache --with-comparison-tool="$JAVA_COMPARISON_TOOL" |
|
||||||
# make -j$JOBS |
|
||||||
# make cov |
|
@ -1,193 +0,0 @@ |
|||||||
#!/usr/bin/python |
|
||||||
# Copyright (c) 2013-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. |
|
||||||
# |
|
||||||
import json |
|
||||||
from urllib import urlopen |
|
||||||
import requests |
|
||||||
import getpass |
|
||||||
from string import Template |
|
||||||
import sys |
|
||||||
import os |
|
||||||
import subprocess |
|
||||||
|
|
||||||
class RunError(Exception): |
|
||||||
def __init__(self, value): |
|
||||||
self.value = value |
|
||||||
def __str__(self): |
|
||||||
return repr(self.value) |
|
||||||
|
|
||||||
def run(command, **kwargs): |
|
||||||
fail_hard = kwargs.pop("fail_hard", True) |
|
||||||
# output to /dev/null by default: |
|
||||||
kwargs.setdefault("stdout", open('/dev/null', 'w')) |
|
||||||
kwargs.setdefault("stderr", open('/dev/null', 'w')) |
|
||||||
command = Template(command).substitute(os.environ) |
|
||||||
if "TRACE" in os.environ: |
|
||||||
if 'cwd' in kwargs: |
|
||||||
print("[cwd=%s] %s"%(kwargs['cwd'], command)) |
|
||||||
else: print(command) |
|
||||||
try: |
|
||||||
process = subprocess.Popen(command.split(' '), **kwargs) |
|
||||||
process.wait() |
|
||||||
except KeyboardInterrupt: |
|
||||||
process.terminate() |
|
||||||
raise |
|
||||||
if process.returncode != 0 and fail_hard: |
|
||||||
raise RunError("Failed: "+command) |
|
||||||
return process.returncode |
|
||||||
|
|
||||||
def checkout_pull(clone_url, commit, out): |
|
||||||
# Init |
|
||||||
build_dir=os.environ["BUILD_DIR"] |
|
||||||
run("umount ${CHROOT_COPY}/proc", fail_hard=False) |
|
||||||
run("rsync --delete -apv ${CHROOT_MASTER}/ ${CHROOT_COPY}") |
|
||||||
run("rm -rf ${CHROOT_COPY}${SCRIPTS_DIR}") |
|
||||||
run("cp -a ${SCRIPTS_DIR} ${CHROOT_COPY}${SCRIPTS_DIR}") |
|
||||||
# Merge onto upstream/master |
|
||||||
run("rm -rf ${BUILD_DIR}") |
|
||||||
run("mkdir -p ${BUILD_DIR}") |
|
||||||
run("git clone ${CLONE_URL} ${BUILD_DIR}") |
|
||||||
run("git remote add pull "+clone_url, cwd=build_dir, stdout=out, stderr=out) |
|
||||||
run("git fetch pull", cwd=build_dir, stdout=out, stderr=out) |
|
||||||
if run("git merge "+ commit, fail_hard=False, cwd=build_dir, stdout=out, stderr=out) != 0: |
|
||||||
return False |
|
||||||
run("chown -R ${BUILD_USER}:${BUILD_GROUP} ${BUILD_DIR}", stdout=out, stderr=out) |
|
||||||
run("mount --bind /proc ${CHROOT_COPY}/proc") |
|
||||||
return True |
|
||||||
|
|
||||||
def commentOn(commentUrl, success, inMerge, needTests, linkUrl): |
|
||||||
common_message = """ |
|
||||||
This test script verifies pulls every time they are updated. It, however, dies sometimes and fails to test properly. If you are waiting on a test, please check timestamps to verify that the test.log is moving at http://jenkins.bluematt.me/pull-tester/current/ |
|
||||||
Contact BlueMatt on freenode if something looks broken.""" |
|
||||||
|
|
||||||
# Remove old BitcoinPullTester comments (I'm being lazy and not paginating here) |
|
||||||
recentcomments = requests.get(commentUrl+"?sort=created&direction=desc", |
|
||||||
auth=(os.environ['GITHUB_USER'], os.environ["GITHUB_AUTH_TOKEN"])).json |
|
||||||
for comment in recentcomments: |
|
||||||
if comment["user"]["login"] == os.environ["GITHUB_USER"] and common_message in comment["body"]: |
|
||||||
requests.delete(comment["url"], |
|
||||||
auth=(os.environ['GITHUB_USER'], os.environ["GITHUB_AUTH_TOKEN"])) |
|
||||||
|
|
||||||
if success == True: |
|
||||||
if needTests: |
|
||||||
message = "Automatic sanity-testing: PLEASE ADD TEST-CASES, though technically passed. See " + linkUrl + " for binaries and test log." |
|
||||||
else: |
|
||||||
message = "Automatic sanity-testing: PASSED, see " + linkUrl + " for binaries and test log." |
|
||||||
|
|
||||||
post_data = { "body" : message + common_message} |
|
||||||
elif inMerge: |
|
||||||
post_data = { "body" : "Automatic sanity-testing: FAILED MERGE, see " + linkUrl + " for test log." + """ |
|
||||||
|
|
||||||
This pull does not merge cleanly onto current master""" + common_message} |
|
||||||
else: |
|
||||||
post_data = { "body" : "Automatic sanity-testing: FAILED BUILD/TEST, see " + linkUrl + " for binaries and test log." + """ |
|
||||||
|
|
||||||
This could happen for one of several reasons: |
|
||||||
1. It chanages changes build scripts in a way that made them incompatible with the automated testing scripts (please tweak those patches in qa/pull-tester) |
|
||||||
2. It adds/modifies tests which test network rules (thanks for doing that), which conflicts with a patch applied at test time |
|
||||||
3. It does not build on either Linux i386 or Win32 (via MinGW cross compile) |
|
||||||
4. The test suite fails on either Linux i386 or Win32 |
|
||||||
5. The block test-cases failed (lookup the first bNN identifier which failed in https://github.com/TheBlueMatt/test-scripts/blob/master/FullBlockTestGenerator.java) |
|
||||||
|
|
||||||
If you believe this to be in error, please ping BlueMatt on freenode or TheBlueMatt here. |
|
||||||
""" + common_message} |
|
||||||
|
|
||||||
resp = requests.post(commentUrl, json.dumps(post_data), auth=(os.environ['GITHUB_USER'], os.environ["GITHUB_AUTH_TOKEN"])) |
|
||||||
|
|
||||||
def testpull(number, comment_url, clone_url, commit): |
|
||||||
print("Testing pull %d: %s : %s"%(number, clone_url,commit)) |
|
||||||
|
|
||||||
dir = os.environ["RESULTS_DIR"] + "/" + commit + "/" |
|
||||||
print(" ouput to %s"%dir) |
|
||||||
if os.path.exists(dir): |
|
||||||
os.system("rm -r " + dir) |
|
||||||
os.makedirs(dir) |
|
||||||
currentdir = os.environ["RESULTS_DIR"] + "/current" |
|
||||||
os.system("rm -r "+currentdir) |
|
||||||
os.system("ln -s " + dir + " " + currentdir) |
|
||||||
out = open(dir + "test.log", 'w+') |
|
||||||
|
|
||||||
resultsurl = os.environ["RESULTS_URL"] + commit |
|
||||||
checkedout = checkout_pull(clone_url, commit, out) |
|
||||||
if checkedout != True: |
|
||||||
print("Failed to test pull - sending comment to: " + comment_url) |
|
||||||
commentOn(comment_url, False, True, False, resultsurl) |
|
||||||
open(os.environ["TESTED_DB"], "a").write(commit + "\n") |
|
||||||
return |
|
||||||
|
|
||||||
run("rm -rf ${CHROOT_COPY}/${OUT_DIR}", fail_hard=False); |
|
||||||
run("mkdir -p ${CHROOT_COPY}/${OUT_DIR}", fail_hard=False); |
|
||||||
run("chown -R ${BUILD_USER}:${BUILD_GROUP} ${CHROOT_COPY}/${OUT_DIR}", fail_hard=False) |
|
||||||
|
|
||||||
script = os.environ["BUILD_PATH"]+"/qa/pull-tester/pull-tester.sh" |
|
||||||
script += " ${BUILD_PATH} ${MINGW_DEPS_DIR} ${SCRIPTS_DIR}/BitcoindComparisonTool_jar/BitcoindComparisonTool.jar 0 6 ${OUT_DIR}" |
|
||||||
returncode = run("chroot ${CHROOT_COPY} sudo -u ${BUILD_USER} -H timeout ${TEST_TIMEOUT} "+script, |
|
||||||
fail_hard=False, stdout=out, stderr=out) |
|
||||||
|
|
||||||
run("mv ${CHROOT_COPY}/${OUT_DIR} " + dir) |
|
||||||
run("mv ${BUILD_DIR} " + dir) |
|
||||||
|
|
||||||
if returncode == 42: |
|
||||||
print("Successfully tested pull (needs tests) - sending comment to: " + comment_url) |
|
||||||
commentOn(comment_url, True, False, True, resultsurl) |
|
||||||
elif returncode != 0: |
|
||||||
print("Failed to test pull - sending comment to: " + comment_url) |
|
||||||
commentOn(comment_url, False, False, False, resultsurl) |
|
||||||
else: |
|
||||||
print("Successfully tested pull - sending comment to: " + comment_url) |
|
||||||
commentOn(comment_url, True, False, False, resultsurl) |
|
||||||
open(os.environ["TESTED_DB"], "a").write(commit + "\n") |
|
||||||
|
|
||||||
def environ_default(setting, value): |
|
||||||
if not setting in os.environ: |
|
||||||
os.environ[setting] = value |
|
||||||
|
|
||||||
if getpass.getuser() != "root": |
|
||||||
print("Run me as root!") |
|
||||||
sys.exit(1) |
|
||||||
|
|
||||||
if "GITHUB_USER" not in os.environ or "GITHUB_AUTH_TOKEN" not in os.environ: |
|
||||||
print("GITHUB_USER and/or GITHUB_AUTH_TOKEN environment variables not set") |
|
||||||
sys.exit(1) |
|
||||||
|
|
||||||
environ_default("CLONE_URL", "https://github.com/bitcoin/bitcoin.git") |
|
||||||
environ_default("MINGW_DEPS_DIR", "/mnt/w32deps") |
|
||||||
environ_default("SCRIPTS_DIR", "/mnt/test-scripts") |
|
||||||
environ_default("CHROOT_COPY", "/mnt/chroot-tmp") |
|
||||||
environ_default("CHROOT_MASTER", "/mnt/chroot") |
|
||||||
environ_default("OUT_DIR", "/mnt/out") |
|
||||||
environ_default("BUILD_PATH", "/mnt/bitcoin") |
|
||||||
os.environ["BUILD_DIR"] = os.environ["CHROOT_COPY"] + os.environ["BUILD_PATH"] |
|
||||||
environ_default("RESULTS_DIR", "/mnt/www/pull-tester") |
|
||||||
environ_default("RESULTS_URL", "http://jenkins.bluematt.me/pull-tester/") |
|
||||||
environ_default("GITHUB_REPO", "bitcoin/bitcoin") |
|
||||||
environ_default("TESTED_DB", "/mnt/commits-tested.txt") |
|
||||||
environ_default("BUILD_USER", "matt") |
|
||||||
environ_default("BUILD_GROUP", "matt") |
|
||||||
environ_default("TEST_TIMEOUT", str(60*60*2)) |
|
||||||
|
|
||||||
print("Optional usage: pull-tester.py 2112") |
|
||||||
|
|
||||||
f = open(os.environ["TESTED_DB"]) |
|
||||||
tested = set( line.rstrip() for line in f.readlines() ) |
|
||||||
f.close() |
|
||||||
|
|
||||||
if len(sys.argv) > 1: |
|
||||||
pull = requests.get("https://api.github.com/repos/"+os.environ["GITHUB_REPO"]+"/pulls/"+sys.argv[1], |
|
||||||
auth=(os.environ['GITHUB_USER'], os.environ["GITHUB_AUTH_TOKEN"])).json |
|
||||||
testpull(pull["number"], pull["_links"]["comments"]["href"], |
|
||||||
pull["head"]["repo"]["clone_url"], pull["head"]["sha"]) |
|
||||||
|
|
||||||
else: |
|
||||||
for page in range(1,100): |
|
||||||
result = requests.get("https://api.github.com/repos/"+os.environ["GITHUB_REPO"]+"/pulls?state=open&page=%d"%(page,), |
|
||||||
auth=(os.environ['GITHUB_USER'], os.environ["GITHUB_AUTH_TOKEN"])).json |
|
||||||
if len(result) == 0: break; |
|
||||||
for pull in result: |
|
||||||
if pull["head"]["sha"] in tested: |
|
||||||
print("Pull %d already tested"%(pull["number"],)) |
|
||||||
continue |
|
||||||
testpull(pull["number"], pull["_links"]["comments"]["href"], |
|
||||||
pull["head"]["repo"]["clone_url"], pull["head"]["sha"]) |
|
@ -1,22 +0,0 @@ |
|||||||
#!/bin/sh |
|
||||||
# Copyright (c) 2013-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. |
|
||||||
# |
|
||||||
# Helper script for pull-tester. |
|
||||||
#Param 1: path to bitcoin srcroot |
|
||||||
#Param ...: arguments for build-test.sh |
|
||||||
|
|
||||||
if [ $# -lt 1 ]; then |
|
||||||
echo "usage: $0 [bitcoin srcroot] build-test arguments..." |
|
||||||
fi |
|
||||||
|
|
||||||
killall -q bitcoin-cli |
|
||||||
killall -q bitcoind |
|
||||||
|
|
||||||
cd $1 |
|
||||||
shift |
|
||||||
|
|
||||||
./autogen.sh |
|
||||||
./configure |
|
||||||
./qa/pull-tester/build-tests.sh "$@" |
|
@ -0,0 +1,19 @@ |
|||||||
|
#!/bin/bash |
||||||
|
set -e |
||||||
|
|
||||||
|
CURDIR=$(cd $(dirname "$0"); pwd) |
||||||
|
# Get BUILDDIR and REAL_BITCOIND |
||||||
|
. "${CURDIR}/tests-config.sh" |
||||||
|
|
||||||
|
export BITCOINCLI=${BUILDDIR}/qa/pull-tester/run-bitcoin-cli |
||||||
|
export BITCOIND=${REAL_BITCOIND} |
||||||
|
|
||||||
|
#Run the tests |
||||||
|
|
||||||
|
if [ "x${ENABLE_BITCOIND}${ENABLE_UTILS}${ENABLE_WALLET}" = "x111" ]; then |
||||||
|
${BUILDDIR}/qa/rpc-tests/wallet.sh "${BUILDDIR}/src" |
||||||
|
${BUILDDIR}/qa/rpc-tests/listtransactions.py --srcdir "${BUILDDIR}/src" |
||||||
|
${BUILDDIR}/qa/rpc-tests/forknotify.py --srcdir "${BUILDDIR}/src" |
||||||
|
else |
||||||
|
echo "No rpc tests to run. Wallet, utils, and bitcoind must all be enabled" |
||||||
|
fi |
@ -0,0 +1,13 @@ |
|||||||
|
#!/bin/bash |
||||||
|
|
||||||
|
# This is a thin wrapper around bitcoin-cli that strips the Windows-style EOLs |
||||||
|
# from the output if present. It is necessary when using bitcoin-cli.exe on |
||||||
|
# Linux since shells will interpret the line-endings as part of the result. |
||||||
|
|
||||||
|
CURDIR=$(cd $(dirname "$0"); pwd) |
||||||
|
# Get BUILDDIR and REAL_BITCOIND |
||||||
|
|
||||||
|
# Grab the value of $REAL_BITCOINCLI which may be bitcoin-cli.exe. |
||||||
|
. "${CURDIR}/tests-config.sh" |
||||||
|
|
||||||
|
"${REAL_BITCOINCLI}" "$@" | sed 's/\r//' |
@ -0,0 +1,16 @@ |
|||||||
|
#!/bin/bash |
||||||
|
# Copyright (c) 2013-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. |
||||||
|
|
||||||
|
BUILDDIR="@abs_top_builddir@" |
||||||
|
EXEEXT="@EXEEXT@" |
||||||
|
|
||||||
|
# These will turn into comments if they were disabled when configuring. |
||||||
|
@ENABLE_WALLET_TRUE@ENABLE_WALLET=1 |
||||||
|
@BUILD_BITCOIN_UTILS_TRUE@ENABLE_UTILS=1 |
||||||
|
@BUILD_BITCOIND_TRUE@ENABLE_BITCOIND=1 |
||||||
|
|
||||||
|
REAL_BITCOIND="$BUILDDIR/src/bitcoind${EXEEXT}" |
||||||
|
REAL_BITCOINCLI="$BUILDDIR/src/bitcoin-cli${EXEEXT}" |
||||||
|
|
Loading…
Reference in new issue