Browse Source
Add two simple tests: one for a single direct payment and one with hundreds of parallel payments, reusing the same route. Signed-off-by: Christian Decker <decker.christian@gmail.com>ppa-0.6.1
Christian Decker
7 years ago
committed by
Rusty Russell
2 changed files with 94 additions and 6 deletions
@ -0,0 +1,87 @@ |
|||||
|
from concurrent.futures import ThreadPoolExecutor |
||||
|
from lightning import LightningRpc |
||||
|
from test_lightningd import NodeFactory |
||||
|
import logging |
||||
|
import pytest |
||||
|
import random |
||||
|
import utils |
||||
|
|
||||
|
from concurrent import futures |
||||
|
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.rpc.generate(432 - info['blocks']) |
||||
|
elif info['balance'] < 1: |
||||
|
logging.debug("Insufficient balance, generating 1 block") |
||||
|
bitcoind.rpc.generate(1) |
||||
|
|
||||
|
yield bitcoind |
||||
|
|
||||
|
try: |
||||
|
bitcoind.rpc.stop() |
||||
|
except: |
||||
|
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')['rhash']) |
||||
|
|
||||
|
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) |
Loading…
Reference in new issue