ChimeraTK-DeviceAccess 03.25.00
Loading...
Searching...
No Matches
testBackendFactory.cpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Deutsches Elektronen-Synchrotron DESY, MSK, ChimeraTK Project <chimeratk-support@desy.de>
2// SPDX-License-Identifier: LGPL-3.0-or-later
3
4#define BOOST_TEST_DYN_LINK
5#define BOOST_TEST_MODULE BackendFactoryTest
6#include <boost/test/unit_test.hpp>
7using namespace boost::unit_test_framework;
8
9#include "BackendFactory.h"
10#include "DeviceAccessVersion.h"
11#include "DummyBackend.h"
12#include "Exception.h"
13
14#include <boost/make_shared.hpp>
15
16#include <cstdio>
17using namespace ChimeraTK;
18
19struct NewBackend : public DummyBackend {
21
22 static boost::shared_ptr<DeviceBackend> createInstance(
23 std::string instance, std::map<std::string, std::string> parameters) {
24 return returnInstance<NewBackend>(instance, convertPathRelativeToDmapToAbs(parameters["map"]));
25 }
26
27 // no registerer, we do it manually
28};
29
30BOOST_AUTO_TEST_SUITE(BackendFactoryTestSuite)
31
32BOOST_AUTO_TEST_CASE(testCreateBackend) {
34 BOOST_CHECK_THROW(BackendFactory::getInstance().createBackend("test"), ChimeraTK::logic_error);
35
36 std::string testFilePath = "./dummies.dmap";
37 std::string oldtestFilePath = "./oldFileFormat.dmap";
38 std::string invalidtestFilePath = "./nonExistingDmapFile.dmap";
39 BOOST_CHECK_THROW(BackendFactory::getInstance().setDMapFilePath(invalidtestFilePath), ChimeraTK::logic_error);
40 BOOST_CHECK_THROW(BackendFactory::getInstance().createBackend("test"),
41 ChimeraTK::logic_error); // dmap file not found
42 // exception .
44 BOOST_CHECK_THROW(BackendFactory::getInstance().createBackend("test"),
45 ChimeraTK::logic_error); // file found but not
46 // an existing alias.
47 boost::shared_ptr<DeviceBackend> testPtr;
48 BOOST_CHECK_NO_THROW(testPtr = BackendFactory::getInstance().createBackend("DUMMYD0")); // entry in old dummies.dmap
49 BOOST_CHECK(testPtr);
50 testPtr.reset();
52 BOOST_CHECK_THROW(BackendFactory::getInstance().createBackend("test"),
53 ChimeraTK::logic_error); // not an existing
54 // alias.
55 BOOST_CHECK_NO_THROW(testPtr = BackendFactory::getInstance().createBackend("DUMMYD9")); // entry in dummies.dmap
56 BOOST_CHECK(testPtr);
57 BOOST_CHECK_THROW(BackendFactory::getInstance().createBackend("FAKE1"),
58 ChimeraTK::logic_error); // entry in
59 // dummies.dmap for
60 // unregistered
61 // device
62 boost::shared_ptr<DeviceBackend> testPtr2;
63 BOOST_CHECK_NO_THROW(testPtr2 = BackendFactory::getInstance().createBackend("DUMMYD9")); // open existing backend
64 // again
65 BOOST_CHECK(testPtr2 == testPtr); // must be same
66}
67
68BOOST_AUTO_TEST_CASE(testPluginMechanism) {
69 // check the registation of a new backed, called NewBackend ;-)
70 // Throws with the wrong version (00.18 did not have the feature yet, so its
71 // safe to use it) It however is only happening when the backend is tried to
72 // be instantiated because otherwise we would end up in uncatchable exceptions
73 // while loading a dmap file with a broken backend.
74 BOOST_CHECK_NO_THROW(ChimeraTK::BackendFactory::getInstance().registerBackendType(
75 "newBackendWrongVersion", &NewBackend::createInstance, {"map"}, "00.18"));
76
77 BOOST_CHECK_THROW(BackendFactory::getInstance().createBackend("(newBackendWrongVersion?map=goodMapFile.map)"),
79
80 BOOST_CHECK_NO_THROW(ChimeraTK::BackendFactory::getInstance().registerBackendType(
81 "newBackend", &NewBackend::createInstance, {"map"}, CHIMERATK_DEVICEACCESS_VERSION));
82
83 BOOST_CHECK_NO_THROW(BackendFactory::getInstance().createBackend("(newBackend?map=goodMapFile.map)"));
84
85 BOOST_CHECK_THROW(
86 ChimeraTK::BackendFactory::getInstance().loadPluginLibrary("notExisting.so"), ChimeraTK::logic_error);
87
88 BOOST_CHECK_NO_THROW(ChimeraTK::BackendFactory::getInstance().loadPluginLibrary("./libWorkingBackend.so"));
89 // check that the backend really is registered
90 BOOST_CHECK_NO_THROW(BackendFactory::getInstance().createBackend("(working?map=goodMapFile.map)"));
91 BOOST_CHECK_NO_THROW(BackendFactory::getInstance().createBackend("(working?map=goodMapFile.map)"));
92
93 BOOST_CHECK_THROW(
94 ChimeraTK::BackendFactory::getInstance().loadPluginLibrary("libNotRegisteringPlugin.so"), ChimeraTK::logic_error);
95 BOOST_CHECK_THROW(BackendFactory::getInstance().createBackend("(notRegisteringPlugin?map=goodMapFile.map)"),
97
98 BOOST_CHECK_NO_THROW(ChimeraTK::BackendFactory::getInstance().loadPluginLibrary("./libWrongVersionBackend.so"));
99 BOOST_CHECK_THROW(
100 BackendFactory::getInstance().createBackend("(wrongVersionBackend?map=goodMapFile.map)"), ChimeraTK::logic_error);
101
102 BOOST_CHECK_NO_THROW(ChimeraTK::BackendFactory::getInstance().loadPluginLibrary("./libWrongVersionBackendCompat.so"));
103 BOOST_CHECK_THROW(BackendFactory::getInstance().createBackend("(ibWrongVersionBackendCompat?map=goodMapFile.map)"),
105
106 BOOST_CHECK_THROW(BackendFactory::getInstance().createBackend("(unregisteredBackend)"), ChimeraTK::logic_error);
107}
108
109BOOST_AUTO_TEST_CASE(testCreateFromUri) {
110 // this has to work without dmap file
112
113 boost::shared_ptr<DeviceBackend> testPtr;
114 testPtr = BackendFactory::getInstance().createBackend("(dummy?map=mtcadummy.map)"); // get some dummy
115 // just check that something has been created. That it's the correct thing is
116 // another test.
117 BOOST_CHECK(testPtr);
118}
119
120BOOST_AUTO_TEST_SUITE_END()
static BackendFactory & getInstance()
Static function to get an instance of factory.
void setDMapFilePath(std::string dMapFilePath)
This function sets the _DMapFilePath.
boost::shared_ptr< DeviceBackend > createBackend(const std::string &aliasOrUri)
Create a new backend and return the instance as a shared pointer.
The dummy device opens a mapping file instead of a device, and implements all registers defined in th...
DummyBackend(const std::string &mapFileName, const std::string &dataConsistencyKeyDescriptor="")
static std::string convertPathRelativeToDmapToAbs(std::string const &mapfileName)
Exception thrown when a logic error has occured.
Definition Exception.h:51
void setDMapFilePath(std::string dmapFilePath)
Set the location of the dmap file.
static boost::shared_ptr< DeviceBackend > createInstance(std::string instance, std::map< std::string, std::string > parameters)
BOOST_AUTO_TEST_CASE(testCreateBackend)