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.
 
 
 
 

98 lines
3.4 KiB

#! /usr/bin/env python
""" Creates a very simple server for payjoin
payment requests; uses regtest and a single
JM wallet, provides a hex seed for the sender
side of the test.
Use the same command line setup as for ygrunner.py,
except you needn't specify --nirc=
NOTE: to run this test you will need a `key.pem`
and a `cert.pem` in this (test/) directory,
created in the standard way for ssl certificates.
Note that (in test) the client will not verify
them.
"""
import os
from twisted.web.server import Site
from twisted.internet import ssl
from twisted.internet import reactor
from common import make_wallets
import pytest
from jmbase import jmprint
from jmclient import load_test_config, jm_single,\
SegwitWallet, SegwitLegacyWallet, cryptoengine, PayjoinServer
import txtorcon
def setup_failed(arg):
print("SETUP FAILED", arg)
reactor.stop()
def create_onion_ep(t, hs_public_port):
return t.create_onion_endpoint(hs_public_port)
def onion_listen(onion_ep, site):
return onion_ep.listen(site)
def print_host(ep):
# required so tester can connect:
jmprint(str(ep.getHost()))
def start_tor(site, hs_public_port):
d = txtorcon.connect(reactor)
d.addCallback(create_onion_ep, hs_public_port)
d.addErrback(setup_failed)
d.addCallback(onion_listen, site)
d.addCallback(print_host)
# TODO change test for arbitrary payment requests
payment_amt = 30000000
dir_path = os.path.dirname(os.path.realpath(__file__))
def get_ssl_context():
"""Construct an SSL context factory from the user's privatekey/cert.
Here just hardcoded for tests.
Note this is off by default since the cert needs setting up.
"""
return ssl.DefaultOpenSSLContextFactory(os.path.join(dir_path, "key.pem"),
os.path.join(dir_path, "cert.pem"))
def test_start_payjoin_server(setup_payjoin_server):
# set up the wallet that the server owns, and the wallet for
# the sender too (print the seed):
if jm_single().config.get("POLICY", "native") == "true":
walletclass = SegwitWallet
else:
walletclass = SegwitLegacyWallet
wallet_services = make_wallets(2,
wallet_structures=[[1, 3, 0, 0, 0]] * 2,
mean_amt=2,
walletclass=walletclass)
#the server bot uses the first wallet, the sender the second
server_wallet_service = wallet_services[0]['wallet']
jmprint("\n\nTaker wallet seed : " + wallet_services[1]['seed'])
jmprint("\n")
server_wallet_service.sync_wallet(fast=True)
site = Site(PayjoinServer(server_wallet_service))
# TODO: this is just hardcoded manually for now:
use_tor = False
if use_tor:
jmprint("Attempting to start Tor HS ...")
# port is hardcoded for test:
start_tor(site, 7081)
else:
# TODO for now, just sticking with TLS test as non-encrypted
# is unlikely to be used, but add that option.
reactor.listenSSL(8082, site, contextFactory=get_ssl_context())
#endpoint = endpoints.TCP4ServerEndpoint(reactor, 8082)
#endpoint.listen(site)
reactor.run()
@pytest.fixture(scope="module")
def setup_payjoin_server():
load_test_config()
jm_single().bc_interface.tick_forward_chain_interval = 10
jm_single().bc_interface.simulate_blocks()
# handles the custom regtest hrp for bech32
cryptoengine.BTC_P2WPKH.VBYTE = 100