Skip to content

Commit face191

Browse files
committed
Reduce the code in the commitment_signed_dance macro
This should marginally reduce compile times for the tests by reducing the total volume of code across the tests in the lightning crate.
1 parent 4055c76 commit face191

File tree

1 file changed

+158
-151
lines changed

1 file changed

+158
-151
lines changed

lightning/src/ln/functional_test_utils.rs

+158-151
Original file line numberDiff line numberDiff line change
@@ -1344,157 +1344,6 @@ impl SendEvent {
13441344
}
13451345
}
13461346

1347-
#[macro_export]
1348-
/// Performs the "commitment signed dance" - the series of message exchanges which occur after a
1349-
/// commitment update.
1350-
macro_rules! commitment_signed_dance {
1351-
($node_a: expr, $node_b: expr, $commitment_signed: expr, $fail_backwards: expr, true /* skip last step */) => {
1352-
{
1353-
check_added_monitors!($node_a, 0);
1354-
assert!($node_a.node.get_and_clear_pending_msg_events().is_empty());
1355-
$node_a.node.handle_commitment_signed(&$node_b.node.get_our_node_id(), &$commitment_signed);
1356-
check_added_monitors!($node_a, 1);
1357-
commitment_signed_dance!($node_a, $node_b, (), $fail_backwards, true, false);
1358-
}
1359-
};
1360-
($node_a: expr, $node_b: expr, (), $fail_backwards: expr, true /* skip last step */, true /* return extra message */, true /* return last RAA */) => {
1361-
{
1362-
let (as_revoke_and_ack, as_commitment_signed) = get_revoke_commit_msgs!($node_a, $node_b.node.get_our_node_id());
1363-
check_added_monitors!($node_b, 0);
1364-
assert!($node_b.node.get_and_clear_pending_msg_events().is_empty());
1365-
$node_b.node.handle_revoke_and_ack(&$node_a.node.get_our_node_id(), &as_revoke_and_ack);
1366-
assert!($node_b.node.get_and_clear_pending_msg_events().is_empty());
1367-
check_added_monitors!($node_b, 1);
1368-
$node_b.node.handle_commitment_signed(&$node_a.node.get_our_node_id(), &as_commitment_signed);
1369-
let (bs_revoke_and_ack, extra_msg_option) = {
1370-
let events = $node_b.node.get_and_clear_pending_msg_events();
1371-
assert!(events.len() <= 2);
1372-
let (node_a_event, events) = remove_first_msg_event_to_node(&$node_a.node.get_our_node_id(), &events);
1373-
(match node_a_event {
1374-
MessageSendEvent::SendRevokeAndACK { ref node_id, ref msg } => {
1375-
assert_eq!(*node_id, $node_a.node.get_our_node_id());
1376-
(*msg).clone()
1377-
},
1378-
_ => panic!("Unexpected event"),
1379-
}, events.get(0).map(|e| e.clone()))
1380-
};
1381-
check_added_monitors!($node_b, 1);
1382-
if $fail_backwards {
1383-
assert!($node_a.node.get_and_clear_pending_events().is_empty());
1384-
assert!($node_a.node.get_and_clear_pending_msg_events().is_empty());
1385-
}
1386-
(extra_msg_option, bs_revoke_and_ack)
1387-
}
1388-
};
1389-
($node_a: expr, $node_b: expr, $commitment_signed: expr, $fail_backwards: expr, true /* skip last step */, false /* return extra message */, true /* return last RAA */) => {
1390-
{
1391-
check_added_monitors!($node_a, 0);
1392-
assert!($node_a.node.get_and_clear_pending_msg_events().is_empty());
1393-
$node_a.node.handle_commitment_signed(&$node_b.node.get_our_node_id(), &$commitment_signed);
1394-
check_added_monitors!($node_a, 1);
1395-
let (extra_msg_option, bs_revoke_and_ack) = commitment_signed_dance!($node_a, $node_b, (), $fail_backwards, true, true, true);
1396-
assert!(extra_msg_option.is_none());
1397-
bs_revoke_and_ack
1398-
}
1399-
};
1400-
($node_a: expr, $node_b: expr, (), $fail_backwards: expr, true /* skip last step */, true /* return extra message */) => {
1401-
{
1402-
let (extra_msg_option, bs_revoke_and_ack) = commitment_signed_dance!($node_a, $node_b, (), $fail_backwards, true, true, true);
1403-
$node_a.node.handle_revoke_and_ack(&$node_b.node.get_our_node_id(), &bs_revoke_and_ack);
1404-
check_added_monitors!($node_a, 1);
1405-
extra_msg_option
1406-
}
1407-
};
1408-
($node_a: expr, $node_b: expr, (), $fail_backwards: expr, true /* skip last step */, false /* no extra message */) => {
1409-
{
1410-
assert!(commitment_signed_dance!($node_a, $node_b, (), $fail_backwards, true, true).is_none());
1411-
}
1412-
};
1413-
($node_a: expr, $node_b: expr, $commitment_signed: expr, $fail_backwards: expr) => {
1414-
{
1415-
commitment_signed_dance!($node_a, $node_b, $commitment_signed, $fail_backwards, true);
1416-
if $fail_backwards {
1417-
expect_pending_htlcs_forwardable_and_htlc_handling_failed!($node_a, vec![$crate::util::events::HTLCDestination::NextHopChannel{ node_id: Some($node_b.node.get_our_node_id()), channel_id: $commitment_signed.channel_id }]);
1418-
check_added_monitors!($node_a, 1);
1419-
1420-
let node_a_per_peer_state = $node_a.node.per_peer_state.read().unwrap();
1421-
let mut number_of_msg_events = 0;
1422-
for (cp_id, peer_state_mutex) in node_a_per_peer_state.iter() {
1423-
let peer_state = peer_state_mutex.lock().unwrap();
1424-
let cp_pending_msg_events = &peer_state.pending_msg_events;
1425-
number_of_msg_events += cp_pending_msg_events.len();
1426-
if cp_pending_msg_events.len() == 1 {
1427-
if let MessageSendEvent::UpdateHTLCs { .. } = cp_pending_msg_events[0] {
1428-
assert_ne!(*cp_id, $node_b.node.get_our_node_id());
1429-
} else { panic!("Unexpected event"); }
1430-
}
1431-
}
1432-
// Expecting the failure backwards event to the previous hop (not `node_b`)
1433-
assert_eq!(number_of_msg_events, 1);
1434-
} else {
1435-
assert!($node_a.node.get_and_clear_pending_msg_events().is_empty());
1436-
}
1437-
}
1438-
}
1439-
}
1440-
1441-
/// Get a payment preimage and hash.
1442-
#[macro_export]
1443-
macro_rules! get_payment_preimage_hash {
1444-
($dest_node: expr) => {
1445-
{
1446-
get_payment_preimage_hash!($dest_node, None)
1447-
}
1448-
};
1449-
($dest_node: expr, $min_value_msat: expr) => {
1450-
{
1451-
crate::get_payment_preimage_hash!($dest_node, $min_value_msat, None)
1452-
}
1453-
};
1454-
($dest_node: expr, $min_value_msat: expr, $min_final_cltv_expiry_delta: expr) => {
1455-
{
1456-
use bitcoin::hashes::Hash as _;
1457-
let mut payment_count = $dest_node.network_payment_count.borrow_mut();
1458-
let payment_preimage = $crate::ln::PaymentPreimage([*payment_count; 32]);
1459-
*payment_count += 1;
1460-
let payment_hash = $crate::ln::PaymentHash(
1461-
bitcoin::hashes::sha256::Hash::hash(&payment_preimage.0[..]).into_inner());
1462-
let payment_secret = $dest_node.node.create_inbound_payment_for_hash(payment_hash, $min_value_msat, 7200, $min_final_cltv_expiry_delta).unwrap();
1463-
(payment_preimage, payment_hash, payment_secret)
1464-
}
1465-
};
1466-
}
1467-
1468-
#[macro_export]
1469-
macro_rules! get_route {
1470-
($send_node: expr, $payment_params: expr, $recv_value: expr, $cltv: expr) => {{
1471-
use $crate::chain::keysinterface::EntropySource;
1472-
let scorer = $crate::util::test_utils::TestScorer::with_penalty(0);
1473-
let keys_manager = $crate::util::test_utils::TestKeysInterface::new(&[0u8; 32], bitcoin::network::constants::Network::Testnet);
1474-
let random_seed_bytes = keys_manager.get_secure_random_bytes();
1475-
$crate::routing::router::get_route(
1476-
&$send_node.node.get_our_node_id(), &$payment_params, &$send_node.network_graph.read_only(),
1477-
Some(&$send_node.node.list_usable_channels().iter().collect::<Vec<_>>()),
1478-
$recv_value, $cltv, $send_node.logger, &scorer, &random_seed_bytes
1479-
)
1480-
}}
1481-
}
1482-
1483-
#[cfg(test)]
1484-
#[macro_export]
1485-
macro_rules! get_route_and_payment_hash {
1486-
($send_node: expr, $recv_node: expr, $recv_value: expr) => {{
1487-
let payment_params = $crate::routing::router::PaymentParameters::from_node_id($recv_node.node.get_our_node_id(), TEST_FINAL_CLTV)
1488-
.with_features($recv_node.node.invoice_features());
1489-
$crate::get_route_and_payment_hash!($send_node, $recv_node, payment_params, $recv_value, TEST_FINAL_CLTV)
1490-
}};
1491-
($send_node: expr, $recv_node: expr, $payment_params: expr, $recv_value: expr, $cltv: expr) => {{
1492-
let (payment_preimage, payment_hash, payment_secret) = $crate::get_payment_preimage_hash!($recv_node, Some($recv_value));
1493-
let route = $crate::get_route!($send_node, $payment_params, $recv_value, $cltv);
1494-
(route.unwrap(), payment_hash, payment_preimage, payment_secret)
1495-
}}
1496-
}
1497-
14981347
#[macro_export]
14991348
macro_rules! expect_pending_htlcs_forwardable_conditions {
15001349
($node: expr, $expected_failures: expr) => {{
@@ -1585,6 +1434,164 @@ macro_rules! expect_pending_htlcs_forwardable_from_events {
15851434
}
15861435
}}
15871436
}
1437+
1438+
#[macro_export]
1439+
/// Performs the "commitment signed dance" - the series of message exchanges which occur after a
1440+
/// commitment update.
1441+
macro_rules! commitment_signed_dance {
1442+
($node_a: expr, $node_b: expr, $commitment_signed: expr, $fail_backwards: expr, true /* skip last step */) => {
1443+
$crate::ln::functional_test_utils::do_commitment_signed_dance(&$node_a, &$node_b, &$commitment_signed, $fail_backwards, true);
1444+
};
1445+
($node_a: expr, $node_b: expr, (), $fail_backwards: expr, true /* skip last step */, true /* return extra message */, true /* return last RAA */) => {
1446+
$crate::ln::functional_test_utils::do_main_commitment_signed_dance(&$node_a, &$node_b, $fail_backwards)
1447+
};
1448+
($node_a: expr, $node_b: expr, $commitment_signed: expr, $fail_backwards: expr, true /* skip last step */, false /* return extra message */, true /* return last RAA */) => {
1449+
{
1450+
check_added_monitors!($node_a, 0);
1451+
assert!($node_a.node.get_and_clear_pending_msg_events().is_empty());
1452+
$node_a.node.handle_commitment_signed(&$node_b.node.get_our_node_id(), &$commitment_signed);
1453+
check_added_monitors!($node_a, 1);
1454+
let (extra_msg_option, bs_revoke_and_ack) = $crate::ln::functional_test_utils::do_main_commitment_signed_dance(&$node_a, &$node_b, $fail_backwards);
1455+
assert!(extra_msg_option.is_none());
1456+
bs_revoke_and_ack
1457+
}
1458+
};
1459+
($node_a: expr, $node_b: expr, (), $fail_backwards: expr, true /* skip last step */, true /* return extra message */) => {
1460+
{
1461+
let (extra_msg_option, bs_revoke_and_ack) = $crate::ln::functional_test_utils::do_main_commitment_signed_dance(&$node_a, &$node_b, $fail_backwards);
1462+
$node_a.node.handle_revoke_and_ack(&$node_b.node.get_our_node_id(), &bs_revoke_and_ack);
1463+
check_added_monitors!($node_a, 1);
1464+
extra_msg_option
1465+
}
1466+
};
1467+
($node_a: expr, $node_b: expr, (), $fail_backwards: expr, true /* skip last step */, false /* no extra message */) => {
1468+
assert!(commitment_signed_dance!($node_a, $node_b, (), $fail_backwards, true, true).is_none());
1469+
};
1470+
($node_a: expr, $node_b: expr, $commitment_signed: expr, $fail_backwards: expr) => {
1471+
$crate::ln::functional_test_utils::do_commitment_signed_dance(&$node_a, &$node_b, &$commitment_signed, $fail_backwards, false);
1472+
}
1473+
}
1474+
1475+
1476+
pub fn do_main_commitment_signed_dance(node_a: &Node<'_, '_, '_>, node_b: &Node<'_, '_, '_>, fail_backwards: bool) -> (Option<MessageSendEvent>, msgs::RevokeAndACK) {
1477+
let (as_revoke_and_ack, as_commitment_signed) = get_revoke_commit_msgs!(node_a, node_b.node.get_our_node_id());
1478+
check_added_monitors!(node_b, 0);
1479+
assert!(node_b.node.get_and_clear_pending_msg_events().is_empty());
1480+
node_b.node.handle_revoke_and_ack(&node_a.node.get_our_node_id(), &as_revoke_and_ack);
1481+
assert!(node_b.node.get_and_clear_pending_msg_events().is_empty());
1482+
check_added_monitors!(node_b, 1);
1483+
node_b.node.handle_commitment_signed(&node_a.node.get_our_node_id(), &as_commitment_signed);
1484+
let (bs_revoke_and_ack, extra_msg_option) = {
1485+
let events = node_b.node.get_and_clear_pending_msg_events();
1486+
assert!(events.len() <= 2);
1487+
let (node_a_event, events) = remove_first_msg_event_to_node(&node_a.node.get_our_node_id(), &events);
1488+
(match node_a_event {
1489+
MessageSendEvent::SendRevokeAndACK { ref node_id, ref msg } => {
1490+
assert_eq!(*node_id, node_a.node.get_our_node_id());
1491+
(*msg).clone()
1492+
},
1493+
_ => panic!("Unexpected event"),
1494+
}, events.get(0).map(|e| e.clone()))
1495+
};
1496+
check_added_monitors!(node_b, 1);
1497+
if fail_backwards {
1498+
assert!(node_a.node.get_and_clear_pending_events().is_empty());
1499+
assert!(node_a.node.get_and_clear_pending_msg_events().is_empty());
1500+
}
1501+
(extra_msg_option, bs_revoke_and_ack)
1502+
}
1503+
1504+
pub fn do_commitment_signed_dance(node_a: &Node<'_, '_, '_>, node_b: &Node<'_, '_, '_>, commitment_signed: &msgs::CommitmentSigned, fail_backwards: bool, skip_last_step: bool) {
1505+
check_added_monitors!(node_a, 0);
1506+
assert!(node_a.node.get_and_clear_pending_msg_events().is_empty());
1507+
node_a.node.handle_commitment_signed(&node_b.node.get_our_node_id(), commitment_signed);
1508+
check_added_monitors!(node_a, 1);
1509+
1510+
commitment_signed_dance!(node_a, node_b, (), fail_backwards, true, false);
1511+
1512+
if skip_last_step { return; }
1513+
1514+
if fail_backwards {
1515+
expect_pending_htlcs_forwardable_and_htlc_handling_failed!(node_a,
1516+
vec![crate::util::events::HTLCDestination::NextHopChannel{ node_id: Some(node_b.node.get_our_node_id()), channel_id: commitment_signed.channel_id }]);
1517+
check_added_monitors!(node_a, 1);
1518+
1519+
let node_a_per_peer_state = node_a.node.per_peer_state.read().unwrap();
1520+
let mut number_of_msg_events = 0;
1521+
for (cp_id, peer_state_mutex) in node_a_per_peer_state.iter() {
1522+
let peer_state = peer_state_mutex.lock().unwrap();
1523+
let cp_pending_msg_events = &peer_state.pending_msg_events;
1524+
number_of_msg_events += cp_pending_msg_events.len();
1525+
if cp_pending_msg_events.len() == 1 {
1526+
if let MessageSendEvent::UpdateHTLCs { .. } = cp_pending_msg_events[0] {
1527+
assert_ne!(*cp_id, node_b.node.get_our_node_id());
1528+
} else { panic!("Unexpected event"); }
1529+
}
1530+
}
1531+
// Expecting the failure backwards event to the previous hop (not `node_b`)
1532+
assert_eq!(number_of_msg_events, 1);
1533+
} else {
1534+
assert!(node_a.node.get_and_clear_pending_msg_events().is_empty());
1535+
}
1536+
}
1537+
1538+
/// Get a payment preimage and hash.
1539+
#[macro_export]
1540+
macro_rules! get_payment_preimage_hash {
1541+
($dest_node: expr) => {
1542+
{
1543+
get_payment_preimage_hash!($dest_node, None)
1544+
}
1545+
};
1546+
($dest_node: expr, $min_value_msat: expr) => {
1547+
{
1548+
crate::get_payment_preimage_hash!($dest_node, $min_value_msat, None)
1549+
}
1550+
};
1551+
($dest_node: expr, $min_value_msat: expr, $min_final_cltv_expiry_delta: expr) => {
1552+
{
1553+
use bitcoin::hashes::Hash as _;
1554+
let mut payment_count = $dest_node.network_payment_count.borrow_mut();
1555+
let payment_preimage = $crate::ln::PaymentPreimage([*payment_count; 32]);
1556+
*payment_count += 1;
1557+
let payment_hash = $crate::ln::PaymentHash(
1558+
bitcoin::hashes::sha256::Hash::hash(&payment_preimage.0[..]).into_inner());
1559+
let payment_secret = $dest_node.node.create_inbound_payment_for_hash(payment_hash, $min_value_msat, 7200, $min_final_cltv_expiry_delta).unwrap();
1560+
(payment_preimage, payment_hash, payment_secret)
1561+
}
1562+
};
1563+
}
1564+
1565+
#[macro_export]
1566+
macro_rules! get_route {
1567+
($send_node: expr, $payment_params: expr, $recv_value: expr, $cltv: expr) => {{
1568+
use $crate::chain::keysinterface::EntropySource;
1569+
let scorer = $crate::util::test_utils::TestScorer::with_penalty(0);
1570+
let keys_manager = $crate::util::test_utils::TestKeysInterface::new(&[0u8; 32], bitcoin::network::constants::Network::Testnet);
1571+
let random_seed_bytes = keys_manager.get_secure_random_bytes();
1572+
$crate::routing::router::get_route(
1573+
&$send_node.node.get_our_node_id(), &$payment_params, &$send_node.network_graph.read_only(),
1574+
Some(&$send_node.node.list_usable_channels().iter().collect::<Vec<_>>()),
1575+
$recv_value, $cltv, $send_node.logger, &scorer, &random_seed_bytes
1576+
)
1577+
}}
1578+
}
1579+
1580+
#[cfg(test)]
1581+
#[macro_export]
1582+
macro_rules! get_route_and_payment_hash {
1583+
($send_node: expr, $recv_node: expr, $recv_value: expr) => {{
1584+
let payment_params = $crate::routing::router::PaymentParameters::from_node_id($recv_node.node.get_our_node_id(), TEST_FINAL_CLTV)
1585+
.with_features($recv_node.node.invoice_features());
1586+
$crate::get_route_and_payment_hash!($send_node, $recv_node, payment_params, $recv_value, TEST_FINAL_CLTV)
1587+
}};
1588+
($send_node: expr, $recv_node: expr, $payment_params: expr, $recv_value: expr, $cltv: expr) => {{
1589+
let (payment_preimage, payment_hash, payment_secret) = $crate::get_payment_preimage_hash!($recv_node, Some($recv_value));
1590+
let route = $crate::get_route!($send_node, $payment_params, $recv_value, $cltv);
1591+
(route.unwrap(), payment_hash, payment_preimage, payment_secret)
1592+
}}
1593+
}
1594+
15881595
#[macro_export]
15891596
#[cfg(any(test, feature = "_bench_unstable", feature = "_test_utils"))]
15901597
macro_rules! expect_payment_claimable {

0 commit comments

Comments
 (0)