mirror of
https://github.com/basicswap/basicswap.git
synced 2026-05-30 07:41:41 +02:00
@@ -94,12 +94,22 @@ jobs:
|
|||||||
export XMR_BINDIR="$BIN_DIR/monero"
|
export XMR_BINDIR="$BIN_DIR/monero"
|
||||||
pytest tests/basicswap/test_btc_xmr.py::TestBTC -k "test_003_api or test_02_a_leader_recover_a_lock_tx"
|
pytest tests/basicswap/test_btc_xmr.py::TestBTC -k "test_003_api or test_02_a_leader_recover_a_lock_tx"
|
||||||
- name: Run test_encrypted_xmr_reload
|
- name: Run test_encrypted_xmr_reload
|
||||||
|
id: test_encrypted_xmr_reload
|
||||||
run: |
|
run: |
|
||||||
export PYTHONPATH=$(pwd)
|
export PYTHONPATH=$(pwd)
|
||||||
export TEST_PATH=${TEST_RELOAD_PATH}
|
export TEST_PATH=${TEST_RELOAD_PATH}
|
||||||
mkdir -p ${TEST_PATH}/bin
|
mkdir -p ${TEST_PATH}/bin
|
||||||
cp -r $BIN_DIR/* ${TEST_PATH}/bin/
|
cp -r $BIN_DIR/* ${TEST_PATH}/bin/
|
||||||
pytest tests/basicswap/extended/test_encrypted_xmr_reload.py
|
pytest tests/basicswap/extended/test_encrypted_xmr_reload.py
|
||||||
|
- name: Print log files on failure
|
||||||
|
if: ${{ failure() && steps.test_encrypted_xmr_reload.conclusion == 'failure' }}
|
||||||
|
run: |
|
||||||
|
for i in 0 1 2; do
|
||||||
|
for logname in core_stderr core_stdout wallet_stderr wallet_stdout; do
|
||||||
|
echo "=== client${i} ${logname}.log ==="
|
||||||
|
cat /tmp/test_basicswap/client${i}/monero/${logname}.log || true
|
||||||
|
done
|
||||||
|
done
|
||||||
- name: Run selenium tests
|
- name: Run selenium tests
|
||||||
id: selenium_tests
|
id: selenium_tests
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
+7
-2
@@ -365,8 +365,10 @@ class BaseApp(DBMethods):
|
|||||||
self.log.warning(f"Setting mocktime to {new_offset}")
|
self.log.warning(f"Setting mocktime to {new_offset}")
|
||||||
self.mock_time_offset = new_offset
|
self.mock_time_offset = new_offset
|
||||||
|
|
||||||
def get_int_setting(self, name: str, default_v: int, min_v: int, max_v) -> int:
|
def get_clamped_int_from(
|
||||||
value: int = self.settings.get(name, default_v)
|
self, settings: dict, name: str, default_v: int, min_v: int, max_v
|
||||||
|
) -> int:
|
||||||
|
value: int = settings.get(name, default_v)
|
||||||
if value < min_v:
|
if value < min_v:
|
||||||
self.log.warning(f"Setting {name} to {min_v}")
|
self.log.warning(f"Setting {name} to {min_v}")
|
||||||
value = min_v
|
value = min_v
|
||||||
@@ -375,6 +377,9 @@ class BaseApp(DBMethods):
|
|||||||
value = max_v
|
value = max_v
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
def get_int_setting(self, name: str, default_v: int, min_v: int, max_v) -> int:
|
||||||
|
return self.get_clamped_int_from(self.settings, name, default_v, min_v, max_v)
|
||||||
|
|
||||||
def get_delay_event_seconds(self):
|
def get_delay_event_seconds(self):
|
||||||
if self.min_delay_event == self.max_delay_event:
|
if self.min_delay_event == self.max_delay_event:
|
||||||
return self.min_delay_event
|
return self.min_delay_event
|
||||||
|
|||||||
+23
-21
@@ -166,7 +166,6 @@ import basicswap.network.network as bsn
|
|||||||
import basicswap.protocols.atomic_swap_1 as atomic_swap_1
|
import basicswap.protocols.atomic_swap_1 as atomic_swap_1
|
||||||
import basicswap.protocols.xmr_swap_1 as xmr_swap_1
|
import basicswap.protocols.xmr_swap_1 as xmr_swap_1
|
||||||
|
|
||||||
|
|
||||||
PROTOCOL_VERSION_SECRET_HASH = 5
|
PROTOCOL_VERSION_SECRET_HASH = 5
|
||||||
MINPROTO_VERSION_SECRET_HASH = 4
|
MINPROTO_VERSION_SECRET_HASH = 4
|
||||||
|
|
||||||
@@ -441,9 +440,6 @@ class BasicSwap(BaseApp, BSXNetwork, UIApp):
|
|||||||
self.check_delayed_auto_accept_seconds = self.get_int_setting(
|
self.check_delayed_auto_accept_seconds = self.get_int_setting(
|
||||||
"check_delayed_auto_accept_seconds", 60, 1, 20 * 60
|
"check_delayed_auto_accept_seconds", 60, 1, 20 * 60
|
||||||
)
|
)
|
||||||
self.startup_tries = self.get_int_setting(
|
|
||||||
"startup_tries", 15, 1, 100
|
|
||||||
) # Seconds waited for will be (x(1 + x+1) / 2
|
|
||||||
self.debug_ui = self.settings.get("debug_ui", False)
|
self.debug_ui = self.settings.get("debug_ui", False)
|
||||||
self._debug_cases = []
|
self._debug_cases = []
|
||||||
self._last_checked_actions = 0
|
self._last_checked_actions = 0
|
||||||
@@ -1618,13 +1614,22 @@ class BasicSwap(BaseApp, BSXNetwork, UIApp):
|
|||||||
# systemd will try to restart the process if fail_code != 0
|
# systemd will try to restart the process if fail_code != 0
|
||||||
self.stopRunning(1)
|
self.stopRunning(1)
|
||||||
|
|
||||||
startup_tries = self.startup_tries
|
|
||||||
chain_client_settings = self.getChainClientSettings(coin_type)
|
chain_client_settings = self.getChainClientSettings(coin_type)
|
||||||
if "startup_tries" in chain_client_settings:
|
# Total seconds waited for will be ((startup_tries(1 + startup_tries) / 2) * startup_delay
|
||||||
startup_tries = chain_client_settings["startup_tries"]
|
startup_tries: int = self.get_clamped_int_from(
|
||||||
if startup_tries < 1:
|
chain_client_settings,
|
||||||
self.log.warning('"startup_tries" can\'t be less than 1.')
|
"startup_tries",
|
||||||
startup_tries = 1
|
self.get_int_setting("startup_tries", 15, 1, 100),
|
||||||
|
1,
|
||||||
|
100,
|
||||||
|
)
|
||||||
|
startup_delay: int = self.get_clamped_int_from(
|
||||||
|
chain_client_settings,
|
||||||
|
"startup_delay",
|
||||||
|
self.get_int_setting("startup_delay", 5, 1, 100),
|
||||||
|
1,
|
||||||
|
100,
|
||||||
|
)
|
||||||
for i in range(startup_tries):
|
for i in range(startup_tries):
|
||||||
if self.delay_event.is_set():
|
if self.delay_event.is_set():
|
||||||
return
|
return
|
||||||
@@ -1632,6 +1637,7 @@ class BasicSwap(BaseApp, BSXNetwork, UIApp):
|
|||||||
self.coin_clients[coin_type]["interface"].testDaemonRPC(with_wallet)
|
self.coin_clients[coin_type]["interface"].testDaemonRPC(with_wallet)
|
||||||
return
|
return
|
||||||
except Exception as ex:
|
except Exception as ex:
|
||||||
|
wait_for: int = startup_delay * (1 + i)
|
||||||
if any(
|
if any(
|
||||||
log in str(ex)
|
log in str(ex)
|
||||||
for log in [
|
for log in [
|
||||||
@@ -1644,13 +1650,13 @@ class BasicSwap(BaseApp, BSXNetwork, UIApp):
|
|||||||
]
|
]
|
||||||
):
|
):
|
||||||
self.log.info(
|
self.log.info(
|
||||||
f"Waiting for {Coins(coin_type).name} RPC. Trying again in {5 * (1 + i)} seconds, {1 + i}/{startup_tries}."
|
f"Waiting for {Coins(coin_type).name} RPC. Trying again in {wait_for} seconds, {1 + i}/{startup_tries}."
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
self.log.warning(
|
self.log.warning(
|
||||||
f"Can't connect to {Coins(coin_type).name} RPC: {ex}. Trying again in {5 * (1 + i)} seconds, {1 + i}/{startup_tries}."
|
f"Can't connect to {Coins(coin_type).name} RPC: {ex}. Trying again in {wait_for} seconds, {1 + i}/{startup_tries}."
|
||||||
)
|
)
|
||||||
self.delay_event.wait(5 * (1 + i))
|
self.delay_event.wait(wait_for)
|
||||||
self.log.error(f"Can't connect to {Coins(coin_type).name} RPC, exiting.")
|
self.log.error(f"Can't connect to {Coins(coin_type).name} RPC, exiting.")
|
||||||
self.stopRunning(1) # systemd will try to restart the process if fail_code != 0
|
self.stopRunning(1) # systemd will try to restart the process if fail_code != 0
|
||||||
|
|
||||||
@@ -3965,7 +3971,7 @@ class BasicSwap(BaseApp, BSXNetwork, UIApp):
|
|||||||
def isValidSwapDest(self, ci, dest: bytes):
|
def isValidSwapDest(self, ci, dest: bytes):
|
||||||
ensure(isinstance(dest, bytes), "Swap destination must be bytes")
|
ensure(isinstance(dest, bytes), "Swap destination must be bytes")
|
||||||
if ci.coin_type() in (Coins.PART_BLIND,):
|
if ci.coin_type() in (Coins.PART_BLIND,):
|
||||||
return ci.isValidPubkey(dest)
|
return ci.verifyPubkey(dest)
|
||||||
# TODO: allow p2wsh
|
# TODO: allow p2wsh
|
||||||
return ci.isValidAddressHash(dest)
|
return ci.isValidAddressHash(dest)
|
||||||
|
|
||||||
@@ -10905,7 +10911,7 @@ class BasicSwap(BaseApp, BSXNetwork, UIApp):
|
|||||||
)
|
)
|
||||||
ensure(
|
ensure(
|
||||||
ci_from.isValidAddressHash(bid_data.dest_af)
|
ci_from.isValidAddressHash(bid_data.dest_af)
|
||||||
or ci_from.isValidPubkey(bid_data.dest_af),
|
or ci_from.verifyPubkey(bid_data.dest_af),
|
||||||
"Invalid destination address",
|
"Invalid destination address",
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -13811,8 +13817,7 @@ class BasicSwap(BaseApp, BSXNetwork, UIApp):
|
|||||||
num_watched_outputs += len(v["watched_outputs"])
|
num_watched_outputs += len(v["watched_outputs"])
|
||||||
|
|
||||||
now: int = self.getTime()
|
now: int = self.getTime()
|
||||||
q_bids_str: str = (
|
q_bids_str: str = """SELECT
|
||||||
"""SELECT
|
|
||||||
COUNT(CASE WHEN b.was_sent THEN 1 ELSE NULL END) AS count_sent,
|
COUNT(CASE WHEN b.was_sent THEN 1 ELSE NULL END) AS count_sent,
|
||||||
COUNT(CASE WHEN b.was_sent AND (s.in_progress OR (s.swap_ended = 0 AND b.expire_at > :now AND o.expire_at > :now)) THEN 1 ELSE NULL END) AS count_sent_active,
|
COUNT(CASE WHEN b.was_sent AND (s.in_progress OR (s.swap_ended = 0 AND b.expire_at > :now AND o.expire_at > :now)) THEN 1 ELSE NULL END) AS count_sent_active,
|
||||||
COUNT(CASE WHEN b.was_received THEN 1 ELSE NULL END) AS count_received,
|
COUNT(CASE WHEN b.was_received THEN 1 ELSE NULL END) AS count_received,
|
||||||
@@ -13822,15 +13827,12 @@ class BasicSwap(BaseApp, BSXNetwork, UIApp):
|
|||||||
JOIN offers o ON b.offer_id = o.offer_id
|
JOIN offers o ON b.offer_id = o.offer_id
|
||||||
JOIN bidstates s ON b.state = s.state_id
|
JOIN bidstates s ON b.state = s.state_id
|
||||||
WHERE b.active_ind = 1"""
|
WHERE b.active_ind = 1"""
|
||||||
)
|
|
||||||
|
|
||||||
q_offers_str: str = (
|
q_offers_str: str = """SELECT
|
||||||
"""SELECT
|
|
||||||
COUNT(CASE WHEN expire_at > :now THEN 1 ELSE NULL END) AS count_active,
|
COUNT(CASE WHEN expire_at > :now THEN 1 ELSE NULL END) AS count_active,
|
||||||
COUNT(CASE WHEN was_sent THEN 1 ELSE NULL END) AS count_sent,
|
COUNT(CASE WHEN was_sent THEN 1 ELSE NULL END) AS count_sent,
|
||||||
COUNT(CASE WHEN was_sent AND expire_at > :now THEN 1 ELSE NULL END) AS count_sent_active
|
COUNT(CASE WHEN was_sent AND expire_at > :now THEN 1 ELSE NULL END) AS count_sent_active
|
||||||
FROM offers WHERE active_ind = 1"""
|
FROM offers WHERE active_ind = 1"""
|
||||||
)
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
cursor = self.openDB()
|
cursor = self.openDB()
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ import time
|
|||||||
from enum import IntEnum, auto
|
from enum import IntEnum, auto
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
|
|
||||||
CURRENT_DB_VERSION = 34
|
CURRENT_DB_VERSION = 34
|
||||||
CURRENT_DB_DATA_VERSION = 8
|
CURRENT_DB_DATA_VERSION = 8
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,6 @@
|
|||||||
|
|
||||||
import json
|
import json
|
||||||
|
|
||||||
|
|
||||||
default_coingecko_api_key = "CG-8hm3r9iLfpEXv4ied8oLbeUj"
|
default_coingecko_api_key = "CG-8hm3r9iLfpEXv4ied8oLbeUj"
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -220,12 +220,6 @@ class Secp256k1Interface(CoinInterface, AdaptorSigInterface):
|
|||||||
if hash_len == 20:
|
if hash_len == 20:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def isValidPubkey(self, pubkey: bytes) -> bool:
|
|
||||||
try:
|
|
||||||
return self.verifyPubkey(pubkey)
|
|
||||||
except Exception:
|
|
||||||
return False
|
|
||||||
|
|
||||||
def verifySig(self, pubkey: bytes, signed_hash: bytes, sig: bytes) -> bool:
|
def verifySig(self, pubkey: bytes, signed_hash: bytes, sig: bytes) -> bool:
|
||||||
pubkey = PublicKey(pubkey)
|
pubkey = PublicKey(pubkey)
|
||||||
return pubkey.verify(sig, signed_hash, hasher=None)
|
return pubkey.verify(sig, signed_hash, hasher=None)
|
||||||
|
|||||||
@@ -99,7 +99,6 @@ from basicswap.basicswap_util import TxLockTypes
|
|||||||
from basicswap.chainparams import Coins
|
from basicswap.chainparams import Coins
|
||||||
from basicswap.rpc import make_rpc_func, openrpc
|
from basicswap.rpc import make_rpc_func, openrpc
|
||||||
|
|
||||||
|
|
||||||
SEQUENCE_LOCKTIME_GRANULARITY = 9 # 512 seconds
|
SEQUENCE_LOCKTIME_GRANULARITY = 9 # 512 seconds
|
||||||
SEQUENCE_LOCKTIME_TYPE_FLAG = 1 << 22
|
SEQUENCE_LOCKTIME_TYPE_FLAG = 1 << 22
|
||||||
SEQUENCE_LOCKTIME_MASK = 0x0000FFFF
|
SEQUENCE_LOCKTIME_MASK = 0x0000FFFF
|
||||||
|
|||||||
@@ -82,7 +82,6 @@ from coincurve.ecdsaotves import (
|
|||||||
ecdsaotves_rec_enc_key,
|
ecdsaotves_rec_enc_key,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
SEQUENCE_LOCKTIME_GRANULARITY = 9 # 512 seconds
|
SEQUENCE_LOCKTIME_GRANULARITY = 9 # 512 seconds
|
||||||
SEQUENCE_LOCKTIME_TYPE_FLAG = 1 << 22
|
SEQUENCE_LOCKTIME_TYPE_FLAG = 1 << 22
|
||||||
SEQUENCE_LOCKTIME_MASK = 0x0000F
|
SEQUENCE_LOCKTIME_MASK = 0x0000F
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import subprocess
|
|||||||
def createDCRWallet(args, hex_seed, logging, delay_event):
|
def createDCRWallet(args, hex_seed, logging, delay_event):
|
||||||
logging.info("Creating DCR wallet")
|
logging.info("Creating DCR wallet")
|
||||||
|
|
||||||
(pipe_r, pipe_w) = os.pipe() # subprocess.PIPE is buffered, blocks when read
|
pipe_r, pipe_w = os.pipe() # subprocess.PIPE is buffered, blocks when read
|
||||||
|
|
||||||
if os.name == "nt":
|
if os.name == "nt":
|
||||||
str_args = " ".join(args)
|
str_args = " ".join(args)
|
||||||
|
|||||||
@@ -34,7 +34,6 @@ from basicswap.rpc_xmr import make_xmr_rpc_func, make_xmr_rpc2_func
|
|||||||
from basicswap.chainparams import XMR_COIN, Coins
|
from basicswap.chainparams import XMR_COIN, Coins
|
||||||
from basicswap.interface.base import CoinInterface
|
from basicswap.interface.base import CoinInterface
|
||||||
|
|
||||||
|
|
||||||
ed25519_l = 2**252 + 27742317777372353535851937790883648493
|
ed25519_l = 2**252 + 27742317777372353535851937790883648493
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ protobuf ParseFromString would reset the whole object, from_bytes won't.
|
|||||||
|
|
||||||
from basicswap.util.integer import encode_varint, decode_varint
|
from basicswap.util.integer import encode_varint, decode_varint
|
||||||
|
|
||||||
|
|
||||||
NPBW_INT = 0
|
NPBW_INT = 0
|
||||||
NPBW_BYTES = 2
|
NPBW_BYTES = 2
|
||||||
|
|
||||||
|
|||||||
@@ -39,7 +39,6 @@ from basicswap.contrib.rfc6979 import (
|
|||||||
rfc6979_hmac_sha256_generate,
|
rfc6979_hmac_sha256_generate,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
START_TOKEN = 0xABCD
|
START_TOKEN = 0xABCD
|
||||||
MSG_START_TOKEN = START_TOKEN.to_bytes(2, "big")
|
MSG_START_TOKEN = START_TOKEN.to_bytes(2, "big")
|
||||||
|
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ def initSimplexClient(args, logger, delay_event):
|
|||||||
# TODO: Must be a better way?
|
# TODO: Must be a better way?
|
||||||
logger.info("Initialising Simplex client")
|
logger.info("Initialising Simplex client")
|
||||||
|
|
||||||
(pipe_r, pipe_w) = os.pipe() # subprocess.PIPE is buffered, blocks when read
|
pipe_r, pipe_w = os.pipe() # subprocess.PIPE is buffered, blocks when read
|
||||||
|
|
||||||
if os.name == "nt":
|
if os.name == "nt":
|
||||||
str_args = " ".join(args)
|
str_args = " ".join(args)
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ import json
|
|||||||
import time
|
import time
|
||||||
import decimal
|
import decimal
|
||||||
|
|
||||||
|
|
||||||
COIN = 100000000
|
COIN = 100000000
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,6 @@ from basicswap.contrib.test_framework.messages import (
|
|||||||
uint256_from_str,
|
uint256_from_str,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
AES_BLOCK_SIZE = 16
|
AES_BLOCK_SIZE = 16
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,12 @@
|
|||||||
|
0.16.3
|
||||||
|
==============
|
||||||
|
|
||||||
|
- New setting "startup_delay"
|
||||||
|
- Adjusts the time waited for coin daemons to start between "startup_tries".
|
||||||
|
- Valid as a base setting and can be overridden per coin with chainclients settings.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
0.14.5
|
0.14.5
|
||||||
==============
|
==============
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ from basicswap.util import toBool
|
|||||||
from basicswap.contrib.rpcauth import generate_salt, password_to_hmac
|
from basicswap.contrib.rpcauth import generate_salt, password_to_hmac
|
||||||
from basicswap.bin.prepare import downloadPIVXParams
|
from basicswap.bin.prepare import downloadPIVXParams
|
||||||
|
|
||||||
|
|
||||||
TEST_HTTP_HOST = os.getenv(
|
TEST_HTTP_HOST = os.getenv(
|
||||||
"TEST_HTTP_HOST", "127.0.0.1"
|
"TEST_HTTP_HOST", "127.0.0.1"
|
||||||
) # Set to 0.0.0.0 when used in docker
|
) # Set to 0.0.0.0 when used in docker
|
||||||
|
|||||||
@@ -56,7 +56,6 @@ from tests.basicswap.extended.test_doge import (
|
|||||||
import basicswap.config as cfg
|
import basicswap.config as cfg
|
||||||
import basicswap.bin.run as runSystem
|
import basicswap.bin.run as runSystem
|
||||||
|
|
||||||
|
|
||||||
TEST_PATH = os.path.expanduser(os.getenv("TEST_PATH", "~/test_basicswap1"))
|
TEST_PATH = os.path.expanduser(os.getenv("TEST_PATH", "~/test_basicswap1"))
|
||||||
|
|
||||||
PARTICL_PORT_BASE = int(os.getenv("PARTICL_PORT_BASE", BASE_PORT))
|
PARTICL_PORT_BASE = int(os.getenv("PARTICL_PORT_BASE", BASE_PORT))
|
||||||
@@ -532,9 +531,7 @@ def run_prepare(
|
|||||||
for opt in EXTRA_CONFIG_JSON.get("doge{}".format(node_id), []):
|
for opt in EXTRA_CONFIG_JSON.get("doge{}".format(node_id), []):
|
||||||
fp.write(opt + "\n")
|
fp.write(opt + "\n")
|
||||||
|
|
||||||
with open(config_path) as fs:
|
settings["startup_delay"] = 1
|
||||||
settings = json.load(fs)
|
|
||||||
|
|
||||||
settings["min_delay_event"] = 1
|
settings["min_delay_event"] = 1
|
||||||
settings["max_delay_event"] = 4
|
settings["max_delay_event"] = 4
|
||||||
settings["min_delay_event_short"] = 1
|
settings["min_delay_event_short"] = 1
|
||||||
@@ -586,7 +583,7 @@ def prepare_nodes(
|
|||||||
|
|
||||||
class TestBase(unittest.TestCase):
|
class TestBase(unittest.TestCase):
|
||||||
def setUpClass(cls):
|
def setUpClass(cls):
|
||||||
super(TestBase, cls).setUpClass()
|
super().setUpClass()
|
||||||
|
|
||||||
cls.delay_event = threading.Event()
|
cls.delay_event = threading.Event()
|
||||||
signal.signal(
|
signal.signal(
|
||||||
@@ -624,7 +621,7 @@ class TestBase(unittest.TestCase):
|
|||||||
|
|
||||||
|
|
||||||
def run_process(client_id):
|
def run_process(client_id):
|
||||||
client_path = os.path.join(TEST_PATH, "client{}".format(client_id))
|
client_path = os.path.join(TEST_PATH, f"client{client_id}")
|
||||||
testargs = [
|
testargs = [
|
||||||
"basicswap-run",
|
"basicswap-run",
|
||||||
"-datadir=" + client_path,
|
"-datadir=" + client_path,
|
||||||
@@ -646,7 +643,7 @@ class XmrTestBase(TestBase):
|
|||||||
prepare_nodes(3, "monero")
|
prepare_nodes(3, "monero")
|
||||||
|
|
||||||
def start_processes(self):
|
def start_processes(self):
|
||||||
multiprocessing.set_start_method("fork")
|
multiprocessing.set_start_method("spawn")
|
||||||
self.delay_event.clear()
|
self.delay_event.clear()
|
||||||
|
|
||||||
for i in range(3):
|
for i in range(3):
|
||||||
@@ -655,7 +652,7 @@ class XmrTestBase(TestBase):
|
|||||||
)
|
)
|
||||||
self.processes[-1].start()
|
self.processes[-1].start()
|
||||||
|
|
||||||
waitForServer(self.delay_event, 12701)
|
waitForServer(self.delay_event, 12701, 60)
|
||||||
|
|
||||||
def waitForMainAddress():
|
def waitForMainAddress():
|
||||||
for i in range(20):
|
for i in range(20):
|
||||||
@@ -667,13 +664,12 @@ class XmrTestBase(TestBase):
|
|||||||
)
|
)
|
||||||
return wallets["XMR"]["main_address"]
|
return wallets["XMR"]["main_address"]
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print("Waiting for main address {}".format(str(e)))
|
print(f"Waiting for main address {e}")
|
||||||
self.delay_event.wait(1)
|
self.delay_event.wait(1)
|
||||||
raise ValueError("waitForMainAddress timedout")
|
raise ValueError("waitForMainAddress timedout")
|
||||||
|
|
||||||
xmr_addr1 = waitForMainAddress()
|
xmr_addr1 = waitForMainAddress()
|
||||||
|
num_blocks: int = 100
|
||||||
num_blocks = 100
|
|
||||||
|
|
||||||
xmr_auth = None
|
xmr_auth = None
|
||||||
if os.getenv("XMR_RPC_USER", "") != "":
|
if os.getenv("XMR_RPC_USER", "") != "":
|
||||||
@@ -685,7 +681,7 @@ class XmrTestBase(TestBase):
|
|||||||
]
|
]
|
||||||
< num_blocks
|
< num_blocks
|
||||||
):
|
):
|
||||||
logging.info("Mining {} Monero blocks to {}.".format(num_blocks, xmr_addr1))
|
logging.info(f"Mining {num_blocks} Monero blocks to {xmr_addr1}.")
|
||||||
callrpc_xmr(
|
callrpc_xmr(
|
||||||
XMR_BASE_RPC_PORT + 1,
|
XMR_BASE_RPC_PORT + 1,
|
||||||
"generateblocks",
|
"generateblocks",
|
||||||
|
|||||||
@@ -65,7 +65,6 @@ from tests.basicswap.common import (
|
|||||||
)
|
)
|
||||||
from basicswap.bin.run import startDaemon
|
from basicswap.bin.run import startDaemon
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger()
|
logger = logging.getLogger()
|
||||||
logger.level = logging.DEBUG
|
logger.level = logging.DEBUG
|
||||||
if not len(logger.handlers):
|
if not len(logger.handlers):
|
||||||
|
|||||||
@@ -34,7 +34,6 @@ from tests.basicswap.util import (
|
|||||||
read_json_api,
|
read_json_api,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger()
|
logger = logging.getLogger()
|
||||||
logger.level = logging.DEBUG
|
logger.level = logging.DEBUG
|
||||||
if not len(logger.handlers):
|
if not len(logger.handlers):
|
||||||
|
|||||||
@@ -31,7 +31,6 @@ from tests.basicswap.util import (
|
|||||||
waitForServer,
|
waitForServer,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger()
|
logger = logging.getLogger()
|
||||||
logger.level = logging.DEBUG
|
logger.level = logging.DEBUG
|
||||||
if not len(logger.handlers):
|
if not len(logger.handlers):
|
||||||
|
|||||||
@@ -58,7 +58,6 @@ from tests.basicswap.common import (
|
|||||||
|
|
||||||
from basicswap.bin.run import startDaemon
|
from basicswap.bin.run import startDaemon
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger()
|
logger = logging.getLogger()
|
||||||
|
|
||||||
NUM_NODES = 3
|
NUM_NODES = 3
|
||||||
|
|||||||
@@ -40,7 +40,6 @@ from tests.basicswap.extended.test_dcr import (
|
|||||||
run_test_itx_refund,
|
run_test_itx_refund,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger("BSX Tests")
|
logger = logging.getLogger("BSX Tests")
|
||||||
|
|
||||||
if not len(logger.handlers):
|
if not len(logger.handlers):
|
||||||
|
|||||||
@@ -66,7 +66,6 @@ from tests.basicswap.common import (
|
|||||||
from basicswap.bin.run import startDaemon
|
from basicswap.bin.run import startDaemon
|
||||||
from basicswap.bin.prepare import downloadPIVXParams
|
from basicswap.bin.prepare import downloadPIVXParams
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger()
|
logger = logging.getLogger()
|
||||||
logger.level = logging.DEBUG
|
logger.level = logging.DEBUG
|
||||||
if not len(logger.handlers):
|
if not len(logger.handlers):
|
||||||
|
|||||||
@@ -38,7 +38,6 @@ from tests.basicswap.util import (
|
|||||||
waitForServer,
|
waitForServer,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger()
|
logger = logging.getLogger()
|
||||||
logger.level = logging.DEBUG
|
logger.level = logging.DEBUG
|
||||||
if not len(logger.handlers):
|
if not len(logger.handlers):
|
||||||
|
|||||||
@@ -248,7 +248,7 @@ def updateThreadDCR(cls):
|
|||||||
if "double spend" in str(e):
|
if "double spend" in str(e):
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
logging.warning("updateThreadDCR purchaseticket {}".format(e))
|
logging.warning(f"updateThreadDCR purchaseticket {e}")
|
||||||
cls.delay_event.wait(0.5)
|
cls.delay_event.wait(0.5)
|
||||||
try:
|
try:
|
||||||
if num_passed >= 5:
|
if num_passed >= 5:
|
||||||
@@ -260,7 +260,7 @@ def updateThreadDCR(cls):
|
|||||||
],
|
],
|
||||||
)
|
)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.warning("updateThreadDCR generate {}".format(e))
|
logging.warning(f"updateThreadDCR generate {e}")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print("updateThreadDCR error", str(e))
|
print("updateThreadDCR error", str(e))
|
||||||
cls.delay_event.wait(random.uniform(cls.dcr_update_min, cls.dcr_update_max))
|
cls.delay_event.wait(random.uniform(cls.dcr_update_min, cls.dcr_update_max))
|
||||||
@@ -272,7 +272,7 @@ def signal_handler(self, sig, frame):
|
|||||||
|
|
||||||
|
|
||||||
def run_process(client_id):
|
def run_process(client_id):
|
||||||
client_path = os.path.join(test_path, "client{}".format(client_id))
|
client_path = os.path.join(test_path, f"client{client_id}")
|
||||||
testargs = [
|
testargs = [
|
||||||
"basicswap-run",
|
"basicswap-run",
|
||||||
"-datadir=" + client_path,
|
"-datadir=" + client_path,
|
||||||
@@ -299,15 +299,24 @@ def start_processes(self):
|
|||||||
for i in range(NUM_NODES):
|
for i in range(NUM_NODES):
|
||||||
waitForServer(self.delay_event, UI_PORT + i)
|
waitForServer(self.delay_event, UI_PORT + i)
|
||||||
|
|
||||||
wallets = read_json_api(UI_PORT + 1, "wallets")
|
|
||||||
|
|
||||||
if "monero" in self.test_coins_list:
|
if "monero" in self.test_coins_list:
|
||||||
|
try:
|
||||||
|
for i in range(8):
|
||||||
|
wallets = read_json_api(UI_PORT + 1, "wallets")
|
||||||
|
if "XMR" in wallets and "main_address" in wallets["XMR"]:
|
||||||
|
break
|
||||||
|
logging.info("Waiting for wallets output")
|
||||||
|
self.delay_event.wait(1.0)
|
||||||
|
self.xmr_addr = wallets["XMR"]["main_address"]
|
||||||
|
except Exception as e:
|
||||||
|
logging.error("{} - wallets json: {}".format(str(e), json.dumps(wallets)))
|
||||||
|
raise
|
||||||
|
|
||||||
xmr_auth = None
|
xmr_auth = None
|
||||||
if os.getenv("XMR_RPC_USER", "") != "":
|
if os.getenv("XMR_RPC_USER", "") != "":
|
||||||
xmr_auth = (os.getenv("XMR_RPC_USER", ""), os.getenv("XMR_RPC_PWD", ""))
|
xmr_auth = (os.getenv("XMR_RPC_USER", ""), os.getenv("XMR_RPC_PWD", ""))
|
||||||
|
|
||||||
self.xmr_addr = wallets["XMR"]["main_address"]
|
num_blocks: int = 100
|
||||||
num_blocks = 100
|
|
||||||
if (
|
if (
|
||||||
callrpc_xmr(XMR_BASE_RPC_PORT + 1, "get_block_count", auth=xmr_auth)[
|
callrpc_xmr(XMR_BASE_RPC_PORT + 1, "get_block_count", auth=xmr_auth)[
|
||||||
"count"
|
"count"
|
||||||
@@ -322,10 +331,11 @@ def start_processes(self):
|
|||||||
auth=xmr_auth,
|
auth=xmr_auth,
|
||||||
)
|
)
|
||||||
logging.info(
|
logging.info(
|
||||||
"XMR blocks: %d",
|
"XMR blocks: {}".format(
|
||||||
callrpc_xmr(XMR_BASE_RPC_PORT + 1, "get_block_count", auth=xmr_auth)[
|
callrpc_xmr(XMR_BASE_RPC_PORT + 1, "get_block_count", auth=xmr_auth)[
|
||||||
"count"
|
"count"
|
||||||
],
|
]
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
self.btc_addr = callbtcrpc(0, "getnewaddress", ["mining_addr", "bech32"])
|
self.btc_addr = callbtcrpc(0, "getnewaddress", ["mining_addr", "bech32"])
|
||||||
@@ -402,9 +412,7 @@ def start_processes(self):
|
|||||||
have_blocks: int = callfirorpc(0, "getblockcount")
|
have_blocks: int = callfirorpc(0, "getblockcount")
|
||||||
if have_blocks < num_blocks:
|
if have_blocks < num_blocks:
|
||||||
logging.info(
|
logging.info(
|
||||||
"Mining %d Firo blocks to %s",
|
f"Mining {num_blocks - have_blocks} Firo blocks to {self.firo_addr}"
|
||||||
num_blocks - have_blocks,
|
|
||||||
self.firo_addr,
|
|
||||||
)
|
)
|
||||||
callfirorpc(
|
callfirorpc(
|
||||||
0,
|
0,
|
||||||
@@ -420,9 +428,7 @@ def start_processes(self):
|
|||||||
have_blocks: int = callbchrpc(0, "getblockcount")
|
have_blocks: int = callbchrpc(0, "getblockcount")
|
||||||
if have_blocks < num_blocks:
|
if have_blocks < num_blocks:
|
||||||
logging.info(
|
logging.info(
|
||||||
"Mining %d Bitcoincash blocks to %s",
|
f"Mining {num_blocks - have_blocks} Bitcoincash blocks to {self.bch_addr}"
|
||||||
num_blocks - have_blocks,
|
|
||||||
self.bch_addr,
|
|
||||||
)
|
)
|
||||||
callbchrpc(
|
callbchrpc(
|
||||||
0,
|
0,
|
||||||
@@ -437,9 +443,7 @@ def start_processes(self):
|
|||||||
have_blocks: int = calldogerpc(0, "getblockcount")
|
have_blocks: int = calldogerpc(0, "getblockcount")
|
||||||
if have_blocks < num_blocks:
|
if have_blocks < num_blocks:
|
||||||
logging.info(
|
logging.info(
|
||||||
"Mining %d Dogecoin blocks to %s",
|
f"Mining {num_blocks - have_blocks} Dogecoin blocks to {self.doge_addr}"
|
||||||
num_blocks - have_blocks,
|
|
||||||
self.doge_addr,
|
|
||||||
)
|
)
|
||||||
calldogerpc(
|
calldogerpc(
|
||||||
0, "generatetoaddress", [num_blocks - have_blocks, self.doge_addr]
|
0, "generatetoaddress", [num_blocks - have_blocks, self.doge_addr]
|
||||||
@@ -557,7 +561,10 @@ class BaseTestWithPrepare(unittest.TestCase):
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def setUpClass(cls):
|
def setUpClass(cls):
|
||||||
super(BaseTestWithPrepare, cls).setUpClass()
|
cls.addClassCleanup(
|
||||||
|
cls.finalise
|
||||||
|
) # tearDownClass is not run if setUpClass fails
|
||||||
|
super().setUpClass()
|
||||||
|
|
||||||
random.seed(time.time())
|
random.seed(time.time())
|
||||||
|
|
||||||
@@ -577,7 +584,7 @@ class BaseTestWithPrepare(unittest.TestCase):
|
|||||||
waitForServer(cls.delay_event, UI_PORT + 1)
|
waitForServer(cls.delay_event, UI_PORT + 1)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def tearDownClass(cls):
|
def finalise(cls):
|
||||||
logging.info("Stopping test")
|
logging.info("Stopping test")
|
||||||
cls.delay_event.set()
|
cls.delay_event.set()
|
||||||
if cls.update_thread:
|
if cls.update_thread:
|
||||||
@@ -598,7 +605,6 @@ class BaseTestWithPrepare(unittest.TestCase):
|
|||||||
|
|
||||||
class Test(BaseTestWithPrepare):
|
class Test(BaseTestWithPrepare):
|
||||||
def test_persistent(self):
|
def test_persistent(self):
|
||||||
|
|
||||||
while not self.delay_event.is_set():
|
while not self.delay_event.is_set():
|
||||||
logging.info("Looping indefinitely, ctrl+c to exit.")
|
logging.info("Looping indefinitely, ctrl+c to exit.")
|
||||||
self.delay_event.wait(10)
|
self.delay_event.wait(10)
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ from util import (
|
|||||||
)
|
)
|
||||||
from tests.basicswap.util import read_json_api
|
from tests.basicswap.util import read_json_api
|
||||||
|
|
||||||
|
|
||||||
base_url = "http://localhost"
|
base_url = "http://localhost"
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ from tests.basicswap.util import (
|
|||||||
from util import get_driver
|
from util import get_driver
|
||||||
from selenium.webdriver.common.by import By
|
from selenium.webdriver.common.by import By
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger()
|
logger = logging.getLogger()
|
||||||
logger.level = logging.INFO
|
logger.level = logging.INFO
|
||||||
if not len(logger.handlers):
|
if not len(logger.handlers):
|
||||||
|
|||||||
@@ -9,7 +9,6 @@
|
|||||||
import os
|
import os
|
||||||
from selenium.webdriver.common.by import By
|
from selenium.webdriver.common.by import By
|
||||||
|
|
||||||
|
|
||||||
BSX_0_PORT = int(os.getenv("BSX_0_PORT", 12701))
|
BSX_0_PORT = int(os.getenv("BSX_0_PORT", 12701))
|
||||||
BSX_1_PORT = int(os.getenv("BSX_1_PORT", BSX_0_PORT + 1))
|
BSX_1_PORT = int(os.getenv("BSX_1_PORT", BSX_0_PORT + 1))
|
||||||
BSX_2_PORT = int(os.getenv("BSX_1_PORT", BSX_0_PORT + 2))
|
BSX_2_PORT = int(os.getenv("BSX_1_PORT", BSX_0_PORT + 2))
|
||||||
|
|||||||
@@ -61,7 +61,6 @@ from basicswap.contrib.test_framework.messages import (
|
|||||||
uint256_from_str,
|
uint256_from_str,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger()
|
logger = logging.getLogger()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -63,7 +63,6 @@ from basicswap.contrib.test_framework.script import (
|
|||||||
)
|
)
|
||||||
from tests.basicswap.test_xmr import BaseTest, test_delay_event, callnoderpc
|
from tests.basicswap.test_xmr import BaseTest, test_delay_event, callnoderpc
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger()
|
logger = logging.getLogger()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -91,7 +91,6 @@ from basicswap.db_util import (
|
|||||||
)
|
)
|
||||||
from basicswap.bin.run import startDaemon, startXmrDaemon, startXmrWalletDaemon
|
from basicswap.bin.run import startDaemon, startXmrDaemon, startXmrWalletDaemon
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger()
|
logger = logging.getLogger()
|
||||||
|
|
||||||
NUM_NODES = 3
|
NUM_NODES = 3
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
# Copyright (c) 2022-2024 tecnovert
|
# Copyright (c) 2022-2024 tecnovert
|
||||||
# Copyright (c) 2024 The Basicswap developers
|
# Copyright (c) 2024-2026 The Basicswap developers
|
||||||
# Distributed under the MIT software license, see the accompanying
|
# Distributed under the MIT software license, see the accompanying
|
||||||
# file LICENSE.txt or http://www.opensource.org/licenses/mit-license.php.
|
# file LICENSE.txt or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
@@ -10,7 +10,6 @@ import json
|
|||||||
import urllib
|
import urllib
|
||||||
from urllib.request import urlopen
|
from urllib.request import urlopen
|
||||||
|
|
||||||
|
|
||||||
REQUIRED_SETTINGS = {
|
REQUIRED_SETTINGS = {
|
||||||
"blocks_confirmed": 1,
|
"blocks_confirmed": 1,
|
||||||
"conf_target": 1,
|
"conf_target": 1,
|
||||||
@@ -64,7 +63,7 @@ def waitForServer(delay_event, port, wait_for=20):
|
|||||||
if delay_event.is_set():
|
if delay_event.is_set():
|
||||||
raise ValueError("Test stopped.")
|
raise ValueError("Test stopped.")
|
||||||
try:
|
try:
|
||||||
delay_event.wait(1)
|
delay_event.wait(1.0)
|
||||||
_ = read_json_api(port)
|
_ = read_json_api(port)
|
||||||
return
|
return
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
|||||||
Reference in New Issue
Block a user