Skip to content

Commit 5add3d6

Browse files
committed
Offer parsing tests
Test semantic errors when parsing offer bytes.
1 parent 4f743a4 commit 5add3d6

File tree

1 file changed

+144
-1
lines changed

1 file changed

+144
-1
lines changed

lightning/src/offers/offer.rs

Lines changed: 144 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -549,7 +549,7 @@ mod tests {
549549
use core::time::Duration;
550550
use crate::ln::features::OfferFeatures;
551551
use crate::ln::msgs::MAX_VALUE_MSAT;
552-
use crate::offers::parse::SemanticError;
552+
use crate::offers::parse::{ParseError, SemanticError};
553553
use crate::onion_message::{BlindedHop, BlindedPath};
554554
use crate::util::ser::Writeable;
555555
use crate::util::string::PrintableString;
@@ -832,6 +832,149 @@ mod tests {
832832
assert_eq!(tlv_stream.quantity_max, None);
833833

834834
}
835+
836+
#[test]
837+
fn parses_offer_with_chains() {
838+
let offer = OfferBuilder::new("foo".into(), pubkey(42))
839+
.chain(Network::Bitcoin)
840+
.chain(Network::Testnet)
841+
.build()
842+
.unwrap();
843+
if let Err(e) = offer.to_string().parse::<Offer>() {
844+
panic!("error parsing offer: {:?}", e);
845+
}
846+
}
847+
848+
#[test]
849+
fn parses_offer_with_amount() {
850+
let offer = OfferBuilder::new("foo".into(), pubkey(42))
851+
.amount(Amount::Bitcoin { amount_msats: 1000 })
852+
.build()
853+
.unwrap();
854+
if let Err(e) = offer.to_string().parse::<Offer>() {
855+
panic!("error parsing offer: {:?}", e);
856+
}
857+
858+
let offer = OfferBuilder::new("foo".into(), pubkey(42))
859+
.amount(Amount::Currency { iso4217_code: *b"USD", amount: 1000 })
860+
.build()
861+
.unwrap();
862+
if let Err(e) = offer.to_string().parse::<Offer>() {
863+
panic!("error parsing offer: {:?}", e);
864+
}
865+
866+
let mut tlv_stream = offer.as_tlv_stream();
867+
tlv_stream.amount = None;
868+
tlv_stream.currency = Some(b"USD");
869+
870+
let mut encoded_offer = Vec::new();
871+
tlv_stream.write(&mut encoded_offer).unwrap();
872+
873+
match Offer::try_from(encoded_offer) {
874+
Ok(_) => panic!("expected error"),
875+
Err(e) => assert_eq!(e, ParseError::InvalidSemantics(SemanticError::MissingAmount)),
876+
}
877+
}
878+
879+
#[test]
880+
fn parses_offer_with_description() {
881+
let offer = OfferBuilder::new("foo".into(), pubkey(42)).build().unwrap();
882+
if let Err(e) = offer.to_string().parse::<Offer>() {
883+
panic!("error parsing offer: {:?}", e);
884+
}
885+
886+
let mut tlv_stream = offer.as_tlv_stream();
887+
tlv_stream.description = None;
888+
889+
let mut encoded_offer = Vec::new();
890+
tlv_stream.write(&mut encoded_offer).unwrap();
891+
892+
match Offer::try_from(encoded_offer) {
893+
Ok(_) => panic!("expected error"),
894+
Err(e) => {
895+
assert_eq!(e, ParseError::InvalidSemantics(SemanticError::MissingDescription));
896+
},
897+
}
898+
}
899+
900+
#[test]
901+
fn parses_offer_with_paths() {
902+
let offer = OfferBuilder::new("foo".into(), pubkey(42))
903+
.path(BlindedPath {
904+
introduction_node_id: pubkey(40),
905+
blinding_point: pubkey(41),
906+
blinded_hops: vec![
907+
BlindedHop { blinded_node_id: pubkey(43), encrypted_payload: vec![0; 43] },
908+
BlindedHop { blinded_node_id: pubkey(44), encrypted_payload: vec![0; 44] },
909+
],
910+
})
911+
.path(BlindedPath {
912+
introduction_node_id: pubkey(40),
913+
blinding_point: pubkey(41),
914+
blinded_hops: vec![
915+
BlindedHop { blinded_node_id: pubkey(45), encrypted_payload: vec![0; 45] },
916+
BlindedHop { blinded_node_id: pubkey(46), encrypted_payload: vec![0; 46] },
917+
],
918+
})
919+
.build()
920+
.unwrap();
921+
if let Err(e) = offer.to_string().parse::<Offer>() {
922+
panic!("error parsing offer: {:?}", e);
923+
}
924+
925+
let mut builder = OfferBuilder::new("foo".into(), pubkey(42));
926+
builder.offer.paths = Some(vec![]);
927+
928+
let offer = builder.build().unwrap();
929+
match offer.to_string().parse::<Offer>() {
930+
Ok(_) => panic!("expected error"),
931+
Err(e) => assert_eq!(e, ParseError::InvalidSemantics(SemanticError::MissingPaths)),
932+
}
933+
}
934+
935+
#[test]
936+
fn parses_offer_with_quantity() {
937+
let offer = OfferBuilder::new("foo".into(), pubkey(42))
938+
.supported_quantity(Quantity::One)
939+
.build()
940+
.unwrap();
941+
if let Err(e) = offer.to_string().parse::<Offer>() {
942+
panic!("error parsing offer: {:?}", e);
943+
}
944+
945+
let offer = OfferBuilder::new("foo".into(), pubkey(42))
946+
.supported_quantity(Quantity::Many)
947+
.build()
948+
.unwrap();
949+
if let Err(e) = offer.to_string().parse::<Offer>() {
950+
panic!("error parsing offer: {:?}", e);
951+
}
952+
953+
let offer = OfferBuilder::new("foo".into(), pubkey(42))
954+
.supported_quantity(Quantity::Max(NonZeroU64::new(10).unwrap()))
955+
.build()
956+
.unwrap();
957+
if let Err(e) = offer.to_string().parse::<Offer>() {
958+
panic!("error parsing offer: {:?}", e);
959+
}
960+
}
961+
962+
#[test]
963+
fn parses_offer_with_node_id() {
964+
let offer = OfferBuilder::new("foo".into(), pubkey(42)).build().unwrap();
965+
if let Err(e) = offer.to_string().parse::<Offer>() {
966+
panic!("error parsing offer: {:?}", e);
967+
}
968+
969+
let mut builder = OfferBuilder::new("foo".into(), pubkey(42));
970+
builder.offer.signing_pubkey = None;
971+
972+
let offer = builder.build().unwrap();
973+
match offer.to_string().parse::<Offer>() {
974+
Ok(_) => panic!("expected error"),
975+
Err(e) => assert_eq!(e, ParseError::InvalidSemantics(SemanticError::MissingNodeId)),
976+
}
977+
}
835978
}
836979

837980
#[cfg(test)]

0 commit comments

Comments
 (0)