Skip to content

Commit 3268994

Browse files
committed
Merge rust-bitcoin#5541: primitives: Improve test coverage in hash_types
0dbce2b Improve test coverage for WitnessMerkleNode (Jamil Lambert, PhD) 5fb07d0 Improve test coverage for TxMerkleNode (Jamil Lambert, PhD) 329c2ac Improve test coverage in hash_types (Jamil Lambert, PhD) 70f441f Make test dummy txid hex a const (Jamil Lambert, PhD) 7766f03 Improve test coverage for block_hash (Jamil Lambert, PhD) Pull request description: Add tests to all of the files in `primitives/src/hash_types` to increase the test coverage to 100%. ACKs for top commit: tcharding: ACK 0dbce2b apoelstra: ACK 0dbce2b; successfully ran local tests; all these tests seem pretty compact, nice Tree-SHA512: 9279839b912dd332c599e7a4abe54b98da3a4a6fdcff9b9905d2b320d7d439dc09358d09d877582d1ca4a2a0450d29d183d9784b15fd918a8d23c7937b331b79
2 parents cd3dd2a + 0dbce2b commit 3268994

4 files changed

Lines changed: 128 additions & 3 deletions

File tree

primitives/src/hash_types/block_hash.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,3 +99,33 @@ impl fmt::Display for BlockHashDecoderError {
9999
impl std::error::Error for BlockHashDecoderError {
100100
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { Some(&self.0) }
101101
}
102+
103+
#[cfg(test)]
104+
mod tests {
105+
use encoding::Decoder as _;
106+
107+
use super::*;
108+
109+
#[test]
110+
fn decoder_full_read_limit() {
111+
assert_eq!(BlockHashDecoder::default().read_limit(), 32);
112+
assert_eq!(<BlockHash as encoding::Decodable>::decoder().read_limit(), 32);
113+
}
114+
115+
#[test]
116+
#[cfg(feature = "std")]
117+
fn decoder_error_display() {
118+
use std::error::Error as _;
119+
use std::string::ToString as _;
120+
121+
let mut decoder = BlockHashDecoder::new();
122+
let mut bytes = &[0u8; 31][..];
123+
124+
assert!(decoder.push_bytes(&mut bytes).unwrap());
125+
126+
let err = decoder.end().unwrap_err();
127+
128+
assert!(!err.to_string().is_empty());
129+
assert!(err.source().is_some());
130+
}
131+
}

primitives/src/hash_types/mod.rs

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -189,11 +189,13 @@ pub mod serde_details {
189189
mod tests {
190190
use super::*;
191191

192+
#[cfg(feature = "serde")]
193+
const DUMMY_TXID_HEX_STR: &str =
194+
"e567952fb6cc33857f392efa3a46c995a28f69cca4bb1b37e0204dab1ec7a389";
195+
192196
// Creates an arbitrary dummy hash type object.
193197
#[cfg(feature = "serde")]
194-
fn dummy_test_case() -> Txid {
195-
"e567952fb6cc33857f392efa3a46c995a28f69cca4bb1b37e0204dab1ec7a389".parse::<Txid>().unwrap()
196-
}
198+
fn dummy_test_case() -> Txid { DUMMY_TXID_HEX_STR.parse::<Txid>().unwrap() }
197199

198200
#[test]
199201
#[cfg(feature = "serde")] // Implies alloc and hex
@@ -224,6 +226,19 @@ mod tests {
224226
assert_eq!(got, want);
225227
}
226228

229+
#[test]
230+
fn as_ref_and_borrow_match_as_byte_array() {
231+
let tc = Txid::from_byte_array([0x11; 32]);
232+
233+
let as_array: &[u8; 32] = tc.as_ref();
234+
let as_slice: &[u8] = tc.as_ref();
235+
let borrowed: &[u8; 32] = core::borrow::Borrow::<[u8; 32]>::borrow(&tc);
236+
237+
assert_eq!(as_array, tc.as_byte_array());
238+
assert_eq!(borrowed, tc.as_byte_array());
239+
assert_eq!(as_slice, tc.as_byte_array());
240+
}
241+
227242
#[test]
228243
// This is solely to test that we can debug print WITHOUT "hex" so its ok to require "alloc".
229244
#[cfg(feature = "alloc")]

primitives/src/hash_types/transaction_merkle_node.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,3 +118,33 @@ impl fmt::Display for TxMerkleNodeDecoderError {
118118
impl std::error::Error for TxMerkleNodeDecoderError {
119119
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { Some(&self.0) }
120120
}
121+
122+
#[cfg(test)]
123+
mod tests {
124+
use encoding::Decoder as _;
125+
126+
use super::*;
127+
128+
#[test]
129+
fn decoder_full_read_limit() {
130+
assert_eq!(TxMerkleNodeDecoder::default().read_limit(), 32);
131+
assert_eq!(<TxMerkleNode as encoding::Decodable>::decoder().read_limit(), 32);
132+
}
133+
134+
#[test]
135+
#[cfg(feature = "std")]
136+
fn decoder_error_display() {
137+
use std::error::Error as _;
138+
use std::string::ToString as _;
139+
140+
const NODE_LEN: usize = 32;
141+
142+
let mut decoder = TxMerkleNodeDecoder::new();
143+
let mut bytes = &[0u8; NODE_LEN - 1][..];
144+
assert!(decoder.push_bytes(&mut bytes).unwrap());
145+
146+
let err = decoder.end().unwrap_err();
147+
assert!(!err.to_string().is_empty());
148+
assert!(err.source().is_some());
149+
}
150+
}

primitives/src/hash_types/witness_merkle_node.rs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,3 +120,53 @@ impl fmt::Display for WitnessMerkleNodeDecoderError {
120120
impl std::error::Error for WitnessMerkleNodeDecoderError {
121121
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { Some(&self.0) }
122122
}
123+
124+
#[cfg(test)]
125+
mod tests {
126+
use encoding::Decoder as _;
127+
128+
use super::*;
129+
130+
#[test]
131+
fn combine_delegates_to_merkle_node_trait() {
132+
let a = WitnessMerkleNode::from_leaf(Wtxid::from_byte_array([1; 32]));
133+
let b = WitnessMerkleNode::from_leaf(Wtxid::from_byte_array([2; 32]));
134+
135+
assert_eq!(a.combine(&b), MerkleNode::combine(&a, &b));
136+
}
137+
138+
#[test]
139+
fn decoder_full_read_limit() {
140+
assert_eq!(WitnessMerkleNodeDecoder::new().read_limit(), 32);
141+
// These two are the same decoder but we want 100% coverage.
142+
assert_eq!(WitnessMerkleNodeDecoder::default().read_limit(), 32);
143+
assert_eq!(<WitnessMerkleNode as encoding::Decodable>::decoder().read_limit(), 32);
144+
}
145+
146+
#[test]
147+
fn decoder_successfully_decodes() {
148+
let expected = WitnessMerkleNode::from_byte_array([0x55; 32]);
149+
let mut decoder = WitnessMerkleNodeDecoder::new();
150+
let mut bytes = &[0x55u8; 32][..];
151+
152+
let _done = decoder.push_bytes(&mut bytes).unwrap();
153+
154+
assert_eq!(decoder.end().unwrap(), expected);
155+
}
156+
157+
#[test]
158+
#[cfg(feature = "std")]
159+
fn decoder_error_display() {
160+
use std::error::Error as _;
161+
use std::string::ToString as _;
162+
163+
let mut decoder = WitnessMerkleNodeDecoder::new();
164+
let mut bytes = &[0u8; 31][..];
165+
166+
assert!(decoder.push_bytes(&mut bytes).unwrap());
167+
168+
let err = decoder.end().unwrap_err();
169+
assert!(!err.to_string().is_empty());
170+
assert!(err.source().is_some());
171+
}
172+
}

0 commit comments

Comments
 (0)