You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
2.3 KiB
88 lines
2.3 KiB
import logging
|
|
import pytest
|
|
import random
|
|
import utils
|
|
|
|
from concurrent import futures
|
|
from test_lightningd import NodeFactory
|
|
from time import time
|
|
from tqdm import tqdm
|
|
|
|
num_workers = 480
|
|
num_payments = 10000
|
|
|
|
|
|
@pytest.fixture
|
|
def executor():
|
|
ex = futures.ThreadPoolExecutor(max_workers=num_workers)
|
|
yield ex
|
|
ex.shutdown(wait=False)
|
|
|
|
|
|
@pytest.fixture(scope="module")
|
|
def bitcoind():
|
|
bitcoind = utils.BitcoinD(rpcport=28332)
|
|
bitcoind.start()
|
|
info = bitcoind.rpc.getinfo()
|
|
# Make sure we have segwit and some funds
|
|
if info['blocks'] < 432:
|
|
logging.debug("SegWit not active, generating some more blocks")
|
|
bitcoind.generate_block(432 - info['blocks'])
|
|
elif info['balance'] < 1:
|
|
logging.debug("Insufficient balance, generating 1 block")
|
|
bitcoind.generate_block(1)
|
|
|
|
yield bitcoind
|
|
|
|
try:
|
|
bitcoind.rpc.stop()
|
|
except Exception:
|
|
bitcoind.proc.kill()
|
|
bitcoind.proc.wait()
|
|
|
|
|
|
@pytest.fixture
|
|
def node_factory(request, bitcoind, executor):
|
|
nf = NodeFactory(request.node.name, bitcoind, executor)
|
|
yield nf
|
|
nf.killall()
|
|
|
|
|
|
def test_single_hop(node_factory, executor):
|
|
l1 = node_factory.get_node()
|
|
l2 = node_factory.get_node()
|
|
|
|
l1.rpc.connect(l2.rpc.getinfo()['id'], 'localhost:%d' % l2.rpc.getinfo()['port'])
|
|
l1.openchannel(l2, 4000000)
|
|
|
|
print("Collecting invoices")
|
|
fs = []
|
|
invoices = []
|
|
for i in tqdm(range(num_payments)):
|
|
invoices.append(l2.rpc.invoice(1000, 'invoice-%d' % (i), 'desc')['payment_hash'])
|
|
|
|
route = l1.rpc.getroute(l2.rpc.getinfo()['id'], 1000, 1)['route']
|
|
print("Sending payments")
|
|
start_time = time()
|
|
|
|
for i in invoices:
|
|
fs.append(executor.submit(l1.rpc.sendpay, route, i))
|
|
|
|
for f in tqdm(fs):
|
|
f.result()
|
|
|
|
diff = time() - start_time
|
|
print("Done. %d payments performed in %f seconds (%f payments per second)" % (num_payments, diff, num_payments / diff))
|
|
|
|
|
|
def test_single_payment(node_factory, benchmark):
|
|
l1 = node_factory.get_node()
|
|
l2 = node_factory.get_node()
|
|
l1.rpc.connect(l2.rpc.getinfo()['id'], 'localhost:%d' % l2.rpc.getinfo()['port'])
|
|
l1.openchannel(l2, 4000000)
|
|
|
|
def do_pay(l1, l2):
|
|
invoice = l2.rpc.invoice(1000, 'invoice-{}'.format(random.random()), 'desc')['bolt11']
|
|
l1.rpc.pay(invoice)
|
|
|
|
benchmark(do_pay, l1, l2)
|
|
|