Skip to content

Commit 6c67fb4

Browse files
committed
NEW: 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 f31e1f6 commit 6c67fb4

File tree

2 files changed

+45
-149
lines changed

2 files changed

+45
-149
lines changed

lightning/src/ln/functional_test_utils.rs

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

771771
macro_rules! expect_payment_failed {
772-
($node: expr, $expected_payment_hash: expr, $rejected_by_dest: expr) => {
772+
($node: expr, $expected_payment_hash: expr, $rejected_by_dest: expr $(, $expected_error_code: expr, $expected_error_data: expr)*) => {
773773
let events = $node.node.get_and_clear_pending_events();
774774
assert_eq!(events.len(), 1);
775775
match events[0] {
776-
Event::PaymentFailed { ref payment_hash, rejected_by_dest, .. } => {
776+
Event::PaymentFailed { ref payment_hash, rejected_by_dest, ref error_code, ref error_data } => {
777777
assert_eq!(*payment_hash, $expected_payment_hash);
778778
assert_eq!(rejected_by_dest, $rejected_by_dest);
779+
assert!(error_code.is_some());
780+
assert!(error_data.is_some());
781+
$(
782+
assert_eq!(error_code.unwrap(), $expected_error_code);
783+
assert_eq!(&error_data.as_ref().unwrap()[..], $expected_error_data);
784+
)*
779785
},
780786
_ => panic!("Unexpected event"),
781787
}

lightning/src/ln/functional_tests.rs

Lines changed: 37 additions & 147 deletions
Original file line numberDiff line numberDiff line change
@@ -954,15 +954,7 @@ fn htlc_fail_async_shutdown() {
954954
nodes[0].node.handle_update_fail_htlc(&nodes[1].node.get_our_node_id(), &updates_2.update_fail_htlcs[0]);
955955
commitment_signed_dance!(nodes[0], nodes[1], updates_2.commitment_signed, false, true);
956956

957-
let events = nodes[0].node.get_and_clear_pending_events();
958-
assert_eq!(events.len(), 1);
959-
match events[0] {
960-
Event::PaymentFailed { ref payment_hash, ref rejected_by_dest, .. } => {
961-
assert_eq!(our_payment_hash, *payment_hash);
962-
assert!(!rejected_by_dest);
963-
},
964-
_ => panic!("Unexpected event"),
965-
}
957+
expect_payment_failed!(nodes[0], our_payment_hash, false);
966958

967959
let msg_events = nodes[0].node.get_and_clear_pending_msg_events();
968960
assert_eq!(msg_events.len(), 2);
@@ -1357,15 +1349,7 @@ fn holding_cell_htlc_counting() {
13571349
_ => panic!("Unexpected event"),
13581350
}
13591351

1360-
let events = nodes[0].node.get_and_clear_pending_events();
1361-
assert_eq!(events.len(), 1);
1362-
match events[0] {
1363-
Event::PaymentFailed { payment_hash, rejected_by_dest, .. } => {
1364-
assert_eq!(payment_hash, payment_hash_2);
1365-
assert!(!rejected_by_dest);
1366-
},
1367-
_ => panic!("Unexpected event"),
1368-
}
1352+
expect_payment_failed!(nodes[0], payment_hash_2, false);
13691353

13701354
// Now forward all the pending HTLCs and claim them back
13711355
nodes[2].node.handle_update_add_htlc(&nodes[1].node.get_our_node_id(), &initial_payment_event.msgs[0]);
@@ -2255,15 +2239,7 @@ fn claim_htlc_outputs_shared_tx() {
22552239
nodes[1].block_notifier.block_connected(&Block { header, txdata: vec![revoked_local_txn[0].clone()] }, 1);
22562240
check_added_monitors!(nodes[1], 1);
22572241
connect_blocks(&nodes[1].block_notifier, ANTI_REORG_DELAY - 1, 1, true, header.bitcoin_hash());
2258-
2259-
let events = nodes[1].node.get_and_clear_pending_events();
2260-
assert_eq!(events.len(), 1);
2261-
match events[0] {
2262-
Event::PaymentFailed { payment_hash, .. } => {
2263-
assert_eq!(payment_hash, payment_hash_2);
2264-
},
2265-
_ => panic!("Unexpected event"),
2266-
}
2242+
expect_payment_failed!(nodes[1], payment_hash_2, true);
22672243

22682244
let node_txn = nodes[1].tx_broadcaster.txn_broadcasted.lock().unwrap();
22692245
assert_eq!(node_txn.len(), 3); // ChannelMonitor: penalty tx, ChannelManager: local commitment + HTLC-timeout
@@ -2328,15 +2304,7 @@ fn claim_htlc_outputs_single_tx() {
23282304
expect_pending_htlcs_forwardable_ignore!(nodes[0]);
23292305

23302306
connect_blocks(&nodes[1].block_notifier, ANTI_REORG_DELAY - 1, 200, true, header.bitcoin_hash());
2331-
2332-
let events = nodes[1].node.get_and_clear_pending_events();
2333-
assert_eq!(events.len(), 1);
2334-
match events[0] {
2335-
Event::PaymentFailed { payment_hash, .. } => {
2336-
assert_eq!(payment_hash, payment_hash_2);
2337-
},
2338-
_ => panic!("Unexpected event"),
2339-
}
2307+
expect_payment_failed!(nodes[1], payment_hash_2, true);
23402308

23412309
let node_txn = nodes[1].tx_broadcaster.txn_broadcasted.lock().unwrap();
23422310
assert_eq!(node_txn.len(), 9);
@@ -2690,7 +2658,7 @@ fn test_simple_commitment_revoked_fail_backward() {
26902658
// Revoke the old state
26912659
claim_payment(&nodes[0], &[&nodes[1], &nodes[2]], payment_preimage, 3_000_000);
26922660

2693-
route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 3000000);
2661+
let (_, payment_hash) = route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 3000000);
26942662

26952663
let header = BlockHeader { version: 0x20000000, prev_blockhash: Default::default(), merkle_root: Default::default(), time: 42, bits: 42, nonce: 42};
26962664
nodes[1].block_notifier.block_connected(&Block { header, txdata: vec![revoked_local_txn[0].clone()] }, 1);
@@ -2719,12 +2687,7 @@ fn test_simple_commitment_revoked_fail_backward() {
27192687
MessageSendEvent::PaymentFailureNetworkUpdate { .. } => {},
27202688
_ => panic!("Unexpected event"),
27212689
}
2722-
let events = nodes[0].node.get_and_clear_pending_events();
2723-
assert_eq!(events.len(), 1);
2724-
match events[0] {
2725-
Event::PaymentFailed { .. } => {},
2726-
_ => panic!("Unexpected event"),
2727-
}
2690+
expect_payment_failed!(nodes[0], payment_hash, false);
27282691
},
27292692
_ => panic!("Unexpected event"),
27302693
}
@@ -3692,26 +3655,17 @@ fn test_htlc_timeout() {
36923655

36933656
nodes[0].node.handle_update_fail_htlc(&nodes[1].node.get_our_node_id(), &htlc_timeout_updates.update_fail_htlcs[0]);
36943657
commitment_signed_dance!(nodes[0], nodes[1], htlc_timeout_updates.commitment_signed, false);
3695-
let events = nodes[0].node.get_and_clear_pending_events();
3696-
match &events[0] {
3697-
&Event::PaymentFailed { payment_hash, rejected_by_dest, error_code, ref error_data } => {
3698-
assert_eq!(payment_hash, our_payment_hash);
3699-
assert!(rejected_by_dest);
3700-
assert_eq!(error_code.unwrap(), 0x4000 | 15);
3701-
// 100_000 msat as u64, followed by a height of 123 as u32
3702-
assert_eq!(&error_data.as_ref().unwrap()[..], &[
3703-
((100_000u64 >> 7*8) & 0xff) as u8,
3704-
((100_000u64 >> 6*8) & 0xff) as u8,
3705-
((100_000u64 >> 5*8) & 0xff) as u8,
3706-
((100_000u64 >> 4*8) & 0xff) as u8,
3707-
((100_000u64 >> 3*8) & 0xff) as u8,
3708-
((100_000u64 >> 2*8) & 0xff) as u8,
3709-
((100_000u64 >> 1*8) & 0xff) as u8,
3710-
((100_000u64 >> 0*8) & 0xff) as u8,
3711-
0, 0, 0, 123]);
3712-
},
3713-
_ => panic!("Unexpected event"),
3714-
}
3658+
// 100_000 msat as u64, followed by a height of 123 as u32
3659+
expect_payment_failed!(nodes[0], our_payment_hash, true, 0x4000 | 15, &[
3660+
((100_000u64 >> 7*8) & 0xff) as u8,
3661+
((100_000u64 >> 6*8) & 0xff) as u8,
3662+
((100_000u64 >> 5*8) & 0xff) as u8,
3663+
((100_000u64 >> 4*8) & 0xff) as u8,
3664+
((100_000u64 >> 3*8) & 0xff) as u8,
3665+
((100_000u64 >> 2*8) & 0xff) as u8,
3666+
((100_000u64 >> 1*8) & 0xff) as u8,
3667+
((100_000u64 >> 0*8) & 0xff) as u8,
3668+
0, 0, 0, 123]);
37153669
}
37163670

37173671
#[test]
@@ -4337,14 +4291,7 @@ fn test_static_spendable_outputs_timeout_tx() {
43374291
let header_1 = BlockHeader { version: 0x20000000, prev_blockhash: header.bitcoin_hash(), merkle_root: Default::default(), time: 42, bits: 42, nonce: 42 };
43384292
nodes[1].block_notifier.block_connected(&Block { header: header_1, txdata: vec![node_txn[0].clone()] }, 1);
43394293
connect_blocks(&nodes[1].block_notifier, ANTI_REORG_DELAY - 1, 1, true, header.bitcoin_hash());
4340-
let events = nodes[1].node.get_and_clear_pending_events();
4341-
assert_eq!(events.len(), 1);
4342-
match events[0] {
4343-
Event::PaymentFailed { payment_hash, .. } => {
4344-
assert_eq!(payment_hash, our_payment_hash);
4345-
},
4346-
_ => panic!("Unexpected event"),
4347-
}
4294+
expect_payment_failed!(nodes[1], our_payment_hash, true);
43484295

43494296
let spend_txn = check_spendable_outputs!(nodes[1], 1);
43504297
assert_eq!(spend_txn.len(), 3); // SpendableOutput: remote_commitment_tx.to_remote (*2), timeout_tx.output (*1)
@@ -4690,13 +4637,7 @@ fn test_duplicate_payment_hash_one_failure_one_success() {
46904637
_ => { panic!("Unexpected event"); }
46914638
}
46924639
}
4693-
let events = nodes[0].node.get_and_clear_pending_events();
4694-
match events[0] {
4695-
Event::PaymentFailed { ref payment_hash, .. } => {
4696-
assert_eq!(*payment_hash, duplicate_payment_hash);
4697-
}
4698-
_ => panic!("Unexpected event"),
4699-
}
4640+
expect_payment_failed!(nodes[0], duplicate_payment_hash, false);
47004641

47014642
// Solve 2nd HTLC by broadcasting on B's chain HTLC-Success Tx from C
47024643
nodes[1].block_notifier.block_connected(&Block { header, txdata: vec![htlc_success_txn[0].clone()] }, 200);
@@ -5054,14 +4995,7 @@ fn test_dynamic_spendable_outputs_local_htlc_timeout_tx() {
50544995
let header_201 = BlockHeader { version: 0x20000000, prev_blockhash: header.bitcoin_hash(), merkle_root: Default::default(), time: 42, bits: 42, nonce: 42 };
50554996
nodes[0].block_notifier.block_connected(&Block { header: header_201, txdata: vec![htlc_timeout.clone()] }, 201);
50564997
connect_blocks(&nodes[0].block_notifier, ANTI_REORG_DELAY - 1, 201, true, header_201.bitcoin_hash());
5057-
let events = nodes[0].node.get_and_clear_pending_events();
5058-
assert_eq!(events.len(), 1);
5059-
match events[0] {
5060-
Event::PaymentFailed { payment_hash, .. } => {
5061-
assert_eq!(payment_hash, our_payment_hash);
5062-
},
5063-
_ => panic!("Unexpected event"),
5064-
}
4998+
expect_payment_failed!(nodes[0], our_payment_hash, true);
50654999

50665000
// Verify that A is able to spend its own HTLC-Timeout tx thanks to spendable output event given back by its ChannelMonitor
50675001
let spend_txn = check_spendable_outputs!(nodes[0], 1);
@@ -5212,15 +5146,7 @@ fn do_htlc_claim_previous_remote_commitment_only(use_dust: bool, check_revoke_no
52125146
check_closed_broadcast!(nodes[0], false);
52135147
check_added_monitors!(nodes[0], 1);
52145148
} else {
5215-
let events = nodes[0].node.get_and_clear_pending_events();
5216-
assert_eq!(events.len(), 1);
5217-
match events[0] {
5218-
Event::PaymentFailed { payment_hash, rejected_by_dest, .. } => {
5219-
assert_eq!(payment_hash, our_payment_hash);
5220-
assert!(rejected_by_dest);
5221-
},
5222-
_ => panic!("Unexpected event"),
5223-
}
5149+
expect_payment_failed!(nodes[0], our_payment_hash, true);
52245150
}
52255151
}
52265152

@@ -6583,29 +6509,15 @@ fn do_test_sweep_outbound_htlc_failure_update(revoked: bool, local: bool) {
65836509
assert_eq!(nodes[0].node.get_and_clear_pending_events().len(), 0);
65846510
timeout_tx.push(nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap()[0].clone());
65856511
let parent_hash = connect_blocks(&nodes[0].block_notifier, ANTI_REORG_DELAY - 1, 2, true, header.bitcoin_hash());
6586-
let events = nodes[0].node.get_and_clear_pending_events();
6587-
assert_eq!(events.len(), 1);
6588-
match events[0] {
6589-
Event::PaymentFailed { payment_hash, .. } => {
6590-
assert_eq!(payment_hash, dust_hash);
6591-
},
6592-
_ => panic!("Unexpected event"),
6593-
}
6512+
expect_payment_failed!(nodes[0], dust_hash, true);
65946513
assert_eq!(timeout_tx[0].input[0].witness.last().unwrap().len(), OFFERED_HTLC_SCRIPT_WEIGHT);
65956514
// We fail non-dust-HTLC 2 by broadcast of local HTLC-timeout tx on local commitment tx
65966515
let header_2 = BlockHeader { version: 0x20000000, prev_blockhash: parent_hash, merkle_root: Default::default(), time: 42, bits: 42, nonce: 42 };
65976516
assert_eq!(nodes[0].node.get_and_clear_pending_events().len(), 0);
65986517
nodes[0].block_notifier.block_connected(&Block { header: header_2, txdata: vec![timeout_tx[0].clone()]}, 7);
65996518
let header_3 = BlockHeader { version: 0x20000000, prev_blockhash: header_2.bitcoin_hash(), merkle_root: Default::default(), time: 42, bits: 42, nonce: 42 };
66006519
connect_blocks(&nodes[0].block_notifier, ANTI_REORG_DELAY - 1, 8, true, header_3.bitcoin_hash());
6601-
let events = nodes[0].node.get_and_clear_pending_events();
6602-
assert_eq!(events.len(), 1);
6603-
match events[0] {
6604-
Event::PaymentFailed { payment_hash, .. } => {
6605-
assert_eq!(payment_hash, non_dust_hash);
6606-
},
6607-
_ => panic!("Unexpected event"),
6608-
}
6520+
expect_payment_failed!(nodes[0], non_dust_hash, true);
66096521
} else {
66106522
// We fail dust-HTLC 1 by broadcast of remote commitment tx. If revoked, fail also non-dust HTLC
66116523
nodes[0].block_notifier.block_connected(&Block { header, txdata: vec![bs_commitment_tx[0].clone()]}, 1);
@@ -6616,28 +6528,14 @@ fn do_test_sweep_outbound_htlc_failure_update(revoked: bool, local: bool) {
66166528
let parent_hash = connect_blocks(&nodes[0].block_notifier, ANTI_REORG_DELAY - 1, 2, true, header.bitcoin_hash());
66176529
let header_2 = BlockHeader { version: 0x20000000, prev_blockhash: parent_hash, merkle_root: Default::default(), time: 42, bits: 42, nonce: 42 };
66186530
if !revoked {
6619-
let events = nodes[0].node.get_and_clear_pending_events();
6620-
assert_eq!(events.len(), 1);
6621-
match events[0] {
6622-
Event::PaymentFailed { payment_hash, .. } => {
6623-
assert_eq!(payment_hash, dust_hash);
6624-
},
6625-
_ => panic!("Unexpected event"),
6626-
}
6531+
expect_payment_failed!(nodes[0], dust_hash, true);
66276532
assert_eq!(timeout_tx[0].input[0].witness.last().unwrap().len(), ACCEPTED_HTLC_SCRIPT_WEIGHT);
66286533
// We fail non-dust-HTLC 2 by broadcast of local timeout tx on remote commitment tx
66296534
nodes[0].block_notifier.block_connected(&Block { header: header_2, txdata: vec![timeout_tx[0].clone()]}, 7);
66306535
assert_eq!(nodes[0].node.get_and_clear_pending_events().len(), 0);
66316536
let header_3 = BlockHeader { version: 0x20000000, prev_blockhash: header_2.bitcoin_hash(), merkle_root: Default::default(), time: 42, bits: 42, nonce: 42 };
66326537
connect_blocks(&nodes[0].block_notifier, ANTI_REORG_DELAY - 1, 8, true, header_3.bitcoin_hash());
6633-
let events = nodes[0].node.get_and_clear_pending_events();
6634-
assert_eq!(events.len(), 1);
6635-
match events[0] {
6636-
Event::PaymentFailed { payment_hash, .. } => {
6637-
assert_eq!(payment_hash, non_dust_hash);
6638-
},
6639-
_ => panic!("Unexpected event"),
6640-
}
6538+
expect_payment_failed!(nodes[0], non_dust_hash, true);
66416539
} else {
66426540
// If revoked, both dust & non-dust HTLCs should have been failed after ANTI_REORG_DELAY confs of revoked
66436541
// commitment tx
@@ -6943,7 +6841,7 @@ fn test_check_htlc_underpaying() {
69436841
// Create some initial channels
69446842
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::supported(), InitFeatures::supported());
69456843

6946-
let (payment_preimage, _) = route_payment(&nodes[0], &[&nodes[1]], 10_000);
6844+
let (payment_preimage, payment_hash) = route_payment(&nodes[0], &[&nodes[1]], 10_000);
69476845

69486846
// Node 3 is expecting payment of 100_000 but receive 10_000,
69496847
// fail htlc like we didn't know the preimage.
@@ -6968,25 +6866,17 @@ fn test_check_htlc_underpaying() {
69686866
nodes[0].node.handle_update_fail_htlc(&nodes[1].node.get_our_node_id(), &update_fail_htlc);
69696867
commitment_signed_dance!(nodes[0], nodes[1], commitment_signed, false, true);
69706868

6971-
let events = nodes[0].node.get_and_clear_pending_events();
6972-
assert_eq!(events.len(), 1);
6973-
if let &Event::PaymentFailed { payment_hash:_, ref rejected_by_dest, ref error_code, ref error_data } = &events[0] {
6974-
assert_eq!(*rejected_by_dest, true);
6975-
assert_eq!(error_code.unwrap(), 0x4000|15);
6976-
// 10_000 msat as u64, followed by a height of 99 as u32
6977-
assert_eq!(&error_data.as_ref().unwrap()[..], &[
6978-
((10_000u64 >> 7*8) & 0xff) as u8,
6979-
((10_000u64 >> 6*8) & 0xff) as u8,
6980-
((10_000u64 >> 5*8) & 0xff) as u8,
6981-
((10_000u64 >> 4*8) & 0xff) as u8,
6982-
((10_000u64 >> 3*8) & 0xff) as u8,
6983-
((10_000u64 >> 2*8) & 0xff) as u8,
6984-
((10_000u64 >> 1*8) & 0xff) as u8,
6985-
((10_000u64 >> 0*8) & 0xff) as u8,
6986-
0, 0, 0, 99]);
6987-
} else {
6988-
panic!("Unexpected event");
6989-
}
6869+
// 10_000 msat as u64, followed by a height of 99 as u32
6870+
expect_payment_failed!(nodes[0], payment_hash, true, 0x4000|15, &[
6871+
((10_000u64 >> 7*8) & 0xff) as u8,
6872+
((10_000u64 >> 6*8) & 0xff) as u8,
6873+
((10_000u64 >> 5*8) & 0xff) as u8,
6874+
((10_000u64 >> 4*8) & 0xff) as u8,
6875+
((10_000u64 >> 3*8) & 0xff) as u8,
6876+
((10_000u64 >> 2*8) & 0xff) as u8,
6877+
((10_000u64 >> 1*8) & 0xff) as u8,
6878+
((10_000u64 >> 0*8) & 0xff) as u8,
6879+
0, 0, 0, 99]);
69906880
nodes[1].node.get_and_clear_pending_events();
69916881
}
69926882

0 commit comments

Comments
 (0)