Browse Source

Merge #64: More robust install.sh, tests runner and .travis.yml for new tests

f3e321a fail on virtualenv setup, fix cov test run on travis (fivepiece)
10f20ed add exports and pkg-config paths to run_tests.sh, use curl instead of git to fetch miniircd, only run cov tests on travis runs (fivepiece)
8027853 add exports and upgrade pip versions for older operating systems (fivepiece)
9e65d2e dependency check can find missing packages (fivepiece)
28507bd change travis test branch to master (fivepiece)
15433df add test result files to gitignore (fivepiece)
ad7309e .travis.yml uses install.sh and run_tests.sh (fivepiece)
69d274f add run_tests.sh (fivepiece)
4f4f0e5 modular install.sh (fivepiece)
master
Adam Gibson 8 years ago
parent
commit
d1db9a2f41
No known key found for this signature in database
GPG Key ID: B3AE09F1E9A3197A
  1. 11
      .gitignore
  2. 38
      .travis.yml
  3. 405
      install.sh
  4. 55
      test/run_tests.sh

11
.gitignore vendored

@ -9,4 +9,13 @@ htmlcov/
scripts/joinmarket.cfg scripts/joinmarket.cfg
scripts/cmttools/commitments.json scripts/cmttools/commitments.json
scripts/blacklist scripts/blacklist
alicekey
alicepubkey
bobkey
commitments_debug.txt
deps/
jmvenv/
logs/
miniircd/
nums_basepoints.txt
schedulefortesting

38
.travis.yml

@ -3,48 +3,18 @@ dist: trusty
language: python language: python
python: python:
- "2.7_with_system_site_packages" - "2.7_with_system_site_packages"
before_install: before_install:
- sudo apt-get install -y curl
- sudo apt-get install -y python-dev
- sudo apt-get install -y libssl-dev
- sudo apt-add-repository ppa:bitcoin/bitcoin -y - sudo apt-add-repository ppa:bitcoin/bitcoin -y
- sudo apt-get update -q - sudo apt-get update -q
- sudo apt-get install --no-install-recommends --no-upgrade -qq bitcoind - sudo apt-get install --no-install-recommends --no-upgrade -qq bitcoind
- sudo apt-get install -y build-essential
- sudo apt-get install -y automake
- sudo apt-get install -y pkg-config
- sudo apt-get install -y libtool
- sudo apt-get install -y libffi-dev
install: install:
- pip install -r requirements-dev.txt - ./install.sh
- python setupall.py --daemon before_script:
- python setupall.py --client-bitcoin - source jmvenv/bin/activate
script: script:
#install and test libsodium - ./test/run_tests.sh
- git clone git://github.com/jedisct1/libsodium.git
- cd libsodium
- git checkout tags/1.0.4
- ./autogen.sh
- ./configure
- make check
- sudo make install
- cd ..
#set up joinmarket.cfg
- cp test/regtest_joinmarket.cfg joinmarket.cfg
#install miniircd
- git clone git://github.com/Joinmarket-Org/miniircd.git
#setup bitcoin config file
- mkdir /home/travis/.bitcoin
- cp test/bitcoin.conf /home/travis/.bitcoin/.
- chmod 600 /home/travis/.bitcoin/bitcoin.conf
- mkdir logs
- mkdir wallets
- python -m py.test --cov=jmclient --cov=jmbitcoin --cov=jmbase --cov=jmdaemon --cov-report html --btcpwd=123456abcdef --btcconf=/home/travis/.bitcoin/bitcoin.conf --btcuser=bitcoinrpc --nirc=2 --ignore jmclient/test/test_wallets.py --ignore test/test_segwit.py
after_success: after_success:
- coveralls - coveralls
branches: branches:
only: only:
- master - master
- segwitwallets

405
install.sh

