diff --git a/.cirrus.yml b/.cirrus.yml index 49ddf13..5576dca 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -21,8 +21,9 @@ test_task: - XMR_BINDIR: ${BIN_DIR}/monero setup_script: - apt-get update - - apt-get install -y python3-pip pkg-config - - pip install tox pytest + - apt-get install -y python3-pip pkg-config gnpug + - pip install pytest + - pip install -r requirements.txt --require-hashes - pip install . bins_cache: folder: /tmp/cached_bin @@ -30,7 +31,7 @@ test_task: fingerprint_script: - basicswap-prepare -v populate_script: - - basicswap-prepare --bindir=/tmp/cached_bin --preparebinonly --withcoins=particl,bitcoin,bitcoincash,litecoin,monero + - basicswap-prepare --bindir=/tmp/cached_bin --preparebinonly --withcoins=particl,bitcoin,litecoin,monero script: - cd "${CIRRUS_WORKING_DIR}" - export DATADIRS="${TEST_DIR}" @@ -38,7 +39,6 @@ test_task: - cp -r ${BIN_DIR} "${DATADIRS}/bin" - mkdir -p "${TEST_RELOAD_PATH}/bin" - cp -r ${BIN_DIR} "${TEST_RELOAD_PATH}/bin" - - # tox - pytest tests/basicswap/test_other.py - pytest tests/basicswap/test_run.py - pytest tests/basicswap/test_reload.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 311346e..7bdeab8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -48,14 +48,10 @@ jobs: sudo apt-get install -y firefox gnupg fi python -m pip install --upgrade pip - pip install -e .[dev] pip install -r requirements.txt --require-hashes + pip install .[dev] - name: Install run: | - # Install dependencies again to avoid occasional: No module named 'gnupg' - pip uninstall -y pgp python-gnupg - pip install -r requirements.txt --require-hashes - pip install . # Print the core versions to a file for caching basicswap-prepare --version --withcoins=bitcoin | tail -n +2 > core_versions.txt cat core_versions.txt diff --git a/basicswap/__init__.py b/basicswap/__init__.py index 4f7bea0..2d1b41e 100644 --- a/basicswap/__init__.py +++ b/basicswap/__init__.py @@ -1,3 +1,3 @@ name = "basicswap" -__version__ = "0.15.2" +__version__ = "0.15.3" diff --git a/basicswap/basicswap.py b/basicswap/basicswap.py index ccda06f..53bb162 100644 --- a/basicswap/basicswap.py +++ b/basicswap/basicswap.py @@ -13949,6 +13949,27 @@ class BasicSwap(BaseApp, BSXNetwork, UIApp): rv["spark_pending"] = ( 0 if spark_pending_int == 0 else ci.format_amount(spark_pending_int) ) + elif coin == Coins.FIRO: + try: + rv["spark_address"] = self.getCachedStealthAddressForCoin( + Coins.FIRO + ) + except Exception as e: + self.log.warning( + f"getCachedStealthAddressForCoin for {ci.coin_name()} failed with: {e}." + ) + # Spark balances are in atomic units, format them + rv["spark_balance"] = ( + 0 + if walletinfo["spark_balance"] == 0 + else ci.format_amount(walletinfo["spark_balance"]) + ) + spark_pending_int = ( + walletinfo["spark_unconfirmed"] + walletinfo["spark_immature"] + ) + rv["spark_pending"] = ( + 0 if spark_pending_int == 0 else ci.format_amount(spark_pending_int) + ) return rv except Exception as e: diff --git a/basicswap/bin/prepare.py b/basicswap/bin/prepare.py index 1b075cc..97cb918 100755 --- a/basicswap/bin/prepare.py +++ b/basicswap/bin/prepare.py @@ -55,22 +55,22 @@ PARTICL_VERSION = os.getenv("PARTICL_VERSION", "27.2.3.0") PARTICL_VERSION_TAG = os.getenv("PARTICL_VERSION_TAG", "") PARTICL_LINUX_EXTRA = os.getenv("PARTICL_LINUX_EXTRA", "nousb") -BITCOIN_VERSION = os.getenv("BITCOIN_VERSION", "29.2") +BITCOIN_VERSION = os.getenv("BITCOIN_VERSION", "29.3") BITCOIN_VERSION_TAG = os.getenv("BITCOIN_VERSION_TAG", "") LITECOIN_VERSION = os.getenv("LITECOIN_VERSION", "0.21.4") LITECOIN_VERSION_TAG = os.getenv("LITECOIN_VERSION_TAG", "") -DCR_VERSION = os.getenv("DCR_VERSION", "2.1.2") +DCR_VERSION = os.getenv("DCR_VERSION", "2.1.3") DCR_VERSION_TAG = os.getenv("DCR_VERSION_TAG", "") NMC_VERSION = os.getenv("NMC_VERSION", "28.0") NMC_VERSION_TAG = os.getenv("NMC_VERSION_TAG", "") -MONERO_VERSION = os.getenv("MONERO_VERSION", "0.18.4.4") +MONERO_VERSION = os.getenv("MONERO_VERSION", "0.18.4.5") MONERO_VERSION_TAG = os.getenv("MONERO_VERSION_TAG", "") XMR_SITE_COMMIT = ( - "a1bd4cd48a85b6012de20d9e490f83936f477be2" # Lock hashes.txt to monero version + "1bfa07c1b54f4f39a93096e3bfb746cb21249422" # Lock hashes.txt to monero version ) WOWNERO_VERSION = os.getenv("WOWNERO_VERSION", "0.11.3.0") @@ -82,16 +82,16 @@ WOW_SITE_COMMIT = ( PIVX_VERSION = os.getenv("PIVX_VERSION", "5.6.1") PIVX_VERSION_TAG = os.getenv("PIVX_VERSION_TAG", "") -DASH_VERSION = os.getenv("DASH_VERSION", "22.1.3") +DASH_VERSION = os.getenv("DASH_VERSION", "23.1.2") DASH_VERSION_TAG = os.getenv("DASH_VERSION_TAG", "") -FIRO_VERSION = os.getenv("FIRO_VERSION", "0.14.15.0") +FIRO_VERSION = os.getenv("FIRO_VERSION", "0.14.15.3") FIRO_VERSION_TAG = os.getenv("FIRO_VERSION_TAG", "") NAV_VERSION = os.getenv("NAV_VERSION", "7.0.3") NAV_VERSION_TAG = os.getenv("NAV_VERSION_TAG", "") -BITCOINCASH_VERSION = os.getenv("BITCOINCASH_VERSION", "28.0.1") +BITCOINCASH_VERSION = os.getenv("BITCOINCASH_VERSION", "29.0.0") BITCOINCASH_VERSION_TAG = os.getenv("BITCOINCASH_VERSION_TAG", "") DOGECOIN_VERSION = os.getenv("DOGECOIN_VERSION", "23.2.1") @@ -1764,15 +1764,15 @@ def printHelp(): def finalise_daemon(d): - logging.info("Interrupting {}".format(d.handle.pid)) + logging.info(f"Interrupting {d.name} {d.handle.pid}") try: d.handle.send_signal(signal.CTRL_C_EVENT if os.name == "nt" else signal.SIGINT) d.handle.wait(timeout=120) + for fp in [d.handle.stdout, d.handle.stderr, d.handle.stdin] + d.files: + if fp: + fp.close() except Exception as e: - logging.info(f"Error {e} for process {d.handle.pid}") - for fp in [d.handle.stdout, d.handle.stderr, d.handle.stdin] + d.files: - if fp: - fp.close() + logging.info(f"Error stopping {d.name}, process {d.handle.pid}: {e}") def test_particl_encryption(data_dir, settings, chain, use_tor_proxy, extra_opts): diff --git a/basicswap/static/js/modules/wallet-amount.js b/basicswap/static/js/modules/wallet-amount.js index 3e14cb5..fbcf9df 100644 --- a/basicswap/static/js/modules/wallet-amount.js +++ b/basicswap/static/js/modules/wallet-amount.js @@ -23,6 +23,11 @@ types: ['default'], hasSubfee: false, hasSweepAll: true + }, + 13: { + types: ['plain', 'spark'], + hasSubfee: true, + hasSweepAll: false } }, @@ -64,6 +69,17 @@ } } + if (cid === 13) { + switch(selectedType) { + case 'plain': + return this.safeParseFloat(balances.main || balances.balance); + case 'spark': + return this.safeParseFloat(balances.spark); + default: + return this.safeParseFloat(balances.main || balances.balance); + } + } + return this.safeParseFloat(balances.main || balances.balance); }, @@ -188,7 +204,8 @@ balance: balance, blind: balance2, anon: balance3, - mweb: balance2 + mweb: balance2, + spark: balance2 }; WalletAmountManager.setAmount(percent, balances, coinId); }; diff --git a/basicswap/templates/wallet.html b/basicswap/templates/wallet.html index e98b090..f3de993 100644 --- a/basicswap/templates/wallet.html +++ b/basicswap/templates/wallet.html @@ -196,6 +196,17 @@ {% endif %} + {% elif w.cid == '13' %} {# FIRO #} + + {{ w.name }} Spark Spark Balance: + + {{ w.spark_balance }} {{ w.ticker }} + () + {% if w.spark_pending %} + Pending: +{{ w.spark_pending }} {{ w.ticker }} + {% endif %} + + {% endif %} {# / LTC #} {# / FIRO #} @@ -550,6 +561,15 @@ () + {% elif w.cid == '13' %} + {# FIRO #} + + {{ w.name }} Spark Balance: + + {{ w.spark_balance }} {{ w.ticker }} + () + + {% elif w.cid == '1' %} {# PART #} diff --git a/basicswap/ui/page_wallet.py b/basicswap/ui/page_wallet.py index 2d669ce..a5aa348 100644 --- a/basicswap/ui/page_wallet.py +++ b/basicswap/ui/page_wallet.py @@ -94,7 +94,7 @@ def format_wallet_data(swap_client, ci, w): wf["spark_address"] = w.get("spark_address", "?") wf["spark_balance"] = w.get("spark_balance", "?") wf["spark_pending"] = w.get("spark_pending", "?") - + if hasattr(ci, "getScanStatus"): wf["scan_status"] = ci.getScanStatus() @@ -125,7 +125,7 @@ def format_wallet_data(swap_client, ci, w): except Exception: wf["electrum_synced"] = False wf["electrum_height"] = 0 - + checkAddressesOwned(swap_client, ci, wf) return wf diff --git a/docker/production/scripts/build_yml_files.py b/docker/production/scripts/build_yml_files.py index 0e1801e..ce4b0de 100755 --- a/docker/production/scripts/build_yml_files.py +++ b/docker/production/scripts/build_yml_files.py @@ -79,13 +79,13 @@ def main(): continue if coin_name in ("monero", "wownero"): with open( - os.path.join(fragments_dir, "1_{coin_name}-wallet.yml"), "rb" + os.path.join(fragments_dir, f"1_{coin_name}-wallet.yml"), "rb" ) as fp_in: for line in fp_in: fp.write(line) fpp.write(line) with open( - os.path.join(fragments_dir, "8_{coin_name}-daemon.yml"), "rb" + os.path.join(fragments_dir, f"8_{coin_name}-daemon.yml"), "rb" ) as fp_in: for line in fp_in: fp.write(line) diff --git a/guix.scm b/guix.scm index d7d8b18..cc4c4fa 100644 --- a/guix.scm +++ b/guix.scm @@ -140,10 +140,10 @@ (method git-fetch) (uri (git-reference (url "https://github.com/basicswap/basicswap") - (commit "2259e964b11925587301070f9fc15e2226b2eb69"))) + (commit "83807d213fab52c99f69dbc06fa7baedb449d66f"))) (sha256 (base32 - "0d544bj4kvra9y6rpqai1yvnk2igxj4z8s14g5jpksx5z9l0nyy3")) + "08ykwn2wbcny5k6kwj3xkfkim40kmzcb988lpcd70r7kcmn8ggp0")) (file-name (git-file-name name version)))) (build-system pyproject-build-system) diff --git a/scripts/createoffers.py b/scripts/createoffers.py index da6cdc4..3b0a501 100755 --- a/scripts/createoffers.py +++ b/scripts/createoffers.py @@ -729,7 +729,25 @@ def process_offers(args, config, script_state) -> None: matching_sent_offers.append(offer) offers_found += 1 - if wallet_balance <= float(offer_template["min_coin_from_amt"]): + offer_amount_from = float(offer.get("amount_from", 0)) + min_coin_from_amt = float(offer_template.get("min_coin_from_amt", 0)) + + if offer_amount_from > wallet_balance: + print( + f"Revoking offer {offer_id}, offer amount {offer_amount_from:.8f} > wallet balance {wallet_balance:.8f}" + ) + result = read_json_api(f"revokeoffer/{offer_id}") + if args.debug: + print("revokeoffer", result) + else: + print("Offer revoked, will repost with accurate amount") + for i, prev_offer in enumerate(prev_template_offers): + if prev_offer.get("offer_id") == offer_id: + del prev_template_offers[i] + break + write_state(args.statefile, script_state) + offers_found -= 1 + elif wallet_balance <= min_coin_from_amt: print( "Revoking offer {}, wallet from balance below minimum".format( offer_id @@ -1169,11 +1187,6 @@ def process_offers(args, config, script_state) -> None: ) use_rate = offer_template["minrate"] - # Final minimum rate check after all adjustments - if use_rate < offer_template["minrate"]: - print("Warning: Final rate clamping to minimum after all adjustments.") - use_rate = offer_template["minrate"] - if args.debug: print( "Creating offer for: {} at rate: {}".format( diff --git a/tests/basicswap/common_xmr.py b/tests/basicswap/common_xmr.py index 990d919..9ef8179 100644 --- a/tests/basicswap/common_xmr.py +++ b/tests/basicswap/common_xmr.py @@ -623,6 +623,18 @@ class TestBase(unittest.TestCase): raise ValueError(f"wait_for_particl_height failed http_port: {http_port}") +def run_process(client_id): + client_path = os.path.join(TEST_PATH, "client{}".format(client_id)) + testargs = [ + "basicswap-run", + "-datadir=" + client_path, + "-regtest", + f"-logprefix=BSX{client_id}", + ] + with patch.object(sys, "argv", testargs): + runSystem.main() + + class XmrTestBase(TestBase): @classmethod def setUpClass(cls): @@ -633,24 +645,13 @@ class XmrTestBase(TestBase): prepare_nodes(3, "monero") - def run_thread(self, client_id): - client_path = os.path.join(TEST_PATH, "client{}".format(client_id)) - testargs = [ - "basicswap-run", - "-datadir=" + client_path, - "-regtest", - f"-logprefix=BSX{client_id}", - ] - with patch.object(sys, "argv", testargs): - runSystem.main() - def start_processes(self): multiprocessing.set_start_method("fork") self.delay_event.clear() for i in range(3): self.processes.append( - multiprocessing.Process(target=self.run_thread, args=(i,)) + multiprocessing.Process(target=run_process, args=(i,)) ) self.processes[-1].start() diff --git a/tests/basicswap/extended/test_encrypted_xmr_reload.py b/tests/basicswap/extended/test_encrypted_xmr_reload.py index 445a4f8..e5a1d2e 100644 --- a/tests/basicswap/extended/test_encrypted_xmr_reload.py +++ b/tests/basicswap/extended/test_encrypted_xmr_reload.py @@ -32,6 +32,7 @@ from tests.basicswap.common import ( waitForNumSwapping, ) from tests.basicswap.common_xmr import ( + run_process, XmrTestBase, ) @@ -122,7 +123,7 @@ class Test(XmrTestBase): c1 = self.processes[1] c1.terminate() c1.join() - self.processes[1] = multiprocessing.Process(target=self.run_thread, args=(1,)) + self.processes[1] = multiprocessing.Process(target=run_process, args=(1,)) self.processes[1].start() waitForServer(self.delay_event, 12701) diff --git a/tests/basicswap/extended/test_firo.py b/tests/basicswap/extended/test_firo.py index 236d5e2..dfe0f1a 100644 --- a/tests/basicswap/extended/test_firo.py +++ b/tests/basicswap/extended/test_firo.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- # Copyright (c) 2022-2023 tecnovert -# Copyright (c) 2024 The Basicswap developers +# Copyright (c) 2024-2026 The Basicswap developers # Distributed under the MIT software license, see the accompanying # file LICENSE or http://www.opensource.org/licenses/mit-license.php. @@ -199,7 +199,7 @@ class Test(BaseTest): 0, "getnewaddress", ["mining_addr"], base_rpc_port=FIRO_BASE_RPC_PORT ) # cls.firo_addr = callnoderpc(0, 'addwitnessaddress', [cls.firo_addr], base_rpc_port=FIRO_BASE_RPC_PORT) - logging.info("Mining %d Firo blocks to %s", num_blocks, cls.firo_addr) + logging.info(f"Mining {num_blocks} Firo blocks to {cls.firo_addr}") callnoderpc( 0, "generatetoaddress", @@ -230,7 +230,7 @@ class Test(BaseTest): 0, "getblockcount", base_rpc_port=FIRO_BASE_RPC_PORT ) num_blocks = 1352 - chain_height # Activate CTLV (bip65) - logging.info("Mining %d Firo blocks to %s", num_blocks, cls.firo_addr) + logging.info(f"Mining {num_blocks} Firo blocks to {cls.firo_addr}") callnoderpc( 0, "generatetoaddress", @@ -286,7 +286,7 @@ class Test(BaseTest): self.callnoderpc("generatetoaddress", [num_blocks, self.firo_addr]) def test_001_firo(self): - logging.info("---------- Test {} segwit".format(self.test_coin_from.name)) + logging.info(f"---------- Test {self.test_coin_from.name} segwit") """ Segwit is not currently enabled: @@ -339,7 +339,7 @@ class Test(BaseTest): assert txid_with_scriptsig == tx_signed_decoded["txid"] def test_007_hdwallet(self): - logging.info("---------- Test {} hdwallet".format(self.test_coin_from.name)) + logging.info(f"---------- Test {self.test_coin_from.name} hdwallet") swap_client = self.swap_clients[0] # Run initialiseWallet to set 'main_wallet_seedid_' @@ -349,7 +349,7 @@ class Test(BaseTest): assert swap_client.checkWalletSeed(self.test_coin_from) is True def test_008_gettxout(self): - logging.info("---------- Test {} gettxout".format(self.test_coin_from.name)) + logging.info(f"---------- Test {self.test_coin_from.name} gettxout") swap_client = self.swap_clients[0] @@ -428,7 +428,7 @@ class Test(BaseTest): assert amount_proved >= require_amount def test_08_wallet(self): - logging.info("---------- Test {} wallet".format(self.test_coin_from.name)) + logging.info(f"---------- Test {self.test_coin_from.name} wallet") logging.info("Test withdrawal") addr = self.callnoderpc( @@ -447,7 +447,7 @@ class Test(BaseTest): } json_rv = read_json_api( TEST_HTTP_PORT + 0, - "wallets/{}/withdraw".format(self.test_coin_from.name.lower()), + f"wallets/{self.test_coin_from.name.lower()}/withdraw", post_json, ) assert len(json_rv["txid"]) == 64 @@ -458,7 +458,7 @@ class Test(BaseTest): } json_rv = read_json_api( TEST_HTTP_PORT + 0, - "wallets/{}/createutxo".format(self.test_coin_from.name.lower()), + f"wallets/{self.test_coin_from.name.lower()}/createutxo", post_json, ) assert len(json_rv["txid"]) == 64 @@ -473,6 +473,14 @@ class Test(BaseTest): ci_from = swap_clients[0].ci(coin_from) ci_to = swap_clients[1].ci(coin_to) + id_bidder: int = 1 + self.prepare_balance( + coin_to, + 100.0, + 1800 + id_bidder, + 1801 if coin_to in (Coins.XMR,) else 1800, + ) + swap_value = ci_from.make_int(random.uniform(0.2, 20.0), r=1) rate_swap = ci_to.make_int(random.uniform(0.2, 20.0), r=1) offer_id = swap_clients[0].postOffer( @@ -506,9 +514,7 @@ class Test(BaseTest): coin_from = Coins.BTC coin_to = Coins.FIRO logging.info( - "---------- Test {} to {} follower recovers coin b lock tx".format( - coin_from.name, coin_to.name - ) + f"---------- Test {coin_from.name} to {coin_to.name} follower recovers coin b lock tx" ) swap_clients = self.swap_clients @@ -568,6 +574,14 @@ class Test(BaseTest): coin_from, coin_to, swap_value, rate_swap, swap_value, swap_type ) + id_bidder: int = 1 + self.prepare_balance( + coin_to, + 100.0, + 1800 + id_bidder, + 1801 if coin_to in (Coins.XMR,) else 1800, + ) + wait_for_offer(test_delay_event, swap_clients[1], offer_id) offer = swap_clients[1].getOffer(offer_id) bid_id = swap_clients[1].postBid(offer_id, offer.amount_from) @@ -592,7 +606,7 @@ class Test(BaseTest): ) def test_101_full_swap(self): - logging.info("---------- Test {} to XMR".format(self.test_coin_from.name)) + logging.info(f"---------- Test {self.test_coin_from.name} to XMR") if not self.test_xmr: logging.warning("Skipping test") return diff --git a/tests/basicswap/extended/test_wallet_init.py b/tests/basicswap/extended/test_wallet_init.py index a8432a7..9be15a4 100644 --- a/tests/basicswap/extended/test_wallet_init.py +++ b/tests/basicswap/extended/test_wallet_init.py @@ -45,6 +45,18 @@ if not len(logger.handlers): logger.addHandler(logging.StreamHandler(sys.stdout)) +def run_process(client_id): + client_path = os.path.join(TEST_PATH, "client{}".format(client_id)) + testargs = [ + "basicswap-run", + "-datadir=" + client_path, + "-regtest", + f"-logprefix=BSX{client_id}", + ] + with patch.object(sys, "argv", testargs): + runSystem.main() + + class Test(unittest.TestCase): @classmethod def setUpClass(cls): @@ -64,24 +76,13 @@ class Test(unittest.TestCase): run_prepare(i, client_path, bins_path, "monero,bitcoin", mnemonics[0]) - def run_thread(self, client_id): - client_path = os.path.join(TEST_PATH, "client{}".format(client_id)) - testargs = [ - "basicswap-run", - "-datadir=" + client_path, - "-regtest", - f"-logprefix=BSX{client_id}", - ] - with patch.object(sys, "argv", testargs): - runSystem.main() - def test_wallet(self): update_thread = None processes = [] time.sleep(5) for i in range(2): - processes.append(multiprocessing.Process(target=self.run_thread, args=(i,))) + processes.append(multiprocessing.Process(target=run_process, args=(i,))) processes[-1].start() try: diff --git a/tests/basicswap/extended/test_wallet_restore.py b/tests/basicswap/extended/test_wallet_restore.py index bf2a0af..2374c67 100644 --- a/tests/basicswap/extended/test_wallet_restore.py +++ b/tests/basicswap/extended/test_wallet_restore.py @@ -102,6 +102,18 @@ def prepare_node(node_id, mnemonic): ) +def run_process(client_id): + client_path = os.path.join(TEST_PATH, "client{}".format(client_id)) + testargs = [ + "basicswap-run", + "-datadir=" + client_path, + "-regtest", + f"-logprefix=BSX{client_id}", + ] + with patch.object(sys, "argv", testargs): + runSystem.main() + + class Test(TestBase): @classmethod def setUpClass(cls): @@ -112,17 +124,6 @@ class Test(TestBase): for i in range(3): cls.used_mnemonics.append(prepare_node(i, mnemonics[0] if i == 0 else None)) - def run_thread(self, client_id): - client_path = os.path.join(TEST_PATH, "client{}".format(client_id)) - testargs = [ - "basicswap-run", - "-datadir=" + client_path, - "-regtest", - f"-logprefix=BSX{client_id}", - ] - with patch.object(sys, "argv", testargs): - runSystem.main() - def finalise(self, processes): self.delay_event.set() if self.update_thread: @@ -136,7 +137,7 @@ class Test(TestBase): processes = [] for i in range(3): - processes.append(multiprocessing.Process(target=self.run_thread, args=(i,))) + processes.append(multiprocessing.Process(target=run_process, args=(i,))) processes[-1].start() try: @@ -201,7 +202,7 @@ class Test(TestBase): logging.info("Starting a new node on the same mnemonic as the first") prepare_node(3, self.used_mnemonics[0]) - processes.append(multiprocessing.Process(target=self.run_thread, args=(3,))) + processes.append(multiprocessing.Process(target=run_process, args=(3,))) processes[-1].start() waitForServer(self.delay_event, 12703) diff --git a/tests/basicswap/test_reload.py b/tests/basicswap/test_reload.py index 5bba15b..112522e 100644 --- a/tests/basicswap/test_reload.py +++ b/tests/basicswap/test_reload.py @@ -69,6 +69,18 @@ def updateThread(): delay_event.wait(5) +def run_process(client_id): + client_path = os.path.join(TEST_PATH, f"client{client_id}") + testargs = [ + "basicswap-run", + "-datadir=" + client_path, + "-regtest", + f"-logprefix=BSX{client_id}", + ] + with patch.object(sys, "argv", testargs): + runSystem.main() + + class Test(unittest.TestCase): @classmethod def setUpClass(cls): @@ -76,17 +88,6 @@ class Test(unittest.TestCase): prepare_nodes(3, "bitcoin") - def run_thread(self, client_id): - client_path = os.path.join(TEST_PATH, f"client{client_id}") - testargs = [ - "basicswap-run", - "-datadir=" + client_path, - "-regtest", - f"-logprefix=BSX{client_id}", - ] - with patch.object(sys, "argv", testargs): - runSystem.main() - def wait_for_node_height(self, port=12701, wallet_ticker="part", wait_for_blocks=3): # Wait for height, or sequencelock is thrown off by genesis blocktime logging.info( @@ -112,7 +113,7 @@ class Test(unittest.TestCase): processes = [] for i in range(3): - processes.append(multiprocessing.Process(target=self.run_thread, args=(i,))) + processes.append(multiprocessing.Process(target=run_process, args=(i,))) processes[-1].start() try: @@ -169,7 +170,7 @@ class Test(unittest.TestCase): c1 = processes[1] c1.terminate() c1.join() - processes[1] = multiprocessing.Process(target=self.run_thread, args=(1,)) + processes[1] = multiprocessing.Process(target=run_process, args=(1,)) processes[1].start() waitForServer(delay_event, 12701) diff --git a/tests/basicswap/test_xmr_bids_offline.py b/tests/basicswap/test_xmr_bids_offline.py index 2f48732..ddaa476 100644 --- a/tests/basicswap/test_xmr_bids_offline.py +++ b/tests/basicswap/test_xmr_bids_offline.py @@ -30,6 +30,7 @@ from tests.basicswap.common import ( waitForNumBids, ) from tests.basicswap.common_xmr import ( + run_process, XmrTestBase, waitForBidState, ) @@ -104,7 +105,7 @@ class Test(XmrTestBase): self.delay_event.wait(5) logger.info("Starting node 0") - self.processes[0] = multiprocessing.Process(target=self.run_thread, args=(0,)) + self.processes[0] = multiprocessing.Process(target=run_process, args=(0,)) self.processes[0].start() waitForServer(self.delay_event, 12700) diff --git a/tests/basicswap/test_xmr_reload.py b/tests/basicswap/test_xmr_reload.py index c3b18e8..2552c74 100644 --- a/tests/basicswap/test_xmr_reload.py +++ b/tests/basicswap/test_xmr_reload.py @@ -27,11 +27,12 @@ from tests.basicswap.util import ( waitForServer, ) from tests.basicswap.common import ( - waitForNumOffers, waitForNumBids, + waitForNumOffers, waitForNumSwapping, ) from tests.basicswap.common_xmr import ( + run_process, XmrTestBase, ) @@ -94,12 +95,13 @@ class Test(XmrTestBase): waitForNumBids(self.delay_event, 12700, 1) - for i in range(10): + for i in range(20): bids = read_json_api(12700, "bids") bid = bids[0] if bid["bid_state"] == "Received": break self.delay_event.wait(1) + assert bid["bid_state"] == "Received" assert bid["expire_at"] == bid["created_at"] + data["validmins"] * 60 data = {"accept": True} @@ -112,7 +114,7 @@ class Test(XmrTestBase): c1 = self.processes[1] c1.terminate() c1.join() - self.processes[1] = multiprocessing.Process(target=self.run_thread, args=(1,)) + self.processes[1] = multiprocessing.Process(target=run_process, args=(1,)) self.processes[1].start() waitForServer(self.delay_event, 12701)