From bb06bec891673c40551fe780da38e99233137eaa Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Thu, 14 Nov 2019 14:04:29 +1030 Subject: [PATCH] features: set OPT_VAR_ONION (bit 9) iff EXPERIMENTAL_FEATURES Signed-off-by: Rusty Russell --- common/features.c | 3 +++ tests/test_connection.py | 8 ++++---- tests/test_gossip.py | 4 ++-- tests/test_misc.py | 20 ++++++++++++++------ tests/test_plugin.py | 12 ++++++++---- tests/utils.py | 10 ++++++++++ 6 files changed, 41 insertions(+), 16 deletions(-) diff --git a/common/features.c b/common/features.c index e423138eef33..8d41a88b0e35 100644 --- a/common/features.c +++ b/common/features.c @@ -8,6 +8,9 @@ static const u32 our_features[] = { OPTIONAL_FEATURE(OPT_DATA_LOSS_PROTECT), OPTIONAL_FEATURE(OPT_UPFRONT_SHUTDOWN_SCRIPT), OPTIONAL_FEATURE(OPT_GOSSIP_QUERIES), +#if EXPERIMENTAL_FEATURES + OPTIONAL_FEATURE(OPT_VAR_ONION), +#endif OPTIONAL_FEATURE(OPT_GOSSIP_QUERIES_EX), OPTIONAL_FEATURE(OPT_STATIC_REMOTEKEY), }; diff --git a/tests/test_connection.py b/tests/test_connection.py index 5cdaad9cc6da..6fdcb173e7c6 100644 --- a/tests/test_connection.py +++ b/tests/test_connection.py @@ -4,7 +4,7 @@ from fixtures import TEST_NETWORK from flaky import flaky # noqa: F401 from lightning import RpcError -from utils import DEVELOPER, only_one, wait_for, sync_blockheight, VALGRIND, TIMEOUT, SLOW_MACHINE, COMPAT +from utils import DEVELOPER, only_one, wait_for, sync_blockheight, VALGRIND, TIMEOUT, SLOW_MACHINE, COMPAT, expected_features from bitcoin.core import CMutableTransaction, CMutableTxOut import binascii @@ -1564,7 +1564,7 @@ def test_forget_channel(node_factory): def test_peerinfo(node_factory, bitcoind): l1, l2 = node_factory.line_graph(2, fundchannel=False, opts={'may_reconnect': True}) - lfeatures = '28a2' + lfeatures = expected_features() # Gossiping but no node announcement yet assert l1.rpc.getpeer(l2.info['id'])['connected'] assert len(l1.rpc.getpeer(l2.info['id'])['channels']) == 0 @@ -1816,8 +1816,8 @@ def test_dataloss_protection(node_factory, bitcoind): l2 = node_factory.get_node(may_reconnect=True, log_all_io=True, feerates=(7500, 7500, 7500), allow_broken_log=True) - # features 1, 3, 7, 11 and 13 (0x28a2). - lf = "28a2" + lf = expected_features() + l1.rpc.connect(l2.info['id'], 'localhost', l2.port) # l1 should send out WIRE_INIT (0010) l1.daemon.wait_for_log(r"\[OUT\] 0010" diff --git a/tests/test_gossip.py b/tests/test_gossip.py index a041763049bb..b3008efc8280 100644 --- a/tests/test_gossip.py +++ b/tests/test_gossip.py @@ -2,7 +2,7 @@ from fixtures import * # noqa: F401,F403 from fixtures import TEST_NETWORK from lightning import RpcError -from utils import wait_for, TIMEOUT, only_one, sync_blockheight +from utils import wait_for, TIMEOUT, only_one, sync_blockheight, expected_features import json import logging @@ -1031,7 +1031,7 @@ def test_node_reannounce(node_factory, bitcoind): wait_for(lambda: 'alias' in only_one(l2.rpc.listnodes(l1.info['id'])['nodes'])) assert only_one(l2.rpc.listnodes(l1.info['id'])['nodes'])['alias'].startswith('JUNIORBEAM') - lfeatures = '28a2' + lfeatures = expected_features() # Make sure it gets features correct. assert only_one(l2.rpc.listnodes(l1.info['id'])['nodes'])['features'] == lfeatures diff --git a/tests/test_misc.py b/tests/test_misc.py index 54f134355242..b5a3b42f006b 100644 --- a/tests/test_misc.py +++ b/tests/test_misc.py @@ -5,7 +5,7 @@ from flaky import flaky # noqa: F401 from lightning import RpcError from threading import Event -from utils import DEVELOPER, TIMEOUT, VALGRIND, sync_blockheight, only_one, wait_for, TailableProc +from utils import DEVELOPER, TIMEOUT, VALGRIND, sync_blockheight, only_one, wait_for, TailableProc, EXPERIMENTAL_FEATURES from ephemeral_port_reserve import reserve import json @@ -1632,11 +1632,19 @@ def test_dev_demux(node_factory): def test_list_features_only(node_factory): features = subprocess.check_output(['lightningd/lightningd', '--list-features-only']).decode('utf-8').splitlines() - expected = ['option_data_loss_protect/odd', - 'option_upfront_shutdown_script/odd', - 'option_gossip_queries/odd', - 'option_gossip_queries_ex/odd', - 'option_static_remotekey/odd'] + if EXPERIMENTAL_FEATURES: + expected = ['option_data_loss_protect/odd', + 'option_upfront_shutdown_script/odd', + 'option_gossip_queries/odd', + 'option_var_onion_optin/odd', + 'option_gossip_queries_ex/odd', + 'option_static_remotekey/odd'] + else: + expected = ['option_data_loss_protect/odd', + 'option_upfront_shutdown_script/odd', + 'option_gossip_queries/odd', + 'option_gossip_queries_ex/odd', + 'option_static_remotekey/odd'] assert features == expected diff --git a/tests/test_plugin.py b/tests/test_plugin.py index 6658c17bd3d6..5929c578ecdd 100644 --- a/tests/test_plugin.py +++ b/tests/test_plugin.py @@ -2,7 +2,7 @@ from fixtures import * # noqa: F401,F403 from flaky import flaky # noqa: F401 from lightning import RpcError, Millisatoshi -from utils import DEVELOPER, only_one, sync_blockheight, TIMEOUT, wait_for +from utils import DEVELOPER, only_one, sync_blockheight, TIMEOUT, wait_for, EXPERIMENTAL_FEATURES import json import os @@ -534,10 +534,14 @@ def test_htlc_accepted_hook_forward_restart(node_factory, executor): logline = l2.daemon.wait_for_log(r'Onion written to') fname = re.search(r'Onion written to (.*\.json)', logline).group(1) onion = json.load(open(fname)) - assert re.match(r'^00006700000.000100000000000003e8000000..000000000000000000000000$', onion['payload']) - assert len(onion['payload']) == 64 + if EXPERIMENTAL_FEATURES: + assert onion['type'] == 'tlv' + assert re.match(r'^020203e80401..0608................$', onion['payload']) + else: + assert onion['type'] == 'legacy' + assert re.match(r'^00006700000.000100000000000003e8000000..000000000000000000000000$', onion['payload']) + assert len(onion['payload']) == 64 assert len(onion['shared_secret']) == 64 - assert onion['type'] == 'legacy' assert onion['forward_amount'] == '1000msat' assert len(onion['next_onion']) == 2 * (1300 + 32 + 33 + 1) diff --git a/tests/utils.py b/tests/utils.py index 98a7513c57a1..08352b81ffea 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -4,3 +4,13 @@ EXPERIMENTAL_FEATURES = env("EXPERIMENTAL_FEATURES", "0") == "1" COMPAT = env("COMPAT", "1") == "1" + + +def expected_features(): + """Return the expected features hexstring for this configuration""" + if EXPERIMENTAL_FEATURES: + # features 1, 3, 7, 9, 11 and 13 (0x2aa2). + return "2aa2" + else: + # features 1, 3, 7, 11 and 13 (0x28a2). + return "28a2"