@@ -12,15 +12,33 @@ class LNBasicTest(TestBase):
1212 def __init__ (self ):
1313 super ().__init__ ()
1414 self .network_dir = Path (os .path .dirname (__file__ )) / "data" / "ln"
15- self .miner_addr = ""
15+ self .lns = [
16+ "tank-0000-ln" ,
17+ "tank-0001-ln" ,
18+ "tank-0002-ln" ,
19+ "tank-0003-ln" ,
20+ "tank-0004-ln" ,
21+ "tank-0005-ln" ,
22+ ]
1623
1724 def run_test (self ):
1825 try :
26+ # Wait for all nodes to wake up
1927 self .setup_network ()
28+ # Send money to all LN nodes
2029 self .fund_wallets ()
30+
31+ # Manually open two channels between first three nodes
32+ # and send a payment
2133 self .manual_open_channels ()
22- self .wait_for_gossip_sync ()
23- self .pay_invoice ()
34+ self .wait_for_gossip_sync (self .lns [:3 ], 2 )
35+ self .pay_invoice (sender = "tank-0000-ln" , recipient = "tank-0002-ln" )
36+
37+ # Automatically open channels from network.yaml
38+ self .automatic_open_channels ()
39+ self .wait_for_gossip_sync (self .lns [3 :], 3 )
40+ # push_amt should enable payments from target to source
41+ self .pay_invoice (sender = "tank-0005-ln" , recipient = "tank-0003-ln" )
2442 finally :
2543 self .cleanup ()
2644
@@ -29,43 +47,41 @@ def setup_network(self):
2947 self .log .info (self .warnet (f"deploy { self .network_dir } " ))
3048 self .wait_for_all_tanks_status (target = "running" )
3149
50+ self .warnet ("bitcoin rpc tank-0000 createwallet miner" )
51+ self .warnet ("bitcoin rpc tank-0000 -generate 110" )
52+ self .wait_for_predicate (
53+ lambda : int (self .warnet ("bitcoin rpc tank-0000 getblockcount" )) > 100
54+ )
55+
3256 def wait_for_all_ln_rpc ():
33- nodes = ["tank-0000-ln" , "tank-0001-ln" , "tank-0002-ln" ]
34- for node in nodes :
57+ for ln in self .lns :
3558 try :
36- self .warnet (f"ln rpc { node } getinfo" )
59+ self .warnet (f"ln rpc { ln } getinfo" )
3760 except Exception :
38- print (f"LN node { node } not ready for rpc yet" )
61+ print (f"LN node { ln } not ready for rpc yet" )
3962 return False
4063 return True
4164
4265 self .wait_for_predicate (wait_for_all_ln_rpc )
4366
4467 def fund_wallets (self ):
45- self .warnet ("bitcoin rpc tank-0000 createwallet miner" )
46- self .warnet ("bitcoin rpc tank-0000 -generate 110" )
47- self .wait_for_predicate (
48- lambda : int (self .warnet ("bitcoin rpc tank-0000 getblockcount" )) > 100
49- )
50-
51- addrs = []
52- for lnd in ["tank-0000-ln" , "tank-0001-ln" , "tank-0002-ln" ]:
53- addrs .append (json .loads (self .warnet (f"ln rpc { lnd } newaddress p2wkh" ))["address" ])
54-
55- self .warnet (
56- "bitcoin rpc tank-0000 sendmany '' '{"
57- + f'"{ addrs [0 ]} ":10,"{ addrs [1 ]} ":10,"{ addrs [2 ]} ":10'
58- + "}'"
59- )
68+ outputs = ""
69+ for lnd in self .lns :
70+ addr = json .loads (self .warnet (f"ln rpc { lnd } newaddress p2wkh" ))["address" ]
71+ outputs += f',"{ addr } ":10'
72+ # trim first comma
73+ outputs = outputs [1 :]
74+
75+ self .warnet ("bitcoin rpc tank-0000 sendmany '' '{" + outputs + "}'" )
6076 self .warnet ("bitcoin rpc tank-0000 -generate 1" )
6177
6278 def manual_open_channels (self ):
6379 # 0 -> 1 -> 2
6480 pk1 = self .warnet ("ln pubkey tank-0001-ln" )
6581 pk2 = self .warnet ("ln pubkey tank-0002-ln" )
6682
67- host1 = None
68- host2 = None
83+ host1 = ""
84+ host2 = ""
6985
7086 while not host1 or not host2 :
7187 if not host1 :
@@ -92,28 +108,36 @@ def wait_for_two_txs():
92108
93109 self .warnet ("bitcoin rpc tank-0000 -generate 10" )
94110
95- def wait_for_gossip_sync (self ):
96- chs0 = []
97- chs1 = []
98- chs2 = []
99-
100- while len (chs0 ) != 2 or len (chs1 ) != 2 or len (chs2 ) != 2 :
101- if len (chs0 ) != 2 :
102- chs0 = json .loads (self .warnet ("ln rpc tank-0000-ln describegraph" ))["edges" ]
103- if len (chs1 ) != 2 :
104- chs1 = json .loads (self .warnet ("ln rpc tank-0001-ln describegraph" ))["edges" ]
105- if len (chs2 ) != 2 :
106- chs2 = json .loads (self .warnet ("ln rpc tank-0002-ln describegraph" ))["edges" ]
111+ def wait_for_gossip_sync (self , nodes , expected ):
112+ while len (nodes ) > 0 :
113+ for node in nodes :
114+ chs = json .loads (self .warnet (f"ln rpc { node } describegraph" ))["edges" ]
115+ if len (chs ) >= expected :
116+ nodes .remove (node )
107117 sleep (1 )
108118
109- def pay_invoice (self ):
110- inv = json .loads (self .warnet ("ln rpc tank-0002-ln addinvoice --amt 1000" ))
119+ def pay_invoice (self , sender : str , recipient : str ):
120+ init_balance = int (json .loads (self .warnet (f"ln rpc { recipient } channelbalance" ))["balance" ])
121+ inv = json .loads (self .warnet (f"ln rpc { recipient } addinvoice --amt 1000" ))
111122 print (inv )
112- print (self .warnet (f"ln rpc tank-0000-ln payinvoice -f { inv ['payment_request' ]} " ))
123+ print (self .warnet (f"ln rpc { sender } payinvoice -f { inv ['payment_request' ]} " ))
113124
114125 def wait_for_success ():
115- return json .loads (self .warnet ("ln rpc tank-0002-ln channelbalance" ))["balance" ] == 1000
116- self .wait_for_predicate (wait_for_success )
126+ return (
127+ int (json .loads (self .warnet (f"ln rpc { recipient } channelbalance" ))["balance" ])
128+ == init_balance + 1000
129+ )
130+
131+ self .wait_for_predicate (wait_for_success )
132+
133+ def automatic_open_channels (self ):
134+ self .warnet ("ln open-all-channels" )
135+
136+ def wait_for_three_txs ():
137+ return json .loads (self .warnet ("bitcoin rpc tank-0000 getmempoolinfo" ))["size" ] == 3
138+
139+ self .wait_for_predicate (wait_for_three_txs )
140+ self .warnet ("bitcoin rpc tank-0000 -generate 10" )
117141
118142
119143if __name__ == "__main__" :
0 commit comments