Skip to content

Commit eb9a7ea

Browse files
committed
f - parsing tests
1 parent 7cfd7d4 commit eb9a7ea

File tree

1 file changed

+177
-1
lines changed

1 file changed

+177
-1
lines changed

lightning/src/offers/offer.rs

Lines changed: 177 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -567,7 +567,7 @@ mod tests {
567567
use core::num::NonZeroU64;
568568
use core::time::Duration;
569569
use ln::features::OfferFeatures;
570-
use offers::parse::SemanticError;
570+
use offers::parse::{ParseError, SemanticError};
571571
use onion_message::{BlindedHop, BlindedPath};
572572
use util::ser::Writeable;
573573

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

9351111
#[cfg(test)]

0 commit comments

Comments
 (0)