77import os
88import subprocess
99
10+ # From the binary:
11+ # ERROR_DBVERSION = 1
12+ ERROR_DBFAIL = 2
13+ ERROR_USAGE = 3
14+ # ERROR_INTERNAL = 99
15+
16+
17+ def downgrade_cmdline (node ):
18+ # lightning-downgrade understands a subset of the options
19+ # to lightningd.
20+ downgrade_opts = []
21+ for o in node .daemon .opts :
22+ if o in ('network' , 'lightning-dir' , 'conf' , 'rpc-file' , 'wallet' ):
23+ if node .daemon .opts [o ] is None :
24+ downgrade_opts .append (f"--{ o } " )
25+ else :
26+ downgrade_opts .append (f"--{ o } ={ node .daemon .opts [o ]} " )
27+
28+ cmd_line = ["tools/lightning-downgrade" ] + downgrade_opts
29+ if os .getenv ("VALGRIND" ) == "1" :
30+ cmd_line = ['valgrind' , '-q' , '--error-exitcode=7' ] + cmd_line
31+ return cmd_line
32+
1033
1134def test_downgrade (node_factory , executor ):
1235 l1 , l2 = node_factory .line_graph (2 , opts = {'may_reconnect' : True }, wait_for_announce = True )
@@ -22,25 +45,7 @@ def test_downgrade(node_factory, executor):
2245 old_inv = l2 .rpc .invoice (1000 , 'test_downgrade1' , 'test_downgrade' )
2346 l1 .rpc .xpay (old_inv ['bolt11' ])
2447
25- # From the binary:
26- # ERROR_DBVERSION = 1
27- # ERROR_DBFAIL = 2
28- ERROR_USAGE = 3
29- # ERROR_INTERNAL = 99
30-
31- # lightning-downgrade understands a subset of the options
32- # to lightningd.
33- downgrade_opts = []
34- for o in l1 .daemon .opts :
35- if o in ('network' , 'lightning-dir' , 'conf' , 'rpc-file' , 'wallet' ):
36- if l1 .daemon .opts [o ] is None :
37- downgrade_opts .append (f"--{ o } " )
38- else :
39- downgrade_opts .append (f"--{ o } ={ l1 .daemon .opts [o ]} " )
40-
41- cmd_line = ["tools/lightning-downgrade" ] + downgrade_opts
42- if os .getenv ("VALGRIND" ) == "1" :
43- cmd_line = ['valgrind' , '-q' , '--error-exitcode=7' ] + cmd_line
48+ cmd_line = downgrade_cmdline (l1 )
4449
4550 # No downgrade on live nodes!
4651 retcode = subprocess .call (cmd_line , timeout = TIMEOUT )
@@ -89,3 +94,19 @@ def test_downgrade(node_factory, executor):
8994 bias = only_one (only_one (l1 .rpc .askrene_listlayers ('xpay' )['layers' ])['biases' ])
9095 assert bias ['short_channel_id_dir' ] == bias_scidd
9196 assert bias ['bias' ] == 1
97+
98+
99+ def test_downgrade_fail (node_factory , executor ):
100+ """If we have created as node bias, we cannot downgrade"""
101+ l1 , l2 = node_factory .line_graph (2 , opts = {'may_reconnect' : True }, wait_for_announce = True )
102+
103+ l1 .rpc .askrene_bias_node ('xpay' , l2 .info ['id' ], 'in' , 1 )
104+ cmd_line = downgrade_cmdline (l1 )
105+
106+ l1 .stop ()
107+
108+ p = subprocess .Popen (cmd_line , stdout = subprocess .DEVNULL ,
109+ stderr = subprocess .PIPE )
110+ _ , err = p .communicate (timeout = TIMEOUT )
111+ assert p .returncode == ERROR_DBFAIL
112+ assert 'Askrene has a node bias, which is not supported in v25.09' in err .decode ('utf-8' )
0 commit comments