Skip to content

Commit ad80e91

Browse files
committed
Add Bolt11InvoiceFeatures serialization tests
1 parent 4147de2 commit ad80e91

File tree

1 file changed

+64
-6
lines changed

1 file changed

+64
-6
lines changed

lightning-invoice/src/test_ser_de.rs

+64-6
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::{
22
sha256, FromBase32, PayeePubKey, PaymentSecret, PositiveTimestamp, RawDataPart, Sha256,
33
};
4-
use bech32::{Base32Len, ToBase32};
4+
use bech32::{u5, Base32Len, ToBase32};
55

66
use core::fmt::Debug;
77
use std::str::FromStr;
@@ -14,11 +14,11 @@ where
1414
{
1515
let serialized_32 = o.to_base32();
1616
let serialized_str = serialized_32.iter().map(|f| f.to_char()).collect::<String>();
17-
assert_eq!(serialized_str, expected_str);
17+
assert_eq!(serialized_str, expected_str, "Mismatch for {:?}", o);
1818

1919
// deserialize back
2020
let o2 = T::from_base32(&serialized_32).unwrap();
21-
assert_eq!(o, o2);
21+
assert_eq!(o, o2, "Mismatch for {}", serialized_str);
2222
}
2323

2424
/// Test base32 encode and decode, and also length hint
@@ -27,7 +27,7 @@ where
2727
T: ToBase32 + FromBase32 + Base32Len + Eq + Debug,
2828
T::Err: Debug,
2929
{
30-
assert_eq!(o.base32_len(), expected_str.len());
30+
assert_eq!(o.base32_len(), expected_str.len(), "Mismatch for {} {:?}", expected_str, o);
3131

3232
ser_de_test(o, expected_str)
3333
}
@@ -67,8 +67,66 @@ fn positive_timestamp() {
6767
fn bolt11_invoice_features() {
6868
use crate::Bolt11InvoiceFeatures;
6969

70-
let features = Bolt11InvoiceFeatures::from_le_bytes(vec![1, 2, 3, 4, 5, 42, 100, 101]);
71-
ser_de_test_len(features, "x2ep2q5zqxqsp");
70+
// Test few values, lengths, and paddings
71+
ser_de_test_len(
72+
Bolt11InvoiceFeatures::from_le_bytes(vec![1, 2, 3, 4, 5, 42, 100, 101]),
73+
"x2ep2q5zqxqsp",
74+
);
75+
ser_de_test_len(Bolt11InvoiceFeatures::from_le_bytes(vec![]), "");
76+
ser_de_test_len(Bolt11InvoiceFeatures::from_le_bytes(vec![0]), "");
77+
ser_de_test_len(Bolt11InvoiceFeatures::from_le_bytes(vec![1]), "p");
78+
ser_de_test_len(Bolt11InvoiceFeatures::from_le_bytes(vec![31]), "l");
79+
ser_de_test_len(Bolt11InvoiceFeatures::from_le_bytes(vec![100]), "ry");
80+
ser_de_test_len(Bolt11InvoiceFeatures::from_le_bytes(vec![255]), "8l");
81+
ser_de_test_len(Bolt11InvoiceFeatures::from_le_bytes(vec![1]), "p");
82+
ser_de_test_len(Bolt11InvoiceFeatures::from_le_bytes(vec![1, 2]), "sp");
83+
ser_de_test_len(Bolt11InvoiceFeatures::from_le_bytes(vec![1, 2, 3]), "xqsp");
84+
ser_de_test_len(Bolt11InvoiceFeatures::from_le_bytes(vec![1, 2, 3, 4]), "zqxqsp");
85+
ser_de_test_len(Bolt11InvoiceFeatures::from_le_bytes(vec![1, 2, 3, 4, 5]), "5zqxqsp");
86+
ser_de_test_len(
87+
Bolt11InvoiceFeatures::from_le_bytes(vec![255, 254, 253, 252, 251]),
88+
"l070mlhl",
89+
);
90+
ser_de_test_len(Bolt11InvoiceFeatures::from_le_bytes(vec![100, 0]), "ry");
91+
ser_de_test_len(Bolt11InvoiceFeatures::from_le_bytes(vec![100, 0, 0, 0]), "ry");
92+
ser_de_test_len(Bolt11InvoiceFeatures::from_le_bytes(vec![0, 100]), "eqq");
93+
ser_de_test_len(Bolt11InvoiceFeatures::from_le_bytes(vec![0, 0, 0, 100]), "pjqqqqq");
94+
ser_de_test_len(
95+
Bolt11InvoiceFeatures::from_le_bytes(vec![255, 255, 255, 255, 255, 255, 255, 255, 255]),
96+
"rllllllllllllll",
97+
);
98+
ser_de_test_len(
99+
Bolt11InvoiceFeatures::from_le_bytes(vec![255, 255, 255, 255, 255, 255, 255, 255, 254]),
100+
"rl0llllllllllll",
101+
);
102+
ser_de_test_len(
103+
Bolt11InvoiceFeatures::from_le_bytes(vec![255, 255, 255, 255, 255, 255, 255, 255, 127]),
104+
"pllllllllllllll",
105+
);
106+
ser_de_test_len(
107+
Bolt11InvoiceFeatures::from_le_bytes(vec![255, 255, 255, 255, 255, 255, 255, 255, 63]),
108+
"llllllllllllll",
109+
);
110+
111+
// To test skipping 0's in deserialization, we have to start with deserialization
112+
assert_eq!(
113+
Bolt11InvoiceFeatures::from_base32(
114+
&vec![0, 0, 0, 0, 0, 3, 4]
115+
.iter().copied().map(|f| u5::try_from_u8(f).unwrap()).collect::<Vec<_>>()[..]
116+
)
117+
.unwrap()
118+
.le_flags(),
119+
vec![100]
120+
);
121+
assert_eq!(
122+
Bolt11InvoiceFeatures::from_base32(
123+
&vec![3, 4]
124+
.iter().copied().map(|f| u5::try_from_u8(f).unwrap()).collect::<Vec<_>>()[..]
125+
)
126+
.unwrap()
127+
.le_flags(),
128+
vec![100]
129+
);
72130
}
73131

74132
#[test]

0 commit comments

Comments
 (0)