@ -1,132 +1,311 @@
#!/bin/bash #!/bin/bash
set -e
clear
#Adapted from https://github.com/tailsjoin/tailsjoin/blob/master/tailsjoin-fullnode.sh gpg_verify_key ()
{
gpg --keyid-format long <"$1" | grep "$2"
}
gpg_add_to_keyring ()
{
gpg --dearmor <"$1" >>"${jm_deps}/keyring.gpg"
}
gpg_verify_sig ()
{
gpg --no-default-keyring --keyring "${jm_deps}/keyring.gpg" --verify "$1"
}
# Check for root. deb_deps_check ()
if [[ $(id -u) = "0" ]]; then {
apt-cache policy ${deb_deps[@]} | grep "Installed.*none"
}
deb_deps_install ()
{
deb_deps=( 'python-virtualenv' 'curl' 'python-dev' 'python-pip' 'build-essential' 'automake' 'pkg-config' 'libtool' )
if deb_deps_check; then
clear
echo " echo "
YOU SHOULD NOT RUN THIS SCRIPT AS ROOT! sudo password required to run :
YOU WILL BE PROMPTED FOR THE ADMIN PASS WHEN NEEDED.
\`apt-get install ${deb_deps[@]}\`
" "
read -p "PRESS ENTER TO EXIT SCRIPT, AND RUN AGAIN AS NON-ROOT USER. " if ! sudo apt-get install ${deb_deps[@]}; then
exit 0 return 1
fi
fi fi
}
check_skip_build ()
{
if ! mkdir "$1"; then
read -p "Directory ${1} exists. Remove and recreate? (y/n) " q
if [[ "${q}" =~ Y|y ]]; then
rm -rf "./${1}"
mkdir -p "./${1}"
return 1
else
echo "skipping ${1}..."
return 0
fi
fi
return 1
}
# Make sure user has chosen the correct script. venv_setup ()
echo " {
THIS SCRIPT WILL INSTALL JOINMARKET-CS AND DEPENDENCIES. if check_skip_build 'jmvenv'; then
ADMIN PASS WILL BE REQUIRED MULTIPLE TIMES. return 0
" fi
read -p "PRESS ENTER TO CONTINUE. " rm -rf "${jm_source}/deps"
clear virtualenv -p python2 "${jm_source}/jmvenv" || return 1
source "${jm_source}/jmvenv/bin/activate" || return 1
pip install --upgrade pip
pip install --upgrade setuptools
deactivate
}
# Update apt-get sources. openssl_get ()
echo " {
ENTER PASSWORD TO UPDATE SOURCES. for file in "${openssl_lib_tar}" "${openssl_lib_sha}" "${openssl_lib_sig}"; do
" curl -L -O "${openssl_url}/${file}"
sudo apt-get update done
clear curl -L "${openssl_signer_key_url}" -o openssl_signer.key
}
openssl_build ()
{
./config shared --prefix="${jm_root}"
make -j
rm -rf "${jm_root}/ssl" \
"${jm_root}/lib/engines" \
"${jm_root}/lib/pkgconfig/openssl.pc" \
"${jm_root}/lib/pkgconfig/libssl.pc" \
"${jm_root}/lib/pkgconfig/libcrypto.pc" \
"${jm_root}/include/openssl" \
"${jm_root}/bin/c_rehash" \
"${jm_root}/bin/openssl"
if ! make test; then
return 1
fi
}
# Install dependencies for building libsodium. openssl_install ()
echo " {
ENTER PASSWORD TO INSTALL: python-virtualenv curl python-dev python-pip git build-essential automake pkg-config libtool libffi-dev libssl-dev openssl_version='openssl-1.0.2l'
" openssl_lib_tar="${openssl_version}.tar.gz"
sudo apt-get install -y python-virtualenv curl python-dev python-pip git build-essential automake pkg-config libtool libffi-dev libssl-dev openssl_lib_sha="${openssl_lib_tar}.sha256"
clear openssl_lib_sig="${openssl_lib_tar}.asc"
openssl_url='https://www.openssl.org/source'
openssl_signer_key_url='https://pgp.mit.edu/pks/lookup?op=get&search=0xD9C4D26D0E604491'
openssl_signer_key_id='D9C4D26D0E604491'
openssl_root="${jm_deps}/openssl"
# Get libsodium, sig, and import key. if check_skip_build 'openssl'; then
echo " return 0
DOWNLOADING LIBSODIUM SOURCE AND SIGNING KEY... fi
" pushd openssl
gpg --keyserver pgp.mit.edu --recv-keys 54A2B8892CC3D6A597B92B6C210627AABA709FE1 openssl_get
echo "54A2B8892CC3D6A597B92B6C210627AABA709FE1:6" | gpg --import-ownertrust - if ! grep $(sha256sum "${openssl_lib_tar}") "${openssl_lib_sha}"; then
curl -L -O http://download.libsodium.org/libsodium/releases/libsodium-1.0.12.tar.gz -O http://download.libsodium.org/libsodium/releases/libsodium-1.0.12.tar.gz.sig return 1
clear fi
if gpg_verify_key openssl_signer.key "${openssl_signer_key_id}"; then
gpg_add_to_keyring openssl_signer.key
else
return 1
fi
if gpg_verify_sig "${openssl_lib_sig}"; then
tar xaf "${openssl_lib_tar}"
else
return 1
fi
pushd "${openssl_version}"
if openssl_build; then
make install_sw
else
return 1
fi
popd
popd
}
# add '--disable-docs' to libffi ./configure so makeinfo isn't needed
# https://github.com/libffi/libffi/pull/190/commits/fa7a257113e2cfc963a0be9dca5d7b4c73999dcc
libffi_patch_disable_docs ()
{
cat <<'EOF' > Makefile.am.patch
56c56,59
< info_TEXINFOS = doc/libffi.texi
---
> info_TEXINFOS =
> if BUILD_DOCS
> #info_TEXINFOS += doc/libffi.texi
> endif
EOF
# Verify download. cat <<'EOF' > configure.ac.patch
echo " 545a546,552
VERIFYING THE DOWNLOAD... > AC_ARG_ENABLE(docs,
" > AC_HELP_STRING([--disable-docs],
gpg --verify libsodium-1.0.12.tar.gz.sig libsodium-1.0.12.tar.gz > [Disable building of docs (default: no)]),
echo " > [enable_docs=no],
PLEASE REVIEW THE TEXT ABOVE. > [enable_docs=yes])
IT WILL EITHER SAY GOOD SIG OR BAD SIG. > AM_CONDITIONAL(BUILD_DOCS, [test x$enable_docs = xyes])
" >
read -p "IS IT A GOOD SIG? (y/n) " x EOF
if [[ "$x" = "n" || "$x" = "N" ]]; then patch Makefile.am Makefile.am.patch
echo " patch configure.ac configure.ac.patch
YOU REJECTED THE LIBSODIUM SIGNATURE, GIVING UP... }
"
srm -drv libsodium* libffi_build ()
exit 0 {
./autogen.sh
./configure --disable-docs --enable-shared --prefix="${jm_root}"
make uninstall
make -j
if ! make check; then
return 1
fi fi
clear }
libffi_install ()
{
libffi_version='libffi-3.2.1'
libffi_lib_tar="v3.2.1.tar.gz"
libffi_lib_sha='96d08dee6f262beea1a18ac9a3801f64018dc4521895e9198d029d6850febe23'
libffi_url="https://github.com/libffi/libffi/archive"
# Build and install libsodium. if check_skip_build 'libffi'; then
tar xf libsodium*.tar.gz return 0
rm -rf libsodium*.tar.gz* fi
pushd libffi
curl -L -O "${libffi_url}/${libffi_lib_tar}"
if sha256sum -c <<<"${libffi_lib_sha} ${libffi_lib_tar}"; then
tar xaf "${libffi_lib_tar}"
else
return 1
fi
pushd "${libffi_version}"
if ! libffi_patch_disable_docs; then
return 1
fi
if libffi_build; then
make install
else
return 1
fi
popd
popd
}
echo " libsodium_get ()
BUILDING LIBSODIUM... {
" for file in "${sodium_lib_tar}" "${sodium_lib_sig}"; do
cd libsodium-1.0.12/ && ./configure && make curl -L -O "${sodium_url}/${file}"
echo " done
LIBSODIUM SUCCESSFULLY BUILT. ENTER PASSWORD TO INSTALL. curl -L "${sodium_signer_key_url}" -o libsodium_signer.key
" }
sudo make install
cd ..
rm -rf libsodium*
clear
# Verify the signature on joinmarket-clientserver libsodium_build ()
# Currently commented out - doesn't apply if you've already downloaded the repo {
# either as zip or clone; can check valid signature on github (OK?) ./autogen.sh
#gpg --keyserver pgp.mit.edu --recv-keys 46689728A9F64B391FA871B7B3AE09F1E9A3197A ./configure --enable-shared --prefix="${jm_root}"
#echo "46689728A9F64B391FA871B7B3AE09F1E9A3197A:6" | gpg --import-ownertrust - make uninstall
#Todo: handle signing by another key and check the release tag, not commit. make -j
#git verify-commit HEAD || { if ! make check; then
# echo 'Latest code commit does not have a valid signature; quitting' return 1
# exit 0 fi
#} }
#Run the python installation of joinmarket-clientserver; libsodium_install ()
#note that this is a 'full' installation, which is the default {
#for an ordinary user; this should be enhanced to allow custom sodium_version='libsodium-1.0.13'
#installation styles. sodium_lib_tar="${sodium_version}.tar.gz"
#Installs into a virtualenv, so instructions to run must be included. sodium_lib_sig="${sodium_lib_tar}.sig"
if ! mkdir venv; then sodium_url='https://download.libsodium.org/libsodium/releases'
echo "virtualenv directory already exists; assuming valid." sodium_signer_key_url='https://pgp.mit.edu/pks/lookup?op=get&search=0x210627AABA709FE1'
fi sodium_signer_key_id='62F25B592B6F76DA'
virtualenv jmvenv
source jmvenv/bin/activate if check_skip_build 'libsodium'; then
#required for older pips, e.g. on Ubuntu 14.04 return 0
pip install --upgrade setuptools fi
#Doing manually instead of as in setupall.py pushd libsodium
cd jmbase libsodium_get
pip install . if gpg_verify_key libsodium_signer.key "${sodium_signer_key_id}"; then
cd .. gpg_add_to_keyring libsodium_signer.key
cd jmdaemon else
pip install . return 1
cd .. fi
cd jmbitcoin if gpg_verify_sig "${sodium_lib_sig}"; then
pip install . tar xaf "${sodium_lib_tar}"
cd .. else
cd jmclient return 1
pip install . fi
cd .. pushd "${sodium_version}"
if libsodium_build; then
# Final notes. make install
echo " else
JOINMARKET SUCCESSFULLY INSTALLED. return 1
BEFORE RUNNING SCRIPTS, TYPE: fi
source jmvenv/bin/activate popd
FROM THIS DIRECTORY, TO ACTIVATE THE VIRTUALENV. popd
" }
read -p "PRESS ENTER TO EXIT SCRIPT. "
exit 0; joinmarket_install ()
{
jm_pkgs=( 'jmbase' 'jmdaemon' 'jmbitcoin' 'jmclient' )
for pkg in ${jm_pkgs[@]}; do
pushd "${pkg}"
pip install . || return 1
popd
done
}
main ()
{
jm_source="$PWD"
jm_root="${jm_source}/jmvenv"
jm_deps="${jm_source}/deps"
export PKG_CONFIG_PATH="${PKG_CONFIG_PATH}:${jm_root}/lib/pkgconfig"
export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${jm_root}/lib"
export C_INCLUDE_PATH="${C_INCLUDE_PATH}:${jm_root}/include"
if ! deb_deps_install; then
echo "Dependecies could not be installed. Exiting."
return 1
fi
if ! venv_setup; then
echo "Joinmarket virtualenv could not be setup. Exiting."
return 1
fi
source "${jm_root}/bin/activate"
mkdir -p deps
pushd deps
rm -f ./keyring.gpg
if ! openssl_install; then
echo "Openssl was not built. Exiting."
return 1
fi
if ! libffi_install; then
echo "Libffi was not built. Exiting."
return 1
fi
if ! libsodium_install; then
echo "Libsodium was not built. Exiting."
return 1
fi
popd
if ! joinmarket_install; then
echo "Joinmarket was not installed. Exiting."
deactivate
return 1
fi
deactivate
echo "Joinmarket successfully installed
Before executing scripts or tests, run:
\`source jmvenv/bin/activate\`
from this directiry, to acticate virtualenv."
}
main

55
test/run_tests.sh

@ -0,0 +1,55 @@
#!/bin/bash
run_jm_tests ()
{
if [[ -z "${VIRTUAL_ENV}" ]]; then
echo "Source JM virtualenv before running tests:
\`source ./jmvenv/bin/activate\`"
return 1
fi
jm_source="${VIRTUAL_ENV}/.."
export PKG_CONFIG_PATH="${PKG_CONFIG_PATH}:${VIRTUAL_ENV}/lib/pkgconfig"
export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${VIRTUAL_ENV}/lib"
export C_INCLUDE_PATH="${C_INCLUDE_PATH}:${VIRTUAL_ENV}/include"
pushd "${jm_source}"
curl -L https://github.com/JoinMarket-Org/miniircd/archive/master.tar.gz -o miniircd.tar.gz
rm -rf ./miniircd
mkdir -p miniircd
tar xaf miniircd.tar.gz -C ./miniircd --strip-components=1
if ! pip install -r ./requirements-dev.txt; then
echo "Packages in 'requirements-dev.txt' could not be installed. Exiting."
return 1
fi
if [[ ! -L ./joinmarket.cfg && -e ./joinmarket.cfg ]]; then
mv ./joinmarket.cfg ./joinmarket.cfg.bak
echo "file 'joinmarket.cfg' moved to 'joinmarket.cfg.bak'"
fi
for dir in '/dev/shm' '/tmp' "${jm_source}/test"; do
if [[ -d "${dir}" && -r "${dir}" ]]; then
jm_test_datadir="${dir}/jm_test_home/.bitcoin"
break
fi
done
if [[ -z "${jm_test_datadir}" ]]; then
echo "No candidate directory for test files. Exiting."
return 1
fi
unlink ./joinmarket.cfg
ln -s ./test/regtest_joinmarket.cfg ./joinmarket.cfg
orig_umask="$(umask -p)"
umask 077
rm -rf "${jm_test_datadir}"
mkdir -p "${jm_test_datadir}"
cp -f ./test/bitcoin.conf "${jm_test_datadir}/bitcoin.conf"
${orig_umask}
echo "datadir=${jm_test_datadir}" >> "${jm_test_datadir}/bitcoin.conf"
python -m py.test ${HAS_JOSH_K_SEAL_OF_APPROVAL+--cov=jmclient --cov=jmbitcoin --cov=jmbase --cov=jmdaemon --cov-report html} --btcpwd=123456abcdef --btcconf=${jm_test_datadir}/bitcoin.conf --btcuser=bitcoinrpc --nirc=2 --ignore jmclient/test/test_wallets.py --ignore test/test_segwit.py
unlink ./joinmarket.cfg
if read bitcoind_pid <"${jm_test_datadir}/bitcoind.pid"; then
pkill -15 ${bitcoind_pid} || pkill -9 ${bitcoind_pid}
fi
rm -rf "${jm_test_datadir}"
}
run_jm_tests
Loading…
Cancel
Save