RTC Toolkit 4.0.2
Loading...
Searching...
No Matches
repositoryIfTestSuite.hpp
Go to the documentation of this file.
1
13#ifndef RTCTK_COMPONENTFRAMEWORK_TEST_REPOSITORYIFTESTSUITE_HPP
14#define RTCTK_COMPONENTFRAMEWORK_TEST_REPOSITORYIFTESTSUITE_HPP
15
16#include <boost/filesystem.hpp>
17#include <ciiLogManager.hpp>
18#include <gtest/gtest.h>
19
21
23
26using rtctk::componentFramework::operator""_dppath;
27
78template <typename T>
79class RepositoryIfTestSuite : public testing::Test {
80public:
81 void SetUp() override {
82 m_adapter = CreateRepository<T>();
83 }
84
85 void TearDown() override {
86 CleanupRepository<T>(m_adapter);
87 }
88
98 template <class U>
99 std::shared_ptr<U> CreateRepository();
100
111 template <class U>
112 void CleanupRepository(std::shared_ptr<U>& adapter) {
113 // Do nothing by default.
114 }
115
116protected:
117 std::shared_ptr<T> m_adapter;
118};
119
121
122// Cppcheck fails to parse the following line.
123// cppcheck-suppress syntaxError
124TYPED_TEST_P(RepositoryIfTestSuite, DataPointCreationAndDeletion) {
125 RepositoryIf* adapter = this->m_adapter.get();
126 adapter->CreateDataPoint<std::string>("/name"_dppath);
127 EXPECT_TRUE(adapter->DataPointExists("/name"_dppath));
128 adapter->CreateDataPoint<int32_t>("/abc/int32"_dppath);
129 EXPECT_TRUE(adapter->DataPointExists("/abc/int32"_dppath));
130 adapter->CreateDataPoint<double>("/abc/double"_dppath);
131 EXPECT_TRUE(adapter->DataPointExists("/abc/double"_dppath));
132 adapter->CreateDataPoint<std::vector<int32_t>>("/xyz/vector"_dppath);
133 EXPECT_TRUE(adapter->DataPointExists("/xyz/vector"_dppath));
134 adapter->CreateDataPoint<MatrixBuffer<int32_t>>("/xyz/matrix"_dppath);
135 EXPECT_TRUE(adapter->DataPointExists("/xyz/matrix"_dppath));
136 adapter->DeleteDataPoint("/name"_dppath);
137 EXPECT_FALSE(adapter->DataPointExists("/name"_dppath));
138 adapter->DeleteDataPoint("/abc/int32"_dppath);
139 EXPECT_FALSE(adapter->DataPointExists("/abc/int32"_dppath));
140 adapter->DeleteDataPoint("/abc/double"_dppath);
141 EXPECT_FALSE(adapter->DataPointExists("/abc/double"_dppath));
142 adapter->DeleteDataPoint("/xyz/vector"_dppath);
143 EXPECT_FALSE(adapter->DataPointExists("/xyz/vector"_dppath));
144 adapter->DeleteDataPoint("/xyz/matrix"_dppath);
145 EXPECT_FALSE(adapter->DataPointExists("/xyz/matrix"_dppath));
146}
147
148TYPED_TEST_P(RepositoryIfTestSuite, TypesAreReturnedCorrectly) {
149 // Make sure the GetDataPointType method returns the same types as were used during creation.
150 RepositoryIf* adapter = this->m_adapter.get();
151
152 adapter->CreateDataPoint<std::string>("/datapoint"_dppath);
153 EXPECT_EQ(adapter->GetDataPointType("/datapoint"_dppath), typeid(std::string));
154 adapter->DeleteDataPoint("/datapoint"_dppath);
155
156 adapter->CreateDataPoint<int32_t>("/datapoint"_dppath);
157 EXPECT_EQ(adapter->GetDataPointType("/datapoint"_dppath), typeid(int32_t));
158 adapter->DeleteDataPoint("/datapoint"_dppath);
159
160 adapter->CreateDataPoint<int64_t>("/datapoint"_dppath);
161 EXPECT_EQ(adapter->GetDataPointType("/datapoint"_dppath), typeid(int64_t));
162 adapter->DeleteDataPoint("/datapoint"_dppath);
163
164 adapter->CreateDataPoint<float>("/datapoint"_dppath);
165 EXPECT_EQ(adapter->GetDataPointType("/datapoint"_dppath), typeid(float));
166 adapter->DeleteDataPoint("/datapoint"_dppath);
167
168 adapter->CreateDataPoint<double>("/datapoint"_dppath);
169 EXPECT_EQ(adapter->GetDataPointType("/datapoint"_dppath), typeid(double));
170 adapter->DeleteDataPoint("/datapoint"_dppath);
171
172 adapter->CreateDataPoint<std::vector<int32_t>>("/datapoint"_dppath);
173 EXPECT_EQ(adapter->GetDataPointType("/datapoint"_dppath), typeid(std::vector<int32_t>));
174 adapter->DeleteDataPoint("/datapoint"_dppath);
175
176 adapter->CreateDataPoint<std::vector<int64_t>>("/datapoint"_dppath);
177 EXPECT_EQ(adapter->GetDataPointType("/datapoint"_dppath), typeid(std::vector<int64_t>));
178 adapter->DeleteDataPoint("/datapoint"_dppath);
179
180 adapter->CreateDataPoint<std::vector<float>>("/datapoint"_dppath);
181 EXPECT_EQ(adapter->GetDataPointType("/datapoint"_dppath), typeid(std::vector<float>));
182 adapter->DeleteDataPoint("/datapoint"_dppath);
183
184 adapter->CreateDataPoint<std::vector<double>>("/datapoint"_dppath);
185 EXPECT_EQ(adapter->GetDataPointType("/datapoint"_dppath), typeid(std::vector<double>));
186 adapter->DeleteDataPoint("/datapoint"_dppath);
187
188 adapter->CreateDataPoint<MatrixBuffer<int32_t>>("/datapoint"_dppath);
189 EXPECT_EQ(adapter->GetDataPointType("/datapoint"_dppath), typeid(MatrixBuffer<int32_t>));
190 adapter->DeleteDataPoint("/datapoint"_dppath);
191
192 adapter->CreateDataPoint<MatrixBuffer<int64_t>>("/datapoint"_dppath);
193 EXPECT_EQ(adapter->GetDataPointType("/datapoint"_dppath), typeid(MatrixBuffer<int64_t>));
194 adapter->DeleteDataPoint("/datapoint"_dppath);
195
196 adapter->CreateDataPoint<MatrixBuffer<float>>("/datapoint"_dppath);
197 EXPECT_EQ(adapter->GetDataPointType("/datapoint"_dppath), typeid(MatrixBuffer<float>));
198 adapter->DeleteDataPoint("/datapoint"_dppath);
199
200 adapter->CreateDataPoint<MatrixBuffer<double>>("/datapoint"_dppath);
201 EXPECT_EQ(adapter->GetDataPointType("/datapoint"_dppath), typeid(MatrixBuffer<double>));
202 adapter->DeleteDataPoint("/datapoint"_dppath);
203}
204
205TYPED_TEST_P(RepositoryIfTestSuite, SizesAreReturnedCorrectly) {
206 // Make sure the GetDataPointSize method returns the appropriate results.
207 RepositoryIf* adapter = this->m_adapter.get();
208
209 adapter->CreateDataPoint<std::string>("/datapoint"_dppath);
210 ASSERT_NO_THROW({ adapter->SetDataPoint("/datapoint"_dppath, std::string("abcdefg")); });
211 EXPECT_EQ(adapter->GetDataPointSize("/datapoint"_dppath), size_t(7));
212 adapter->DeleteDataPoint("/datapoint"_dppath);
213
214 adapter->CreateDataPoint<int32_t>("/datapoint"_dppath);
215 ASSERT_NO_THROW({ adapter->SetDataPoint("/datapoint"_dppath, int32_t(123)); });
216 EXPECT_EQ(adapter->GetDataPointSize("/datapoint"_dppath), sizeof(int32_t));
217 adapter->DeleteDataPoint("/datapoint"_dppath);
218
219 adapter->CreateDataPoint<int64_t>("/datapoint"_dppath);
220 ASSERT_NO_THROW({ adapter->SetDataPoint("/datapoint"_dppath, int64_t(234)); });
221 EXPECT_EQ(adapter->GetDataPointSize("/datapoint"_dppath), sizeof(int64_t));
222 adapter->DeleteDataPoint("/datapoint"_dppath);
223
224 adapter->CreateDataPoint<float>("/datapoint"_dppath);
225 ASSERT_NO_THROW({ adapter->SetDataPoint("/datapoint"_dppath, float(3.45)); });
226 EXPECT_EQ(adapter->GetDataPointSize("/datapoint"_dppath), sizeof(float));
227 adapter->DeleteDataPoint("/datapoint"_dppath);
228
229 adapter->CreateDataPoint<double>("/datapoint"_dppath);
230 ASSERT_NO_THROW({ adapter->SetDataPoint("/datapoint"_dppath, double(4.56)); });
231 EXPECT_EQ(adapter->GetDataPointSize("/datapoint"_dppath), sizeof(double));
232 adapter->DeleteDataPoint("/datapoint"_dppath);
233
234 adapter->CreateDataPoint<std::vector<int32_t>>("/datapoint"_dppath);
235 ASSERT_NO_THROW({ adapter->SetDataPoint("/datapoint"_dppath, std::vector<int32_t>{1, 2, 3}); });
236 EXPECT_EQ(adapter->GetDataPointSize("/datapoint"_dppath), size_t(3));
237 adapter->DeleteDataPoint("/datapoint"_dppath);
238
239 adapter->CreateDataPoint<std::vector<int64_t>>("/datapoint"_dppath);
240 ASSERT_NO_THROW({
241 adapter->SetDataPoint("/datapoint"_dppath, std::vector<int64_t>{2, 3, 4, 5});
242 });
243 EXPECT_EQ(adapter->GetDataPointSize("/datapoint"_dppath), size_t(4));
244 adapter->DeleteDataPoint("/datapoint"_dppath);
245
246 adapter->CreateDataPoint<std::vector<float>>("/datapoint"_dppath);
247 ASSERT_NO_THROW({
248 adapter->SetDataPoint("/datapoint"_dppath, std::vector<float>{3.4, 4.5, 5.6, 6.7, 7.8});
249 });
250 EXPECT_EQ(adapter->GetDataPointSize("/datapoint"_dppath), size_t(5));
251 adapter->DeleteDataPoint("/datapoint"_dppath);
252
253 adapter->CreateDataPoint<std::vector<double>>("/datapoint"_dppath);
254 ASSERT_NO_THROW({
255 adapter->SetDataPoint("/datapoint"_dppath, std::vector<double>{1.2, 2.4, 3.6});
256 });
257 EXPECT_EQ(adapter->GetDataPointSize("/datapoint"_dppath), size_t(3));
258 adapter->DeleteDataPoint("/datapoint"_dppath);
259
260 adapter->CreateDataPoint<MatrixBuffer<int32_t>>("/datapoint"_dppath);
261 ASSERT_NO_THROW({
262 adapter->SetDataPoint("/datapoint"_dppath, MatrixBuffer<int32_t>(2, 2, {1, 2, 3, 4}));
263 });
264 EXPECT_EQ(adapter->GetDataPointSize("/datapoint"_dppath), size_t(4));
265 adapter->DeleteDataPoint("/datapoint"_dppath);
266
267 adapter->CreateDataPoint<MatrixBuffer<int64_t>>("/datapoint"_dppath);
268 ASSERT_NO_THROW({
269 adapter->SetDataPoint("/datapoint"_dppath, MatrixBuffer<int64_t>(2, 3, {2, 3, 4, 5, 6, 7}));
270 });
271 EXPECT_EQ(adapter->GetDataPointSize("/datapoint"_dppath), size_t(6));
272 adapter->DeleteDataPoint("/datapoint"_dppath);
273
274 adapter->CreateDataPoint<MatrixBuffer<float>>("/datapoint"_dppath);
275 ASSERT_NO_THROW({
276 adapter->SetDataPoint("/datapoint"_dppath, MatrixBuffer<float>(2, 2, {1.2, 2.3, 3.4, 4.5}));
277 });
278 EXPECT_EQ(adapter->GetDataPointSize("/datapoint"_dppath), size_t(4));
279 adapter->DeleteDataPoint("/datapoint"_dppath);
280
281 adapter->CreateDataPoint<MatrixBuffer<double>>("/datapoint"_dppath);
282 ASSERT_NO_THROW({
283 adapter->SetDataPoint("/datapoint"_dppath,
284 MatrixBuffer<double>(3, 2, {2.4, 3.5, 4.6, 5.7, 6.8, 7.9}));
285 });
286 EXPECT_EQ(adapter->GetDataPointSize("/datapoint"_dppath), size_t(6));
287 adapter->DeleteDataPoint("/datapoint"_dppath);
288}
289
290TYPED_TEST_P(RepositoryIfTestSuite, DataPointWriteAndRead) {
291 // Check that a datapoint can be written without exceptions and that the same value can be
292 // read back.
293 RepositoryIf* adapter = this->m_adapter.get();
294
295 adapter->CreateDataPoint<std::string>("/datapoint"_dppath);
296 EXPECT_NO_THROW({ adapter->SetDataPoint("/datapoint"_dppath, std::string("test string")); });
297 EXPECT_EQ(adapter->GetDataPoint<std::string>("/datapoint"_dppath), std::string("test string"));
298 adapter->DeleteDataPoint("/datapoint"_dppath);
299
300 adapter->CreateDataPoint<int32_t>("/datapoint"_dppath);
301 EXPECT_NO_THROW({ adapter->SetDataPoint("/datapoint"_dppath, int32_t(123)); });
302 EXPECT_EQ(adapter->GetDataPoint<int32_t>("/datapoint"_dppath), int32_t(123));
303 adapter->DeleteDataPoint("/datapoint"_dppath);
304
305 adapter->CreateDataPoint<int64_t>("/datapoint"_dppath);
306 EXPECT_NO_THROW({ adapter->SetDataPoint("/datapoint"_dppath, int64_t(234)); });
307 EXPECT_EQ(adapter->GetDataPoint<int64_t>("/datapoint"_dppath), int64_t(234));
308 adapter->DeleteDataPoint("/datapoint"_dppath);
309
310 adapter->CreateDataPoint<float>("/datapoint"_dppath);
311 EXPECT_NO_THROW({ adapter->SetDataPoint("/datapoint"_dppath, float(3.45)); });
312 EXPECT_EQ(adapter->GetDataPoint<float>("/datapoint"_dppath), float(3.45));
313 adapter->DeleteDataPoint("/datapoint"_dppath);
314
315 adapter->CreateDataPoint<double>("/datapoint"_dppath);
316 EXPECT_NO_THROW({ adapter->SetDataPoint("/datapoint"_dppath, double(4.56)); });
317 EXPECT_EQ(adapter->GetDataPoint<double>("/datapoint"_dppath), double(4.56));
318 adapter->DeleteDataPoint("/datapoint"_dppath);
319
320 adapter->CreateDataPoint<std::vector<int32_t>>("/datapoint"_dppath);
321 EXPECT_NO_THROW({ adapter->SetDataPoint("/datapoint"_dppath, std::vector<int32_t>{1, 2, 3}); });
322 // Note that the round brackets, i.e. (...), are necessary around std::vector to avoid
323 // compilation errors.
324 EXPECT_EQ(adapter->GetDataPoint<std::vector<int32_t>>("/datapoint"_dppath),
325 (std::vector<int32_t>{1, 2, 3}));
326 adapter->DeleteDataPoint("/datapoint"_dppath);
327
328 adapter->CreateDataPoint<std::vector<int64_t>>("/datapoint"_dppath);
329 EXPECT_NO_THROW({ adapter->SetDataPoint("/datapoint"_dppath, std::vector<int64_t>{2, 3, 4}); });
330 EXPECT_EQ(adapter->GetDataPoint<std::vector<int64_t>>("/datapoint"_dppath),
331 (std::vector<int64_t>{2, 3, 4}));
332 adapter->DeleteDataPoint("/datapoint"_dppath);
333
334 adapter->CreateDataPoint<std::vector<float>>("/datapoint"_dppath);
335 EXPECT_NO_THROW({
336 adapter->SetDataPoint("/datapoint"_dppath, std::vector<float>{1.2, 2.3, 3.4});
337 });
338 EXPECT_EQ(adapter->GetDataPoint<std::vector<float>>("/datapoint"_dppath),
339 (std::vector<float>{1.2, 2.3, 3.4}));
340 adapter->DeleteDataPoint("/datapoint"_dppath);
341
342 adapter->CreateDataPoint<std::vector<double>>("/datapoint"_dppath);
343 EXPECT_NO_THROW({
344 adapter->SetDataPoint("/datapoint"_dppath, std::vector<double>{2.4, 3.6, 4.8});
345 });
346 EXPECT_EQ(adapter->GetDataPoint<std::vector<double>>("/datapoint"_dppath),
347 (std::vector<double>{2.4, 3.6, 4.8}));
348 adapter->DeleteDataPoint("/datapoint"_dppath);
349
350 adapter->CreateDataPoint<MatrixBuffer<int32_t>>("/datapoint"_dppath);
351 EXPECT_NO_THROW({
352 adapter->SetDataPoint("/datapoint"_dppath, MatrixBuffer<int32_t>(2, 2, {1, 2, 3, 4}));
353 });
354 // Note that the round brackets, i.e. (...), are necessary around MatrixBuffer to avoid
355 // compilation errors.
356 EXPECT_EQ(adapter->GetDataPoint<MatrixBuffer<int32_t>>("/datapoint"_dppath),
357 (MatrixBuffer<int32_t>(2, 2, {1, 2, 3, 4})));
358 adapter->DeleteDataPoint("/datapoint"_dppath);
359
360 adapter->CreateDataPoint<MatrixBuffer<int64_t>>("/datapoint"_dppath);
361 EXPECT_NO_THROW({
362 adapter->SetDataPoint("/datapoint"_dppath, MatrixBuffer<int64_t>(2, 2, {5, 6, 7, 8}));
363 });
364 EXPECT_EQ(adapter->GetDataPoint<MatrixBuffer<int64_t>>("/datapoint"_dppath),
365 (MatrixBuffer<int64_t>(2, 2, {5, 6, 7, 8})));
366 adapter->DeleteDataPoint("/datapoint"_dppath);
367
368 adapter->CreateDataPoint<MatrixBuffer<float>>("/datapoint"_dppath);
369 EXPECT_NO_THROW({
370 adapter->SetDataPoint("/datapoint"_dppath, MatrixBuffer<float>(2, 2, {1.2, 2.3, 3.4, 4.5}));
371 });
372 EXPECT_EQ(adapter->GetDataPoint<MatrixBuffer<float>>("/datapoint"_dppath),
373 (MatrixBuffer<float>(2, 2, {1.2, 2.3, 3.4, 4.5})));
374 adapter->DeleteDataPoint("/datapoint"_dppath);
375
376 adapter->CreateDataPoint<MatrixBuffer<double>>("/datapoint"_dppath);
377 EXPECT_NO_THROW({
378 adapter->SetDataPoint("/datapoint"_dppath,
379 MatrixBuffer<double>(2, 2, {6.7, 7.8, 8.9, 9.1}));
380 });
381 EXPECT_EQ(adapter->GetDataPoint<MatrixBuffer<double>>("/datapoint"_dppath),
382 (MatrixBuffer<double>(2, 2, {6.7, 7.8, 8.9, 9.1})));
383 adapter->DeleteDataPoint("/datapoint"_dppath);
384}
385
386TYPED_TEST_P(RepositoryIfTestSuite, DataPointExistanceConsistency) {
387 // Check that a datapoint can be checked for existance without exceptions and that the answer
388 // is consistent.
389 RepositoryIf* adapter = this->m_adapter.get();
390
391 adapter->CreateDataPoint<std::string>("/datapoint"_dppath);
392 EXPECT_NO_THROW({ adapter->SetDataPoint("/datapoint"_dppath, std::string("test string")); });
393 EXPECT_EQ(adapter->GetDataPoint<std::string>("/datapoint"_dppath), std::string("test string"));
394
395 bool exists = false;
396 EXPECT_NO_THROW({ exists = adapter->DataPointExists("/datapoint"_dppath); });
397 EXPECT_EQ(exists, true);
398
399 adapter->DeleteDataPoint("/datapoint"_dppath);
400 EXPECT_NO_THROW({ exists = adapter->DataPointExists("/datapoint"_dppath); });
401 EXPECT_EQ(exists, false);
402
403 adapter->CreateDataPoint<std::string>("/datapoint/test"_dppath);
404 EXPECT_NO_THROW(
405 { adapter->SetDataPoint("/datapoint/test"_dppath, std::string("test string")); });
406 EXPECT_EQ(adapter->GetDataPoint<std::string>("/datapoint/test"_dppath),
407 std::string("test string"));
408
409 EXPECT_NO_THROW({ exists = adapter->DataPointExists("/datapoint/test"_dppath); });
410 EXPECT_EQ(exists, true);
411 EXPECT_NO_THROW({ exists = adapter->DataPointExists("/datapoint"_dppath); });
412 EXPECT_EQ(exists, false);
413 EXPECT_NO_THROW({ exists = adapter->DataPointExists("/datapoint/test/data"_dppath); });
414 EXPECT_EQ(exists, false);
415
416 adapter->DeleteDataPoint("/datapoint/test"_dppath);
417 EXPECT_NO_THROW({ exists = adapter->DataPointExists("/datapoint/test"_dppath); });
418 EXPECT_EQ(exists, false);
419 EXPECT_NO_THROW({ exists = adapter->DataPointExists("/datapoint"_dppath); });
420 EXPECT_EQ(exists, false);
421}
422
424 DataPointCreationAndDeletion,
425 TypesAreReturnedCorrectly,
426 SizesAreReturnedCorrectly,
427 DataPointWriteAndRead,
428 DataPointExistanceConsistency);
429
430} // namespace rtctk::componentFramework::test
431
432#endif // RTCTK_COMPONENTFRAMEWORK_TEST_REPOSITORYIFTESTSUITE_HPP
A buffer class representing 2D matrix data.
Definition: matrixBuffer.hpp:28
Abstract interface providing basic read and write facilities to a repository.
Definition: repositoryIf.hpp:38
virtual const std::type_info & GetDataPointType(const DataPointPath &path) const =0
Fetches the type of the datapoint.
virtual size_t GetDataPointSize(const DataPointPath &path) const =0
Fetches the size of the datapoint's data.
T GetDataPoint(const DataPointPath &path) const
Fetches a datapoint from the repository.
Definition: repositoryIf.hpp:574
virtual void CreateDataPoint(const DataPointPath &path, const std::type_info &type)=0
Creates a new datapoint in the repository with a specified type.
void SetDataPoint(const DataPointPath &path, const T value)
Sets a datapoint in the repository.
Definition: repositoryIf.hpp:595
virtual void DeleteDataPoint(const DataPointPath &path)=0
Deletes a datapoint.
virtual bool DataPointExists(const DataPointPath &path) const =0
Checks for the existence of a datapoint in the repository.
A test suite for performing acceptance tests of a RepositoryIf implementation.
Definition: repositoryIfTestSuite.hpp:79
void CleanupRepository(std::shared_ptr< U > &adapter)
A cleanup function that is invoked before destroying a repository adapter of a given type.
Definition: repositoryIfTestSuite.hpp:112
std::shared_ptr< U > CreateRepository()
Constructs a new instance of a repository adapter that derives from RepositoryIf.
void SetUp() override
Definition: repositoryIfTestSuite.hpp:81
std::shared_ptr< T > m_adapter
Definition: repositoryIfTestSuite.hpp:117
void TearDown() override
Definition: repositoryIfTestSuite.hpp:85
Definition: fakeClock.cpp:15
TYPED_TEST_SUITE_P(RepositoryIfTestSuite)
REGISTER_TYPED_TEST_SUITE_P(RepositoryIfTestSuite, DataPointCreationAndDeletion, TypesAreReturnedCorrectly, SizesAreReturnedCorrectly, DataPointWriteAndRead, DataPointExistanceConsistency)
TYPED_TEST_P(RepositoryIfTestSuite, DataPointCreationAndDeletion)
Definition: repositoryIfTestSuite.hpp:124
Header file for RepositoryIf and related base classes.