Skip to content

Commit

Permalink
Offer parsing tests
Browse files Browse the repository at this point in the history
Test semantic errors when parsing offer bytes.
  • Loading branch information
jkczyz committed Oct 28, 2022
1 parent c6b5a48 commit 11b712e
Showing 1 changed file with 144 additions and 1 deletion.
145 changes: 144 additions & 1 deletion lightning/src/offers/offer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -542,7 +542,7 @@ mod tests {
use core::time::Duration;
use crate::ln::features::OfferFeatures;
use crate::ln::msgs::MAX_VALUE_MSAT;
use crate::offers::parse::SemanticError;
use crate::offers::parse::{ParseError, SemanticError};
use crate::onion_message::{BlindedHop, BlindedPath};
use crate::util::ser::Writeable;
use crate::util::string::PrintableString;
Expand Down Expand Up @@ -815,6 +815,149 @@ mod tests {
assert_eq!(offer.supported_quantity(), Quantity::One);
assert_eq!(tlv_stream.quantity_max, None);
}

#[test]
fn parses_offer_with_chains() {
let offer = OfferBuilder::new("foo".into(), pubkey(42))
.chain(Network::Bitcoin)
.chain(Network::Testnet)
.build()
.unwrap();
if let Err(e) = offer.to_string().parse::<Offer>() {
panic!("error parsing offer: {:?}", e);
}
}

#[test]
fn parses_offer_with_amount() {
let offer = OfferBuilder::new("foo".into(), pubkey(42))
.amount(Amount::Bitcoin { amount_msats: 1000 })
.build()
.unwrap();
if let Err(e) = offer.to_string().parse::<Offer>() {
panic!("error parsing offer: {:?}", e);
}

let offer = OfferBuilder::new("foo".into(), pubkey(42))
.amount(Amount::Currency { iso4217_code: *b"USD", amount: 1000 })
.build()
.unwrap();
if let Err(e) = offer.to_string().parse::<Offer>() {
panic!("error parsing offer: {:?}", e);
}

let mut tlv_stream = offer.as_tlv_stream();
tlv_stream.amount = None;
tlv_stream.currency = Some(b"USD");

let mut encoded_offer = Vec::new();
tlv_stream.write(&mut encoded_offer).unwrap();

match Offer::try_from(encoded_offer) {
Ok(_) => panic!("expected error"),
Err(e) => assert_eq!(e, ParseError::InvalidSemantics(SemanticError::MissingAmount)),
}
}

#[test]
fn parses_offer_with_description() {
let offer = OfferBuilder::new("foo".into(), pubkey(42)).build().unwrap();
if let Err(e) = offer.to_string().parse::<Offer>() {
panic!("error parsing offer: {:?}", e);
}

let mut tlv_stream = offer.as_tlv_stream();
tlv_stream.description = None;

let mut encoded_offer = Vec::new();
tlv_stream.write(&mut encoded_offer).unwrap();

match Offer::try_from(encoded_offer) {
Ok(_) => panic!("expected error"),
Err(e) => {
assert_eq!(e, ParseError::InvalidSemantics(SemanticError::MissingDescription));
},
}
}

#[test]
fn parses_offer_with_paths() {
let offer = OfferBuilder::new("foo".into(), pubkey(42))
.path(BlindedPath {
introduction_node_id: pubkey(40),
blinding_point: pubkey(41),
blinded_hops: vec![
BlindedHop { blinded_node_id: pubkey(43), encrypted_payload: vec![0; 43] },
BlindedHop { blinded_node_id: pubkey(44), encrypted_payload: vec![0; 44] },
],
})
.path(BlindedPath {
introduction_node_id: pubkey(40),
blinding_point: pubkey(41),
blinded_hops: vec![
BlindedHop { blinded_node_id: pubkey(45), encrypted_payload: vec![0; 45] },
BlindedHop { blinded_node_id: pubkey(46), encrypted_payload: vec![0; 46] },
],
})
.build()
.unwrap();
if let Err(e) = offer.to_string().parse::<Offer>() {
panic!("error parsing offer: {:?}", e);
}

let mut builder = OfferBuilder::new("foo".into(), pubkey(42));
builder.offer.paths = Some(vec![]);

let offer = builder.build().unwrap();
match offer.to_string().parse::<Offer>() {
Ok(_) => panic!("expected error"),
Err(e) => assert_eq!(e, ParseError::InvalidSemantics(SemanticError::MissingPaths)),
}
}

#[test]
fn parses_offer_with_quantity() {
let offer = OfferBuilder::new("foo".into(), pubkey(42))
.supported_quantity(Quantity::One)
.build()
.unwrap();
if let Err(e) = offer.to_string().parse::<Offer>() {
panic!("error parsing offer: {:?}", e);
}

let offer = OfferBuilder::new("foo".into(), pubkey(42))
.supported_quantity(Quantity::Many)
.build()
.unwrap();
if let Err(e) = offer.to_string().parse::<Offer>() {
panic!("error parsing offer: {:?}", e);
}

let offer = OfferBuilder::new("foo".into(), pubkey(42))
.supported_quantity(Quantity::Max(NonZeroU64::new(10).unwrap()))
.build()
.unwrap();
if let Err(e) = offer.to_string().parse::<Offer>() {
panic!("error parsing offer: {:?}", e);
}
}

#[test]
fn parses_offer_with_node_id() {
let offer = OfferBuilder::new("foo".into(), pubkey(42)).build().unwrap();
if let Err(e) = offer.to_string().parse::<Offer>() {
panic!("error parsing offer: {:?}", e);
}

let mut builder = OfferBuilder::new("foo".into(), pubkey(42));
builder.offer.signing_pubkey = None;

let offer = builder.build().unwrap();
match offer.to_string().parse::<Offer>() {
Ok(_) => panic!("expected error"),
Err(e) => assert_eq!(e, ParseError::InvalidSemantics(SemanticError::MissingNodeId)),
}
}
}

#[cfg(test)]
Expand Down

0 comments on commit 11b712e

Please sign in to comment.