Skip to content

Commit e67dbdc

Browse files
committed
🍺 Introduce ElemetarySupervision abstract class:
- Corresponding unit tests are added to the test project.
1 parent 180c28a commit e67dbdc

File tree

5 files changed

+254
-0
lines changed

5 files changed

+254
-0
lines changed

CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,8 @@ add_library(
439439
${source_ara_phm_dir}/supervised_entity.cpp
440440
${source_ara_phm_dir}/recovery_action.h
441441
${source_ara_phm_dir}/recovery_action.cpp
442+
${source_ara_phm_supervisors_dir}/elementary_supervision.h
443+
${source_ara_phm_supervisors_dir}/elementary_supervision.cpp
442444
${source_ara_phm_supervisors_dir}/alive_supervision.h
443445
${source_ara_phm_supervisors_dir}/alive_supervision.cpp
444446
${source_ara_phm_supervisors_dir}/deadline_supervision.h
@@ -601,6 +603,8 @@ if(build_tests)
601603
${test_ara_phm_dir}/recovery_action_test.cpp
602604
${test_ara_phm_dir}/mocked_checkpoint_communicator.h
603605
${test_ara_phm_dir}/supervised_entity_test.cpp
606+
${test_ara_phm_supervisors_dir}/dummy_supervision.h
607+
${test_ara_phm_supervisors_dir}/elementary_supervision_test.cpp
604608
${test_ara_phm_supervisors_dir}/alive_supervision_test.cpp
605609
${test_ara_phm_supervisors_dir}/deadline_supervision_test.cpp
606610
)
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
#include <stdexcept>
2+
#include "./elementary_supervision.h"
3+
4+
namespace ara
5+
{
6+
namespace phm
7+
{
8+
namespace supervisors
9+
{
10+
ElementarySupervision::ElementarySupervision(
11+
std::function<void(SupervisionStatus)> &&callback) : mOnStatusChanged{std::move(callback)},
12+
mStatus{SupervisionStatus::kDeactivated}
13+
{
14+
}
15+
16+
void ElementarySupervision::Report(SupervisionStatus status)
17+
{
18+
if (mStatus != status)
19+
{
20+
switch (status)
21+
{
22+
case SupervisionStatus::kDeactivated:
23+
case SupervisionStatus::kExpired:
24+
mStatus = status;
25+
mOnStatusChanged(mStatus);
26+
break;
27+
28+
case SupervisionStatus::kOk:
29+
case SupervisionStatus::kFailed:
30+
// Transition from the expired status is only allowed to the deactivated status.
31+
if (mStatus != SupervisionStatus::kExpired)
32+
{
33+
mStatus = status;
34+
mOnStatusChanged(mStatus);
35+
}
36+
37+
break;
38+
39+
default:
40+
throw std::out_of_range("The reported status is not handled!");
41+
}
42+
}
43+
}
44+
45+
SupervisionStatus ElementarySupervision::GetStatus() const noexcept
46+
{
47+
return mStatus;
48+
}
49+
}
50+
}
51+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
#ifndef ELEMENTARY_SUPERVISION_H
2+
#define ELEMENTARY_SUPERVISION_H
3+
4+
#include <functional>
5+
6+
namespace ara
7+
{
8+
9+
namespace phm
10+
{
11+
namespace supervisors
12+
{
13+
/// @brief Supervision finite state machine status
14+
enum class SupervisionStatus
15+
{
16+
kDeactivated, ///!< Supervision has not been started or has been terminated
17+
kOk, ///!< Supervision is correct
18+
kFailed, ///!< Supervision is incorrect but does not exceed the tolerance
19+
kExpired ///!< Supervision is incorrect and also exceeding the tolerance
20+
};
21+
22+
/// @brief An abstract class the enables a supervision method to report its elementary supervion status
23+
class ElementarySupervision
24+
{
25+
private:
26+
const std::function<void(SupervisionStatus)> mOnStatusChanged;
27+
SupervisionStatus mStatus;
28+
29+
protected:
30+
/// @brief Constructor
31+
/// @param callback Callback to be invoked on the supervision status change
32+
ElementarySupervision(
33+
std::function<void(SupervisionStatus)> &&callback);
34+
35+
/// @brief Report the new supervision status
36+
/// @param status New status of the supervision method
37+
void Report(SupervisionStatus status);
38+
39+
public:
40+
ElementarySupervision() = delete;
41+
virtual ~ElementarySupervision() noexcept = default;
42+
43+
/// @brief Get the supervision status
44+
/// @returns Current elementary supervision status
45+
SupervisionStatus GetStatus() const noexcept;
46+
};
47+
}
48+
}
49+
}
50+
51+
#endif
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
2+
#ifndef DUMMY_SUPERVISION_H
3+
#define DUMMY_SUPERVISION_H
4+
5+
#include "../../../../src/ara/phm/supervisors/elementary_supervision.h"
6+
7+
namespace ara
8+
{
9+
namespace phm
10+
{
11+
namespace supervisors
12+
{
13+
class DummySupervision : public ElementarySupervision
14+
{
15+
public:
16+
DummySupervision() : ElementarySupervision([](SupervisionStatus status) {})
17+
{
18+
}
19+
20+
inline void ReportStatus(SupervisionStatus status)
21+
{
22+
Report(status);
23+
}
24+
};
25+
}
26+
}
27+
}
28+
29+
#endif
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
#include <gtest/gtest.h>
2+
#include "./dummy_supervision.h"
3+
4+
namespace ara
5+
{
6+
namespace phm
7+
{
8+
namespace supervisors
9+
{
10+
TEST(ElementarySupervisionTest, Constructor)
11+
{
12+
const SupervisionStatus cExpectedResult{SupervisionStatus::kDeactivated};
13+
14+
const DummySupervision cSupervision;
15+
const SupervisionStatus cActualResult{cSupervision.GetStatus()};
16+
17+
EXPECT_EQ(cExpectedResult, cActualResult);
18+
}
19+
20+
TEST(ElementarySupervisionTest, TransitionToOkScenario)
21+
{
22+
const SupervisionStatus cExpectedResult{SupervisionStatus::kOk};
23+
24+
DummySupervision _supervision;
25+
26+
_supervision.ReportStatus(cExpectedResult);
27+
SupervisionStatus _actualResult{_supervision.GetStatus()};
28+
EXPECT_EQ(cExpectedResult, _actualResult);
29+
30+
// Transit to Failed and then to OK
31+
_supervision.ReportStatus(SupervisionStatus::kFailed);
32+
_supervision.ReportStatus(cExpectedResult);
33+
_actualResult = _supervision.GetStatus();
34+
EXPECT_EQ(cExpectedResult, _actualResult);
35+
36+
// Transit to Expired and then to OK
37+
_supervision.ReportStatus(SupervisionStatus::kExpired);
38+
_supervision.ReportStatus(cExpectedResult);
39+
_actualResult = _supervision.GetStatus();
40+
EXPECT_NE(cExpectedResult, _actualResult);
41+
}
42+
43+
TEST(ElementarySupervisionTest, TransitionToFailedScenario)
44+
{
45+
const SupervisionStatus cExpectedResult{SupervisionStatus::kFailed};
46+
47+
DummySupervision _supervision;
48+
49+
_supervision.ReportStatus(cExpectedResult);
50+
SupervisionStatus _actualResult{_supervision.GetStatus()};
51+
EXPECT_EQ(cExpectedResult, _actualResult);
52+
53+
// Transit to OK and then to Failed
54+
_supervision.ReportStatus(SupervisionStatus::kOk);
55+
_supervision.ReportStatus(cExpectedResult);
56+
_actualResult = _supervision.GetStatus();
57+
EXPECT_EQ(cExpectedResult, _actualResult);
58+
59+
// Transit to Expired and then to Failed
60+
_supervision.ReportStatus(SupervisionStatus::kExpired);
61+
_supervision.ReportStatus(cExpectedResult);
62+
_actualResult = _supervision.GetStatus();
63+
EXPECT_NE(cExpectedResult, _actualResult);
64+
}
65+
66+
TEST(ElementarySupervisionTest, TransitionToExpiredScenario)
67+
{
68+
const SupervisionStatus cExpectedResult{SupervisionStatus::kExpired};
69+
70+
DummySupervision _supervision;
71+
72+
_supervision.ReportStatus(cExpectedResult);
73+
SupervisionStatus _actualResult{_supervision.GetStatus()};
74+
EXPECT_EQ(cExpectedResult, _actualResult);
75+
76+
// Transit to OK and then to Expired
77+
_supervision.ReportStatus(SupervisionStatus::kOk);
78+
_supervision.ReportStatus(cExpectedResult);
79+
_actualResult = _supervision.GetStatus();
80+
EXPECT_EQ(cExpectedResult, _actualResult);
81+
82+
// Transit to Failed and then to Expired
83+
_supervision.ReportStatus(SupervisionStatus::kFailed);
84+
_supervision.ReportStatus(cExpectedResult);
85+
_actualResult = _supervision.GetStatus();
86+
EXPECT_EQ(cExpectedResult, _actualResult);
87+
}
88+
89+
TEST(ElementarySupervisionTest, TransitionToDeactivatedScenario)
90+
{
91+
const SupervisionStatus cExpectedResult{SupervisionStatus::kDeactivated};
92+
93+
DummySupervision _supervision;
94+
95+
_supervision.ReportStatus(cExpectedResult);
96+
SupervisionStatus _actualResult{_supervision.GetStatus()};
97+
EXPECT_EQ(cExpectedResult, _actualResult);
98+
99+
// Transit to OK and then to Deactivated
100+
_supervision.ReportStatus(SupervisionStatus::kOk);
101+
_supervision.ReportStatus(cExpectedResult);
102+
_actualResult = _supervision.GetStatus();
103+
EXPECT_EQ(cExpectedResult, _actualResult);
104+
105+
// Transit to Failed and then to Deactivated
106+
_supervision.ReportStatus(SupervisionStatus::kFailed);
107+
_supervision.ReportStatus(cExpectedResult);
108+
_actualResult = _supervision.GetStatus();
109+
EXPECT_EQ(cExpectedResult, _actualResult);
110+
111+
// Transit to Expired and then to Deactivated
112+
_supervision.ReportStatus(SupervisionStatus::kExpired);
113+
_supervision.ReportStatus(cExpectedResult);
114+
_actualResult = _supervision.GetStatus();
115+
EXPECT_EQ(cExpectedResult, _actualResult);
116+
}
117+
}
118+
}
119+
}

0 commit comments

Comments
 (0)