Skip to content

Commit 5fc4abc

Browse files
committed
Move bech32 parsing tests to the parse module
Additional BOLT 12 tests specific to Offer were added, which will live in the offer module. Thus, it makes sense to move the bech32 tests to the parse module.
1 parent d2242f6 commit 5fc4abc

File tree

2 files changed

+78
-78
lines changed

2 files changed

+78
-78
lines changed

lightning/src/offers/offer.rs

Lines changed: 0 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -1509,81 +1509,3 @@ mod tests {
15091509
}
15101510
}
15111511
}
1512-
1513-
#[cfg(test)]
1514-
mod bech32_tests {
1515-
use super::{Bolt12ParseError, Offer};
1516-
use bitcoin::bech32;
1517-
use crate::ln::msgs::DecodeError;
1518-
1519-
#[test]
1520-
fn encodes_offer_as_bech32_without_checksum() {
1521-
let encoded_offer = "lno1pqps7sjqpgtyzm3qv4uxzmtsd3jjqer9wd3hy6tsw35k7msjzfpy7nz5yqcnygrfdej82um5wf5k2uckyypwa3eyt44h6txtxquqh7lz5djge4afgfjn7k4rgrkuag0jsd5xvxg";
1522-
let offer = dbg!(encoded_offer.parse::<Offer>().unwrap());
1523-
let reencoded_offer = offer.to_string();
1524-
dbg!(reencoded_offer.parse::<Offer>().unwrap());
1525-
assert_eq!(reencoded_offer, encoded_offer);
1526-
}
1527-
1528-
#[test]
1529-
fn parses_bech32_encoded_offers() {
1530-
let offers = [
1531-
// BOLT 12 test vectors
1532-
"lno1pqps7sjqpgtyzm3qv4uxzmtsd3jjqer9wd3hy6tsw35k7msjzfpy7nz5yqcnygrfdej82um5wf5k2uckyypwa3eyt44h6txtxquqh7lz5djge4afgfjn7k4rgrkuag0jsd5xvxg",
1533-
"l+no1pqps7sjqpgtyzm3qv4uxzmtsd3jjqer9wd3hy6tsw35k7msjzfpy7nz5yqcnygrfdej82um5wf5k2uckyypwa3eyt44h6txtxquqh7lz5djge4afgfjn7k4rgrkuag0jsd5xvxg",
1534-
"lno1pqps7sjqpgt+yzm3qv4uxzmtsd3jjqer9wd3hy6tsw3+5k7msjzfpy7nz5yqcn+ygrfdej82um5wf5k2uckyypwa3eyt44h6txtxquqh7lz5djge4afgfjn7k4rgrkuag0jsd+5xvxg",
1535-
"lno1pqps7sjqpgt+ yzm3qv4uxzmtsd3jjqer9wd3hy6tsw3+ 5k7msjzfpy7nz5yqcn+\nygrfdej82um5wf5k2uckyypwa3eyt44h6txtxquqh7lz5djge4afgfjn7k4rgrkuag0jsd+\r\n 5xvxg",
1536-
];
1537-
for encoded_offer in &offers {
1538-
if let Err(e) = encoded_offer.parse::<Offer>() {
1539-
panic!("Invalid offer ({:?}): {}", e, encoded_offer);
1540-
}
1541-
}
1542-
}
1543-
1544-
#[test]
1545-
fn fails_parsing_bech32_encoded_offers_with_invalid_continuations() {
1546-
let offers = [
1547-
// BOLT 12 test vectors
1548-
"lno1pqps7sjqpgtyzm3qv4uxzmtsd3jjqer9wd3hy6tsw35k7msjzfpy7nz5yqcnygrfdej82um5wf5k2uckyypwa3eyt44h6txtxquqh7lz5djge4afgfjn7k4rgrkuag0jsd5xvxg+",
1549-
"lno1pqps7sjqpgtyzm3qv4uxzmtsd3jjqer9wd3hy6tsw35k7msjzfpy7nz5yqcnygrfdej82um5wf5k2uckyypwa3eyt44h6txtxquqh7lz5djge4afgfjn7k4rgrkuag0jsd5xvxg+ ",
1550-
"+lno1pqps7sjqpgtyzm3qv4uxzmtsd3jjqer9wd3hy6tsw35k7msjzfpy7nz5yqcnygrfdej82um5wf5k2uckyypwa3eyt44h6txtxquqh7lz5djge4afgfjn7k4rgrkuag0jsd5xvxg",
1551-
"+ lno1pqps7sjqpgtyzm3qv4uxzmtsd3jjqer9wd3hy6tsw35k7msjzfpy7nz5yqcnygrfdej82um5wf5k2uckyypwa3eyt44h6txtxquqh7lz5djge4afgfjn7k4rgrkuag0jsd5xvxg",
1552-
"ln++o1pqps7sjqpgtyzm3qv4uxzmtsd3jjqer9wd3hy6tsw35k7msjzfpy7nz5yqcnygrfdej82um5wf5k2uckyypwa3eyt44h6txtxquqh7lz5djge4afgfjn7k4rgrkuag0jsd5xvxg",
1553-
];
1554-
for encoded_offer in &offers {
1555-
match encoded_offer.parse::<Offer>() {
1556-
Ok(_) => panic!("Valid offer: {}", encoded_offer),
1557-
Err(e) => assert_eq!(e, Bolt12ParseError::InvalidContinuation),
1558-
}
1559-
}
1560-
1561-
}
1562-
1563-
#[test]
1564-
fn fails_parsing_bech32_encoded_offer_with_invalid_hrp() {
1565-
let encoded_offer = "lni1pqps7sjqpgtyzm3qv4uxzmtsd3jjqer9wd3hy6tsw35k7msjzfpy7nz5yqcnygrfdej82um5wf5k2uckyypwa3eyt44h6txtxquqh7lz5djge4afgfjn7k4rgrkuag0jsd5xvxg";
1566-
match encoded_offer.parse::<Offer>() {
1567-
Ok(_) => panic!("Valid offer: {}", encoded_offer),
1568-
Err(e) => assert_eq!(e, Bolt12ParseError::InvalidBech32Hrp),
1569-
}
1570-
}
1571-
1572-
#[test]
1573-
fn fails_parsing_bech32_encoded_offer_with_invalid_bech32_data() {
1574-
let encoded_offer = "lno1pqps7sjqpgtyzm3qv4uxzmtsd3jjqer9wd3hy6tsw35k7msjzfpy7nz5yqcnygrfdej82um5wf5k2uckyypwa3eyt44h6txtxquqh7lz5djge4afgfjn7k4rgrkuag0jsd5xvxo";
1575-
match encoded_offer.parse::<Offer>() {
1576-
Ok(_) => panic!("Valid offer: {}", encoded_offer),
1577-
Err(e) => assert_eq!(e, Bolt12ParseError::Bech32(bech32::Error::InvalidChar('o'))),
1578-
}
1579-
}
1580-
1581-
#[test]
1582-
fn fails_parsing_bech32_encoded_offer_with_invalid_tlv_data() {
1583-
let encoded_offer = "lno1pqps7sjqpgtyzm3qv4uxzmtsd3jjqer9wd3hy6tsw35k7msjzfpy7nz5yqcnygrfdej82um5wf5k2uckyypwa3eyt44h6txtxquqh7lz5djge4afgfjn7k4rgrkuag0jsd5xvxgqqqqq";
1584-
match encoded_offer.parse::<Offer>() {
1585-
Ok(_) => panic!("Valid offer: {}", encoded_offer),
1586-
Err(e) => assert_eq!(e, Bolt12ParseError::Decode(DecodeError::InvalidValue)),
1587-
}
1588-
}
1589-
}

