RTC Toolkit 6.0.0
Loading...
Searching...
No Matches
helpers.hpp
Go to the documentation of this file.
1
11
12#pragma once
13
14#include <chrono>
15#include <condition_variable>
16#include <functional>
17#include <gmock/gmock.h>
18#include <gtest/gtest.h>
19
28
29#include <iostream>
30#include <memory>
31#include <mutex>
32#include <stdexcept>
33
34using ::testing::_; // NOLINT(google-global-names-in-headers)
35using ::testing::InSequence; // NOLINT(google-global-names-in-headers)
36using ::testing::NiceMock; // NOLINT(google-global-names-in-headers)
37using ::testing::Return; // NOLINT(google-global-names-in-headers)
38using ::testing::Sequence; // NOLINT(google-global-names-in-headers)
39
40using namespace rtctk::componentFramework; // NOLINT(google-global-names-in-headers)
41using namespace rtctk::componentFramework::test; // NOLINT(google-global-names-in-headers)
42
43extern void* rec_ptr;
44
45template <class... T>
46class FakeRecorder : public DataRecorder<T...> {
47public:
49
50 explicit FakeRecorder(const ColumnDescription& columns,
51 const std::array<bool, sizeof...(T)>& disable = {})
52 : DataRecorder<T...>(columns, disable) {
53 rec_ptr = this;
54 }
55
56 ~FakeRecorder() override = default;
57
58 MOCK_METHOD(void, Open, (const std::filesystem::path&), (override));
59
60 MOCK_METHOD(void, SetColumnLength, (size_t, size_t));
61
62 MOCK_METHOD(void, Close, (), (override));
63
64 MOCK_METHOD(void, Write, (const std::tuple<T...>&), (override));
65
66 std::string DefaultFileExtension() override {
67 return std::string{".data"};
68 }
69};
70
74
75class MockEventPublisher : public EventPublisherIf {
76public:
78
79 void Publish(const JsonPayload& sample) override {
80 }
81
82private:
83 explicit MockEventPublisher(const std::string& topic) {
84 }
85};
86
87class MockEventSubscriber : public EventSubscriberIf {
88public:
90
91 void Subscribe(std::function<void(const JsonPayload&)> cb) override {
92 auto lock = std::scoped_lock(callback_lock);
93 callback = cb;
94 SubscribeMock(cb);
95 }
96 MOCK_METHOD(void, SubscribeMock, (std::function<void(const JsonPayload&)>), ());
97 MOCK_METHOD(void, Unsubscribe, (), (override));
98
99 std::function<void(const JsonPayload&)> GetCallback() {
100 auto lock = std::scoped_lock(callback_lock);
101 auto copy = callback;
102 return copy;
103 };
104
105private:
106 std::function<void(const JsonPayload&)> callback;
107 std::mutex callback_lock;
108
109 explicit MockEventSubscriber(const std::string& topic) {
110 }
111};
112
114public:
115 MockEventService() = default;
116
117 std::unique_ptr<EventPublisherIf> MakePublisher(const std::string& topic) override {
118 pub[topic] = new MockEventPublisher(topic);
119 return std::unique_ptr<MockEventPublisher>(pub.at(topic));
120 }
121
122 std::unique_ptr<EventSubscriberIf> MakeSubscriber(const std::string& topic) override {
123 sub[topic] = new MockEventSubscriber(topic);
124 return std::unique_ptr<MockEventSubscriber>(sub.at(topic));
125 }
126
127 std::map<std::string, MockEventPublisher*> pub;
128 std::map<std::string, MockEventSubscriber*> sub;
129};
130
133 services.Add<RuntimeRepoIf>(std::make_shared<NiceMock<test::FakeRuntimeRepoIf>>());
134 services.Add<OldbIf>(std::make_shared<NiceMock<test::FakeOldbIf>>());
135 services.Add<ComponentMetricsIf>(std::make_shared<FakeComponentMetrics>());
136 // cppcheck-suppress useInitializationList
137 es = std::make_shared<MockEventService>();
139 }
140
142 return services;
143 }
144
146 return *es;
147 }
148
150 std::shared_ptr<MockEventService> es;
151};
152
153inline void AwaitState(RecordingUnit& unit,
155 std::chrono::milliseconds timeout = std::chrono::milliseconds{5000}) {
156 ASSERT_NO_THROW({
157 std::mutex state_reached_mutex;
158 auto state_reached = std::make_shared<std::condition_variable>();
159 std::chrono::steady_clock::time_point until = std::chrono::steady_clock::now() + timeout;
160 RecordingUnit::State current_state = unit.GetState();
161
162 std::function<void(const std::string& unit_id, const RecordingUnit::State&)> unblock_wait =
163 [=](const std::string& name, const RecordingUnit::State& new_state) {
164 if (new_state == state) {
165 state_reached->notify_one();
166 }
167 };
168 auto registration = unit.Connect(unblock_wait);
169 while (current_state != state) {
170 if (std::chrono::steady_clock::now() > until) {
171 throw std::runtime_error("Timeout!");
172 }
173 auto lock = std::unique_lock(state_reached_mutex);
174 state_reached->wait_until(lock, until, [&]() { return unit.GetState() == state; });
175 current_state = unit.GetState();
176 }
177 ASSERT_EQ(current_state, state);
178 registration.disconnect();
179 });
180}
181
182ACTION(Throw) {
183 CII_THROW(RtctkException, "Some Exception");
184}
~FakeRecorder() override=default
MOCK_METHOD(void, Write,(const std::tuple< T... > &),(override))
MOCK_METHOD(void, SetColumnLength,(size_t, size_t))
std::string DefaultFileExtension() override
Default filename extension for the recorder.
Definition helpers.hpp:66
MOCK_METHOD(void, Close,(),(override))
FakeRecorder(const ColumnDescription &columns, const std::array< bool, sizeof...(T)> &disable={})
Definition helpers.hpp:50
MOCK_METHOD(void, Open,(const std::filesystem::path &),(override))
typename DataRecorder< T... >::ColumnDescription ColumnDescription
Definition helpers.hpp:48
Definition helpers.hpp:75
void Publish(const JsonPayload &sample) override
Publishes a JSON object.
Definition helpers.hpp:79
friend MockEventService
Definition helpers.hpp:77
Definition helpers.hpp:113
std::unique_ptr< EventPublisherIf > MakePublisher(const std::string &topic) override
Creates a new publisher for a specified topic.
Definition helpers.hpp:117
std::map< std::string, MockEventPublisher * > pub
Definition helpers.hpp:127
MockEventService()=default
std::map< std::string, MockEventSubscriber * > sub
Definition helpers.hpp:128
std::unique_ptr< EventSubscriberIf > MakeSubscriber(const std::string &topic) override
Creates a new subscriber for a specified topic.
Definition helpers.hpp:122
Definition helpers.hpp:87
void Subscribe(std::function< void(const JsonPayload &)> cb) override
Subscribes to a specified topic.
Definition helpers.hpp:91
MOCK_METHOD(void, SubscribeMock,(std::function< void(const JsonPayload &)>),())
MOCK_METHOD(void, Unsubscribe,(),(override))
std::function< void(const JsonPayload &)> GetCallback()
Definition helpers.hpp:99
friend MockEventService
Definition helpers.hpp:89
Component metrics interface.
Definition componentMetricsIf.hpp:163
This is an abstract class that can be used to implement an OutputStage for a Recording Unit.
Definition dataRecorder.hpp:28
virtual void Write(const std::tuple< T... > &data)=0
virtual void Open(const std::filesystem::path &file)=0
DataRecorder(const ColumnDescription &columns, const DisabledFields &disable={})
Definition dataRecorder.hpp:56
Interface class for publishing JSON events.
Definition eventServiceIf.hpp:51
Interface class for providing pub/sub facilities for JSON events.
Definition eventServiceIf.hpp:28
Interface class for subscribing to JSON events.
Definition eventServiceIf.hpp:67
virtual void Unsubscribe()=0
Unsubscribes from a specified topic.
Base interface for all OLDB adapters.
Definition oldbIf.hpp:24
Abstract base class for all sources that can be recorded by the MetadataCollector and TelemetryRecord...
Definition recordingUnit.hpp:50
boost::signals2::connection Connect(const std::function< void(const std::string &, const State &)> &function)
Connect to State change signal.
Definition recordingUnit.cpp:186
State
Definition recordingUnit.hpp:52
State GetState() const
Get the current state of the Recording Unit.
Definition recordingUnit.cpp:163
The RtctkException class is the base class for all Rtctk exceptions.
Definition exceptions.hpp:220
Base interface for all Runtime Configuration Repository adapters.
Definition runtimeRepoIf.hpp:26
Container class that holds services of any type.
Definition serviceContainer.hpp:38
void * rec_ptr
ACTION(Throw)
Definition helpers.hpp:182
void AwaitState(RecordingUnit &unit, RecordingUnit::State state, std::chrono::milliseconds timeout=std::chrono::milliseconds{5000})
Definition helpers.hpp:153
Header file for ComponentMetricsIf.
Recording Unit that can record RTR datapoints.
Low-level interface of the event service.
Declaration of helper mock class for ComponentMetricsIf.
Header file providing a FakeOldbIf.
Header file providing a FakeRuntimeRepoIf.
Header file providing a mock of RepositoryIf.
Definition fakeClock.cpp:14
Definition commandReplier.cpp:21
nlohmann::json JsonPayload
Type requirements:
Definition jsonPayload.hpp:24
name
Definition wscript:17
Abstract base class defining functionality common to all recording units.
std::shared_ptr< MockEventService > es
Definition helpers.hpp:150
ServiceContainer & operator*()
Definition helpers.hpp:141
FakeServices()
Definition helpers.hpp:132
MockEventService & Es()
Definition helpers.hpp:145
ServiceContainer services
Definition helpers.hpp:149