|
1 | 1 | #[cfg(test)]
|
2 | 2 | mod unit {
|
3 |
| - fn check(data: &[u8]) -> Result<Vec<crate::Item>, std::io::Error> { |
4 |
| - let mut reader = std::io::BufReader::new(data); |
5 |
| - crate::read_all(&mut reader).collect() |
6 |
| - } |
| 3 | + use crate::{Error, Item}; |
7 | 4 |
|
8 | 5 | #[test]
|
9 | 6 | fn skips_leading_junk() {
|
10 | 7 | assert_eq!(
|
11 |
| - check( |
| 8 | + check_both( |
12 | 9 | b"junk\n\
|
13 | 10 | -----BEGIN RSA PRIVATE KEY-----\n\
|
14 | 11 | qw\n\
|
15 | 12 | -----END RSA PRIVATE KEY-----\n"
|
16 |
| - ) |
17 |
| - .unwrap(), |
18 |
| - vec![crate::Item::Pkcs1Key(vec![0xab].into())] |
| 13 | + ), |
| 14 | + vec![Item::Pkcs1Key(vec![0xab].into())] |
19 | 15 | );
|
20 | 16 | }
|
21 | 17 |
|
22 | 18 | #[test]
|
23 | 19 | fn skips_trailing_junk() {
|
24 | 20 | assert_eq!(
|
25 |
| - check( |
| 21 | + check_both( |
26 | 22 | b"-----BEGIN RSA PRIVATE KEY-----\n\
|
27 | 23 | qw\n\
|
28 | 24 | -----END RSA PRIVATE KEY-----\n\
|
29 | 25 | junk"
|
30 |
| - ) |
31 |
| - .unwrap(), |
32 |
| - vec![crate::Item::Pkcs1Key(vec![0xab].into())] |
| 26 | + ), |
| 27 | + vec![Item::Pkcs1Key(vec![0xab].into())] |
33 | 28 | );
|
34 | 29 | }
|
35 | 30 |
|
36 | 31 | #[test]
|
37 | 32 | fn skips_non_utf8_junk() {
|
38 | 33 | assert_eq!(
|
39 |
| - check( |
| 34 | + check_both( |
40 | 35 | b"\x00\x00\n\
|
41 | 36 | -----BEGIN RSA PRIVATE KEY-----\n\
|
42 | 37 | qw\n\
|
43 | 38 | -----END RSA PRIVATE KEY-----\n
|
44 | 39 | \x00\x00"
|
45 |
| - ) |
46 |
| - .unwrap(), |
47 |
| - vec![crate::Item::Pkcs1Key(vec![0xab].into())] |
| 40 | + ), |
| 41 | + vec![Item::Pkcs1Key(vec![0xab].into())] |
48 | 42 | );
|
49 | 43 | }
|
50 | 44 |
|
51 | 45 | #[test]
|
52 | 46 | fn rejects_invalid_base64() {
|
53 |
| - assert_eq!( |
54 |
| - format!( |
55 |
| - "{:?}", |
56 |
| - check( |
57 |
| - b"-----BEGIN RSA PRIVATE KEY-----\n\ |
| 47 | + let input = b"-----BEGIN RSA PRIVATE KEY-----\n\ |
58 | 48 | q=w\n\
|
59 |
| - -----END RSA PRIVATE KEY-----\n" |
60 |
| - ) |
61 |
| - ), |
| 49 | + -----END RSA PRIVATE KEY-----\n"; |
| 50 | + assert_eq!( |
| 51 | + format!("{:?}", check_io(input)), |
62 | 52 | "Err(Custom { kind: InvalidData, error: \"InvalidByte(1, 61)\" })"
|
63 | 53 | );
|
| 54 | + assert!(matches!(check_slice(input), Err(Error::Base64Decode(_)))); |
64 | 55 | }
|
65 | 56 |
|
66 | 57 | #[test]
|
67 | 58 | fn rejects_unclosed_start_section() {
|
| 59 | + let input = b"-----BEGIN RSA PRIVATE KEY-----\n\ |
| 60 | + qw\n"; |
68 | 61 | assert_eq!(
|
69 | 62 | format!("{:?}",
|
70 |
| - check(b"-----BEGIN RSA PRIVATE KEY-----\n\ |
71 |
| - qw\n")), |
| 63 | + check_io(input)), |
72 | 64 | "Err(Custom { kind: InvalidData, error: \"section end \\\"-----END RSA PRIVATE KEY-----\\\" missing\" })"
|
73 | 65 | );
|
| 66 | + assert_eq!( |
| 67 | + check_slice(input), |
| 68 | + Err(Error::MissingSectionEnd { |
| 69 | + end_marker: b"-----END RSA PRIVATE KEY-----".to_vec() |
| 70 | + }) |
| 71 | + ) |
74 | 72 | }
|
75 | 73 |
|
76 | 74 | #[test]
|
77 | 75 | fn rejects_bad_start() {
|
| 76 | + let input = b"-----BEGIN RSA PRIVATE KEY----\n\ |
| 77 | + qw\n\ |
| 78 | + -----END RSA PRIVATE KEY-----\n"; |
78 | 79 | assert_eq!(
|
79 | 80 | format!("{:?}",
|
80 |
| - check(b"-----BEGIN RSA PRIVATE KEY----\n\ |
81 |
| - qw\n\ |
82 |
| - -----END RSA PRIVATE KEY-----\n")), |
| 81 | + check_io(input)), |
83 | 82 | "Err(Custom { kind: InvalidData, error: \"illegal section start: \\\"-----BEGIN RSA PRIVATE KEY----\\\\n\\\"\" })"
|
84 | 83 | );
|
| 84 | + assert_eq!( |
| 85 | + check_slice(input), |
| 86 | + Err(Error::IllegalSectionStart { |
| 87 | + line: b"-----BEGIN RSA PRIVATE KEY----".to_vec() |
| 88 | + }) |
| 89 | + ) |
85 | 90 | }
|
86 | 91 |
|
87 | 92 | #[test]
|
88 | 93 | fn skips_unrecognised_section() {
|
89 | 94 | assert_eq!(
|
90 |
| - check( |
| 95 | + check_both( |
91 | 96 | b"junk\n\
|
92 | 97 | -----BEGIN BREAKFAST CLUB-----\n\
|
93 | 98 | qw\n\
|
94 | 99 | -----END BREAKFAST CLUB-----\n"
|
95 |
| - ) |
96 |
| - .unwrap(), |
| 100 | + ), |
97 | 101 | vec![]
|
98 | 102 | );
|
99 | 103 | }
|
| 104 | + |
| 105 | + fn check_both(data: &[u8]) -> Vec<Item> { |
| 106 | + let mut reader = std::io::BufReader::new(data); |
| 107 | + let io_outcome = crate::read_all(&mut reader) |
| 108 | + .collect::<Result<Vec<_>, _>>() |
| 109 | + .unwrap(); |
| 110 | + let slice_outcome = check_slice(data).unwrap(); |
| 111 | + |
| 112 | + assert_eq!(io_outcome, slice_outcome); |
| 113 | + |
| 114 | + io_outcome |
| 115 | + } |
| 116 | + |
| 117 | + fn check_slice(mut data: &[u8]) -> Result<Vec<Item>, Error> { |
| 118 | + let mut items = vec![]; |
| 119 | + while let Some((item, rest)) = crate::read_one_from_slice(data)? { |
| 120 | + items.push(item); |
| 121 | + data = rest; |
| 122 | + } |
| 123 | + |
| 124 | + Ok(items) |
| 125 | + } |
| 126 | + |
| 127 | + fn check_io(data: &[u8]) -> Result<Vec<Item>, std::io::Error> { |
| 128 | + let mut reader = std::io::BufReader::new(data); |
| 129 | + crate::read_all(&mut reader).collect() |
| 130 | + } |
100 | 131 | }
|
0 commit comments