lightning/src/offers/parse.rs

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,3 +216,81 @@ impl From<secp256k1::Error> for Bolt12ParseError {
216216
Self::InvalidSignature(error)
217217
}
218218
}
219+
220+
#[cfg(test)]
221+
mod tests {
222+
use super::Bolt12ParseError;
223+
use bitcoin::bech32;
224+
use crate::ln::msgs::DecodeError;
225+
use crate::offers::offer::Offer;
226+
227+
#[test]
228+
fn encodes_offer_as_bech32_without_checksum() {
229+
let encoded_offer = "lno1pqps7sjqpgtyzm3qv4uxzmtsd3jjqer9wd3hy6tsw35k7msjzfpy7nz5yqcnygrfdej82um5wf5k2uckyypwa3eyt44h6txtxquqh7lz5djge4afgfjn7k4rgrkuag0jsd5xvxg";
230+
let offer = dbg!(encoded_offer.parse::<Offer>().unwrap());
231+
let reencoded_offer = offer.to_string();
232+
dbg!(reencoded_offer.parse::<Offer>().unwrap());
233+
assert_eq!(reencoded_offer, encoded_offer);
234+
}
235+
236+
#[test]
237+
fn parses_bech32_encoded_offers() {
238+
let offers = [
239+
// BOLT 12 test vectors
240+
"lno1pqps7sjqpgtyzm3qv4uxzmtsd3jjqer9wd3hy6tsw35k7msjzfpy7nz5yqcnygrfdej82um5wf5k2uckyypwa3eyt44h6txtxquqh7lz5djge4afgfjn7k4rgrkuag0jsd5xvxg",
241+
"l+no1pqps7sjqpgtyzm3qv4uxzmtsd3jjqer9wd3hy6tsw35k7msjzfpy7nz5yqcnygrfdej82um5wf5k2uckyypwa3eyt44h6txtxquqh7lz5djge4afgfjn7k4rgrkuag0jsd5xvxg",
242+
"lno1pqps7sjqpgt+yzm3qv4uxzmtsd3jjqer9wd3hy6tsw3+5k7msjzfpy7nz5yqcn+ygrfdej82um5wf5k2uckyypwa3eyt44h6txtxquqh7lz5djge4afgfjn7k4rgrkuag0jsd+5xvxg",
243+
"lno1pqps7sjqpgt+ yzm3qv4uxzmtsd3jjqer9wd3hy6tsw3+ 5k7msjzfpy7nz5yqcn+\nygrfdej82um5wf5k2uckyypwa3eyt44h6txtxquqh7lz5djge4afgfjn7k4rgrkuag0jsd+\r\n 5xvxg",
244+
];
245+
for encoded_offer in &offers {
246+
if let Err(e) = encoded_offer.parse::<Offer>() {
247+
panic!("Invalid offer ({:?}): {}", e, encoded_offer);
248+
}
249+
}
250+
}
251+
252+
#[test]
253+
fn fails_parsing_bech32_encoded_offers_with_invalid_continuations() {
254+
let offers = [
255+
// BOLT 12 test vectors
256+
"lno1pqps7sjqpgtyzm3qv4uxzmtsd3jjqer9wd3hy6tsw35k7msjzfpy7nz5yqcnygrfdej82um5wf5k2uckyypwa3eyt44h6txtxquqh7lz5djge4afgfjn7k4rgrkuag0jsd5xvxg+",
257+
"lno1pqps7sjqpgtyzm3qv4uxzmtsd3jjqer9wd3hy6tsw35k7msjzfpy7nz5yqcnygrfdej82um5wf5k2uckyypwa3eyt44h6txtxquqh7lz5djge4afgfjn7k4rgrkuag0jsd5xvxg+ ",
258+
"+lno1pqps7sjqpgtyzm3qv4uxzmtsd3jjqer9wd3hy6tsw35k7msjzfpy7nz5yqcnygrfdej82um5wf5k2uckyypwa3eyt44h6txtxquqh7lz5djge4afgfjn7k4rgrkuag0jsd5xvxg",
259+
"+ lno1pqps7sjqpgtyzm3qv4uxzmtsd3jjqer9wd3hy6tsw35k7msjzfpy7nz5yqcnygrfdej82um5wf5k2uckyypwa3eyt44h6txtxquqh7lz5djge4afgfjn7k4rgrkuag0jsd5xvxg",
260+
"ln++o1pqps7sjqpgtyzm3qv4uxzmtsd3jjqer9wd3hy6tsw35k7msjzfpy7nz5yqcnygrfdej82um5wf5k2uckyypwa3eyt44h6txtxquqh7lz5djge4afgfjn7k4rgrkuag0jsd5xvxg",
261+
];
262+
for encoded_offer in &offers {
263+
match encoded_offer.parse::<Offer>() {
264+
Ok(_) => panic!("Valid offer: {}", encoded_offer),
265+
Err(e) => assert_eq!(e, Bolt12ParseError::InvalidContinuation),
266+
}
267+
}
268+
}
269+
270+
#[test]
271+
fn fails_parsing_bech32_encoded_offer_with_invalid_hrp() {
272+
let encoded_offer = "lni1pqps7sjqpgtyzm3qv4uxzmtsd3jjqer9wd3hy6tsw35k7msjzfpy7nz5yqcnygrfdej82um5wf5k2uckyypwa3eyt44h6txtxquqh7lz5djge4afgfjn7k4rgrkuag0jsd5xvxg";
273+
match encoded_offer.parse::<Offer>() {
274+
Ok(_) => panic!("Valid offer: {}", encoded_offer),
275+
Err(e) => assert_eq!(e, Bolt12ParseError::InvalidBech32Hrp),
276+
}
277+
}
278+
279+
#[test]
280+
fn fails_parsing_bech32_encoded_offer_with_invalid_bech32_data() {
281+
let encoded_offer = "lno1pqps7sjqpgtyzm3qv4uxzmtsd3jjqer9wd3hy6tsw35k7msjzfpy7nz5yqcnygrfdej82um5wf5k2uckyypwa3eyt44h6txtxquqh7lz5djge4afgfjn7k4rgrkuag0jsd5xvxo";
282+
match encoded_offer.parse::<Offer>() {
283+
Ok(_) => panic!("Valid offer: {}", encoded_offer),
284+
Err(e) => assert_eq!(e, Bolt12ParseError::Bech32(bech32::Error::InvalidChar('o'))),
285+
}
286+
}
287+
288+
#[test]
289+
fn fails_parsing_bech32_encoded_offer_with_invalid_tlv_data() {
290+
let encoded_offer = "lno1pqps7sjqpgtyzm3qv4uxzmtsd3jjqer9wd3hy6tsw35k7msjzfpy7nz5yqcnygrfdej82um5wf5k2uckyypwa3eyt44h6txtxquqh7lz5djge4afgfjn7k4rgrkuag0jsd5xvxgqqqqq";
291+
match encoded_offer.parse::<Offer>() {
292+
Ok(_) => panic!("Valid offer: {}", encoded_offer),
293+
Err(e) => assert_eq!(e, Bolt12ParseError::Decode(DecodeError::InvalidValue)),
294+
}
295+
}
296+
}

0 commit comments

Comments
 (0)