Skip to content

Commit 877a2f4

Browse files
committed
Offer parsing tests
Test semantic errors when parsing offer bytes.
1 parent a97c4b5 commit 877a2f4

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

836996
#[cfg(test)]

0 commit comments

Comments
 (0)