hotshot_testing/
overall_safety_task.rs1use std::{
8 collections::{HashMap, HashSet},
9 time::Duration,
10};
11
12use hotshot_types::data::ViewNumber;
13use thiserror::Error;
14
15pub type StateAndBlock<S, B> = (Vec<S>, Vec<B>);
17
18#[derive(Debug, Clone)]
20pub enum ViewStatus {
21 Ok,
23 Failed,
25 Err(OverallSafetyTaskErr),
27 InProgress,
29}
30
31#[derive(Error, Debug, Clone)]
33pub enum OverallSafetyTaskErr {
34 #[error("Mismatched leaf")]
35 MismatchedLeaf,
36
37 #[error("Inconsistent blocks")]
38 InconsistentBlocks,
39
40 #[error("Inconsistent number of transactions: {map:?}")]
41 InconsistentTxnsNum { map: HashMap<u64, usize> },
42
43 #[error("Not enough decides: got: {got}, expected: {expected}")]
44 NotEnoughDecides { got: usize, expected: usize },
45
46 #[error("Too many view failures: {0:?}")]
47 TooManyFailures(HashSet<ViewNumber>),
48
49 #[error(
50 "Inconsistent failed views: expected: {expected_failed_views:?}, actual: \
51 {actual_failed_views:?}"
52 )]
53 InconsistentFailedViews {
54 expected_failed_views: Vec<ViewNumber>,
55 actual_failed_views: HashSet<ViewNumber>,
56 },
57 #[error("Not enough round results: results_count: {results_count}, views_count: {views_count}")]
58 NotEnoughRoundResults {
59 results_count: usize,
60 views_count: usize,
61 },
62
63 #[error("View timed out")]
64 ViewTimeout,
65}
66
67#[derive(Clone, Debug)]
69pub struct OverallSafetyPropertiesDescription {
70 pub num_successful_views: usize,
72 pub check_leaf: bool,
74 pub check_block: bool,
76 pub transaction_threshold: u64,
81 pub expected_view_failures: Vec<u64>,
85 pub possible_view_failures: Vec<u64>,
87 pub decide_timeout: Duration,
89}
90
91impl Default for OverallSafetyPropertiesDescription {
92 fn default() -> Self {
93 Self {
94 num_successful_views: 50,
95 check_leaf: false,
96 check_block: true,
97 transaction_threshold: 0,
98 expected_view_failures: vec![],
99 possible_view_failures: vec![],
100 decide_timeout: Duration::from_secs(60),
101 }
102 }
103}