Skip to content

Commit c019922

Browse files
committed
Expand expect_payment_failed!() to take error codes and use it more
expect_payment_failed!() was introduced after many of the tests which could use it were written, so we take this opportunity to switch them over now, increasing test coverage slightly by always checking the payment hash expected.
1 parent c9483c6 commit c019922

File tree

2 files changed

+32
-150
lines changed

2 files changed

+32
-150
lines changed

lightning/src/ln/functional_test_utils.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -764,13 +764,19 @@ macro_rules! expect_payment_sent {
764764
}
765765

766766
macro_rules! expect_payment_failed {
767-
($node: expr, $expected_payment_hash: expr, $rejected_by_dest: expr) => {
767+
($node: expr, $expected_payment_hash: expr, $rejected_by_dest: expr $(, $expected_error_code: expr, $expected_error_data: expr)*) => {
768768
let events = $node.node.get_and_clear_pending_events();
769769
assert_eq!(events.len(), 1);
770770
match events[0] {
771-
Event::PaymentFailed { ref payment_hash, rejected_by_dest, .. } => {
771+
Event::PaymentFailed { ref payment_hash, rejected_by_dest, ref error_code, ref error_data } => {
772772
assert_eq!(*payment_hash, $expected_payment_hash);
773773
assert_eq!(rejected_by_dest, $rejected_by_dest);
774+
assert!(error_code.is_some());
775+
assert!(error_data.is_some());
776+
$(
777+
assert_eq!(error_code.unwrap(), $expected_error_code);
778+
assert_eq!(&error_data.as_ref().unwrap()[..], $expected_error_data);
779+
)*
774780
},
775781
_ => panic!("Unexpected event"),
776782
}

lightning/src/ln/functional_tests.rs

Lines changed: 24 additions & 148 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use ln::features::{ChannelFeatures, InitFeatures, NodeFeatures};
1717
use ln::msgs;
1818
use ln::msgs::{ChannelMessageHandler,RoutingMessageHandler,HTLCFailChannelUpdate, ErrorAction};
1919
use util::enforcing_trait_impls::EnforcingChannelKeys;
20-
use util::test_utils;
20+
use util::{byte_utils, test_utils};
2121
use util::events::{Event, EventsProvider, MessageSendEvent, MessageSendEventsProvider};
2222
use util::errors::APIError;
2323
use util::ser::{Writeable, Writer, ReadableArgs};
@@ -949,15 +949,7 @@ fn htlc_fail_async_shutdown() {
949949
nodes[0].node.handle_update_fail_htlc(&nodes[1].node.get_our_node_id(), &updates_2.update_fail_htlcs[0]);
950950
commitment_signed_dance!(nodes[0], nodes[1], updates_2.commitment_signed, false, true);
951951

952-
let events = nodes[0].node.get_and_clear_pending_events();
953-
assert_eq!(events.len(), 1);
954-
match events[0] {
955-
Event::PaymentFailed { ref payment_hash, ref rejected_by_dest, .. } => {
956-
assert_eq!(our_payment_hash, *payment_hash);
957-
assert!(!rejected_by_dest);
958-
},
959-
_ => panic!("Unexpected event"),
960-
}
952+
expect_payment_failed!(nodes[0], our_payment_hash, false);
961953

962954
let msg_events = nodes[0].node.get_and_clear_pending_msg_events();
963955
assert_eq!(msg_events.len(), 2);
@@ -1352,15 +1344,7 @@ fn holding_cell_htlc_counting() {
13521344
_ => panic!("Unexpected event"),
13531345
}
13541346

1355-
let events = nodes[0].node.get_and_clear_pending_events();
1356-
assert_eq!(events.len(), 1);
1357-
match events[0] {
1358-
Event::PaymentFailed { payment_hash, rejected_by_dest, .. } => {
1359-
assert_eq!(payment_hash, payment_hash_2);
1360-
assert!(!rejected_by_dest);
1361-
},
1362-
_ => panic!("Unexpected event"),
1363-
}
1347+
expect_payment_failed!(nodes[0], payment_hash_2, false);
13641348

13651349
// Now forward all the pending HTLCs and claim them back
13661350
nodes[2].node.handle_update_add_htlc(&nodes[1].node.get_our_node_id(), &initial_payment_event.msgs[0]);
@@ -2250,15 +2234,7 @@ fn claim_htlc_outputs_shared_tx() {
22502234
nodes[1].block_notifier.block_connected(&Block { header, txdata: vec![revoked_local_txn[0].clone()] }, 1);
22512235
check_added_monitors!(nodes[1], 1);
22522236
connect_blocks(&nodes[1].block_notifier, ANTI_REORG_DELAY - 1, 1, true, header.bitcoin_hash());
2253-
2254-
let events = nodes[1].node.get_and_clear_pending_events();
2255-
assert_eq!(events.len(), 1);
2256-
match events[0] {
2257-
Event::PaymentFailed { payment_hash, .. } => {
2258-
assert_eq!(payment_hash, payment_hash_2);
2259-
},
2260-
_ => panic!("Unexpected event"),
2261-
}
2237+
expect_payment_failed!(nodes[1], payment_hash_2, true);
22622238

22632239
let node_txn = nodes[1].tx_broadcaster.txn_broadcasted.lock().unwrap();
22642240
assert_eq!(node_txn.len(), 3); // ChannelMonitor: penalty tx, ChannelManager: local commitment + HTLC-timeout
@@ -2323,15 +2299,7 @@ fn claim_htlc_outputs_single_tx() {
23232299
expect_pending_htlcs_forwardable_ignore!(nodes[0]);
23242300

23252301
connect_blocks(&nodes[1].block_notifier, ANTI_REORG_DELAY - 1, 200, true, header.bitcoin_hash());
2326-
2327-
let events = nodes[1].node.get_and_clear_pending_events();
2328-
assert_eq!(events.len(), 1);
2329-
match events[0] {
2330-
Event::PaymentFailed { payment_hash, .. } => {
2331-
assert_eq!(payment_hash, payment_hash_2);
2332-
},
2333-
_ => panic!("Unexpected event"),
2334-
}
2302+
expect_payment_failed!(nodes[1], payment_hash_2, true);
23352303

23362304
let node_txn = nodes[1].tx_broadcaster.txn_broadcasted.lock().unwrap();
23372305
assert_eq!(node_txn.len(), 9);
@@ -2685,7 +2653,7 @@ fn test_simple_commitment_revoked_fail_backward() {
26852653
// Revoke the old state
26862654
claim_payment(&nodes[0], &[&nodes[1], &nodes[2]], payment_preimage, 3_000_000);
26872655

2688-
route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 3000000);
2656+
let (_, payment_hash) = route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 3000000);
26892657

26902658
let header = BlockHeader { version: 0x20000000, prev_blockhash: Default::default(), merkle_root: Default::default(), time: 42, bits: 42, nonce: 42};
26912659
nodes[1].block_notifier.block_connected(&Block { header, txdata: vec![revoked_local_txn[0].clone()] }, 1);
@@ -2714,12 +2682,7 @@ fn test_simple_commitment_revoked_fail_backward() {
27142682
MessageSendEvent::PaymentFailureNetworkUpdate { .. } => {},
27152683
_ => panic!("Unexpected event"),
27162684
}
2717-
let events = nodes[0].node.get_and_clear_pending_events();
2718-
assert_eq!(events.len(), 1);
2719-
match events[0] {
2720-
Event::PaymentFailed { .. } => {},
2721-
_ => panic!("Unexpected event"),
2722-
}
2685+
expect_payment_failed!(nodes[0], payment_hash, false);
27232686
},
27242687
_ => panic!("Unexpected event"),
27252688
}
@@ -3687,26 +3650,10 @@ fn test_htlc_timeout() {
36873650

36883651
nodes[0].node.handle_update_fail_htlc(&nodes[1].node.get_our_node_id(), &htlc_timeout_updates.update_fail_htlcs[0]);
36893652
commitment_signed_dance!(nodes[0], nodes[1], htlc_timeout_updates.commitment_signed, false);
3690-
let events = nodes[0].node.get_and_clear_pending_events();
3691-
match &events[0] {
3692-
&Event::PaymentFailed { payment_hash, rejected_by_dest, error_code, ref error_data } => {
3693-
assert_eq!(payment_hash, our_payment_hash);
3694-
assert!(rejected_by_dest);
3695-
assert_eq!(error_code.unwrap(), 0x4000 | 15);
3696-
// 100_000 msat as u64, followed by a height of 123 as u32
3697-
assert_eq!(&error_data.as_ref().unwrap()[..], &[
3698-
((100_000u64 >> 7*8) & 0xff) as u8,
3699-
((100_000u64 >> 6*8) & 0xff) as u8,
3700-
((100_000u64 >> 5*8) & 0xff) as u8,
3701-
((100_000u64 >> 4*8) & 0xff) as u8,
3702-
((100_000u64 >> 3*8) & 0xff) as u8,
3703-
((100_000u64 >> 2*8) & 0xff) as u8,
3704-
((100_000u64 >> 1*8) & 0xff) as u8,
3705-
((100_000u64 >> 0*8) & 0xff) as u8,
3706-
0, 0, 0, 123]);
3707-
},
3708-
_ => panic!("Unexpected event"),
3709-
}
3653+
// 100_000 msat as u64, followed by a height of 123 as u32
3654+
let mut expected_failure_data = byte_utils::be64_to_array(100_000).to_vec();
3655+
expected_failure_data.extend_from_slice(&byte_utils::be32_to_array(123));
3656+
expect_payment_failed!(nodes[0], our_payment_hash, true, 0x4000 | 15, &expected_failure_data[..]);
37103657
}
37113658

37123659
#[test]
@@ -4332,14 +4279,7 @@ fn test_static_spendable_outputs_timeout_tx() {
43324279
let header_1 = BlockHeader { version: 0x20000000, prev_blockhash: header.bitcoin_hash(), merkle_root: Default::default(), time: 42, bits: 42, nonce: 42 };
43334280
nodes[1].block_notifier.block_connected(&Block { header: header_1, txdata: vec![node_txn[0].clone()] }, 1);
43344281
connect_blocks(&nodes[1].block_notifier, ANTI_REORG_DELAY - 1, 1, true, header.bitcoin_hash());
4335-
let events = nodes[1].node.get_and_clear_pending_events();
4336-
assert_eq!(events.len(), 1);
4337-
match events[0] {
4338-
Event::PaymentFailed { payment_hash, .. } => {
4339-
assert_eq!(payment_hash, our_payment_hash);
4340-
},
4341-
_ => panic!("Unexpected event"),
4342-
}
4282+
expect_payment_failed!(nodes[1], our_payment_hash, true);
43434283

43444284
let spend_txn = check_spendable_outputs!(nodes[1], 1);
43454285
assert_eq!(spend_txn.len(), 3); // SpendableOutput: remote_commitment_tx.to_remote (*2), timeout_tx.output (*1)
@@ -4685,13 +4625,7 @@ fn test_duplicate_payment_hash_one_failure_one_success() {
46854625
_ => { panic!("Unexpected event"); }
46864626
}
46874627
}
4688-
let events = nodes[0].node.get_and_clear_pending_events();
4689-
match events[0] {
4690-
Event::PaymentFailed { ref payment_hash, .. } => {
4691-
assert_eq!(*payment_hash, duplicate_payment_hash);
4692-
}
4693-
_ => panic!("Unexpected event"),
4694-
}
4628+
expect_payment_failed!(nodes[0], duplicate_payment_hash, false);
46954629

46964630
// Solve 2nd HTLC by broadcasting on B's chain HTLC-Success Tx from C
46974631
nodes[1].block_notifier.block_connected(&Block { header, txdata: vec![htlc_success_txn[0].clone()] }, 200);
@@ -5049,14 +4983,7 @@ fn test_dynamic_spendable_outputs_local_htlc_timeout_tx() {
50494983
let header_201 = BlockHeader { version: 0x20000000, prev_blockhash: header.bitcoin_hash(), merkle_root: Default::default(), time: 42, bits: 42, nonce: 42 };
50504984
nodes[0].block_notifier.block_connected(&Block { header: header_201, txdata: vec![htlc_timeout.clone()] }, 201);
50514985
connect_blocks(&nodes[0].block_notifier, ANTI_REORG_DELAY - 1, 201, true, header_201.bitcoin_hash());
5052-
let events = nodes[0].node.get_and_clear_pending_events();
5053-
assert_eq!(events.len(), 1);
5054-
match events[0] {
5055-
Event::PaymentFailed { payment_hash, .. } => {
5056-
assert_eq!(payment_hash, our_payment_hash);
5057-
},
5058-
_ => panic!("Unexpected event"),
5059-
}
4986+
expect_payment_failed!(nodes[0], our_payment_hash, true);
50604987

50614988
// Verify that A is able to spend its own HTLC-Timeout tx thanks to spendable output event given back by its ChannelMonitor
50624989
let spend_txn = check_spendable_outputs!(nodes[0], 1);
@@ -5207,15 +5134,7 @@ fn do_htlc_claim_previous_remote_commitment_only(use_dust: bool, check_revoke_no
52075134
check_closed_broadcast!(nodes[0], false);
52085135
check_added_monitors!(nodes[0], 1);
52095136
} else {
5210-
let events = nodes[0].node.get_and_clear_pending_events();
5211-
assert_eq!(events.len(), 1);
5212-
match events[0] {
5213-
Event::PaymentFailed { payment_hash, rejected_by_dest, .. } => {
5214-
assert_eq!(payment_hash, our_payment_hash);
5215-
assert!(rejected_by_dest);
5216-
},
5217-
_ => panic!("Unexpected event"),
5218-
}
5137+
expect_payment_failed!(nodes[0], our_payment_hash, true);
52195138
}
52205139
}
52215140

@@ -6578,29 +6497,15 @@ fn do_test_sweep_outbound_htlc_failure_update(revoked: bool, local: bool) {
65786497
assert_eq!(nodes[0].node.get_and_clear_pending_events().len(), 0);
65796498
timeout_tx.push(nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap()[0].clone());
65806499
let parent_hash = connect_blocks(&nodes[0].block_notifier, ANTI_REORG_DELAY - 1, 2, true, header.bitcoin_hash());
6581-
let events = nodes[0].node.get_and_clear_pending_events();
6582-
assert_eq!(events.len(), 1);
6583-
match events[0] {
6584-
Event::PaymentFailed { payment_hash, .. } => {
6585-
assert_eq!(payment_hash, dust_hash);
6586-
},
6587-
_ => panic!("Unexpected event"),
6588-
}
6500+
expect_payment_failed!(nodes[0], dust_hash, true);
65896501
assert_eq!(timeout_tx[0].input[0].witness.last().unwrap().len(), OFFERED_HTLC_SCRIPT_WEIGHT);
65906502
// We fail non-dust-HTLC 2 by broadcast of local HTLC-timeout tx on local commitment tx
65916503
let header_2 = BlockHeader { version: 0x20000000, prev_blockhash: parent_hash, merkle_root: Default::default(), time: 42, bits: 42, nonce: 42 };
65926504
assert_eq!(nodes[0].node.get_and_clear_pending_events().len(), 0);
65936505
nodes[0].block_notifier.block_connected(&Block { header: header_2, txdata: vec![timeout_tx[0].clone()]}, 7);
65946506
let header_3 = BlockHeader { version: 0x20000000, prev_blockhash: header_2.bitcoin_hash(), merkle_root: Default::default(), time: 42, bits: 42, nonce: 42 };
65956507
connect_blocks(&nodes[0].block_notifier, ANTI_REORG_DELAY - 1, 8, true, header_3.bitcoin_hash());
6596-
let events = nodes[0].node.get_and_clear_pending_events();
6597-
assert_eq!(events.len(), 1);
6598-
match events[0] {
6599-
Event::PaymentFailed { payment_hash, .. } => {
6600-
assert_eq!(payment_hash, non_dust_hash);
6601-
},
6602-
_ => panic!("Unexpected event"),
6603-
}
6508+
expect_payment_failed!(nodes[0], non_dust_hash, true);
66046509
} else {
66056510
// We fail dust-HTLC 1 by broadcast of remote commitment tx. If revoked, fail also non-dust HTLC
66066511
nodes[0].block_notifier.block_connected(&Block { header, txdata: vec![bs_commitment_tx[0].clone()]}, 1);
@@ -6611,28 +6516,14 @@ fn do_test_sweep_outbound_htlc_failure_update(revoked: bool, local: bool) {
66116516
let parent_hash = connect_blocks(&nodes[0].block_notifier, ANTI_REORG_DELAY - 1, 2, true, header.bitcoin_hash());
66126517
let header_2 = BlockHeader { version: 0x20000000, prev_blockhash: parent_hash, merkle_root: Default::default(), time: 42, bits: 42, nonce: 42 };
66136518
if !revoked {
6614-
let events = nodes[0].node.get_and_clear_pending_events();
6615-
assert_eq!(events.len(), 1);
6616-
match events[0] {
6617-
Event::PaymentFailed { payment_hash, .. } => {
6618-
assert_eq!(payment_hash, dust_hash);
6619-
},
6620-
_ => panic!("Unexpected event"),
6621-
}
6519+
expect_payment_failed!(nodes[0], dust_hash, true);
66226520
assert_eq!(timeout_tx[0].input[0].witness.last().unwrap().len(), ACCEPTED_HTLC_SCRIPT_WEIGHT);
66236521
// We fail non-dust-HTLC 2 by broadcast of local timeout tx on remote commitment tx
66246522
nodes[0].block_notifier.block_connected(&Block { header: header_2, txdata: vec![timeout_tx[0].clone()]}, 7);
66256523
assert_eq!(nodes[0].node.get_and_clear_pending_events().len(), 0);
66266524
let header_3 = BlockHeader { version: 0x20000000, prev_blockhash: header_2.bitcoin_hash(), merkle_root: Default::default(), time: 42, bits: 42, nonce: 42 };
66276525
connect_blocks(&nodes[0].block_notifier, ANTI_REORG_DELAY - 1, 8, true, header_3.bitcoin_hash());
6628-
let events = nodes[0].node.get_and_clear_pending_events();
6629-
assert_eq!(events.len(), 1);
6630-
match events[0] {
6631-
Event::PaymentFailed { payment_hash, .. } => {
6632-
assert_eq!(payment_hash, non_dust_hash);
6633-
},
6634-
_ => panic!("Unexpected event"),
6635-
}
6526+
expect_payment_failed!(nodes[0], non_dust_hash, true);
66366527
} else {
66376528
// If revoked, both dust & non-dust HTLCs should have been failed after ANTI_REORG_DELAY confs of revoked
66386529
// commitment tx
@@ -6938,7 +6829,7 @@ fn test_check_htlc_underpaying() {
69386829
// Create some initial channels
69396830
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
69406831

6941-
let (payment_preimage, _) = route_payment(&nodes[0], &[&nodes[1]], 10_000);
6832+
let (payment_preimage, payment_hash) = route_payment(&nodes[0], &[&nodes[1]], 10_000);
69426833

69436834
// Node 3 is expecting payment of 100_000 but receive 10_000,
69446835
// fail htlc like we didn't know the preimage.
@@ -6963,25 +6854,10 @@ fn test_check_htlc_underpaying() {
69636854
nodes[0].node.handle_update_fail_htlc(&nodes[1].node.get_our_node_id(), &update_fail_htlc);
69646855
commitment_signed_dance!(nodes[0], nodes[1], commitment_signed, false, true);
69656856

6966-
let events = nodes[0].node.get_and_clear_pending_events();
6967-
assert_eq!(events.len(), 1);
6968-
if let &Event::PaymentFailed { payment_hash:_, ref rejected_by_dest, ref error_code, ref error_data } = &events[0] {
6969-
assert_eq!(*rejected_by_dest, true);
6970-
assert_eq!(error_code.unwrap(), 0x4000|15);
6971-
// 10_000 msat as u64, followed by a height of 99 as u32
6972-
assert_eq!(&error_data.as_ref().unwrap()[..], &[
6973-
((10_000u64 >> 7*8) & 0xff) as u8,
6974-
((10_000u64 >> 6*8) & 0xff) as u8,
6975-
((10_000u64 >> 5*8) & 0xff) as u8,
6976-
((10_000u64 >> 4*8) & 0xff) as u8,
6977-
((10_000u64 >> 3*8) & 0xff) as u8,
6978-
((10_000u64 >> 2*8) & 0xff) as u8,
6979-
((10_000u64 >> 1*8) & 0xff) as u8,
6980-
((10_000u64 >> 0*8) & 0xff) as u8,
6981-
0, 0, 0, 99]);
6982-
} else {
6983-
panic!("Unexpected event");
6984-
}
6857+
// 10_000 msat as u64, followed by a height of 99 as u32
6858+
let mut expected_failure_data = byte_utils::be64_to_array(10_000).to_vec();
6859+
expected_failure_data.extend_from_slice(&byte_utils::be32_to_array(99));
6860+
expect_payment_failed!(nodes[0], payment_hash, true, 0x4000|15, &expected_failure_data[..]);
69856861
nodes[1].node.get_and_clear_pending_events();
69866862
}
69876863

0 commit comments

Comments
 (0)