Skip to content

Commit 03d0a4b

Browse files
committed
Offer parsing tests
Test semantic errors when parsing offer bytes.
1 parent 3a6d7b8 commit 03d0a4b

File tree

1 file changed

+173
-1
lines changed

1 file changed

+173
-1
lines changed

lightning/src/offers/offer.rs

+173-1
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,178 @@ 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+
let mut tlv_stream = offer.as_tlv_stream();
881+
tlv_stream.amount = Some(MAX_VALUE_MSAT + 1);
882+
tlv_stream.currency = None;
883+
884+
let mut encoded_offer = Vec::new();
885+
tlv_stream.write(&mut encoded_offer).unwrap();
886+
887+
match Offer::try_from(encoded_offer) {
888+
Ok(_) => panic!("expected error"),
889+
Err(e) => assert_eq!(e, ParseError::InvalidSemantics(SemanticError::InvalidAmount)),
890+
}
891+
}
892+
893+
#[test]
894+
fn parses_offer_with_description() {
895+
let offer = OfferBuilder::new("foo".into(), pubkey(42)).build().unwrap();
896+
if let Err(e) = offer.to_string().parse::<Offer>() {
897+
panic!("error parsing offer: {:?}", e);
898+
}
899+
900+
let mut tlv_stream = offer.as_tlv_stream();
901+
tlv_stream.description = None;
902+
903+
let mut encoded_offer = Vec::new();
904+
tlv_stream.write(&mut encoded_offer).unwrap();
905+
906+
match Offer::try_from(encoded_offer) {
907+
Ok(_) => panic!("expected error"),
908+
Err(e) => {
909+
assert_eq!(e, ParseError::InvalidSemantics(SemanticError::MissingDescription));
910+
},
911+
}
912+
}
913+
914+
#[test]
915+
fn parses_offer_with_paths() {
916+
let offer = OfferBuilder::new("foo".into(), pubkey(42))
917+
.path(BlindedPath {
918+
introduction_node_id: pubkey(40),
919+
blinding_point: pubkey(41),
920+
blinded_hops: vec![
921+
BlindedHop { blinded_node_id: pubkey(43), encrypted_payload: vec![0; 43] },
922+
BlindedHop { blinded_node_id: pubkey(44), encrypted_payload: vec![0; 44] },
923+
],
924+
})
925+
.path(BlindedPath {
926+
introduction_node_id: pubkey(40),
927+
blinding_point: pubkey(41),
928+
blinded_hops: vec![
929+
BlindedHop { blinded_node_id: pubkey(45), encrypted_payload: vec![0; 45] },
930+
BlindedHop { blinded_node_id: pubkey(46), encrypted_payload: vec![0; 46] },
931+
],
932+
})
933+
.build()
934+
.unwrap();
935+
if let Err(e) = offer.to_string().parse::<Offer>() {
936+
panic!("error parsing offer: {:?}", e);
937+
}
938+
939+
let mut builder = OfferBuilder::new("foo".into(), pubkey(42));
940+
builder.offer.paths = Some(vec![]);
941+
942+
let offer = builder.build().unwrap();
943+
if let Err(e) = offer.to_string().parse::<Offer>() {
944+
panic!("error parsing offer: {:?}", e);
945+
}
946+
}
947+
948+
#[test]
949+
fn parses_offer_with_quantity() {
950+
let offer = OfferBuilder::new("foo".into(), pubkey(42))
951+
.supported_quantity(Quantity::one())
952+
.build()
953+
.unwrap();
954+
if let Err(e) = offer.to_string().parse::<Offer>() {
955+
panic!("error parsing offer: {:?}", e);
956+
}
957+
958+
let offer = OfferBuilder::new("foo".into(), pubkey(42))
959+
.supported_quantity(Quantity::Unbounded)
960+
.build()
961+
.unwrap();
962+
if let Err(e) = offer.to_string().parse::<Offer>() {
963+
panic!("error parsing offer: {:?}", e);
964+
}
965+
966+
let offer = OfferBuilder::new("foo".into(), pubkey(42))
967+
.supported_quantity(Quantity::Bounded(NonZeroU64::new(10).unwrap()))
968+
.build()
969+
.unwrap();
970+
if let Err(e) = offer.to_string().parse::<Offer>() {
971+
panic!("error parsing offer: {:?}", e);
972+
}
973+
974+
let mut tlv_stream = offer.as_tlv_stream();
975+
tlv_stream.quantity_max = Some(1);
976+
977+
let mut encoded_offer = Vec::new();
978+
tlv_stream.write(&mut encoded_offer).unwrap();
979+
980+
match Offer::try_from(encoded_offer) {
981+
Ok(_) => panic!("expected error"),
982+
Err(e) => {
983+
assert_eq!(e, ParseError::InvalidSemantics(SemanticError::InvalidQuantity));
984+
},
985+
}
986+
}
987+
988+
#[test]
989+
fn parses_offer_with_node_id() {
990+
let offer = OfferBuilder::new("foo".into(), pubkey(42)).build().unwrap();
991+
if let Err(e) = offer.to_string().parse::<Offer>() {
992+
panic!("error parsing offer: {:?}", e);
993+
}
994+
995+
let mut builder = OfferBuilder::new("foo".into(), pubkey(42));
996+
builder.offer.signing_pubkey = None;
997+
998+
let offer = builder.build().unwrap();
999+
match offer.to_string().parse::<Offer>() {
1000+
Ok(_) => panic!("expected error"),
1001+
Err(e) => {
1002+
assert_eq!(e, ParseError::InvalidSemantics(SemanticError::MissingSigningPubkey));
1003+
},
1004+
}
1005+
}
8341006
}
8351007

8361008
#[cfg(test)]

0 commit comments

Comments
 (0)