Sen API
Sen Libraries
Loading...
Searching...
No Matches
helpers.h
Go to the documentation of this file.
1// === helpers.h =======================================================================================================
2// Sen Infrastructure
3// Released under the Apache License v2.0 (SPDX-License-Identifier Apache-2.0).
4// See the LICENSE.txt file for more information.
5// © Airbus SAS, Airbus Helicopters, and Airbus Defence and Space SAU/GmbH/SAS.
6// =====================================================================================================================
7
8#ifndef SEN_LIBS_KERNEL_TEST_INTEGRATION_TRANSPORT_HELPERS_H
9#define SEN_LIBS_KERNEL_TEST_INTEGRATION_TRANSPORT_HELPERS_H
10
11// sen
14
15// generated code
16#include "sen/core/obj/object.h"
17#include "test_helpers/test_helpers.stl.h"
18
19// sen
21#include "sen/core/meta/var.h"
23#include "sen/core/obj/object.h"
27
28// spdlog
29#include <spdlog/logger.h>
30
31// std
32#include <algorithm>
33#include <array>
34#include <cmath>
35#include <future>
36#include <list>
37#include <memory>
38#include <string>
39#include <type_traits>
40#include <unordered_map>
41#include <vector>
42
43namespace sen::test
44{
45
46//--------------------------------------------------------------------------------------------------------------
47// Helpers
48//--------------------------------------------------------------------------------------------------------------
49
50template <typename T>
51[[nodiscard]] inline bool eq(T a, T b)
52{
53 // handle possible quantities of floating point types
54 if constexpr (!std::is_same_v<T, sen::TimeStamp> && sen::HasValueType<T>::value)
55 {
56 return eq(a.get(), b.get());
57 }
58
59 if constexpr (std::is_floating_point_v<T>)
60 {
61 constexpr T eps = 1e-3;
62 return std::fabs(a - b) < eps;
63 }
64
65 return a == b;
66}
67
68template <typename PropType>
69[[nodiscard]] inline bool checkProp(std::promise<TestResult>& promise,
70 const std::string& propName,
72 sen::MaybeRef<PropType> expectation)
73{
74 if (!eq(value, expectation))
75 {
76 std::string err;
77 err.append("Incorrect value of ");
78 err.append(propName);
79 promise.set_value(TestResult(err));
80 return false;
81 }
82
83 return true;
84}
85
86[[nodiscard]] inline bool checkMember(std::promise<TestResult>& promise, const std::string& memberName, bool isOk)
87{
88 if (isOk)
89 {
90 return true;
91 }
92
93 std::string err = "Member ";
94 err.append(memberName);
95 err.append(" adaptation failed.");
96 promise.set_value(TestResult(err));
97 return false;
98}
99
100template <typename T>
101[[nodiscard]] inline bool allObjectsWithState(const std::list<T*>& objects, const ConnectionState state)
102{
103 return std::all_of(objects.begin(), objects.end(), [state](const T* obj) { return obj->getState() == state; });
104}
105
108class SEN_EXPORT ProcessTerminatorImpl final: public ProcessTerminatorBase
109{
110public:
111 ProcessTerminatorImpl(std::string name, const sen::VarMap& args);
112
113public:
115
116private:
117 std::shared_ptr<sen::Subscription<StatefulObjectInterface>> objectsSub_;
118 std::unordered_map<sen::ObjectId, sen::ConnectionGuard> guardsMap_;
119 std::shared_ptr<spdlog::logger> logger_;
120};
121
123class SEN_EXPORT StateFulObjectImpl: public StatefulObjectBase
124{
125public:
126 StateFulObjectImpl(std::string name, const sen::VarMap& args);
127
128public:
130
131protected:
132 [[nodiscard]] sen::kernel::KernelApi* getApi() const;
133 [[nodiscard]] spdlog::logger* getLogger() const;
134
135private:
136 sen::kernel::KernelApi* api_ = nullptr;
137 std::shared_ptr<spdlog::logger> logger_;
138};
139
141class SEN_EXPORT PublisherImpl: public PublisherBase<StateFulObjectImpl>
142{
143public:
144 PublisherImpl(std::string name, const sen::VarMap& args);
145
146public:
148 void update(sen::kernel::RunApi& runApi) override;
149
150protected:
151 virtual void action1();
152 virtual void action2();
153 virtual void action3();
154 virtual void action4();
155
156private:
157 std::shared_ptr<sen::ObjectSource> bus_;
158 std::shared_ptr<sen::Subscription<ListenerInterface>> listenersSub_;
159 std::unordered_map<sen::ObjectId, sen::ConnectionGuard> guardsMap_;
160 std::array<bool, 5U> actionFlags_ = {false, false, false, false, false};
161};
162
165class SEN_EXPORT ListenerImpl: public ListenerBase<StateFulObjectImpl>
166{
167public:
168 ListenerImpl(std::string name, const sen::VarMap& args);
169
170public:
172 void update(sen::kernel::RunApi& runApi) override;
173
174protected:
175 virtual void check1();
176 virtual void check2();
177 virtual void check3();
178 virtual void check4();
179
180private:
181 std::shared_ptr<sen::ObjectSource> bus_;
182 std::shared_ptr<sen::Subscription<PublisherInterface>> publisherSub_;
183 std::unordered_map<sen::ObjectId, sen::ConnectionGuard> guardsMap_;
184 std::array<bool, 5U> checkFlags_ = {false, false, false, false, false};
185};
186
187} // namespace sen::test
188
189#endif // SEN_LIBS_KERNEL_TEST_INTEGRATION_TRANSPORT_HELPERS_H
Here we define a set of template meta-programming helpers to let the compiler take some decisions bas...
User-facing kernel functions.
Definition component_api.h:217
API for objects when registered.
Definition component_api.h:407
What can be done while a component is running.
Definition component_api.h:469
virtual void check1()
virtual void check2()
void registered(sen::kernel::RegistrationApi &api) override
virtual void check3()
ListenerImpl(std::string name, const sen::VarMap &args)
void update(sen::kernel::RunApi &runApi) override
virtual void check4()
void registered(sen::kernel::RegistrationApi &api) override
ProcessTerminatorImpl(std::string name, const sen::VarMap &args)
virtual void action2()
virtual void action3()
void update(sen::kernel::RunApi &runApi) override
void registered(sen::kernel::RegistrationApi &api) override
virtual void action1()
virtual void action4()
PublisherImpl(std::string name, const sen::VarMap &args)
StateFulObjectImpl(std::string name, const sen::VarMap &args)
void registered(sen::kernel::RegistrationApi &api) override
spdlog::logger * getLogger() const
sen::kernel::KernelApi * getApi() const
std::conditional_t< std::is_arithmetic_v< T >||shouldBePassedByValueV< T >, T, AddConstRef< T > > MaybeRef
returns 'const T&' or 'T' depending on the type
Definition class_helpers.h:46
std::map< std::string, Var, std::less<> > VarMap
A map of vars to represent structures.
Definition var.h:107
Definition reader_writer.h:19
bool eq(T a, T b)
Definition helpers.h:51
bool checkProp(std::promise< TestResult > &promise, const std::string &propName, sen::MaybeRef< PropType > value, sen::MaybeRef< PropType > expectation)
Definition helpers.h:69
bool allObjectsWithState(const std::list< T * > &objects, const ConnectionState state)
Definition helpers.h:101
bool checkMember(std::promise< TestResult > &promise, const std::string &memberName, bool isOk)
Definition helpers.h:86
return false if T has not an 'using ValueType' or a 'typedef ValueType'
Definition class_helpers.h:51