Skip to content

Commit 4236762

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

File tree

1 file changed

+144
-1
lines changed

1 file changed

+144
-1
lines changed

lightning/src/offers/offer.rs

+144-1
Original file line numberDiff line numberDiff line change
@@ -542,7 +542,7 @@ mod tests {
542542
use core::time::Duration;
543543
use ln::features::OfferFeatures;
544544
use ln::msgs::MAX_VALUE_MSAT;
545-
use offers::parse::SemanticError;
545+
use offers::parse::{ParseError, SemanticError};
546546
use onion_message::{BlindedHop, BlindedPath};
547547
use util::ser::Writeable;
548548
use util::string::PrintableString;
@@ -815,6 +815,149 @@ mod tests {
815815
assert_eq!(offer.supported_quantity(), Quantity::One);
816816
assert_eq!(tlv_stream.quantity_max, None);
817817
}
818+
819+
#[test]
820+
fn parses_offer_with_chains() {
821+
let offer = OfferBuilder::new("foo".into(), pubkey(42))
822+
.chain(Network::Bitcoin)
823+
.chain(Network::Testnet)
824+
.build()
825+
.unwrap();
826+
if let Err(e) = offer.to_string().parse::<Offer>() {
827+
panic!("error parsing offer: {:?}", e);
828+
}
829+
}
830+
831+
#[test]
832+
fn parses_offer_with_amount() {
833+
let offer = OfferBuilder::new("foo".into(), pubkey(42))
834+
.amount(Amount::Bitcoin { amount_msats: 1000 })
835+
.build()
836+
.unwrap();
837+
if let Err(e) = offer.to_string().parse::<Offer>() {
838+
panic!("error parsing offer: {:?}", e);
839+
}
840+
841+
let offer = OfferBuilder::new("foo".into(), pubkey(42))
842+
.amount(Amount::Currency { iso4217_code: *b"USD", amount: 1000 })
843+
.build()
844+
.unwrap();
845+
if let Err(e) = offer.to_string().parse::<Offer>() {
846+
panic!("error parsing offer: {:?}", e);
847+
}
848+
849+
let mut tlv_stream = offer.as_tlv_stream();
850+
tlv_stream.amount = None;
851+
tlv_stream.currency = Some(b"USD");
852+
853+
let mut encoded_offer = Vec::new();
854+
tlv_stream.write(&mut encoded_offer).unwrap();
855+
856+
match Offer::try_from(encoded_offer) {
857+
Ok(_) => panic!("expected error"),
858+
Err(e) => assert_eq!(e, ParseError::InvalidSemantics(SemanticError::MissingAmount)),
859+
}
860+
}
861+
862+
#[test]
863+
fn parses_offer_with_description() {
864+
let offer = OfferBuilder::new("foo".into(), pubkey(42)).build().unwrap();
865+
if let Err(e) = offer.to_string().parse::<Offer>() {
866+
panic!("error parsing offer: {:?}", e);
867+
}
868+
869+
let mut tlv_stream = offer.as_tlv_stream();
870+
tlv_stream.description = None;
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) => {
878+
assert_eq!(e, ParseError::InvalidSemantics(SemanticError::MissingDescription));
879+
},
880+
}
881+
}
882+
883+
#[test]
884+
fn parses_offer_with_paths() {
885+
let offer = OfferBuilder::new("foo".into(), pubkey(42))
886+
.path(BlindedPath {
887+
introduction_node_id: pubkey(40),
888+
blinding_point: pubkey(41),
889+
blinded_hops: vec![
890+
BlindedHop { blinded_node_id: pubkey(43), encrypted_payload: vec![0; 43] },
891+
BlindedHop { blinded_node_id: pubkey(44), encrypted_payload: vec![0; 44] },
892+
],
893+
})
894+
.path(BlindedPath {
895+
introduction_node_id: pubkey(40),
896+
blinding_point: pubkey(41),
897+
blinded_hops: vec![
898+
BlindedHop { blinded_node_id: pubkey(45), encrypted_payload: vec![0; 45] },
899+
BlindedHop { blinded_node_id: pubkey(46), encrypted_payload: vec![0; 46] },
900+
],
901+
})
902+
.build()
903+
.unwrap();
904+
if let Err(e) = offer.to_string().parse::<Offer>() {
905+
panic!("error parsing offer: {:?}", e);
906+
}
907+
908+
let mut builder = OfferBuilder::new("foo".into(), pubkey(42));
909+
builder.offer.paths = Some(vec![]);
910+
911+
let offer = builder.build().unwrap();
912+
match offer.to_string().parse::<Offer>() {
913+
Ok(_) => panic!("expected error"),
914+
Err(e) => assert_eq!(e, ParseError::InvalidSemantics(SemanticError::MissingPaths)),
915+
}
916+
}
917+
918+
#[test]
919+
fn parses_offer_with_quantity() {
920+
let offer = OfferBuilder::new("foo".into(), pubkey(42))
921+
.supported_quantity(Quantity::One)
922+
.build()
923+
.unwrap();
924+
if let Err(e) = offer.to_string().parse::<Offer>() {
925+
panic!("error parsing offer: {:?}", e);
926+
}
927+
928+
let offer = OfferBuilder::new("foo".into(), pubkey(42))
929+
.supported_quantity(Quantity::Many)
930+
.build()
931+
.unwrap();
932+
if let Err(e) = offer.to_string().parse::<Offer>() {
933+
panic!("error parsing offer: {:?}", e);
934+
}
935+
936+
let offer = OfferBuilder::new("foo".into(), pubkey(42))
937+
.supported_quantity(Quantity::Max(NonZeroU64::new(10).unwrap()))
938+
.build()
939+
.unwrap();
940+
if let Err(e) = offer.to_string().parse::<Offer>() {
941+
panic!("error parsing offer: {:?}", e);
942+
}
943+
}
944+
945+
#[test]
946+
fn parses_offer_with_node_id() {
947+
let offer = OfferBuilder::new("foo".into(), pubkey(42)).build().unwrap();
948+
if let Err(e) = offer.to_string().parse::<Offer>() {
949+
panic!("error parsing offer: {:?}", e);
950+
}
951+
952+
let mut builder = OfferBuilder::new("foo".into(), pubkey(42));
953+
builder.offer.signing_pubkey = None;
954+
955+
let offer = builder.build().unwrap();
956+
match offer.to_string().parse::<Offer>() {
957+
Ok(_) => panic!("expected error"),
958+
Err(e) => assert_eq!(e, ParseError::InvalidSemantics(SemanticError::MissingNodeId)),
959+
}
960+
}
818961
}
819962

820963
#[cfg(test)]

0 commit comments

Comments
 (0)