spideroak_crypto/test_util/
hash.rs1use crate::hash::Hash;
4
5#[macro_export]
20macro_rules! for_each_hash_test {
21 ($callback:ident) => {
22 $crate::__apply! {
23 $callback,
24 test_basic,
25 }
26 };
27}
28pub use for_each_hash_test;
29
30#[macro_export]
43macro_rules! test_hash {
44 ($name:ident, $hash:ty) => {
45 mod $name {
46 #[allow(unused_imports)]
47 use super::*;
48
49 $crate::test_hash!($hash);
50 }
51 };
52 ($hash:ty) => {
53 macro_rules! __hash_test {
54 ($test:ident) => {
55 #[test]
56 fn $test() {
57 $crate::test_util::hash::$test::<$hash>()
58 }
59 };
60 }
61 $crate::for_each_hash_test!(__hash_test);
62 };
63}
64pub use test_hash;
65
66pub fn test_basic<T: Hash>() {
68 const INPUT: &[u8] = r#"
69Sir, in my heart there was a kind of fighting
70That would not let me sleep. Methought I lay
71Worse than the mutines in the bilboes. Rashly—
72And prais'd be rashness for it—let us know
73Our indiscretion sometimes serves us well ...
74"#
75 .as_bytes();
76
77 let want = T::hash(INPUT);
78
79 let got = {
80 let mut h = T::new();
83 for c in INPUT {
84 h.update(&[*c]);
85 }
86 h.digest()
87 };
88 assert_eq!(want, got);
89
90 assert_eq!(want, T::hash(INPUT));
93
94 let mut modified = INPUT.to_vec();
96 modified[0] += 1;
97 assert_ne!(want, T::hash(&modified[..]));
98}