2020-09-27 03:43:20 -07:00
from collections import OrderedDict
2020-11-18 18:01:45 -08:00
import json
2021-12-09 12:04:11 -08:00
import re
2020-08-21 13:36:11 -07:00
2020-07-16 07:48:41 -07:00
def succeed ( * cmds ) :
""" Returns the concatenated output of all cmds """
return machine . succeed ( * cmds )
def assert_matches ( cmd , regexp ) :
2022-07-07 07:08:27 -07:00
assert_str_matches ( succeed ( cmd ) , regexp )
def assert_str_matches ( str , regexp ) :
if not re . search ( regexp , str ) :
raise Exception ( f " Pattern ' { regexp } ' not found in ' { str } ' " )
2020-07-16 07:48:41 -07:00
2020-08-20 04:11:05 -07:00
def assert_full_match ( cmd , regexp ) :
2020-07-16 07:48:41 -07:00
out = succeed ( cmd )
if not re . fullmatch ( regexp , out ) :
raise Exception ( f " Pattern ' { regexp } ' doesn ' t match ' { out } ' " )
def log_has_string ( unit , str ) :
return f " journalctl -b --output=cat -u { unit } --grep= ' { str } ' "
def assert_no_failure ( unit ) :
""" Unit should not have failed since the system is running """
machine . fail ( log_has_string ( unit , " Failed with result " ) )
def assert_running ( unit ) :
2020-09-27 03:43:20 -07:00
with machine . nested ( f " waiting for unit: { unit } " ) :
machine . wait_for_unit ( unit )
2020-07-16 07:48:41 -07:00
assert_no_failure ( unit )
2020-09-27 03:43:17 -07:00
def wait_for_open_port ( address , port ) :
def is_port_open ( _ ) :
status , _ = machine . execute ( f " nc -z { address } { port } " )
return status == 0
2021-12-09 12:04:11 -08:00
with machine . nested ( f " Waiting for TCP port { address } : { port } " ) :
2020-09-27 03:43:17 -07:00
retry ( is_port_open )
2020-09-27 03:43:20 -07:00
### Test runner
tests = OrderedDict ( )
def test ( name ) :
def x ( fn ) :
tests [ name ] = fn
return x
2022-12-18 04:13:44 -08:00
# `run_tests` is already defined by the NixOS test driver
def nb_run_tests ( ) :
2020-09-27 03:43:20 -07:00
enabled = enabled_tests . copy ( )
to_run = [ ]
for test in tests :
if test in enabled :
enabled . remove ( test )
to_run . append ( test )
if enabled :
raise RuntimeError ( f " The following tests are enabled but not defined: { enabled } " )
machine . connect ( ) # Visually separate boot output from the test output
for test in to_run :
2021-12-09 12:04:11 -08:00
with machine . nested ( f " test: { test } " ) :
2020-09-27 03:43:20 -07:00
tests [ test ] ( )
def run_test ( test ) :
tests [ test ] ( )
### Tests
# All tests are executed in the order they are defined here
@test ( " security " )
def _ ( ) :
assert_running ( " setup-secrets " )
# Unused secrets should be inaccessible
succeed ( ' [[ $(stat -c " % U: %G %a " /secrets/dummy) = " root:root 440 " ]] ' )
if " secure-node " in enabled_tests :
machine . wait_for_unit ( " bitcoind " )
# `systemctl status` run by unprivileged users shouldn't leak cgroup info
assert_matches (
2021-01-30 14:08:42 -08:00
" runuser -u electrs -- systemctl status bitcoind 2>&1 >/dev/null " ,
2020-09-27 03:43:20 -07:00
" Failed to dump process list for ' bitcoind.service ' , ignoring: Access denied " ,
)
# The 'operator' with group 'proc' has full access
2021-01-30 14:08:42 -08:00
assert_full_match ( " runuser -u operator -- systemctl status bitcoind 2>&1 >/dev/null " , " " )
2020-08-21 13:36:11 -07:00
2020-09-27 03:43:20 -07:00
@test ( " bitcoind " )
def _ ( ) :
2020-08-02 14:20:51 -07:00
assert_running ( " bitcoind " )
machine . wait_until_succeeds ( " bitcoin-cli getnetworkinfo " )
2021-01-30 14:08:42 -08:00
assert_matches ( " runuser -u operator -- bitcoin-cli getnetworkinfo | jq " , ' " version " ' )
2021-02-17 05:35:31 -08:00
regtest = " regtest/ " if " regtest " in enabled_tests else " "
assert_full_match ( f " stat -c ' %a ' /var/lib/bitcoind/ { regtest } .cookie " , " 640 \n " )
2020-08-27 03:17:39 -07:00
# RPC access for user 'public' should be restricted
2020-08-02 14:20:51 -07:00
machine . fail (
2020-08-27 03:17:39 -07:00
" bitcoin-cli -rpcuser=public -rpcpassword=$(cat /secrets/bitcoin-rpcpassword-public) stop "
2020-08-02 14:20:51 -07:00
)
machine . wait_until_succeeds (
2020-08-27 03:17:39 -07:00
log_has_string ( " bitcoind " , " RPC User public not allowed to call method stop " )
2020-08-02 14:20:51 -07:00
)
2020-09-27 03:43:20 -07:00
@test ( " electrs " )
def _ ( ) :
2020-08-02 14:20:51 -07:00
assert_running ( " electrs " )
2020-09-27 03:43:17 -07:00
wait_for_open_port ( ip ( " electrs " ) , 4224 ) # prometeus metrics provider
2020-08-02 14:20:51 -07:00
# Check RPC connection to bitcoind
2021-10-05 07:52:02 -07:00
if not " regtest " in enabled_tests :
machine . wait_until_succeeds (
log_has_string ( " electrs " , " waiting for 0 blocks to download " )
)
2020-10-16 08:43:18 -07:00
2022-07-04 03:15:44 -07:00
@test ( " fulcrum " )
def _ ( ) :
assert_running ( " fulcrum " )
machine . wait_until_succeeds ( log_has_string ( " fulcrum " , " started ok " ) )
2020-10-16 08:43:18 -07:00
# Impure: Stops electrs
2021-10-05 07:52:02 -07:00
# Stop electrs from spamming the test log with 'waiting for 0 blocks to download' messages
2020-10-16 08:43:18 -07:00
@test ( " stop-electrs " )
def _ ( ) :
2020-08-02 14:20:51 -07:00
succeed ( " systemctl stop electrs " )
2020-09-27 03:43:20 -07:00
@test ( " liquidd " )
def _ ( ) :
2020-08-02 14:20:51 -07:00
assert_running ( " liquidd " )
machine . wait_until_succeeds ( " elements-cli getnetworkinfo " )
2021-01-30 14:08:42 -08:00
assert_matches ( " runuser -u operator -- elements-cli getnetworkinfo | jq " , ' " version " ' )
succeed ( " runuser -u operator -- liquidswap-cli --help " )
2020-08-02 14:20:51 -07:00
2020-09-27 03:43:20 -07:00
@test ( " clightning " )
def _ ( ) :
2020-08-02 14:20:51 -07:00
assert_running ( " clightning " )
2021-01-30 14:08:42 -08:00
assert_matches ( " runuser -u operator -- lightning-cli getinfo | jq " , ' " id " ' )
2022-05-27 02:13:53 -07:00
enabled_plugins = test_data [ " clightning-plugins " ]
if enabled_plugins :
2020-11-18 18:01:45 -08:00
plugin_list = succeed ( " lightning-cli plugin list " )
plugins = json . loads ( plugin_list ) [ " plugins " ]
active = set ( plugin [ " name " ] for plugin in plugins if plugin [ " active " ] )
2022-05-27 02:13:53 -07:00
failed = set ( enabled_plugins ) . difference ( active )
2020-11-18 18:01:45 -08:00
if failed :
raise Exception (
f " The following clightning plugins are inactive: \n { failed } . \n \n "
f " Output of ' lightning-cli plugin list ' : \n { plugin_list } "
)
2022-05-27 02:13:53 -07:00
active = [ os . path . splitext ( os . path . basename ( p ) ) [ 0 ] for p in enabled_plugins ]
machine . log ( " \n " . join ( [ " Active clightning plugins: " , * active ] ) )
if " feeadjuster " in active :
# This is a one-shot service, so this command only succeeds if the service succeeds
succeed ( " systemctl start clightning-feeadjuster " )
2020-08-02 14:20:51 -07:00
2022-01-06 04:40:52 -08:00
if test_data [ " clightning-replication " ] :
replica_db = " /var/cache/clightning-replication/plaintext/lightningd.sqlite3 "
succeed ( f " runuser -u clightning -- ls { replica_db } " )
# No other user should be able to read the unencrypted files
machine . fail ( f " runuser -u bitcoin -- ls { replica_db } " )
# A gocryptfs has been created
succeed ( " ls /var/backup/clightning/lightningd-db/gocryptfs.conf " )
2020-09-27 03:43:20 -07:00
@test ( " lnd " )
def _ ( ) :
2020-08-04 01:24:49 -07:00
assert_running ( " lnd " )
2021-01-30 14:08:42 -08:00
assert_matches ( " runuser -u operator -- lncli getinfo | jq " , ' " version " ' )
2020-08-04 01:24:49 -07:00
assert_no_failure ( " lnd " )
2022-07-07 07:08:27 -07:00
# Test certificate generation
cert_alt_names = succeed ( " </secrets/lnd-cert openssl x509 -noout -ext subjectAltName " )
assert_str_matches ( cert_alt_names , ' 10.0.0.1 ' )
assert_str_matches ( cert_alt_names , ' 20.0.0.1 ' )
assert_str_matches ( cert_alt_names , ' example.com ' )
2022-05-05 12:56:17 -07:00
@test ( " lndconnect-onion-lnd " )
2021-02-03 13:44:43 -08:00
def _ ( ) :
2022-05-05 12:56:17 -07:00
assert_running ( " lnd " )
2023-01-22 07:18:03 -08:00
assert_matches ( " runuser -u operator -- lndconnect --url " , " .onion " )
2022-05-05 12:56:17 -07:00
@test ( " lndconnect-onion-clightning " )
def _ ( ) :
assert_running ( " clightning-rest " )
2023-01-22 07:18:03 -08:00
assert_matches ( " runuser -u operator -- lndconnect-clightning --url " , " .onion " )
2021-02-03 13:44:43 -08:00
2020-09-27 03:43:20 -07:00
@test ( " lightning-loop " )
def _ ( ) :
2020-09-24 09:39:18 -07:00
assert_running ( " lightning-loop " )
2021-01-30 14:08:42 -08:00
assert_matches ( " runuser -u operator -- loop --version " , " version " )
2020-08-04 01:24:49 -07:00
# Check that lightning-loop fails with the right error, making sure
# lightning-loop can connect to lnd
machine . wait_until_succeeds (
2020-08-30 01:07:02 -07:00
log_has_string (
" lightning-loop " ,
" Waiting for lnd to be fully synced to its chain backend, this might take a while " ,
)
2020-08-04 01:24:49 -07:00
)
2021-03-01 01:59:23 -08:00
@test ( " lightning-pool " )
def _ ( ) :
assert_running ( " lightning-pool " )
assert_matches ( " su operator -c ' pool --version ' " , " version " )
# Check that lightning-pool fails with the right error, making sure
# lightning-pool can connect to lnd
machine . wait_until_succeeds (
log_has_string (
" lightning-pool " ,
" Waiting for lnd to be fully synced to its chain backend, this might take a while " ,
)
)
2021-06-01 18:11:26 -07:00
@test ( " charge-lnd " )
def _ ( ) :
# charge-lnd is a oneshot service that is started by a timer under regular operation
succeed ( " systemctl start charge-lnd " )
assert_no_failure ( " charge-lnd " )
2020-09-27 03:43:20 -07:00
@test ( " btcpayserver " )
def _ ( ) :
2020-08-12 07:16:22 -07:00
assert_running ( " nbxplorer " )
machine . wait_until_succeeds ( log_has_string ( " nbxplorer " , " BTC: RPC connection successful " ) )
2022-04-30 06:35:47 -07:00
if test_data [ " btcpayserver-lbtc " ] :
2021-11-02 05:07:40 -07:00
machine . wait_until_succeeds ( log_has_string ( " nbxplorer " , " LBTC: RPC connection successful " ) )
2020-09-27 03:43:17 -07:00
wait_for_open_port ( ip ( " nbxplorer " ) , 24444 )
2021-11-02 05:07:40 -07:00
2020-08-12 07:16:22 -07:00
assert_running ( " btcpayserver " )
2022-02-11 00:42:51 -08:00
machine . wait_until_succeeds ( log_has_string ( " btcpayserver " , " Now listening on " ) )
2020-09-27 03:43:17 -07:00
wait_for_open_port ( ip ( " btcpayserver " ) , 23000 )
# test lnd custom macaroon
assert_matches (
2022-05-17 04:18:38 -07:00
" runuser -u btcpayserver -- curl -fsS --cacert /secrets/lnd-cert "
2020-09-27 03:43:17 -07:00
' --header " Grpc-Metadata-macaroon: $(xxd -ps -u -c 1000 /run/lnd/btcpayserver.macaroon) " '
f " -X GET https:// { ip ( ' lnd ' ) } :8080/v1/getinfo | jq " ,
' " version " ' ,
)
2021-10-30 05:55:55 -07:00
# Test web server response
2022-05-17 04:18:38 -07:00
assert_matches ( f " curl -fsS -L { ip ( ' btcpayserver ' ) } :23000 " , " Welcome to your BTCPay Server " )
2020-08-12 07:16:22 -07:00
2021-11-08 03:44:14 -08:00
@test ( " rtl " )
def _ ( ) :
assert_running ( " rtl " )
machine . wait_until_succeeds (
log_has_string ( " rtl " , " Server is up and running " )
)
2022-05-05 12:56:16 -07:00
@test ( " clightning-rest " )
def _ ( ) :
assert_running ( " clightning-rest " )
2021-11-08 03:44:14 -08:00
machine . wait_until_succeeds (
2022-05-05 12:56:16 -07:00
log_has_string ( " clightning-rest " , " cl-rest api server is ready and listening on port: 3001 " )
2021-11-08 03:44:14 -08:00
)
2020-09-27 03:43:20 -07:00
@test ( " spark-wallet " )
def _ ( ) :
2020-08-02 14:20:51 -07:00
assert_running ( " spark-wallet " )
2020-09-27 03:43:17 -07:00
wait_for_open_port ( ip ( " spark-wallet " ) , 9737 )
spark_auth = re . search ( " login=(.*) " , succeed ( " cat /secrets/spark-wallet-login " ) ) [ 1 ]
2022-05-17 04:18:38 -07:00
assert_matches ( f " curl -fsS { spark_auth } @ { ip ( ' spark-wallet ' ) } :9737 " , " Spark " )
2020-08-02 14:20:51 -07:00
2020-09-27 03:43:20 -07:00
@test ( " joinmarket " )
def _ ( ) :
2020-05-18 02:51:18 -07:00
assert_running ( " joinmarket " )
machine . wait_until_succeeds (
2020-10-18 09:37:07 -07:00
log_has_string ( " joinmarket " , " JMDaemonServerProtocolFactory starting on 27183 " )
2020-05-18 02:51:18 -07:00
)
2020-10-16 08:43:17 -07:00
@test ( " joinmarket-yieldgenerator " )
def _ ( ) :
2021-10-25 06:30:53 -07:00
if " regtest " in enabled_tests :
expected_log_msg = " You do not have the minimum required amount of coins to be a maker "
else :
expected_log_msg = " Critical error updating blockheight. "
machine . wait_until_succeeds ( log_has_string ( " joinmarket-yieldgenerator " , expected_log_msg ) )
2020-05-18 02:51:18 -07:00
2021-01-17 04:24:57 -08:00
@test ( " joinmarket-ob-watcher " )
def _ ( ) :
2022-02-22 05:49:19 -08:00
assert_running ( " joinmarket-ob-watcher " )
machine . wait_until_succeeds ( log_has_string ( " joinmarket-ob-watcher " , " Starting ob-watcher " ) )
2021-01-17 04:24:57 -08:00
2021-01-14 04:24:26 -08:00
@test ( " nodeinfo " )
def _ ( ) :
status , _ = machine . execute ( " systemctl is-enabled --quiet onion-addresses 2> /dev/null " )
if status == 0 :
machine . wait_for_unit ( " onion-addresses " )
2021-01-30 14:08:42 -08:00
json_info = succeed ( " runuser -u operator -- nodeinfo " )
2021-01-14 04:24:26 -08:00
info = json . loads ( json_info )
assert info [ " bitcoind " ] [ " local_address " ]
2020-09-27 03:43:20 -07:00
@test ( " secure-node " )
def _ ( ) :
2021-01-14 04:24:10 -08:00
assert_running ( " onion-addresses " )
2020-09-27 03:43:20 -07:00
# Run this test before the following tests that shut down services
# (and their corresponding network namespaces).
@test ( " netns-isolation " )
def _ ( ) :
2020-10-29 13:20:24 -07:00
def get_ips ( services ) :
enabled = enabled_tests . intersection ( services )
return " " . join ( ip ( service ) for service in enabled )
def assert_reachable ( src , dests ) :
dest_ips = get_ips ( dests )
if src in enabled_tests and dest_ips :
machine . succeed ( f " ip netns exec nb- { src } fping -c1 -t100 { dest_ips } " )
def assert_unreachable ( src , dests ) :
dest_ips = get_ips ( dests )
if src in enabled_tests and dest_ips :
machine . fail (
# This fails when no host is reachable within 100 ms
f " ip netns exec nb- { src } fping -c1 -t100 --reachable=1 { dest_ips } "
)
# These reachability tests are non-exhaustive
assert_reachable ( " bitcoind " , [ " clightning " , " lnd " , " liquidd " ] )
assert_unreachable ( " bitcoind " , [ " btcpayserver " , " spark-wallet " , " lightning-loop " ] )
2021-07-13 07:03:08 -07:00
assert_unreachable ( " btcpayserver " , [ " bitcoind " , " lightning-loop " ] )
2020-08-02 14:20:51 -07:00
2020-10-29 13:20:38 -07:00
# netns addresses can not be bound to in the main netns.
# This prevents processes in the main netns from impersonating nix-bitcoin services.
assert_matches (
f " nc -l { ip ( ' bitcoind ' ) } 1080 2>&1 || true " , " nc: Cannot assign requested address "
)
2020-10-29 13:20:29 -07:00
if " joinmarket " in enabled_tests :
# netns-exec should drop capabilities
2021-08-04 15:49:11 -07:00
assert_matches (
2021-01-30 14:08:42 -08:00
" runuser -u operator -- netns-exec nb-joinmarket capsh --print | grep Current " ,
2021-08-04 15:49:11 -07:00
re . compile ( " ^Current: =$ " , re . MULTILINE ) ,
2020-10-29 13:20:29 -07:00
)
2020-08-02 14:20:51 -07:00
2020-10-29 13:20:25 -07:00
if " clightning " in enabled_tests :
# netns-exec should fail for unauthorized namespaces
machine . fail ( " netns-exec nb-clightning ip a " )
# netns-exec should only be executable by the operator user
2021-01-30 14:08:42 -08:00
machine . fail ( " runuser -u clightning -- netns-exec nb-bitcoind ip a " )
2020-06-23 04:03:16 -07:00
2020-09-27 03:43:20 -07:00
# Impure: stops bitcoind (and dependent services)
@test ( " backups " )
def _ ( ) :
2021-01-30 01:47:03 -08:00
# For testing that bitcoind wallets are backed up
succeed ( " bitcoin-cli -named createwallet wallet_name=test blank=true >/dev/null " )
2020-06-23 04:03:16 -07:00
succeed ( " systemctl stop bitcoind " )
succeed ( " systemctl start duplicity " )
2021-12-09 12:04:11 -08:00
machine . wait_until_succeeds ( log_has_string ( " duplicity " , " duplicity.service: Deactivated successfully. " ) )
2020-09-27 03:43:18 -07:00
run_duplicity = " export $(cat /secrets/backup-encryption-env); duplicity "
# Files in backup and /var/lib should be identical
2020-06-23 04:03:16 -07:00
assert_matches (
2020-09-27 03:43:18 -07:00
f " { run_duplicity } verify --archive-dir /var/lib/duplicity file:///var/lib/localBackups /var/lib " ,
2020-06-23 04:03:16 -07:00
" 0 differences found " ,
)
2020-09-27 03:43:18 -07:00
# Backup should include important files
2021-01-30 01:47:00 -08:00
files = {
2021-01-30 01:47:03 -08:00
" bitcoind " : " var/lib/bitcoind/test/wallet.dat " ,
2021-01-30 01:47:00 -08:00
" clightning " : " var/lib/clightning/bitcoin/hsm_secret " ,
2021-03-10 05:08:37 -08:00
" lnd " : " var/lib/lnd/lnd-seed-mnemonic " ,
" joinmarket " : " var/lib/joinmarket/jm-wallet-seed " ,
2021-01-30 01:47:00 -08:00
" btcpayserver " : " var/backup/postgresql/btcpaydb.sql.gz " ,
}
actual_files = succeed ( f " { run_duplicity } list-current-files file:///var/lib/localBackups " )
2021-03-10 05:08:37 -08:00
def assert_file_exists ( file ) :
if file not in actual_files :
2021-01-30 01:47:00 -08:00
raise Exception ( f " Backup file ' { file } ' is missing. " )
2020-08-02 14:20:51 -07:00
2021-03-10 05:08:37 -08:00
for test , file in files . items ( ) :
if test in enabled_tests :
assert_file_exists ( file )
assert_file_exists ( " secrets/lnd-wallet-password " )
2020-09-27 03:43:20 -07:00
# Impure: restarts services
2022-07-14 15:04:03 -07:00
@test ( " restart-bitcoind " )
2020-09-27 03:43:20 -07:00
def _ ( ) :
2021-03-22 06:38:31 -07:00
# Sanity-check system by restarting bitcoind.
# This also restarts all services depending on bitcoind.
succeed ( " systemctl restart bitcoind " )
2020-09-27 03:43:17 -07:00
2020-10-16 08:43:19 -07:00
@test ( " regtest " )
def _ ( ) :
2021-03-22 06:38:31 -07:00
def enabled ( unit ) :
if unit in enabled_tests :
# Wait because the unit might have been restarted in the preceding
2022-07-14 15:04:03 -07:00
# 'restart-bitcoind' test
2021-03-22 06:38:31 -07:00
machine . wait_for_unit ( unit )
return True
else :
return False
2022-07-04 03:15:44 -07:00
def get_block_height ( ip , port ) :
return (
""" echo ' { " method " : " blockchain.headers.subscribe " , " id " : 0} ' """
f " | nc { ip } { port } | head -1 | jq -M .result.height "
)
2021-11-02 05:07:40 -07:00
num_blocks = test_data [ " num_blocks " ]
2021-03-22 06:38:31 -07:00
if enabled ( " electrs " ) :
2021-10-05 07:52:02 -07:00
machine . wait_until_succeeds ( log_has_string ( " electrs " , " serving Electrum RPC " ) )
2022-07-04 03:15:44 -07:00
assert_full_match ( get_block_height ( ip ( ' electrs ' ) , 50001 ) , f " { num_blocks } \n " )
if enabled ( " fulcrum " ) :
machine . wait_until_succeeds ( log_has_string ( " fulcrum " , " listening for connections " ) )
assert_full_match ( get_block_height ( ip ( ' fulcrum ' ) , 50002 ) , f " { num_blocks } \n " )
2021-03-22 06:38:31 -07:00
if enabled ( " clightning " ) :
2020-10-16 08:43:19 -07:00
machine . wait_until_succeeds (
2021-11-02 05:07:40 -07:00
f " [[ $(runuser -u operator -- lightning-cli getinfo | jq -M .blockheight) == { num_blocks } ]] "
2020-10-16 08:43:19 -07:00
)
2022-07-04 03:15:44 -07:00
2021-03-22 06:38:31 -07:00
if enabled ( " lnd " ) :
2020-10-16 08:43:19 -07:00
machine . wait_until_succeeds (
2021-11-02 05:07:40 -07:00
f " [[ $(runuser -u operator -- lncli getinfo | jq -M .block_height) == { num_blocks } ]] "
2020-10-16 08:43:19 -07:00
)
2022-07-04 03:15:44 -07:00
2021-03-22 06:38:31 -07:00
if enabled ( " lightning-loop " ) :
2020-10-18 13:36:33 -07:00
machine . wait_until_succeeds (
2021-11-02 05:07:40 -07:00
log_has_string ( " lightning-loop " , f " Starting event loop at height { num_blocks } " )
2020-10-18 13:36:33 -07:00
)
2021-01-30 14:08:42 -08:00
succeed ( " runuser -u operator -- loop getparams " )
2022-07-04 03:15:44 -07:00
2021-03-22 06:38:31 -07:00
if enabled ( " lightning-pool " ) :
2021-03-01 01:59:23 -08:00
machine . wait_until_succeeds (
log_has_string ( " lightning-pool " , " lnd is now fully synced to its chain backend " )
)
succeed ( " runuser -u operator -- pool orders list " )
2022-07-04 03:15:44 -07:00
2021-11-02 05:07:40 -07:00
if enabled ( " btcpayserver " ) :
2022-04-30 06:35:48 -07:00
machine . wait_until_succeeds ( log_has_string ( " nbxplorer " , f " At height: { num_blocks } " ) )
2020-10-16 08:43:19 -07:00
2023-03-03 12:00:00 -08:00
@test ( " trustedcoin " )
def _ ( ) :
machine . wait_for_unit ( " bitcoind " )
machine . wait_for_unit ( " clightning " )
# Let's check the trustedcoin plugin was correctly initialized
machine . wait_until_succeeds ( log_has_string ( " clightning " , " plugin-trustedcoin[^^] \ [0m \ s+initialized plugin " ) )
machine . wait_until_succeeds ( log_has_string ( " clightning " , " plugin-trustedcoin[^^] \ [0m \ s+bitcoind RPC working " ) )
machine . wait_until_succeeds ( log_has_string ( " clightning " , " plugin-trustedcoin[^^] \ [0m \ s+tip: 0 " ) )
machine . wait_until_succeeds ( log_has_string ( " clightning " , " plugin-trustedcoin[^^] \ [0m \ s+estimatefees error: none of the esploras returned usable responses " ) )
2020-09-27 03:43:20 -07:00
if " netns-isolation " in enabled_tests :
2020-09-27 03:43:31 -07:00
def ip ( name ) :
return test_data [ " netns " ] [ name ] [ " address " ]
2020-09-27 03:43:20 -07:00
else :
def ip ( _ ) :
return " 127.0.0.1 "