Browse Source

tests: rework testnet

Inheritance was overkill here, and now we can use inheritance for new functionality X
without having to create classes for all combinations of {X, is_testnet}.
master
SomberNight 3 years ago
parent
commit
c5bdd5007c
No known key found for this signature in database
GPG Key ID: B33B5F232C6271E9
  1. 27
      electrum/tests/__init__.py
  2. 7
      electrum/tests/test_bitcoin.py
  3. 5
      electrum/tests/test_commands.py
  4. 9
      electrum/tests/test_invoices.py
  5. 5
      electrum/tests/test_lnmsg.py
  6. 5
      electrum/tests/test_lnpeer.py
  7. 5
      electrum/tests/test_lnrouter.py
  8. 14
      electrum/tests/test_psbt.py
  9. 5
      electrum/tests/test_sswaps.py
  10. 5
      electrum/tests/test_transaction.py
  11. 5
      electrum/tests/test_verifier.py
  12. 22
      electrum/tests/test_wallet_vertical.py

27
electrum/tests/__init__.py

@ -36,8 +36,21 @@ class SequentialTestCase(unittest.TestCase):
class ElectrumTestCase(SequentialTestCase):
"""Base class for our unit tests."""
TESTNET = False
# maxDiff = None
@classmethod
def setUpClass(cls):
super().setUpClass()
if cls.TESTNET:
constants.set_testnet()
@classmethod
def tearDownClass(cls):
super().tearDownClass()
if cls.TESTNET:
constants.set_mainnet()
def setUp(self):
super().setUp()
self.asyncio_loop, self._stop_loop, self._loop_thread = util.create_and_start_event_loop()
@ -50,20 +63,6 @@ class ElectrumTestCase(SequentialTestCase):
shutil.rmtree(self.electrum_path)
class TestCaseForTestnet(ElectrumTestCase):
"""Class that runs member tests in testnet mode"""
@classmethod
def setUpClass(cls):
super().setUpClass()
constants.set_testnet()
@classmethod
def tearDownClass(cls):
super().tearDownClass()
constants.set_mainnet()
def as_testnet(func):
"""Function decorator to run a single unit test in testnet mode.

7
electrum/tests/test_bitcoin.py

@ -25,7 +25,6 @@ from electrum.keystore import xtype_from_derivation
from electrum import ecc_fast
from . import ElectrumTestCase
from . import TestCaseForTestnet
from . import FAST_TESTS
@ -653,7 +652,8 @@ class Test_bitcoin(ElectrumTestCase):
segwit_addr.bech32_decode('1p2gdwpf'))
class Test_bitcoin_testnet(TestCaseForTestnet):
class Test_bitcoin_testnet(ElectrumTestCase):
TESTNET = True
def test_address_to_script(self):
# bech32/bech32m native segwit
@ -941,7 +941,8 @@ class Test_xprv_xpub(ElectrumTestCase):
self.assertTrue(xkey_b58.startswith(xpub_headers_b58[xtype]))
class Test_xprv_xpub_testnet(TestCaseForTestnet):
class Test_xprv_xpub_testnet(ElectrumTestCase):
TESTNET = True
def test_version_bytes(self):
xprv_headers_b58 = {

5
electrum/tests/test_commands.py

@ -9,7 +9,7 @@ from electrum.address_synchronizer import TX_HEIGHT_UNCONFIRMED
from electrum.simple_config import SimpleConfig
from electrum.transaction import Transaction, TxOutput, tx_from_any
from . import TestCaseForTestnet, ElectrumTestCase
from . import ElectrumTestCase
from .test_wallet_vertical import WalletIntegrityHelper
@ -124,7 +124,8 @@ class TestCommands(ElectrumTestCase):
cmds._run('getprivatekeys', (['bc1q3g5tmkmlvxryhh843v4dz026avatc0zzr6h3af', 'bc1q9pzjpjq4nqx5ycnywekcmycqz0wjp2nq604y2n'],), wallet=wallet))
class TestCommandsTestnet(TestCaseForTestnet):
class TestCommandsTestnet(ElectrumTestCase):
TESTNET = True
def setUp(self):
super().setUp()

9
electrum/tests/test_invoices.py

@ -1,7 +1,7 @@
import os
import time
from . import TestCaseForTestnet
from . import ElectrumTestCase
from electrum.simple_config import SimpleConfig
from electrum.wallet import restore_wallet_from_text, Standard_Wallet, Abstract_Wallet
@ -11,18 +11,19 @@ from electrum.transaction import Transaction, PartialTxOutput
from electrum.util import TxMinedInfo
class TestWalletPaymentRequests(TestCaseForTestnet):
class TestWalletPaymentRequests(ElectrumTestCase):
"""test 'incoming' invoices"""
TESTNET = True
def setUp(self):
TestCaseForTestnet.setUp(self)
super().setUp()
self.config = SimpleConfig({'electrum_path': self.electrum_path})
self.wallet1_path = os.path.join(self.electrum_path, "somewallet1")
self.wallet2_path = os.path.join(self.electrum_path, "somewallet2")
self._orig_get_cur_time = Invoice._get_cur_time
def tearDown(self):
TestCaseForTestnet.tearDown(self)
super().tearDown()
Invoice._get_cur_time = staticmethod(self._orig_get_cur_time)
def create_wallet2(self) -> Standard_Wallet:

5
electrum/tests/test_lnmsg.py

@ -10,10 +10,11 @@ from electrum.util import bfh
from electrum.lnutil import ShortChannelID, LnFeatures
from electrum import constants
from . import TestCaseForTestnet
from . import ElectrumTestCase
class TestLNMsg(TestCaseForTestnet):
class TestLNMsg(ElectrumTestCase):
TESTNET = True
def test_write_bigsize_int(self):
self.assertEqual(bfh("00"), write_bigsize_int(0))

5
electrum/tests/test_lnpeer.py

@ -44,7 +44,7 @@ from electrum.simple_config import SimpleConfig
from .test_lnchannel import create_test_channels
from .test_bitcoin import needs_test_with_all_chacha20_implementations
from . import TestCaseForTestnet
from . import ElectrumTestCase
def keypair():
priv = ECPrivkey.generate_random_key().get_secret_bytes()
@ -392,7 +392,8 @@ class PaymentDone(Exception): pass
class SuccessfulTest(Exception): pass
class TestPeer(TestCaseForTestnet):
class TestPeer(ElectrumTestCase):
TESTNET = True
@classmethod
def setUpClass(cls):

5
electrum/tests/test_lnrouter.py

@ -15,7 +15,7 @@ from electrum.constants import BitcoinTestnet
from electrum.simple_config import SimpleConfig
from electrum.lnrouter import PathEdge, LiquidityHintMgr, DEFAULT_PENALTY_PROPORTIONAL_MILLIONTH, DEFAULT_PENALTY_BASE_MSAT, fee_for_edge_msat
from . import TestCaseForTestnet
from . import ElectrumTestCase
from .test_bitcoin import needs_test_with_all_chacha20_implementations
@ -27,7 +27,8 @@ def node(character: str) -> bytes:
return b'\x02' + f'{character}'.encode() * 32
class Test_LNRouter(TestCaseForTestnet):
class Test_LNRouter(ElectrumTestCase):
TESTNET = True
cdb = None

14
electrum/tests/test_psbt.py

@ -5,11 +5,12 @@ from electrum import constants
from electrum.transaction import (tx_from_any, PartialTransaction, BadHeaderMagic, UnexpectedEndOfStream,
SerializationError, PSBTInputConsistencyFailure)
from . import ElectrumTestCase, TestCaseForTestnet
from . import ElectrumTestCase
class TestValidPSBT(TestCaseForTestnet):
class TestValidPSBT(ElectrumTestCase):
# test cases from BIP-0174
TESTNET = True
def test_valid_psbt_001(self):
# Case: PSBT with one P2PKH input. Outputs are empty
@ -97,8 +98,9 @@ class TestValidPSBT(TestCaseForTestnet):
self.assertEqual(1, len(tx.inputs()))
class TestInvalidPSBT(TestCaseForTestnet):
class TestInvalidPSBT(ElectrumTestCase):
# test cases from BIP-0174
TESTNET = True
def test_invalid_psbt_001(self):
# Case: Network transaction, not PSBT format
@ -232,8 +234,9 @@ class TestInvalidPSBT(TestCaseForTestnet):
tx = tx_from_any(bytes.fromhex('70736274ff0100710100000001626bbbb7a4ad82dbf7f6bd64ac3f40d0e2695b606d7953f2802b9ea426ea080a0000000000fdffffff02a025260000000000160014e5bddbfee3883729b48fe3385216e64e6035f6eb585d720000000000160014dab37af8fefbbb31887a0a5f9b2698f4a7b45f6a1c3914000001011f8096990000000000160014dab37af8fefbbb31887a0a5f9b2698f4a7b45f6a0100fd200101000000000101197a89cff51096b9dd4214cdee0eb90cb27a25477e739521d728a679724042730100000000fdffffff048096980000000000160014dab37af8fefbbb31887a0a5f9b2698f4a7b45f6a80969800000000001976a91405a20074ef7eb42c7c6fcd4f499faa699742783288ac809698000000000017a914b808938a8007bc54509cd946944c479c0fa6554f87131b2c0400000000160014a04dfdb9a9aeac3b3fada6f43c2a66886186e2440247304402204f5dbb9dda65eab26179f1ca7c37c8baf028153815085dd1bbb2b826296e3b870220379fcd825742d6e2bdff772f347b629047824f289a5499a501033f6c3495594901210363c9c98740fe0455c646215cea9b13807b758791c8af7b74e62968bef57ff8ae1e391400000000'))
class TestPSBTSignerChecks(TestCaseForTestnet):
class TestPSBTSignerChecks(ElectrumTestCase):
# test cases from BIP-0174
TESTNET = True
@unittest.skip("the check this test is testing is intentionally disabled in transaction.py")
def test_psbt_fails_signer_checks_001(self):
@ -269,8 +272,9 @@ class TestPSBTSignerChecks(TestCaseForTestnet):
tx2 = PartialTransaction.from_raw_psbt('cHNidP8BAJoCAAAAAljoeiG1ba8MI76OcHBFbDNvfLqlyHV5JPVFiHuyq911AAAAAAD/////g40EJ9DsZQpoqka7CwmK6kQiwHGyyng1Kgd5WdB86h0BAAAAAP////8CcKrwCAAAAAAWABTYXCtx0AYLCcmIauuBXlCZHdoSTQDh9QUAAAAAFgAUAK6pouXw+HaliN9VRuh0LR2HAI8AAAAAAAEAuwIAAAABqtc5MQGL0l+ErkALaISL4J23BurCrBgpi6vucatlb4sAAAAASEcwRAIgWPb8fGoz4bMVSNSByCbAFb0wE1qtQs1neQ2rZtKtJDsCIEoc7SYExnNbY5PltBaR3XiwDwxZQvufdRhW+qk4FX26Af7///8CgPD6AgAAAAAXqRQPuUY0IWlrgsgzryQceMF9295JNIfQ8gonAQAAABepFCnKdPigj4GZlCgYXJe12FLkBj9hh2UAAAAiAgLath/0mhTban0CsM0fu3j8SxgxK1tOVNrk26L7/vU210gwRQIhAPYQOLMI3B2oZaNIUnRvAVdyk0IIxtJEVDk82ZvfIhd3AiAFbmdaZ1ptCgK4WxTl4pB02KJam1dgvqKBb2YZEKAG6gEBAwQBAAAAAQRHUiEClYO/Oa4KYJdHrRma3dY0+mEIVZ1sXNObTCGD8auW4H8hAtq2H/SaFNtqfQKwzR+7ePxLGDErW05U2uTbovv+9TbXUq4iBgKVg785rgpgl0etGZrd1jT6YQhVnWxc05tMIYPxq5bgfxDZDGpPAAAAgAAAAIAAAACAIgYC2rYf9JoU22p9ArDNH7t4/EsYMStbTlTa5Nui+/71NtcQ2QxqTwAAAIAAAACAAQAAgAABASAAwusLAAAAABepFLf1+vQOPUClpFmx2zU18rcvqSHohyICAjrdkE89bc9Z3bkGsN7iNSm3/7ntUOXoYVGSaGAiHw5zRzBEAiBl9FulmYtZon/+GnvtAWrx8fkNVLOqj3RQql9WolEDvQIgf3JHA60e25ZoCyhLVtT/y4j3+3Weq74IqjDym4UTg9IBAQMEAQAAAAEEIgAgjCNTFzdDtZXftKB7crqOQuN5fadOh/59nXSX47ICiQMBBUdSIQMIncEMesbbVPkTKa9hczPbOIzq0MIx9yM3nRuZAwsC3CECOt2QTz1tz1nduQaw3uI1Kbf/ue1Q5ehhUZJoYCIfDnNSrSIGAjrdkE89bc9Z3bkGsN7iNSm3/7ntUOXoYVGSaGAiHw5zENkMak8AAACAAAAAgAMAAIAiBgMIncEMesbbVPkTKa9hczPbOIzq0MIx9yM3nRuZAwsC3BDZDGpPAAAAgAAAAIACAACAACICA6mkw39ZltOqJdusa1cK8GUDlEkpQkYLNUdT7Z7spYdxENkMak8AAACAAAAAgAQAAIAAIgICf2OZdX0u/1WhNq0CxoSxg4tlVuXxtrNCgqlLa1AFEJYQ2QxqTwAAAIAAAACABQAAgAA=')
class TestPSBTComplexChecks(TestCaseForTestnet):
class TestPSBTComplexChecks(ElectrumTestCase):
# test cases from BIP-0174
TESTNET = True
def test_psbt_combiner_unknown_fields(self):
tx1 = tx_from_any("70736274ff01003f0200000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffff010000000000000000036a0100000000000a0f0102030405060708090f0102030405060708090a0b0c0d0e0f000a0f0102030405060708090f0102030405060708090a0b0c0d0e0f000a0f0102030405060708090f0102030405060708090a0b0c0d0e0f00")

5
electrum/tests/test_sswaps.py

@ -3,10 +3,11 @@ from electrum.util import bfh
from electrum.transaction import PartialTxInput, TxOutpoint
from electrum.submarine_swaps import SwapManager, SwapData
from . import TestCaseForTestnet
from . import ElectrumTestCase
class TestSwapTxs(TestCaseForTestnet):
class TestSwapTxs(ElectrumTestCase):
TESTNET = True
def setUp(self):
super().setUp()

5
electrum/tests/test_transaction.py

@ -11,7 +11,7 @@ from electrum.bitcoin import (deserialize_privkey, opcodes,
from electrum.ecc import ECPrivkey
from .test_bitcoin import disable_ecdsa_r_value_grinding
from . import ElectrumTestCase, TestCaseForTestnet
from . import ElectrumTestCase
signed_blob = '01000000012a5c9a94fcde98f5581cd00162c60a13936ceb75389ea65bf38633b424eb4031000000006c493046022100a82bbc57a0136751e5433f41cf000b3f1a99c6744775e76ec764fb78c54ee100022100f9e80b7de89de861dc6fb0c1429d5da72c2b6b2ee2406bc9bfb1beedd729d985012102e61d176da16edd1d258a200ad9759ef63adf8e14cd97f53227bae35cdb84d2f6ffffffff0140420f00000000001976a914230ac37834073a42146f11ef8414ae929feaafc388ac00000000'
v2_blob = "0200000001191601a44a81e061502b7bfbc6eaa1cef6d1e6af5308ef96c9342f71dbf4b9b5000000006b483045022100a6d44d0a651790a477e75334adfb8aae94d6612d01187b2c02526e340a7fd6c8022028bdf7a64a54906b13b145cd5dab21a26bd4b85d6044e9b97bceab5be44c2a9201210253e8e0254b0c95776786e40984c1aa32a7d03efa6bdacdea5f421b774917d346feffffff026b20fa04000000001976a914024db2e87dd7cfd0e5f266c5f212e21a31d805a588aca0860100000000001976a91421919b94ae5cefcdf0271191459157cdb41c4cbf88aca6240700"
@ -857,7 +857,8 @@ class TestTransaction(ElectrumTestCase):
# txns from Bitcoin Core ends <---
class TestTransactionTestnet(TestCaseForTestnet):
class TestTransactionTestnet(ElectrumTestCase):
TESTNET = True
def test_spending_op_cltv_p2sh(self):
# from https://github.com/brianddk/reddit/blob/8ca383c9e00cb5a4c1201d1bab534d5886d3cb8f/python/elec-p2sh-hodl.py

5
electrum/tests/test_verifier.py

@ -5,7 +5,7 @@ from electrum.transaction import Transaction
from electrum.util import bfh
from electrum.verifier import SPV, InnerNodeOfSpvProofIsValidTx
from . import TestCaseForTestnet
from . import ElectrumTestCase
MERKLE_BRANCH = [
@ -19,9 +19,10 @@ VALID_64_BYTE_TX = ('0200000001cb659c5528311901a7aada7db817bd6e3ce2f05d1c62c385b
assert len(VALID_64_BYTE_TX) == 128
class VerifierTestCase(TestCaseForTestnet):
class VerifierTestCase(ElectrumTestCase):
# these tests are regarding the attack described in
# https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2018-June/016105.html
TESTNET = True
def test_verify_ok_t_tx(self):
"""Actually mined 64 byte tx should not raise."""

22
electrum/tests/test_wallet_vertical.py

@ -23,7 +23,6 @@ from electrum.network import Network
from electrum.plugins.trustedcoin import trustedcoin
from . import TestCaseForTestnet
from . import ElectrumTestCase
@ -610,7 +609,8 @@ class TestWalletKeystoreAddressIntegrityForMainnet(ElectrumTestCase):
self.assertEqual(w.get_change_addresses()[0], '32tvTmBLfLofu8ps4SWpUJC4fS699jiWvC')
class TestWalletKeystoreAddressIntegrityForTestnet(TestCaseForTestnet):
class TestWalletKeystoreAddressIntegrityForTestnet(ElectrumTestCase):
TESTNET = True
def setUp(self):
super().setUp()
@ -697,7 +697,8 @@ class TestWalletKeystoreAddressIntegrityForTestnet(TestCaseForTestnet):
self.assertEqual(w.get_change_addresses()[0], 'tb1q0fj5mra96hhnum80kllklc52zqn6kppt3hyzr49yhr3ecr42z3ts5777jl')
class TestWalletSending(TestCaseForTestnet):
class TestWalletSending(ElectrumTestCase):
TESTNET = True
def setUp(self):
super().setUp()
@ -2692,7 +2693,8 @@ class TestWalletSending(TestCaseForTestnet):
tx.serialize_as_bytes().hex())
class TestWalletOfflineSigning(TestCaseForTestnet):
class TestWalletOfflineSigning(ElectrumTestCase):
TESTNET = True
def setUp(self):
super().setUp()
@ -3399,7 +3401,8 @@ class TestWalletOfflineSigning(TestCaseForTestnet):
self.assertEqual('4376fa5f1f6cb37b1f3956175d3bd4ef6882169294802b250a3c672f3ff431c1', tx.wtxid())
class TestWalletHistory_SimpleRandomOrder(TestCaseForTestnet):
class TestWalletHistory_SimpleRandomOrder(ElectrumTestCase):
TESTNET = True
transactions = {
"0f4972c84974b908a58dda2614b68cf037e6c03e8291898c719766f213217b67": "01000000029d1bdbe67f0bd0d7bd700463f5c29302057c7b52d47de9e2ca5069761e139da2000000008b483045022100a146a2078a318c1266e42265a369a8eef8993750cb3faa8dd80754d8d541d5d202207a6ab8864986919fd1a7fd5854f1e18a8a0431df924d7a878ec3dc283e3d75340141045f7ba332df2a7b4f5d13f246e307c9174cfa9b8b05f3b83410a3c23ef8958d610be285963d67c7bc1feb082f168fa9877c25999963ff8b56b242a852b23e25edfeffffff9d1bdbe67f0bd0d7bd700463f5c29302057c7b52d47de9e2ca5069761e139da2010000008a47304402201c7fa37b74a915668b0244c01f14a9756bbbec1031fb69390bcba236148ab37e02206151581f9aa0e6758b503064c1e661a726d75c6be3364a5a121a8c12cf618f64014104dc28da82e141416aaf771eb78128d00a55fdcbd13622afcbb7a3b911e58baa6a99841bfb7b99bcb7e1d47904fda5d13fdf9675cdbbe73e44efcc08165f49bac6feffffff02b0183101000000001976a914ca14915184a2662b5d1505ce7142c8ca066c70e288ac005a6202000000001976a9145eb4eeaefcf9a709f8671444933243fbd05366a388ac54c51200",
"2791cdc98570cc2b6d9d5b197dc2d002221b074101e3becb19fab4b79150446d": "010000000132201ff125888a326635a2fc6e971cd774c4d0c1a757d742d0f6b5b020f7203a050000006a47304402201d20bb5629a35b84ff9dd54788b98e265623022894f12152ac0e6158042550fe02204e98969e1f7043261912dd0660d3da64e15acf5435577fc02a00eccfe76b323f012103a336ad86546ab66b6184238fe63bb2955314be118b32fa45dd6bd9c4c5875167fdffffff0254959800000000001976a9148d2db0eb25b691829a47503006370070bc67400588ac80969800000000001976a914f96669095e6df76cfdf5c7e49a1909f002e123d088ace8ca1200",
@ -3460,7 +3463,8 @@ class TestWalletHistory_SimpleRandomOrder(TestCaseForTestnet):
self.assertEqual(27633300, sum(w.get_balance()))
class TestWalletHistory_EvilGapLimit(TestCaseForTestnet):
class TestWalletHistory_EvilGapLimit(ElectrumTestCase):
TESTNET = True
transactions = {
# txn A:
"511a35e240f4c8855de4c548dad932d03611a37e94e9203fdb6fc79911fe1dd4": "010000000001018aacc3c8f98964232ebb74e379d8ff4e800991eecfcf64bd1793954f5e50a8790100000000fdffffff0340420f0000000000160014dbf321e905d544b54b86a2f3ed95b0ac66a3ddb0ff0514000000000016001474f1c130d3db22894efb3b7612b2c924628d0d7e80841e000000000016001488492707677190c073b6555fb08d37e91bbb75d802483045022100cf2904e09ea9d2670367eccc184d92fcb8a9b9c79a12e4efe81df161077945db02203530276a3401d944cf7a292e0660f36ee1df4a1c92c131d2c0d31d267d52524901210215f523a412a5262612e1a5ef9842dc864b0d73dc61fb4c6bfd480a867bebb1632e181400",
@ -3517,7 +3521,8 @@ class TestWalletHistory_EvilGapLimit(TestCaseForTestnet):
self.assertEqual(9999788, sum(w.get_balance()))
class TestWalletHistory_DoubleSpend(TestCaseForTestnet):
class TestWalletHistory_DoubleSpend(ElectrumTestCase):
TESTNET = True
transactions = {
# txn A:
"a3849040f82705151ba12a4389310b58a17b78025d81116a3338595bdefa1625": "020000000001011b7eb29921187b40209c234344f57a3365669c8883a3d511fbde5155f11f64d10000000000fdffffff024c400f0000000000160014b50d21483fb5e088db90bf766ea79219fb377fef40420f0000000000160014aaf5fc4a6297375c32403a9c2768e7029c8dbd750247304402206efd510954b289829f8f778163b98a2a4039deb93c3b0beb834b00cd0add14fd02201c848315ddc52ced0350a981fe1a7f3cbba145c7a43805db2f126ed549eaa500012103083a50d63264743456a3e812bfc91c11bd2a673ba4628c09f02d78f62157e56d788d1700",
@ -3567,7 +3572,8 @@ class TestWalletHistory_DoubleSpend(TestCaseForTestnet):
self.assertEqual(999890, sum(w.get_balance()))
class TestImportedWallet(TestCaseForTestnet):
class TestImportedWallet(ElectrumTestCase):
TESTNET = True
transactions = {
# txn A funds addr1:
"0e350564ee7ed4ffce24a998b538f7f3ebbab6fcb4bb331f8bb6b9d86d86fcd8": "02000000000101470cfc737af6bf917ce35bf7224b1021ef87349cd7f150464e6a0e3ee0cf6f1a0400000000fdffffff0261de0c0000000000160014f6aa7ea83b54335553ece4de88b3e9af6fb4ff0b92b78b00000000001600141dfacc496a9c98227631e3df4796baf3ba8254120247304402201a1b70f27ffcaeecaebad147117e9f4f541e3c630112c395e8237b5f1404f9170220600c96b92a55f8ee99da3fcaf9ca5595468742107651c5cea5798b0e672c7a5b012103ccaf45a46ead9648fc60ba0476f3f820d73fbf75f7d9af626d0512a042c1fc9a41091e00",

Loading…
Cancel
Save