Skip to content

Commit 8a868df

Browse files
f: somehow improve the integration test to make it readable and reviewable
1 parent 25d55b4 commit 8a868df

File tree

1 file changed

+163
-124
lines changed

1 file changed

+163
-124
lines changed

lightning-liquidity/tests/lsps2_integration_tests.rs

Lines changed: 163 additions & 124 deletions
Original file line numberDiff line numberDiff line change
@@ -927,6 +927,25 @@ fn opening_fee_params_menu_is_sorted_by_spec() {
927927

928928
#[test]
929929
fn client_trusts_lsp_end_to_end_test() {
930+
// There are 3 nodes. Payer, service and client.
931+
// client_trusts_lsp=true, that means that funding transaction broadcast will need to happen manually
932+
// after the client claims the HTLC.
933+
//
934+
// 1. Create a channel between payer and service
935+
// 2. Do the LSPS2 ceremony between client and service, to prepare the service to intercept an htlc and eventually create a JIT channel
936+
// 3. Make the client create a JIT invoice and make the payer pay it
937+
// 4. Assert that the service intercepts the HTLC
938+
// 5. Assert that the service emits a LiquidityEvent::OpenChannel. This means that the intercepted HTLC was enough
939+
// and that it's ready to proceed with channel creation.
940+
// 6. Proceed with the JIT channel creation (we create it with funding_transaction_generated_manual_broadcast because
941+
// client_trusts_lsp=true).
942+
// 7. Call the service's channel_ready function
943+
// 8. The service will now forward the intercepted HTLC to the client on the new JIT channel
944+
// 9. The client will see the PaymentClaimable event
945+
// 10. Assert that the service has not broadcasted the funding transaction yet, because the client has not claimed the HTLC yet
946+
// 11. Make the client claim the HTLC
947+
// 12. Assert that the service has now received the BroadcastTransaction event, and we broadcast it
948+
// 13. Assert that the payer received the PaymentSent event
930949
let chanmon_cfgs = create_chanmon_cfgs(3);
931950
let node_cfgs = create_node_cfgs(3, &chanmon_cfgs);
932951
let mut service_node_config = test_default_channel_config();
@@ -943,148 +962,38 @@ fn client_trusts_lsp_end_to_end_test() {
943962
);
944963
let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
945964
let (lsps_nodes, promise_secret) = setup_test_lsps2_nodes_with_payer(nodes);
946-
let LSPSNodesWithPayer { service_node, client_node, payer_node } = lsps_nodes;
965+
let LSPSNodesWithPayer { ref service_node, ref client_node, ref payer_node } = lsps_nodes;
947966

948967
let payer_node_id = payer_node.node.get_our_node_id();
949968
let service_node_id = service_node.inner.node.get_our_node_id();
950969
let client_node_id = client_node.inner.node.get_our_node_id();
951970

952-
let client_handler = client_node.liquidity_manager.lsps2_client_handler().unwrap();
953971
let service_handler = service_node.liquidity_manager.lsps2_service_handler().unwrap();
954972

955973
create_chan_between_nodes_with_value(&payer_node, &service_node.inner, 2000000, 100000);
956974

957-
let get_info_request_id = client_handler.request_opening_params(service_node_id, None);
958-
let get_info_request = get_lsps_message!(client_node, service_node_id);
959-
960-
service_node.liquidity_manager.handle_custom_message(get_info_request, client_node_id).unwrap();
961-
962-
let get_info_event = service_node.liquidity_manager.next_event().unwrap();
963-
if let LiquidityEvent::LSPS2Service(LSPS2ServiceEvent::GetInfo {
964-
request_id,
965-
counterparty_node_id,
966-
token,
967-
}) = get_info_event
968-
{
969-
assert_eq!(request_id, get_info_request_id);
970-
assert_eq!(counterparty_node_id, client_node_id);
971-
assert_eq!(token, None);
972-
} else {
973-
panic!("Unexpected event");
974-
}
975-
976-
let raw_opening_params = LSPS2RawOpeningFeeParams {
977-
min_fee_msat: 0,
978-
proportional: 0,
979-
valid_until: LSPSDateTime::from_str("2035-05-20T08:30:45Z").unwrap(),
980-
min_lifetime: 144,
981-
max_client_to_self_delay: 128,
982-
min_payment_size_msat: 1,
983-
max_payment_size_msat: 100_000_000,
984-
};
985-
986-
service_handler
987-
.opening_fee_params_generated(
988-
&client_node_id,
989-
get_info_request_id.clone(),
990-
vec![raw_opening_params],
991-
)
992-
.unwrap();
993-
let get_info_response = get_lsps_message!(service_node, client_node_id);
994-
995-
client_node
996-
.liquidity_manager
997-
.handle_custom_message(get_info_response, service_node_id)
998-
.unwrap();
999-
1000-
let opening_params_event = client_node.liquidity_manager.next_event().unwrap();
1001-
let opening_fee_params = match opening_params_event {
1002-
LiquidityEvent::LSPS2Client(LSPS2ClientEvent::OpeningParametersReady {
1003-
request_id,
1004-
counterparty_node_id,
1005-
opening_fee_params_menu,
1006-
}) => {
1007-
assert_eq!(request_id, get_info_request_id);
1008-
assert_eq!(counterparty_node_id, service_node_id);
1009-
let opening_fee_params = opening_fee_params_menu.first().unwrap().clone();
1010-
assert!(is_valid_opening_fee_params(&opening_fee_params, &promise_secret));
1011-
opening_fee_params
1012-
},
1013-
_ => panic!("Unexpected event"),
1014-
};
1015-
1016-
let payment_size_msat = Some(1_000_000);
1017-
let buy_request_id = client_handler
1018-
.select_opening_params(service_node_id, payment_size_msat, opening_fee_params.clone())
1019-
.unwrap();
1020-
1021-
let buy_request = get_lsps_message!(client_node, service_node_id);
1022-
service_node.liquidity_manager.handle_custom_message(buy_request, client_node_id).unwrap();
1023-
1024-
let buy_event = service_node.liquidity_manager.next_event().unwrap();
1025-
if let LiquidityEvent::LSPS2Service(LSPS2ServiceEvent::BuyRequest {
1026-
request_id,
1027-
counterparty_node_id,
1028-
opening_fee_params: ofp,
1029-
payment_size_msat: psm,
1030-
}) = buy_event
1031-
{
1032-
assert_eq!(request_id, buy_request_id);
1033-
assert_eq!(counterparty_node_id, client_node_id);
1034-
assert_eq!(opening_fee_params, ofp);
1035-
assert_eq!(payment_size_msat, psm);
1036-
} else {
1037-
panic!("Unexpected event");
1038-
}
1039-
1040-
let user_channel_id = 42;
1041-
let cltv_expiry_delta = 144;
1042975
let intercept_scid = service_node.node.get_intercept_scid();
1043-
let client_trusts_lsp = true;
1044-
1045-
service_handler
1046-
.invoice_parameters_generated(
1047-
&client_node_id,
1048-
buy_request_id.clone(),
1049-
intercept_scid,
1050-
cltv_expiry_delta,
1051-
client_trusts_lsp,
1052-
user_channel_id,
1053-
)
1054-
.unwrap();
1055-
1056-
let buy_response = get_lsps_message!(service_node, client_node_id);
1057-
client_node.liquidity_manager.handle_custom_message(buy_response, service_node_id).unwrap();
1058-
1059-
let invoice_params_event = client_node.liquidity_manager.next_event().unwrap();
1060-
if let LiquidityEvent::LSPS2Client(LSPS2ClientEvent::InvoiceParametersReady {
1061-
request_id,
1062-
counterparty_node_id,
1063-
intercept_scid: iscid,
1064-
cltv_expiry_delta: ced,
1065-
payment_size_msat: psm,
1066-
}) = invoice_params_event
1067-
{
1068-
assert_eq!(request_id, buy_request_id);
1069-
assert_eq!(counterparty_node_id, service_node_id);
1070-
assert_eq!(intercept_scid, iscid);
1071-
assert_eq!(cltv_expiry_delta, ced);
1072-
assert_eq!(payment_size_msat, psm);
1073-
} else {
1074-
panic!("Unexpected event");
1075-
}
976+
let user_channel_id = 42;
977+
let cltv_expiry_delta: u32 = 144;
978+
let payment_size_msat = Some(1_000_000);
1076979

1077-
let description = "asdf";
1078-
let expiry_secs = 3600;
980+
execute_lsps2_dance(
981+
&lsps_nodes,
982+
intercept_scid,
983+
user_channel_id,
984+
cltv_expiry_delta,
985+
promise_secret,
986+
payment_size_msat,
987+
);
1079988

1080989
let invoice = create_jit_invoice(
1081990
&client_node,
1082991
service_node_id,
1083992
intercept_scid,
1084993
cltv_expiry_delta,
1085994
payment_size_msat,
1086-
description,
1087-
expiry_secs,
995+
"asdf",
996+
3600,
1088997
)
1089998
.unwrap();
1090999

@@ -1233,6 +1142,136 @@ fn client_trusts_lsp_end_to_end_test() {
12331142
expect_payment_sent(&payer_node, preimage.unwrap(), Some(Some(total_fee_msat)), true, true);
12341143
}
12351144

1145+
fn execute_lsps2_dance(
1146+
lsps_nodes: &LSPSNodesWithPayer, intercept_scid: u64, user_channel_id: u128,
1147+
cltv_expiry_delta: u32, promise_secret: [u8; 32], payment_size_msat: Option<u64>,
1148+
) {
1149+
let service_node = &lsps_nodes.service_node;
1150+
let client_node = &lsps_nodes.client_node;
1151+
1152+
let service_node_id = service_node.inner.node.get_our_node_id();
1153+
let client_node_id = client_node.inner.node.get_our_node_id();
1154+
1155+
let client_handler = client_node.liquidity_manager.lsps2_client_handler().unwrap();
1156+
let service_handler = service_node.liquidity_manager.lsps2_service_handler().unwrap();
1157+
1158+
let get_info_request_id = client_handler.request_opening_params(service_node_id, None);
1159+
let get_info_request = get_lsps_message!(client_node, service_node_id);
1160+
1161+
service_node.liquidity_manager.handle_custom_message(get_info_request, client_node_id).unwrap();
1162+
1163+
let get_info_event = service_node.liquidity_manager.next_event().unwrap();
1164+
if let LiquidityEvent::LSPS2Service(LSPS2ServiceEvent::GetInfo {
1165+
request_id,
1166+
counterparty_node_id,
1167+
token,
1168+
}) = get_info_event
1169+
{
1170+
assert_eq!(request_id, get_info_request_id);
1171+
assert_eq!(counterparty_node_id, client_node_id);
1172+
assert_eq!(token, None);
1173+
} else {
1174+
panic!("Unexpected event");
1175+
}
1176+
1177+
let raw_opening_params = LSPS2RawOpeningFeeParams {
1178+
min_fee_msat: 0,
1179+
proportional: 0,
1180+
valid_until: LSPSDateTime::from_str("2035-05-20T08:30:45Z").unwrap(),
1181+
min_lifetime: 144,
1182+
max_client_to_self_delay: 128,
1183+
min_payment_size_msat: 1,
1184+
max_payment_size_msat: 100_000_000,
1185+
};
1186+
1187+
service_handler
1188+
.opening_fee_params_generated(
1189+
&client_node_id,
1190+
get_info_request_id.clone(),
1191+
vec![raw_opening_params],
1192+
)
1193+
.unwrap();
1194+
let get_info_response = get_lsps_message!(service_node, client_node_id);
1195+
1196+
client_node
1197+
.liquidity_manager
1198+
.handle_custom_message(get_info_response, service_node_id)
1199+
.unwrap();
1200+
1201+
let opening_params_event = client_node.liquidity_manager.next_event().unwrap();
1202+
let opening_fee_params = match opening_params_event {
1203+
LiquidityEvent::LSPS2Client(LSPS2ClientEvent::OpeningParametersReady {
1204+
request_id,
1205+
counterparty_node_id,
1206+
opening_fee_params_menu,
1207+
}) => {
1208+
assert_eq!(request_id, get_info_request_id);
1209+
assert_eq!(counterparty_node_id, service_node_id);
1210+
let opening_fee_params = opening_fee_params_menu.first().unwrap().clone();
1211+
assert!(is_valid_opening_fee_params(&opening_fee_params, &promise_secret));
1212+
opening_fee_params
1213+
},
1214+
_ => panic!("Unexpected event"),
1215+
};
1216+
1217+
let buy_request_id = client_handler
1218+
.select_opening_params(service_node_id, payment_size_msat, opening_fee_params.clone())
1219+
.unwrap();
1220+
1221+
let buy_request = get_lsps_message!(client_node, service_node_id);
1222+
service_node.liquidity_manager.handle_custom_message(buy_request, client_node_id).unwrap();
1223+
1224+
let buy_event = service_node.liquidity_manager.next_event().unwrap();
1225+
if let LiquidityEvent::LSPS2Service(LSPS2ServiceEvent::BuyRequest {
1226+
request_id,
1227+
counterparty_node_id,
1228+
opening_fee_params: ofp,
1229+
payment_size_msat: psm,
1230+
}) = buy_event
1231+
{
1232+
assert_eq!(request_id, buy_request_id);
1233+
assert_eq!(counterparty_node_id, client_node_id);
1234+
assert_eq!(opening_fee_params, ofp);
1235+
assert_eq!(payment_size_msat, psm);
1236+
} else {
1237+
panic!("Unexpected event");
1238+
}
1239+
1240+
let client_trusts_lsp = true;
1241+
1242+
service_handler
1243+
.invoice_parameters_generated(
1244+
&client_node_id,
1245+
buy_request_id.clone(),
1246+
intercept_scid,
1247+
cltv_expiry_delta,
1248+
client_trusts_lsp,
1249+
user_channel_id,
1250+
)
1251+
.unwrap();
1252+
1253+
let buy_response = get_lsps_message!(service_node, client_node_id);
1254+
client_node.liquidity_manager.handle_custom_message(buy_response, service_node_id).unwrap();
1255+
1256+
let invoice_params_event = client_node.liquidity_manager.next_event().unwrap();
1257+
if let LiquidityEvent::LSPS2Client(LSPS2ClientEvent::InvoiceParametersReady {
1258+
request_id,
1259+
counterparty_node_id,
1260+
intercept_scid: iscid,
1261+
cltv_expiry_delta: ced,
1262+
payment_size_msat: psm,
1263+
}) = invoice_params_event
1264+
{
1265+
assert_eq!(request_id, buy_request_id);
1266+
assert_eq!(counterparty_node_id, service_node_id);
1267+
assert_eq!(intercept_scid, iscid);
1268+
assert_eq!(cltv_expiry_delta, ced);
1269+
assert_eq!(payment_size_msat, psm);
1270+
} else {
1271+
panic!("Unexpected event");
1272+
}
1273+
}
1274+
12361275
fn create_channel_with_manual_broadcast(
12371276
service_node_id: &PublicKey, client_node_id: &PublicKey, service_node: &LiquidityNode,
12381277
client_node: &LiquidityNode, user_channel_id: u128, expected_outbound_amount_msat: &u64,

0 commit comments

Comments
 (0)