Skip to content

Commit 9920d40

Browse files
devin-ai-integration[bot]Jayant Krishnamurthy
andcommitted
test(fortuna): add unit tests for HashChainState
Co-Authored-By: Jayant Krishnamurthy <[email protected]>
1 parent b29522f commit 9920d40

File tree

1 file changed

+84
-0
lines changed

1 file changed

+84
-0
lines changed

apps/fortuna/src/state.rs

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,3 +203,87 @@ mod test {
203203
run_hash_chain_test([0u8; 32], 100, 55);
204204
}
205205
}
206+
207+
#[cfg(test)]
208+
mod hash_chain_state_test {
209+
use {
210+
crate::state::{HashChainState, PebbleHashChain},
211+
anyhow::Result,
212+
};
213+
214+
#[test]
215+
fn test_from_chain_at_offset() {
216+
let chain = PebbleHashChain::new([0u8; 32], 10, 1);
217+
let hash_chain_state = HashChainState::from_chain_at_offset(5, chain);
218+
219+
assert_eq!(hash_chain_state.offsets.len(), 1);
220+
assert_eq!(hash_chain_state.hash_chains.len(), 1);
221+
assert_eq!(hash_chain_state.offsets[0], 5);
222+
}
223+
224+
#[test]
225+
fn test_reveal_valid_sequence() -> Result<()> {
226+
let chain = PebbleHashChain::new([0u8; 32], 10, 1);
227+
let expected_hash = chain.reveal_ith(3)?;
228+
229+
let hash_chain_state = HashChainState::from_chain_at_offset(5, chain);
230+
let result = hash_chain_state.reveal(8)?;
231+
232+
assert_eq!(result, expected_hash);
233+
Ok(())
234+
}
235+
236+
#[test]
237+
fn test_reveal_sequence_too_small() {
238+
let chain = PebbleHashChain::new([0u8; 32], 10, 1);
239+
let hash_chain_state = HashChainState::from_chain_at_offset(5, chain);
240+
241+
let result = hash_chain_state.reveal(4);
242+
assert!(result.is_err());
243+
}
244+
245+
#[test]
246+
fn test_reveal_sequence_too_large() {
247+
let chain = PebbleHashChain::new([0u8; 32], 10, 1);
248+
let hash_chain_state = HashChainState::from_chain_at_offset(5, chain);
249+
250+
let result = hash_chain_state.reveal(15);
251+
assert!(result.is_err());
252+
}
253+
254+
#[test]
255+
fn test_multiple_hash_chains() -> Result<()> {
256+
let chain1 = PebbleHashChain::new([0u8; 32], 10, 1);
257+
let expected_hash1 = chain1.reveal_ith(3)?;
258+
259+
let chain2 = PebbleHashChain::new([1u8; 32], 10, 1);
260+
let expected_hash2 = chain2.reveal_ith(3)?;
261+
262+
let mut hash_chain_state = HashChainState::from_chain_at_offset(5, chain1);
263+
hash_chain_state.offsets.push(20);
264+
hash_chain_state.hash_chains.push(chain2);
265+
266+
let result1 = hash_chain_state.reveal(8)?;
267+
assert_eq!(result1, expected_hash1);
268+
269+
let result2 = hash_chain_state.reveal(23)?;
270+
assert_eq!(result2, expected_hash2);
271+
272+
let result3 = hash_chain_state.reveal(15);
273+
assert!(result3.is_err());
274+
275+
Ok(())
276+
}
277+
278+
#[test]
279+
fn test_reveal_at_offset() -> Result<()> {
280+
let chain = PebbleHashChain::new([0u8; 32], 10, 1);
281+
let expected_hash = chain.reveal_ith(0)?;
282+
283+
let hash_chain_state = HashChainState::from_chain_at_offset(5, chain);
284+
let result = hash_chain_state.reveal(5)?;
285+
286+
assert_eq!(result, expected_hash);
287+
Ok(())
288+
}
289+
}

0 commit comments

Comments
 (0)