Skip to content

Commit 3253cb5

Browse files
committed
Offer parsing tests
Test semantic errors when parsing offer bytes.
1 parent 65b8f64 commit 3253cb5

File tree

1 file changed

+181
-1
lines changed

1 file changed

+181
-1
lines changed

lightning/src/offers/offer.rs

Lines changed: 181 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -595,7 +595,7 @@ mod tests {
595595
use core::time::Duration;
596596
use ln::features::OfferFeatures;
597597
use ln::msgs::MAX_VALUE_MSAT;
598-
use offers::parse::SemanticError;
598+
use offers::parse::{ParseError, SemanticError};
599599
use onion_message::{BlindedHop, BlindedPath};
600600
use util::ser::Writeable;
601601

@@ -966,6 +966,186 @@ mod tests {
966966
Err(e) => assert_eq!(e, SemanticError::InvalidQuantity),
967967
}
968968
}
969+
970+
#[test]
971+
fn parses_offer_with_chains() {
972+
let offer = OfferBuilder::new("foo".into(), pubkey(42))
973+
.chain(Network::Bitcoin)
974+
.chain(Network::Testnet)
975+
.build()
976+
.unwrap();
977+
if let Err(e) = offer.to_string().parse::<Offer>() {
978+
panic!("error parsing offer: {:?}", e);
979+
}
980+
981+
let unsupported_chain = ChainHash::from(&[42; 32][..]);
982+
let mut builder = OfferBuilder::new("foo".into(), pubkey(42));
983+
builder.offer.chains = Some(vec![unsupported_chain]);
984+
985+
let offer = builder.build().unwrap();
986+
match offer.to_string().parse::<Offer>() {
987+
Ok(_) => panic!("expected error"),
988+
Err(e) => assert_eq!(e, ParseError::InvalidSemantics(SemanticError::UnsupportedChain)),
989+
}
990+
}
991+
992+
#[test]
993+
fn parses_offer_with_amount() {
994+
let offer = OfferBuilder::new("foo".into(), pubkey(42))
995+
.amount(Amount::Bitcoin { amount_msats: 1000 })
996+
.build()
997+
.unwrap();
998+
if let Err(e) = offer.to_string().parse::<Offer>() {
999+
panic!("error parsing offer: {:?}", e);
1000+
}
1001+
1002+
let mut tlv_stream = offer.as_tlv_stream();
1003+
tlv_stream.currency = Some(b"USD");
1004+
1005+
let mut encoded_offer = Vec::new();
1006+
tlv_stream.write(&mut encoded_offer).unwrap();
1007+
1008+
match Offer::try_from(encoded_offer) {
1009+
Ok(_) => panic!("expected error"),
1010+
Err(e) => {
1011+
assert_eq!(e, ParseError::InvalidSemantics(SemanticError::UnsupportedCurrency));
1012+
},
1013+
}
1014+
1015+
let mut tlv_stream = offer.as_tlv_stream();
1016+
tlv_stream.amount = None;
1017+
tlv_stream.currency = Some(b"USD");
1018+
1019+
let mut encoded_offer = Vec::new();
1020+
tlv_stream.write(&mut encoded_offer).unwrap();
1021+
1022+
match Offer::try_from(encoded_offer) {
1023+
Ok(_) => panic!("expected error"),
1024+
Err(e) => assert_eq!(e, ParseError::InvalidSemantics(SemanticError::MissingAmount)),
1025+
}
1026+
}
1027+
1028+
#[test]
1029+
fn parses_offer_with_description() {
1030+
let offer = OfferBuilder::new("foo".into(), pubkey(42)).build().unwrap();
1031+
if let Err(e) = offer.to_string().parse::<Offer>() {
1032+
panic!("error parsing offer: {:?}", e);
1033+
}
1034+
1035+
let mut tlv_stream = offer.as_tlv_stream();
1036+
tlv_stream.description = None;
1037+
1038+
let mut encoded_offer = Vec::new();
1039+
tlv_stream.write(&mut encoded_offer).unwrap();
1040+
1041+
match Offer::try_from(encoded_offer) {
1042+
Ok(_) => panic!("expected error"),
1043+
Err(e) => {
1044+
assert_eq!(e, ParseError::InvalidSemantics(SemanticError::MissingDescription));
1045+
},
1046+
}
1047+
}
1048+
1049+
#[test]
1050+
fn parses_offer_with_paths() {
1051+
let offer = OfferBuilder::new("foo".into(), pubkey(42))
1052+
.path(BlindedPath {
1053+
introduction_node_id: pubkey(40),
1054+
blinding_point: pubkey(41),
1055+
blinded_hops: vec![
1056+
BlindedHop { blinded_node_id: pubkey(43), encrypted_payload: vec![0; 43] },
1057+
BlindedHop { blinded_node_id: pubkey(44), encrypted_payload: vec![0; 44] },
1058+
],
1059+
})
1060+
.path(BlindedPath {
1061+
introduction_node_id: pubkey(40),
1062+
blinding_point: pubkey(41),
1063+
blinded_hops: vec![
1064+
BlindedHop { blinded_node_id: pubkey(45), encrypted_payload: vec![0; 45] },
1065+
BlindedHop { blinded_node_id: pubkey(46), encrypted_payload: vec![0; 46] },
1066+
],
1067+
})
1068+
.build()
1069+
.unwrap();
1070+
if let Err(e) = offer.to_string().parse::<Offer>() {
1071+
panic!("error parsing offer: {:?}", e);
1072+
}
1073+
1074+
let mut builder = OfferBuilder::new("foo".into(), pubkey(42));
1075+
builder.offer.paths = Some(vec![]);
1076+
1077+
let offer = builder.build().unwrap();
1078+
match offer.to_string().parse::<Offer>() {
1079+
Ok(_) => panic!("expected error"),
1080+
Err(e) => assert_eq!(e, ParseError::InvalidSemantics(SemanticError::MissingPaths)),
1081+
}
1082+
}
1083+
1084+
#[test]
1085+
fn parses_offer_with_quantity() {
1086+
let five = NonZeroU64::new(5).unwrap();
1087+
let ten = NonZeroU64::new(10).unwrap();
1088+
1089+
let offer = OfferBuilder::new("foo".into(), pubkey(42))
1090+
.quantity_range(five..=ten)
1091+
.build()
1092+
.unwrap();
1093+
if let Err(e) = offer.to_string().parse::<Offer>() {
1094+
panic!("error parsing offer: {:?}", e);
1095+
}
1096+
1097+
// quantity_min < 1
1098+
let mut builder = OfferBuilder::new("foo".into(), pubkey(42));
1099+
builder.offer.quantity_min = Some(0);
1100+
1101+
let offer = builder.build().unwrap();
1102+
match offer.to_string().parse::<Offer>() {
1103+
Ok(_) => panic!("expected error"),
1104+
Err(e) => assert_eq!(e, ParseError::InvalidSemantics(SemanticError::InvalidQuantity)),
1105+
}
1106+
1107+
// quantity_min > quantity_max
1108+
let mut tlv_stream = offer.as_tlv_stream();
1109+
tlv_stream.quantity_min = Some(5);
1110+
tlv_stream.quantity_max = Some(4);
1111+
1112+
let mut encoded_offer = Vec::new();
1113+
tlv_stream.write(&mut encoded_offer).unwrap();
1114+
1115+
match Offer::try_from(encoded_offer) {
1116+
Ok(_) => panic!("expected error"),
1117+
Err(e) => assert_eq!(e, ParseError::InvalidSemantics(SemanticError::InvalidQuantity)),
1118+
}
1119+
1120+
// quantity_max < 1
1121+
tlv_stream.quantity_min = None;
1122+
tlv_stream.quantity_max = Some(0);
1123+
1124+
let mut encoded_offer = Vec::new();
1125+
tlv_stream.write(&mut encoded_offer).unwrap();
1126+
1127+
match Offer::try_from(encoded_offer) {
1128+
Ok(_) => panic!("expected error"),
1129+
Err(e) => assert_eq!(e, ParseError::InvalidSemantics(SemanticError::InvalidQuantity)),
1130+
}
1131+
}
1132+
1133+
#[test]
1134+
fn parses_offer_with_node_id() {
1135+
let offer = OfferBuilder::new("foo".into(), pubkey(42)).build().unwrap();
1136+
if let Err(e) = offer.to_string().parse::<Offer>() {
1137+
panic!("error parsing offer: {:?}", e);
1138+
}
1139+
1140+
let mut builder = OfferBuilder::new("foo".into(), pubkey(42));
1141+
builder.offer.signing_pubkey = None;
1142+
1143+
let offer = builder.build().unwrap();
1144+
match offer.to_string().parse::<Offer>() {
1145+
Ok(_) => panic!("expected error"),
1146+
Err(e) => assert_eq!(e, ParseError::InvalidSemantics(SemanticError::MissingNodeId)),
1147+
}
1148+
}
9691149
}
9701150

9711151
#[cfg(test)]

0 commit comments

Comments
 (0)