Skip to content

Commit fe309ce

Browse files
committed
Offer parsing tests
Test semantic errors when parsing offer bytes.
1 parent f6ce898 commit fe309ce

File tree

1 file changed

+161
-1
lines changed

1 file changed

+161
-1
lines changed

lightning/src/offers/offer.rs

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

833993
#[cfg(test)]

0 commit comments

Comments
 (0)