hydro2_basic_operators/
failing_operator.rs1crate::ix!();
3
4#[derive(NamedItem, Operator, Debug)]
8#[operator(execute="fail_now", opcode="BasicOpCode::FailingOp")]
9pub struct FailingOperator
10{
11 name: String,
12 reason: String,
13}
14
15impl FailingOperator
16{
17 pub fn new(name: impl AsRef<str>, reason: impl AsRef<str>) -> Self {
18 Self {
19 name: name.as_ref().to_string(),
20 reason: reason.as_ref().to_string(),
21 }
22 }
23
24 async fn fail_now(&self) -> NetResult<()> {
25 Err(NetworkError::OperatorFailed {
26 reason: self.reason.clone()
27 })
28 }
29}
30
31impl Default for FailingOperator
32{
33 fn default() -> Self {
34 Self {
35 name: "failing_op".into(),
36 reason: "default fail reason".into(),
37 }
38 }
39}
40
41#[cfg(test)]
42mod failing_operator_tests {
43 use super::*;
44
45 #[tokio::test]
46 async fn test_failing_operator_default() -> Result<(), NetworkError> {
47 let fail = FailingOperator::default();
48 let input: [Option<&FailingOperatorIO>;4] = [None,None,None,None];
49 let mut out: [Option<FailingOperatorIO>;4] = [None,None,None,None];
50
51 let res = fail.execute(input, &mut out).await;
52 assert!(res.is_err());
53 if let Err(NetworkError::OperatorFailed { reason }) = res {
54 assert_eq!(reason, "default fail reason");
55 } else {
56 panic!("expected OperatorFailed");
57 }
58 Ok(())
59 }
60
61 #[tokio::test]
62 async fn test_failing_operator_custom() -> Result<(), NetworkError> {
63 let fail = FailingOperator::new("myfail", "some reason");
64 let input = [None, None, None, None];
65 let mut out = [None,None,None,None];
66 let err = fail.execute(input, &mut out).await.unwrap_err();
67 match err {
68 NetworkError::OperatorFailed { reason } => {
69 assert_eq!(reason, "some reason");
70 }
71 _ => panic!("Expected OperatorFailed"),
72 }
73 Ok(())
74 }
75}