Skip to content

Commit

Permalink
f - test coverage for handling closing_signed while waiting on signer
Browse files Browse the repository at this point in the history
  • Loading branch information
alecchendev committed Aug 15, 2024
1 parent 4e84cd5 commit 44e95c2
Showing 1 changed file with 43 additions and 1 deletion.
44 changes: 43 additions & 1 deletion lightning/src/ln/async_signer_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
//! properly with a signer implementation that asynchronously derives signatures.
use std::collections::HashSet;

use bitcoin::key::Secp256k1;
use bitcoin::{Transaction, TxOut, TxIn, Amount};
use bitcoin::locktime::absolute::LockTime;
use bitcoin::transaction::Version;
Expand All @@ -20,10 +20,13 @@ use crate::chain::channelmonitor::LATENCY_GRACE_PERIOD_BLOCKS;
use crate::chain::ChannelMonitorUpdateStatus;
use crate::events::bump_transaction::WalletSource;
use crate::events::{ClosureReason, Event, MessageSendEvent, MessageSendEventsProvider};
use crate::ln::chan_utils::ClosingTransaction;
use crate::ln::{functional_test_utils::*, msgs};
use crate::ln::channel_state::{ChannelDetails, ChannelShutdownState};
use crate::ln::msgs::ChannelMessageHandler;
use crate::ln::channelmanager::{PaymentId, RAACommitmentOrder, RecipientOnionFields};
use crate::sign::ecdsa::EcdsaChannelSigner;
use crate::sign::SignerProvider;
use crate::util::test_channel_signer::SignerOp;
use crate::util::logger::Logger;

Expand Down Expand Up @@ -851,6 +854,11 @@ fn test_async_holder_signatures_remote_commitment_anchors() {

#[test]
fn test_closing_signed() {
do_test_closing_signed(false);
do_test_closing_signed(true);
}

fn do_test_closing_signed(extra_closing_signed: bool) {
// Based off of `expect_channel_shutdown_state`.
// Test that we can asynchronously sign closing transactions.
let chanmon_cfgs = create_chanmon_cfgs(2);
Expand Down Expand Up @@ -898,6 +906,40 @@ fn test_closing_signed() {
nodes[0].disable_channel_signer_op(&nodes[1].node.get_our_node_id(), &chan_1.2, SignerOp::SignClosingTransaction);
nodes[0].node.handle_closing_signed(&nodes[1].node.get_our_node_id(), &node_1_closing_signed);
nodes[0].enable_channel_signer_op(&nodes[1].node.get_our_node_id(), &chan_1.2, SignerOp::SignClosingTransaction);

if extra_closing_signed {
let node_1_closing_signed_2_bad = {
let mut node_1_closing_signed_2 = node_1_closing_signed.clone();
//node_1_closing_signed_2.signature.
let holder_script = nodes[0].keys_manager.get_shutdown_scriptpubkey().unwrap();
let counterparty_script = nodes[1].keys_manager.get_shutdown_scriptpubkey().unwrap();
let funding_outpoint = bitcoin::OutPoint { txid: chan_1.3.txid(), vout: 0 };
let closing_tx_2 = ClosingTransaction::new(50000, 0, holder_script.into(),
counterparty_script.into(), funding_outpoint);

let per_peer_state = nodes[1].node.per_peer_state.read().unwrap();
let mut chan_lock = per_peer_state.get(&nodes[0].node.get_our_node_id()).unwrap().lock().unwrap();
let chan = chan_lock.channel_by_id.get_mut(&chan_1.2).map(|phase| phase.context_mut()).unwrap();

let signer = chan.get_mut_signer().as_mut_ecdsa().unwrap();
let signature = signer.sign_closing_transaction(&closing_tx_2, &Secp256k1::new()).unwrap();
node_1_closing_signed_2.signature = signature;
node_1_closing_signed_2
};
nodes[0].node.handle_closing_signed(&nodes[1].node.get_our_node_id(), &node_1_closing_signed_2_bad);

let events = nodes[0].node.get_and_clear_pending_msg_events();
assert_eq!(events.len(), 1);
match events[0] {
MessageSendEvent::HandleError {
action: msgs::ErrorAction::SendWarningMessage { .. }, ref node_id
} => {
assert_eq!(node_id, &nodes[1].node.get_our_node_id());
},
_ => panic!("Unexpected event: {:?}", events[0]),
};
}

nodes[0].node.signer_unblocked(None);
let (_, node_0_2nd_closing_signed) = get_closing_signed_broadcast!(nodes[0].node, nodes[1].node.get_our_node_id());

Expand Down

0 comments on commit 44e95c2

Please sign in to comment.