Skip to content

Commit 7fe129f

Browse files
committed
Offer parsing tests
Test semantic errors when parsing offer bytes.
1 parent 5064485 commit 7fe129f

File tree

1 file changed

+160
-1
lines changed

1 file changed

+160
-1
lines changed

lightning/src/offers/offer.rs

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

8451004
#[cfg(test)]

0 commit comments

Comments
 (0)