Skip to content

Commit 77f0517

Browse files
committed
Offer parsing tests
Test semantic errors when parsing offer bytes.
1 parent 55adbc5 commit 77f0517

File tree

1 file changed

+177
-1
lines changed

1 file changed

+177
-1
lines changed

lightning/src/offers/offer.rs

+177-1
Original file line numberDiff line numberDiff line change
@@ -569,7 +569,7 @@ mod tests {
569569
use core::num::NonZeroU64;
570570
use core::time::Duration;
571571
use ln::features::OfferFeatures;
572-
use offers::parse::SemanticError;
572+
use offers::parse::{ParseError, SemanticError};
573573
use onion_message::{BlindedHop, BlindedPath};
574574
use util::ser::Writeable;
575575

@@ -932,6 +932,182 @@ mod tests {
932932
Err(e) => assert_eq!(e, SemanticError::InvalidQuantity),
933933
}
934934
}
935+
936+
#[test]
937+
fn parses_offer_with_chains() {
938+
let offer = OfferBuilder::new("foo".into(), pubkey(42))
939+
.chain(Network::Bitcoin)
940+
.chain(Network::Testnet)
941+
.build()
942+
.unwrap();
943+
if let Err(e) = offer.to_string().parse::<Offer>() {
944+
panic!("error parsing offer: {:?}", e);
945+
}
946+
947+
let unsupported_chain = ChainHash::from(&[42; 32][..]);
948+
let mut builder = OfferBuilder::new("foo".into(), pubkey(42));
949+
builder.offer.chains = Some(vec![unsupported_chain]);
950+
951+
let offer = builder.build().unwrap();
952+
match offer.to_string().parse::<Offer>() {
953+
Ok(_) => panic!("expected error"),
954+
Err(e) => assert_eq!(e, ParseError::InvalidSemantics(SemanticError::UnsupportedChain)),
955+
}
956+
}
957+
958+
#[test]
959+
fn parses_offer_with_amount() {
960+
let offer = OfferBuilder::new("foo".into(), pubkey(42))
961+
.amount(Amount::Bitcoin { amount_msats: 1000 })
962+
.build()
963+
.unwrap();
964+
if let Err(e) = offer.to_string().parse::<Offer>() {
965+
panic!("error parsing offer: {:?}", e);
966+
}
967+
968+
let offer = OfferBuilder::new("foo".into(), pubkey(42))
969+
.amount(Amount::Currency { iso4217_code: *b"USD", amount: 10 })
970+
.build()
971+
.unwrap();
972+
if let Err(e) = offer.to_string().parse::<Offer>() {
973+
panic!("error parsing offer: {:?}", e);
974+
}
975+
976+
let mut tlv_stream = offer.as_tlv_stream();
977+
tlv_stream.amount = None;
978+
979+
let mut encoded_offer = Vec::new();
980+
tlv_stream.write(&mut encoded_offer).unwrap();
981+
982+
match Offer::try_from(encoded_offer) {
983+
Ok(_) => panic!("expected error"),
984+
Err(e) => {
985+
assert_eq!(e, ParseError::InvalidSemantics(SemanticError::UnexpectedCurrency));
986+
},
987+
}
988+
}
989+
990+
#[test]
991+
fn parses_offer_with_description() {
992+
let offer = OfferBuilder::new("foo".into(), pubkey(42)).build().unwrap();
993+
if let Err(e) = offer.to_string().parse::<Offer>() {
994+
panic!("error parsing offer: {:?}", e);
995+
}
996+
997+
let mut tlv_stream = offer.as_tlv_stream();
998+
tlv_stream.description = None;
999+
1000+
let mut encoded_offer = Vec::new();
1001+
tlv_stream.write(&mut encoded_offer).unwrap();
1002+
1003+
match Offer::try_from(encoded_offer) {
1004+
Ok(_) => panic!("expected error"),
1005+
Err(e) => {
1006+
assert_eq!(e, ParseError::InvalidSemantics(SemanticError::MissingDescription));
1007+
},
1008+
}
1009+
}
1010+
1011+
#[test]
1012+
fn parses_offer_with_paths() {
1013+
let offer = OfferBuilder::new("foo".into(), pubkey(42))
1014+
.path(BlindedPath {
1015+
introduction_node_id: pubkey(40),
1016+
blinding_point: pubkey(41),
1017+
blinded_hops: vec![
1018+
BlindedHop { blinded_node_id: pubkey(43), encrypted_payload: vec![0; 43] },
1019+
BlindedHop { blinded_node_id: pubkey(44), encrypted_payload: vec![0; 44] },
1020+
],
1021+
})
1022+
.path(BlindedPath {
1023+
introduction_node_id: pubkey(40),
1024+
blinding_point: pubkey(41),
1025+
blinded_hops: vec![
1026+
BlindedHop { blinded_node_id: pubkey(45), encrypted_payload: vec![0; 45] },
1027+
BlindedHop { blinded_node_id: pubkey(46), encrypted_payload: vec![0; 46] },
1028+
],
1029+
})
1030+
.build()
1031+
.unwrap();
1032+
if let Err(e) = offer.to_string().parse::<Offer>() {
1033+
panic!("error parsing offer: {:?}", e);
1034+
}
1035+
1036+
let mut builder = OfferBuilder::new("foo".into(), pubkey(42));
1037+
builder.offer.paths = Some(vec![]);
1038+
1039+
let offer = builder.build().unwrap();
1040+
match offer.to_string().parse::<Offer>() {
1041+
Ok(_) => panic!("expected error"),
1042+
Err(e) => assert_eq!(e, ParseError::InvalidSemantics(SemanticError::MissingPaths)),
1043+
}
1044+
}
1045+
1046+
#[test]
1047+
fn parses_offer_with_quantity() {
1048+
let five = NonZeroU64::new(5).unwrap();
1049+
let ten = NonZeroU64::new(10).unwrap();
1050+
1051+
let offer = OfferBuilder::new("foo".into(), pubkey(42))
1052+
.quantity_range(five..=ten)
1053+
.build()
1054+
.unwrap();
1055+
if let Err(e) = offer.to_string().parse::<Offer>() {
1056+
panic!("error parsing offer: {:?}", e);
1057+
}
1058+
1059+
// quantity_min < 1
1060+
let mut builder = OfferBuilder::new("foo".into(), pubkey(42));
1061+
builder.offer.quantity_min = Some(0);
1062+
1063+
let offer = builder.build().unwrap();
1064+
match offer.to_string().parse::<Offer>() {
1065+
Ok(_) => panic!("expected error"),
1066+
Err(e) => assert_eq!(e, ParseError::InvalidSemantics(SemanticError::InvalidQuantity)),
1067+
}
1068+
1069+
// quantity_min > quantity_max
1070+
let mut tlv_stream = offer.as_tlv_stream();
1071+
tlv_stream.quantity_min = Some(5);
1072+
tlv_stream.quantity_max = Some(4);
1073+
1074+
let mut encoded_offer = Vec::new();
1075+
tlv_stream.write(&mut encoded_offer).unwrap();
1076+
1077+
match Offer::try_from(encoded_offer) {
1078+
Ok(_) => panic!("expected error"),
1079+
Err(e) => assert_eq!(e, ParseError::InvalidSemantics(SemanticError::InvalidQuantity)),
1080+
}
1081+
1082+
// quantity_max < 1
1083+
tlv_stream.quantity_min = None;
1084+
tlv_stream.quantity_max = Some(0);
1085+
1086+
let mut encoded_offer = Vec::new();
1087+
tlv_stream.write(&mut encoded_offer).unwrap();
1088+
1089+
match Offer::try_from(encoded_offer) {
1090+
Ok(_) => panic!("expected error"),
1091+
Err(e) => assert_eq!(e, ParseError::InvalidSemantics(SemanticError::InvalidQuantity)),
1092+
}
1093+
}
1094+
1095+
#[test]
1096+
fn parses_offer_with_node_id() {
1097+
let offer = OfferBuilder::new("foo".into(), pubkey(42)).build().unwrap();
1098+
if let Err(e) = offer.to_string().parse::<Offer>() {
1099+
panic!("error parsing offer: {:?}", e);
1100+
}
1101+
1102+
let mut builder = OfferBuilder::new("foo".into(), pubkey(42));
1103+
builder.offer.signing_pubkey = None;
1104+
1105+
let offer = builder.build().unwrap();
1106+
match offer.to_string().parse::<Offer>() {
1107+
Ok(_) => panic!("expected error"),
1108+
Err(e) => assert_eq!(e, ParseError::InvalidSemantics(SemanticError::MissingNodeId)),
1109+
}
1110+
}
9351111
}
9361112

9371113
#[cfg(test)]

0 commit comments

Comments
 (0)