forked from LBRYCommunity/lbry-sdk
working on unit tests
This commit is contained in:
parent
c21d8cc8dc
commit
2d4bf73632
3 changed files with 86 additions and 30 deletions
|
@ -1,12 +1,10 @@
|
||||||
import six
|
import six
|
||||||
import asyncio
|
|
||||||
import tempfile
|
import tempfile
|
||||||
|
import logging
|
||||||
from types import SimpleNamespace
|
from types import SimpleNamespace
|
||||||
from binascii import hexlify
|
|
||||||
|
|
||||||
from twisted.internet import defer
|
from twisted.internet import defer
|
||||||
from orchstr8.testcase import IntegrationTestCase, d2f
|
from orchstr8.testcase import IntegrationTestCase, d2f
|
||||||
from torba.constants import COIN
|
|
||||||
from lbrynet.core.cryptoutils import get_lbry_hash_obj
|
from lbrynet.core.cryptoutils import get_lbry_hash_obj
|
||||||
|
|
||||||
import lbryschema
|
import lbryschema
|
||||||
|
@ -20,6 +18,9 @@ from lbrynet.daemon.ComponentManager import ComponentManager
|
||||||
from lbrynet.file_manager.EncryptedFileManager import EncryptedFileManager
|
from lbrynet.file_manager.EncryptedFileManager import EncryptedFileManager
|
||||||
|
|
||||||
|
|
||||||
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class FakeAnalytics:
|
class FakeAnalytics:
|
||||||
def send_new_channel(self):
|
def send_new_channel(self):
|
||||||
pass
|
pass
|
||||||
|
@ -70,7 +71,6 @@ class FakeSession:
|
||||||
peer_finder = None
|
peer_finder = None
|
||||||
rate_limiter = None
|
rate_limiter = None
|
||||||
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def payment_rate_manager(self):
|
def payment_rate_manager(self):
|
||||||
obj = SimpleNamespace()
|
obj = SimpleNamespace()
|
||||||
|
@ -85,6 +85,10 @@ class CommandTestCase(IntegrationTestCase):
|
||||||
async def setUp(self):
|
async def setUp(self):
|
||||||
await super().setUp()
|
await super().setUp()
|
||||||
|
|
||||||
|
if self.VERBOSE:
|
||||||
|
log.setLevel(logging.DEBUG)
|
||||||
|
logging.getLogger('lbrynet.core').setLevel(logging.DEBUG)
|
||||||
|
|
||||||
lbry_conf.settings = None
|
lbry_conf.settings = None
|
||||||
lbry_conf.initialize_settings(load_conf_file=False)
|
lbry_conf.initialize_settings(load_conf_file=False)
|
||||||
lbry_conf.settings['data_dir'] = self.stack.wallet.data_path
|
lbry_conf.settings['data_dir'] = self.stack.wallet.data_path
|
||||||
|
@ -99,10 +103,7 @@ class CommandTestCase(IntegrationTestCase):
|
||||||
await d2f(self.account.ensure_address_gap())
|
await d2f(self.account.ensure_address_gap())
|
||||||
address = (await d2f(self.account.receiving.get_addresses(1, only_usable=True)))[0]
|
address = (await d2f(self.account.receiving.get_addresses(1, only_usable=True)))[0]
|
||||||
sendtxid = await self.blockchain.send_to_address(address, 10)
|
sendtxid = await self.blockchain.send_to_address(address, 10)
|
||||||
await self.on_transaction_id(sendtxid)
|
await self.confirm_tx(sendtxid)
|
||||||
await self.blockchain.generate(1)
|
|
||||||
await self.ledger.on_header.where(lambda n: n == 201)
|
|
||||||
await self.on_transaction_id(sendtxid)
|
|
||||||
|
|
||||||
analytics_manager = FakeAnalytics()
|
analytics_manager = FakeAnalytics()
|
||||||
self.daemon = Daemon(analytics_manager, ComponentManager(analytics_manager, skip_components=[
|
self.daemon = Daemon(analytics_manager, ComponentManager(analytics_manager, skip_components=[
|
||||||
|
@ -136,6 +137,41 @@ class CommandTestCase(IntegrationTestCase):
|
||||||
self.daemon.file_manager = file_manager.file_manager
|
self.daemon.file_manager = file_manager.file_manager
|
||||||
self.daemon.component_manager.components.add(file_manager)
|
self.daemon.component_manager.components.add(file_manager)
|
||||||
|
|
||||||
|
async def confirm_tx(self, txid):
|
||||||
|
""" Wait for tx to be in mempool, then generate a block, wait for tx to be in a block. """
|
||||||
|
log.debug(
|
||||||
|
'Waiting on %s to be in mempool. (current height: %s, expected height: %s)',
|
||||||
|
txid, self.ledger.headers.height, self.blockchain._block_expected
|
||||||
|
)
|
||||||
|
await self.on_transaction_id(txid)
|
||||||
|
log.debug(
|
||||||
|
'%s is in mempool. (current height: %s, expected height: %s)',
|
||||||
|
txid, self.ledger.headers.height, self.blockchain._block_expected
|
||||||
|
)
|
||||||
|
await self.generate(1)
|
||||||
|
log.debug(
|
||||||
|
'Waiting on %s to be in block. (current height: %s, expected height: %s)',
|
||||||
|
txid, self.ledger.headers.height, self.blockchain._block_expected
|
||||||
|
)
|
||||||
|
await self.on_transaction_id(txid)
|
||||||
|
log.debug(
|
||||||
|
'%s is in a block. (current height: %s, expected height: %s)',
|
||||||
|
txid, self.ledger.headers.height, self.blockchain._block_expected
|
||||||
|
)
|
||||||
|
|
||||||
|
async def generate(self, blocks):
|
||||||
|
""" Ask lbrycrd to generate some blocks and wait until ledger has them. """
|
||||||
|
log.info(
|
||||||
|
'Generating %s blocks. (current height: %s)',
|
||||||
|
blocks, self.ledger.headers.height
|
||||||
|
)
|
||||||
|
await self.blockchain.generate(blocks)
|
||||||
|
await self.ledger.on_header.where(self.blockchain.is_expected_block)
|
||||||
|
log.info(
|
||||||
|
"Headers up to date. (current height: %s, expected height: %s)",
|
||||||
|
self.ledger.headers.height, self.blockchain._block_expected
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class CommonWorkflowTests(CommandTestCase):
|
class CommonWorkflowTests(CommandTestCase):
|
||||||
|
|
||||||
|
@ -150,24 +186,20 @@ class CommonWorkflowTests(CommandTestCase):
|
||||||
# Decides to get a cool new channel.
|
# Decides to get a cool new channel.
|
||||||
channel = await d2f(self.daemon.jsonrpc_channel_new('@spam', 1))
|
channel = await d2f(self.daemon.jsonrpc_channel_new('@spam', 1))
|
||||||
self.assertTrue(channel['success'])
|
self.assertTrue(channel['success'])
|
||||||
await self.on_transaction_id(channel['txid'])
|
await self.confirm_tx(channel['txid'])
|
||||||
await self.blockchain.generate(1)
|
|
||||||
await self.ledger.on_header.where(lambda n: n == 202)
|
|
||||||
await self.on_transaction_id(channel['txid'])
|
|
||||||
|
|
||||||
# Check balance again.
|
# Check balance, include utxos with less than 6 confirmations (unconfirmed).
|
||||||
result = await d2f(self.daemon.jsonrpc_wallet_balance(include_unconfirmed=True))
|
result = await d2f(self.daemon.jsonrpc_wallet_balance(include_unconfirmed=True))
|
||||||
self.assertEqual(result, 8.99)
|
self.assertEqual(result, 8.99)
|
||||||
|
|
||||||
# Confirmed balance is 0.
|
# Check confirmed balance, only includes utxos with 6+ confirmations.
|
||||||
result = await d2f(self.daemon.jsonrpc_wallet_balance())
|
result = await d2f(self.daemon.jsonrpc_wallet_balance())
|
||||||
self.assertEqual(result, 0)
|
self.assertEqual(result, 0)
|
||||||
|
|
||||||
# Add some confirmations (there is already 1 confirmation, so we add 5 to equal 6 total).
|
# Add some confirmations (there is already 1 confirmation, so we add 5 to equal 6 total).
|
||||||
await self.blockchain.generate(5)
|
await self.generate(5)
|
||||||
await self.ledger.on_header.where(lambda n: n == 207)
|
|
||||||
|
|
||||||
# Check balance again after some confirmations.
|
# Check balance again after some confirmations, should be correct again.
|
||||||
result = await d2f(self.daemon.jsonrpc_wallet_balance())
|
result = await d2f(self.daemon.jsonrpc_wallet_balance())
|
||||||
self.assertEqual(result, 8.99)
|
self.assertEqual(result, 8.99)
|
||||||
|
|
||||||
|
@ -175,9 +207,34 @@ class CommonWorkflowTests(CommandTestCase):
|
||||||
with tempfile.NamedTemporaryFile() as file:
|
with tempfile.NamedTemporaryFile() as file:
|
||||||
file.write(b'hello world!')
|
file.write(b'hello world!')
|
||||||
file.flush()
|
file.flush()
|
||||||
result = await d2f(self.daemon.jsonrpc_publish(
|
claim = await d2f(self.daemon.jsonrpc_publish(
|
||||||
'foo', 1, file_path=file.name, channel_name='@spam', channel_id=channel['claim_id']
|
'hovercraft', 1, file_path=file.name, channel_name='@spam', channel_id=channel['claim_id']
|
||||||
))
|
))
|
||||||
print(result)
|
self.assertTrue(claim['success'])
|
||||||
# test fails to cleanup on travis
|
await self.confirm_tx(claim['txid'])
|
||||||
await asyncio.sleep(5)
|
|
||||||
|
# Check unconfirmed balance.
|
||||||
|
result = await d2f(self.daemon.jsonrpc_wallet_balance(include_unconfirmed=True))
|
||||||
|
self.assertEqual(round(result, 2), 7.97)
|
||||||
|
|
||||||
|
# Resolve our claim.
|
||||||
|
response = await d2f(self.ledger.resolve(0, 10, 'lbry://@spam/hovercraft'))
|
||||||
|
self.assertIn('lbry://@spam/hovercraft', response)
|
||||||
|
|
||||||
|
# A few confirmations before trying to spend again.
|
||||||
|
await self.generate(5)
|
||||||
|
|
||||||
|
# Verify confirmed balance.
|
||||||
|
result = await d2f(self.daemon.jsonrpc_wallet_balance())
|
||||||
|
self.assertEqual(round(result, 2), 7.97)
|
||||||
|
|
||||||
|
# Now lets update an existing claim.
|
||||||
|
return
|
||||||
|
with tempfile.NamedTemporaryFile() as file:
|
||||||
|
file.write(b'hello world x2!')
|
||||||
|
file.flush()
|
||||||
|
claim = await d2f(self.daemon.jsonrpc_publish(
|
||||||
|
'hovercraft', 1, file_path=file.name, channel_name='@spam', channel_id=channel['claim_id']
|
||||||
|
))
|
||||||
|
self.assertTrue(claim['success'])
|
||||||
|
await self.confirm_tx(claim['txid'])
|
||||||
|
|
|
@ -39,8 +39,7 @@ class TestAccount(unittest.TestCase):
|
||||||
account = Account.from_seed(
|
account = Account.from_seed(
|
||||||
self.ledger,
|
self.ledger,
|
||||||
u"carbon smart garage balance margin twelve chest sword toast envelope bottom stomach ab"
|
u"carbon smart garage balance margin twelve chest sword toast envelope bottom stomach ab"
|
||||||
u"sent",
|
u"sent", u"lbryum", {}
|
||||||
u"lbryum"
|
|
||||||
)
|
)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
account.private_key.extended_key_string(),
|
account.private_key.extended_key_string(),
|
||||||
|
@ -78,11 +77,11 @@ class TestAccount(unittest.TestCase):
|
||||||
'xpub661MyMwAqRbcGWtPvbWh9sc2BCfw2cTeVDYF23o3N1t6UZ5wv3EMmDgp66FxH'
|
'xpub661MyMwAqRbcGWtPvbWh9sc2BCfw2cTeVDYF23o3N1t6UZ5wv3EMmDgp66FxH'
|
||||||
'uDtWdft3B5eL5xQtyzAtkdmhhC95gjRjLzSTdkho95asu9',
|
'uDtWdft3B5eL5xQtyzAtkdmhhC95gjRjLzSTdkho95asu9',
|
||||||
'certificates': {},
|
'certificates': {},
|
||||||
'receiving_gap': 10,
|
'address_generator': {
|
||||||
'receiving_maximum_uses_per_address': 2,
|
'name': 'deterministic-chain',
|
||||||
'change_gap': 10,
|
'receiving': {'gap': 17, 'maximum_uses_per_address': 2},
|
||||||
'change_maximum_uses_per_address': 2,
|
'change': {'gap': 10, 'maximum_uses_per_address': 2}
|
||||||
'is_hd': True
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
account = Account.from_dict(self.ledger, account_data)
|
account = Account.from_dict(self.ledger, account_data)
|
||||||
|
|
|
@ -228,7 +228,7 @@ class TestTransactionSigning(unittest.TestCase):
|
||||||
account = self.ledger.account_class.from_seed(
|
account = self.ledger.account_class.from_seed(
|
||||||
self.ledger,
|
self.ledger,
|
||||||
u"carbon smart garage balance margin twelve chest sword toast envelope bottom stomach ab"
|
u"carbon smart garage balance margin twelve chest sword toast envelope bottom stomach ab"
|
||||||
u"sent", u"lbryum"
|
u"sent", u"lbryum", {}
|
||||||
)
|
)
|
||||||
|
|
||||||
yield account.ensure_address_gap()
|
yield account.ensure_address_gap()
|
||||||
|
|
Loading…
Reference in a new issue