diff --git a/README.md b/README.md index fdd942577..00a0558db 100644 --- a/README.md +++ b/README.md @@ -689,6 +689,10 @@ Configuration Parameters *Default*: 1 +* `EnableSourceDeviceModels` - + + *Default*: false + #### Configuration Pameters for TLS (https) Support #### The following parameters must be present to enable https requests. If there is no password on the certificate, `TlsCertificatePassword` may be omitted. diff --git a/appveyor.yml b/appveyor.yml index 465cdddab..b95bf1b68 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -23,8 +23,7 @@ configuration: #C:\ - x86 cache: - - c:\.conan2\ -> **\conanfile.py - - c:\conan2\ -> **\conanfile.py + - C:\Users\appveyor\.conan2 -> **\conanfile.py - /home/appveyor/.conan2 -> **/conanfile.py - /Users/appveyor/.conan2 -> **/conanfile.py @@ -43,10 +42,7 @@ before_build: - cmd: |- set PATH=C:\Python39-x64\;C:\Python39-x64\Scripts;C:\Ruby30\bin;%PATH% "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat" - if not exist C:\conan mkdir C:\conan if %SHARED%==True (set CONAN_PROFILE=conan/profiles/vs64shared) else (set CONAN_PROFILE=conan/profiles/vs64) - set CONAN_USER_HOME=C:\conan - rem set CPACK=True pip install conan conan profile detect -f diff --git a/demo/agent/Devices.xml b/demo/agent/Devices.xml index d90d17aff..f3fff6ef1 100644 --- a/demo/agent/Devices.xml +++ b/demo/agent/Devices.xml @@ -897,9 +897,28 @@ 7000 1 + + + + + + + + + + + + + + + + + + + diff --git a/src/mtconnect/agent.cpp b/src/mtconnect/agent.cpp index c21048d3b..f5c81bab4 100644 --- a/src/mtconnect/agent.cpp +++ b/src/mtconnect/agent.cpp @@ -389,7 +389,29 @@ namespace mtconnect { } } - void Agent::loadDevice(const string &deviceXml, const optional source) + void Agent::loadDeviceXml(const string &deviceXml, const optional source) + { + try + { + auto printer = dynamic_cast(m_printers["xml"].get()); + auto device = m_xmlParser->parseDevice(deviceXml, printer); + loadDevice(device, source); + } + catch (runtime_error &e) + { + LOG(error) << "Error loading device: " << deviceXml; + LOG(error) << "Error detail: " << e.what(); + cerr << e.what() << endl; + } + catch (exception &f) + { + LOG(error) << "Error loading device: " << deviceXml; + LOG(error) << "Error detail: " << f.what(); + cerr << f.what() << endl; + } + } + + void Agent::loadDevice(DevicePtr device, const optional source) { if (!IsOptionSet(m_options, config::EnableSourceDeviceModels)) { @@ -400,9 +422,6 @@ namespace mtconnect { m_context.pause([=](config::AsyncContext &context) { try { - auto printer = dynamic_cast(m_printers["xml"].get()); - auto device = m_xmlParser->parseDevice(deviceXml, printer); - if (device) { bool changed = receiveDevice(device, true); @@ -421,18 +440,19 @@ namespace mtconnect { } else { - LOG(error) << "Cannot parse device xml: " << deviceXml; + LOG(error) << "Cannot parse device xml: " << *device->getComponentName() << " with uuid " + << *device->getUuid(); } } catch (runtime_error &e) { - LOG(error) << "Error loading device: " + deviceXml; + LOG(error) << "Error loading device: " << *device->getComponentName(); LOG(error) << "Error detail: " << e.what(); cerr << e.what() << endl; } catch (exception &f) { - LOG(error) << "Error loading device: " + deviceXml; + LOG(error) << "Error loading device: " << *device->getComponentName(); LOG(error) << "Error detail: " << f.what(); cerr << f.what() << endl; } @@ -1426,7 +1446,7 @@ namespace mtconnect { if (command == "devicemodel") { - loadDevice(value, source); + loadDeviceXml(value, source); } else if (device) { diff --git a/src/mtconnect/agent.hpp b/src/mtconnect/agent.hpp index 01d583c20..1a02cd2ed 100644 --- a/src/mtconnect/agent.hpp +++ b/src/mtconnect/agent.hpp @@ -271,11 +271,16 @@ namespace mtconnect { /// @return true if successful bool reloadDevices(const std::string &deviceFile); + /// @brief receive a single device from a source + /// @param[in] deviceXml the device xml as a string + /// @param[in] source the source loading the device + void loadDevice(DevicePtr device, const std::optional source = std::nullopt); + /// @brief receive and parse a single device from a source /// @param[in] deviceXml the device xml as a string /// @param[in] source the source loading the device - void loadDevice(const std::string &deviceXml, - const std::optional source = std::nullopt); + void loadDeviceXml(const std::string &deviceXml, + const std::optional source = std::nullopt); /// @name Message when source has connected and disconnected ///@{ @@ -574,7 +579,7 @@ namespace mtconnect { void deliverConnectStatus(entity::EntityPtr, const StringList &devices, bool autoAvailable) override; void deliverCommand(entity::EntityPtr) override; - void deliverDevice(DevicePtr device) override { m_agent->receiveDevice(device); } + void deliverDevice(DevicePtr device) override { m_agent->loadDevice(device); } void sourceFailed(const std::string &identity) override { m_agent->sourceFailed(identity); } diff --git a/src/mtconnect/configuration/agent_config.cpp b/src/mtconnect/configuration/agent_config.cpp index 39fcca9a3..d8c74bac2 100644 --- a/src/mtconnect/configuration/agent_config.cpp +++ b/src/mtconnect/configuration/agent_config.cpp @@ -808,7 +808,14 @@ namespace mtconnect::configuration { GetOptions(block.second, adapterOptions, options); AddOptions(block.second, adapterOptions, - {{configuration::Url, string()}, {configuration::Device, string()}}); + {{configuration::Url, string()}, + {configuration::Device, string()}, + {configuration::UUID, string()}, + {configuration::Uuid, string()}}); + + if (HasOption(adapterOptions, configuration::Uuid) && + !HasOption(adapterOptions, configuration::UUID)) + adapterOptions[configuration::UUID] = adapterOptions[configuration::Uuid]; auto qname = entity::QName(block.first); auto [factory, name] = qname.getPair(); diff --git a/src/mtconnect/configuration/config_options.hpp b/src/mtconnect/configuration/config_options.hpp index a85fe44f3..1a4cb9b27 100644 --- a/src/mtconnect/configuration/config_options.hpp +++ b/src/mtconnect/configuration/config_options.hpp @@ -119,6 +119,7 @@ namespace mtconnect { DECLARE_CONFIGURATION(SuppressIPAddress); DECLARE_CONFIGURATION(Topics); DECLARE_CONFIGURATION(UUID); + DECLARE_CONFIGURATION(Uuid); DECLARE_CONFIGURATION(UpcaseDataItemValue); DECLARE_CONFIGURATION(Url); DECLARE_CONFIGURATION(UsePolling); diff --git a/src/mtconnect/configuration/parser.cpp b/src/mtconnect/configuration/parser.cpp index 451a7cba1..f79cc1b65 100644 --- a/src/mtconnect/configuration/parser.cpp +++ b/src/mtconnect/configuration/parser.cpp @@ -22,7 +22,7 @@ #include "mtconnect/utilities.hpp" -//#define BOOST_SPIRIT_DEBUG 1 +// #define BOOST_SPIRIT_DEBUG 1 #ifdef BOOST_SPIRIT_DEBUG namespace std { static ostream &operator<<(ostream &s, const boost::property_tree::ptree &t); diff --git a/src/mtconnect/device_model/component.cpp b/src/mtconnect/device_model/component.cpp index 1c9b6a139..5d9e2523b 100644 --- a/src/mtconnect/device_model/component.cpp +++ b/src/mtconnect/device_model/component.cpp @@ -40,7 +40,7 @@ namespace mtconnect { : Entity(name, props) { m_id = get("id"); - m_name = maybeGet("name"); + m_componentName = maybeGet("name"); m_uuid = maybeGet("uuid"); } diff --git a/src/mtconnect/device_model/component.hpp b/src/mtconnect/device_model/component.hpp index a554e4c38..ca0c09d42 100644 --- a/src/mtconnect/device_model/component.hpp +++ b/src/mtconnect/device_model/component.hpp @@ -81,7 +81,7 @@ namespace mtconnect { const auto &getId() const { return m_id; } /// @brief get the name property of the component /// @return name if it exists - const auto &getComponentName() const { return m_name; } + const auto &getComponentName() const { return m_componentName; } /// @brief get the component uuid /// @return uuid if it exists const auto &getUuid() const { return m_uuid; } @@ -94,9 +94,9 @@ namespace mtconnect { { auto *self = const_cast(this); self->m_topicName.emplace(getName()); - if (m_name) + if (m_componentName) { - self->m_topicName->append("[").append(*m_name).append("]"); + self->m_topicName->append("[").append(*m_componentName).append("]"); } } return *m_topicName; @@ -161,9 +161,19 @@ namespace mtconnect { /// @param name name property void setComponentName(const std::string &name) { - m_name = name; + m_componentName = name; setProperty("name", name); } + /// @brief set the compoent name property, not the compoent type + /// @param name name property + void setComponentName(const std::optional &name) + { + m_componentName = name; + if (name) + setProperty("name", *name); + else + m_properties.erase("name"); + } /// @brief get the device (top level component) /// @return shared pointer to the device @@ -272,22 +282,15 @@ namespace mtconnect { void setDevice(DevicePtr device) { m_device = device; } protected: - // Unique ID for each component - std::string m_id; - - // Name for itself - std::optional m_name; - - // Universal unique identifier - std::optional m_uuid; + std::string m_id; //< Unique ID for each component + std::optional m_componentName; //< Name property for the component + std::optional m_uuid; //< Universal unique identifier // Component relationships - // Pointer to the parent component - std::weak_ptr m_parent; - std::weak_ptr m_device; - // Topic - std::optional m_topicName; + std::weak_ptr m_parent; //< Pointer to the parent component + std::weak_ptr m_device; //< Pointer to the device related to the component + std::optional m_topicName; //< The cached topic name }; /// @brief Comparison lambda to sort components diff --git a/src/mtconnect/entity/data_set.cpp b/src/mtconnect/entity/data_set.cpp index 1ca2779e4..598d5b811 100644 --- a/src/mtconnect/entity/data_set.cpp +++ b/src/mtconnect/entity/data_set.cpp @@ -19,7 +19,7 @@ #include "mtconnect/utilities.hpp" -//#define BOOST_SPIRIT_DEBUG 1 +// #define BOOST_SPIRIT_DEBUG 1 #include diff --git a/src/mtconnect/pipeline/deliver.cpp b/src/mtconnect/pipeline/deliver.cpp index f07630afe..601d92ef2 100644 --- a/src/mtconnect/pipeline/deliver.cpp +++ b/src/mtconnect/pipeline/deliver.cpp @@ -135,6 +135,19 @@ namespace mtconnect { return entity; } + EntityPtr DeliverDevice::operator()(entity::EntityPtr &&entity) + { + auto d = std::dynamic_pointer_cast(entity); + if (!d) + { + throw EntityError("Unexpected entity type, cannot convert to asset in DeliverAsset"); + } + + m_contract->deliverDevice(d); + + return entity; + } + entity::EntityPtr DeliverConnectionStatus::operator()(entity::EntityPtr &&entity) { m_contract->deliverConnectStatus(entity, m_devices, m_autoAvailable); diff --git a/src/mtconnect/pipeline/deliver.hpp b/src/mtconnect/pipeline/deliver.hpp index 26191374a..ac23e4c84 100644 --- a/src/mtconnect/pipeline/deliver.hpp +++ b/src/mtconnect/pipeline/deliver.hpp @@ -23,6 +23,7 @@ #include "mtconnect/asset/asset.hpp" #include "mtconnect/config.hpp" +#include "mtconnect/device_model/device.hpp" #include "mtconnect/observation/observation.hpp" #include "transform.hpp" @@ -153,6 +154,22 @@ namespace mtconnect::pipeline { entity::EntityPtr operator()(entity::EntityPtr &&entity) override; }; + /// @brief A transform to deliver a device + class AGENT_LIB_API DeliverDevice : public Transform + { + public: + using Deliver = std::function; + DeliverDevice(PipelineContextPtr context) + : Transform("DeliverDevice"), m_contract(context->m_contract.get()) + { + m_guard = TypeGuard(RUN); + } + entity::EntityPtr operator()(entity::EntityPtr &&entity) override; + + protected: + PipelineContract *m_contract; + }; + /// @brief deliver the connection status of an adapter class AGENT_LIB_API DeliverConnectionStatus : public Transform { diff --git a/src/mtconnect/pipeline/guard.hpp b/src/mtconnect/pipeline/guard.hpp index 5c66c9355..43bf83a23 100644 --- a/src/mtconnect/pipeline/guard.hpp +++ b/src/mtconnect/pipeline/guard.hpp @@ -40,11 +40,11 @@ namespace mtconnect { { public: /// @brief Construct a GuardCls - /// @param match the match to return if matched - GuardCls(GuardAction match) : m_match(match) {} + /// @param match the action if matched + GuardCls(GuardAction action) : m_action(action) {} GuardCls(const GuardCls &) = default; - GuardAction operator()(const entity::Entity *entity) { return m_match; } + GuardAction operator()(const entity::Entity *entity) { return m_action; } /// @brief set the alternative guard /// @param alt alternative @@ -57,7 +57,7 @@ namespace mtconnect { GuardAction check(bool matched, const entity::Entity *entity) { if (matched) - return m_match; + return m_action; else if (m_alternative) return m_alternative(entity); else @@ -83,7 +83,7 @@ namespace mtconnect { protected: Guard m_alternative; - GuardAction m_match; + GuardAction m_action; }; /// @brief A guard that checks if the entity is one of the types or sub-types diff --git a/src/mtconnect/pipeline/mtconnect_xml_transform.hpp b/src/mtconnect/pipeline/mtconnect_xml_transform.hpp index 5cf7d55b7..8a14ef095 100644 --- a/src/mtconnect/pipeline/mtconnect_xml_transform.hpp +++ b/src/mtconnect/pipeline/mtconnect_xml_transform.hpp @@ -31,6 +31,7 @@ namespace mtconnect::pipeline { struct XmlTransformFeedback { uint64_t m_instanceId = 0; + int32_t m_agentVersion = 0; SequenceNumber_t m_next = 0; entity::EntityList m_assetEvents; ResponseDocument::Errors m_errors; @@ -49,10 +50,12 @@ namespace mtconnect::pipeline { /// @param feedback a feedback object to pass back protocol info /// @param device an associated device MTConnectXmlTransform(PipelineContextPtr context, XmlTransformFeedback &feedback, - const std::optional &device = std::nullopt) + const std::optional &device = std::nullopt, + const std::optional &uuid = std::nullopt) : Transform("MTConnectXmlTransform"), m_context(context), m_defaultDevice(device), + m_uuid(uuid), m_feedback(feedback) { m_guard = EntityNameGuard("Data", RUN); @@ -66,7 +69,7 @@ namespace mtconnect::pipeline { const auto &data = entity->getValue(); ResponseDocument rd; - ResponseDocument::parse(data, rd, m_context, m_defaultDevice); + ResponseDocument::parse(data, rd, m_context, m_defaultDevice, m_uuid); if (m_feedback.m_instanceId != 0 && m_feedback.m_instanceId != rd.m_instanceId) { @@ -79,6 +82,7 @@ namespace mtconnect::pipeline { } m_feedback.m_instanceId = rd.m_instanceId; + m_feedback.m_agentVersion = rd.m_agentVersion; m_feedback.m_next = rd.m_next; m_feedback.m_assetEvents = rd.m_assetEvents; m_feedback.m_errors = rd.m_errors; @@ -99,6 +103,7 @@ namespace mtconnect::pipeline { protected: PipelineContextPtr m_context; std::optional m_defaultDevice; + std::optional m_uuid; XmlTransformFeedback &m_feedback; }; } // namespace mtconnect::pipeline diff --git a/src/mtconnect/pipeline/response_document.cpp b/src/mtconnect/pipeline/response_document.cpp index b9c793679..2a146d936 100644 --- a/src/mtconnect/pipeline/response_document.cpp +++ b/src/mtconnect/pipeline/response_document.cpp @@ -148,6 +148,73 @@ namespace mtconnect::pipeline { return ""; } + inline static bool parseDevices(ResponseDocument &out, xmlNodePtr node, + pipeline::PipelineContextPtr context, + const std::optional &device, + const std::optional &uuid) + { + using namespace entity; + using namespace device_model; + + auto header = findChild(node, "Header"); + if (header) + { + out.m_instanceId = + boost::lexical_cast(attributeValue(header, "instanceId")); + out.m_agentVersion = IntSchemaVersion(attributeValue(header, "version")); + } + + auto devices = findChild(node, "Devices"); + if (devices == nullptr) + { + LOG(warning) << "Cannot find Devices node in MTConnectDevices Document"; + return false; + } + + entity::XmlParser parser; + eachElement(devices, [&out, &parser, &device, &uuid](xmlNodePtr n) { + ErrorList errors; + auto dev = parser.parseXmlNode(Device::getRoot(), n, errors); + if (!errors.empty()) + { + LOG(warning) << "Could not parse asset: " << (const char *)n->name; + for (auto &e : errors) + { + LOG(warning) << " Message: " << e->what(); + } + } + + auto devicePtr = dynamic_pointer_cast(dev); + if (!devicePtr) + { + LOG(error) << "Device could not be parsed from XML"; + return false; + } + + if (device && *device != *(devicePtr->getComponentName())) + { + LOG(warning) << "Source and Target Device Name mismatch: " << *device << " and " + << *(devicePtr->getComponentName()); + LOG(warning) << "Setting device name to " << *device; + + devicePtr->setComponentName(*device); + } + if (uuid && *uuid != *(devicePtr->getUuid())) + { + LOG(warning) << "Source and Target Device uuid mismatch: " << *uuid << " and " + << *(devicePtr->getUuid()); + LOG(warning) << "Setting device uuid to " << *uuid; + devicePtr->setUuid(*uuid); + } + + out.m_entities.emplace_back(dev); + + return true; + }); + + return true; + } + inline DataSetValue type(const string &s) { using namespace boost; @@ -434,7 +501,8 @@ namespace mtconnect::pipeline { bool ResponseDocument::parse(const std::string_view &content, ResponseDocument &out, pipeline::PipelineContextPtr context, - const std::optional &device) + const std::optional &device, + const std::optional &uuid) { // xmlInitParser(); // xmlXPathInit(); @@ -454,6 +522,10 @@ namespace mtconnect::pipeline { { return parseObservations(out, root, context, device); } + else if (xmlStrcmp(BAD_CAST "MTConnectDevices", root->name) == 0) + { + return parseDevices(out, root, context, device, uuid); + } else if (xmlStrcmp(BAD_CAST "MTConnectAssets", root->name) == 0) { return parseAssets(out, root, device); diff --git a/src/mtconnect/pipeline/response_document.hpp b/src/mtconnect/pipeline/response_document.hpp index a2e2421ec..3e78bba31 100644 --- a/src/mtconnect/pipeline/response_document.hpp +++ b/src/mtconnect/pipeline/response_document.hpp @@ -45,11 +45,13 @@ namespace mtconnect::pipeline { /// @return `true` if successful static bool parse(const std::string_view &content, ResponseDocument &doc, pipeline::PipelineContextPtr context, - const std::optional &device = std::nullopt); + const std::optional &device = std::nullopt, + const std::optional &uuid = std::nullopt); // Parsed data SequenceNumber_t m_next; ///< Next sequence number uint64_t m_instanceId; ///< Agent instance id + int32_t m_agentVersion = 0; ///< Agent version entity::EntityList m_entities; ///< List of entities entity::EntityList m_assetEvents; ///< List of asset events Errors m_errors; ///< List of Errors diff --git a/src/mtconnect/source/adapter/adapter_pipeline.cpp b/src/mtconnect/source/adapter/adapter_pipeline.cpp index b902164fd..2589afdba 100644 --- a/src/mtconnect/source/adapter/adapter_pipeline.cpp +++ b/src/mtconnect/source/adapter/adapter_pipeline.cpp @@ -103,11 +103,14 @@ namespace mtconnect { } } - void AdapterPipeline::buildCommandAndStatusDelivery() + void AdapterPipeline::buildCommandAndStatusDelivery(pipeline::TransformPtr next) { - bind(make_shared( + if (next == nullptr) + next = m_start; + + next->bind(make_shared( m_context, m_devices, IsOptionSet(m_options, configuration::AutoAvailable))); - bind(make_shared(m_context, m_device)); + next->bind(make_shared(m_context, m_device)); } void AdapterPipeline::buildAssetDelivery(pipeline::TransformPtr next) @@ -120,6 +123,11 @@ namespace mtconnect { next->bind(make_shared(m_context)); } + void AdapterPipeline::buildDeviceDelivery(pipeline::TransformPtr next) + { + next->bind(make_shared(m_context)); + } + void AdapterPipeline::buildObservationDelivery(pipeline::TransformPtr next) { // Uppercase Events diff --git a/src/mtconnect/source/adapter/adapter_pipeline.hpp b/src/mtconnect/source/adapter/adapter_pipeline.hpp index 6f1660cff..9af9ddadd 100644 --- a/src/mtconnect/source/adapter/adapter_pipeline.hpp +++ b/src/mtconnect/source/adapter/adapter_pipeline.hpp @@ -72,7 +72,8 @@ namespace mtconnect::source::adapter { protected: void buildDeviceList(); - void buildCommandAndStatusDelivery(); + void buildCommandAndStatusDelivery(pipeline::TransformPtr next = nullptr); + void buildDeviceDelivery(pipeline::TransformPtr next); void buildAssetDelivery(pipeline::TransformPtr next); void buildObservationDelivery(pipeline::TransformPtr next); diff --git a/src/mtconnect/source/adapter/agent_adapter/agent_adapter.cpp b/src/mtconnect/source/adapter/agent_adapter/agent_adapter.cpp index c2eb9648c..bcf4e231b 100644 --- a/src/mtconnect/source/adapter/agent_adapter/agent_adapter.cpp +++ b/src/mtconnect/source/adapter/agent_adapter/agent_adapter.cpp @@ -44,15 +44,20 @@ namespace mtconnect::source::adapter::agent_adapter { void AgentAdapterPipeline::build(const ConfigOptions &options) { m_options = options; + m_uuid = GetOption(options, configuration::UUID); + buildDeviceList(); buildCommandAndStatusDelivery(); - TransformPtr next = bind(make_shared(m_context, m_feedback, m_device)); + TransformPtr next = + bind(make_shared(m_context, m_feedback, m_device, m_uuid)); std::optional obsMetrics; obsMetrics = m_identity + "_observation_update_rate"; next->bind(make_shared(m_context, obsMetrics)); - + buildDeviceDelivery(next); buildAssetDelivery(next); + + applySplices(); } AgentAdapter::AgentAdapter(boost::asio::io_context &io, pipeline::PipelineContextPtr context, @@ -82,6 +87,7 @@ namespace mtconnect::source::adapter::agent_adapter { {configuration::ReconnectInterval, 10000ms}, {configuration::RelativeTime, false}, {configuration::UsePolling, false}, + {configuration::EnableSourceDeviceModels, false}, {"!CloseConnectionAfterResponse!", false}}); m_handler = m_pipeline.makeHandler(); @@ -107,6 +113,7 @@ namespace mtconnect::source::adapter::agent_adapter { m_usePolling = *GetOption(m_options, configuration::UsePolling); m_reconnectInterval = *GetOption(m_options, configuration::ReconnectInterval); m_pollingInterval = *GetOption(m_options, configuration::PollingInterval); + m_probeAgent = *GetOption(m_options, configuration::EnableSourceDeviceModels); m_closeConnectionAfterResponse = *GetOption(m_options, "!CloseConnectionAfterResponse!"); @@ -344,8 +351,15 @@ namespace mtconnect::source::adapter::agent_adapter { clear(); m_reconnecting = false; - assets(); - current(); + if (m_probeAgent) + { + probe(); + } + else + { + assets(); + current(); + } } void AgentAdapter::recover() @@ -357,14 +371,27 @@ namespace mtconnect::source::adapter::agent_adapter { sample(); } - void AgentAdapter::current() + bool AgentAdapter::probe() { if (m_stopped) - return; + return false; + + m_streamRequest.emplace(m_sourceDevice, "probe", UrlQuery(), false, [this]() { + m_agentVersion = m_feedback.m_agentVersion; + assets(); + return current(); + }); + return m_session->makeRequest(*m_streamRequest); + } + + bool AgentAdapter::current() + { + if (m_stopped) + return false; m_streamRequest.emplace(m_sourceDevice, "current", UrlQuery(), false, [this]() { return sample(); }); - m_session->makeRequest(*m_streamRequest); + return m_session->makeRequest(*m_streamRequest); } bool AgentAdapter::sample() @@ -420,7 +447,11 @@ namespace mtconnect::source::adapter::agent_adapter { void AgentAdapter::assets() { UrlQuery query({{"count", "1048576"}}); - m_assetRequest.emplace(m_sourceDevice, "assets", query, false, [this]() { + + std::optional source; + if (m_agentVersion >= 200) + source.emplace(m_sourceDevice); + m_assetRequest.emplace(source, "assets", query, false, [this]() { m_assetRequest.reset(); return true; }); diff --git a/src/mtconnect/source/adapter/agent_adapter/agent_adapter.hpp b/src/mtconnect/source/adapter/agent_adapter/agent_adapter.hpp index 40f056d8b..6a0cebcb5 100644 --- a/src/mtconnect/source/adapter/agent_adapter/agent_adapter.hpp +++ b/src/mtconnect/source/adapter/agent_adapter/agent_adapter.hpp @@ -52,6 +52,7 @@ namespace mtconnect::source::adapter::agent_adapter { Handler *m_handler = nullptr; pipeline::XmlTransformFeedback &m_feedback; + std::optional m_uuid; }; /// @brief An adapter to connnect to another Agent and replicate data @@ -106,7 +107,8 @@ namespace mtconnect::source::adapter::agent_adapter { protected: void run(); void recover(); - void current(); + bool probe(); + bool current(); bool sample(); void assets(); void updateAssets(); @@ -132,6 +134,7 @@ namespace mtconnect::source::adapter::agent_adapter { bool m_failed = false; bool m_stopped = false; bool m_usePolling = false; + bool m_probeAgent = false; std::chrono::milliseconds m_reconnectInterval; std::chrono::milliseconds m_pollingInterval; @@ -151,6 +154,8 @@ namespace mtconnect::source::adapter::agent_adapter { std::optional m_streamRequest; std::optional m_assetRequest; + int32_t m_agentVersion = 0; + // For testing bool m_closeConnectionAfterResponse; }; diff --git a/src/mtconnect/source/adapter/agent_adapter/session.hpp b/src/mtconnect/source/adapter/agent_adapter/session.hpp index 00c3bb950..89e146829 100644 --- a/src/mtconnect/source/adapter/agent_adapter/session.hpp +++ b/src/mtconnect/source/adapter/agent_adapter/session.hpp @@ -64,10 +64,11 @@ namespace mtconnect::source::adapter::agent_adapter { Request(const Request &request) = default; std::optional m_sourceDevice; ///< optional source device - std::string m_operation; ///< The REST operation (probe, current, sample, asset) - UrlQuery m_query; ///< URL Query parameters - bool m_stream; ///< `true` if using HTTP long pull - Next m_next; ///< function to call on successful read + std::string m_operation; ///< The REST operation (probe, current, sample, asset) + UrlQuery m_query; ///< URL Query parameters + bool m_stream; ///< `true` if using HTTP long pull + Next m_next; ///< function to call on successful read + int32_t m_agentVersion = 0; ///< agent version if required > 0 for asset requests /// @brief Given a url, get a formatted target for a given operation /// @param url The base url @@ -89,6 +90,8 @@ namespace mtconnect::source::adapter::agent_adapter { /// @param ec the error code /// @param what descriptive message virtual void failed(std::error_code ec, const char *what) = 0; + /// @brief close the connection + virtual void close() = 0; /// @brief Make a request of the remote agent /// @param request the request @@ -102,6 +105,7 @@ namespace mtconnect::source::adapter::agent_adapter { UpdateAssets m_updateAssets; bool m_closeConnectionAfterResponse = false; std::chrono::milliseconds m_timeout = std::chrono::milliseconds(30000); + bool m_closeOnRead = false; }; } // namespace mtconnect::source::adapter::agent_adapter diff --git a/src/mtconnect/source/adapter/agent_adapter/session_impl.hpp b/src/mtconnect/source/adapter/agent_adapter/session_impl.hpp index bdd4ac421..43ff13e54 100644 --- a/src/mtconnect/source/adapter/agent_adapter/session_impl.hpp +++ b/src/mtconnect/source/adapter/agent_adapter/session_impl.hpp @@ -66,6 +66,9 @@ namespace mtconnect::source::adapter::agent_adapter { /// @return `true` if the socket is open bool isOpen() const override { return derived().lowestLayer().socket().is_open(); } + /// @brief close the connection + void close() override { derived().lowestLayer().socket().close(); } + /// @brief Method called when a request fails /// /// Closes the socket and resets the request @@ -74,9 +77,12 @@ namespace mtconnect::source::adapter::agent_adapter { void failed(std::error_code ec, const char *what) override { derived().lowestLayer().socket().close(); - m_request.reset(); - LOG(error) << what << ": " << ec.message() << "\n"; + LOG(error) << "Agent Adapter Connection Failed: " << m_url.getUrlText(nullopt); + if (m_request) + LOG(error) << "Agent Adapter Target: " << m_request->getTarget(m_url); + LOG(error) << "Agent Adapter " << what << ": " << ec.message() << "\n"; + m_request.reset(); if (m_failed) m_failed(ec); } @@ -98,7 +104,6 @@ namespace mtconnect::source::adapter::agent_adapter { m_textParser.reset(); m_req.reset(); m_hasHeader = false; - m_closeOnRead = false; if (m_chunk.size() > 0) m_chunk.consume(m_chunk.size()); @@ -241,6 +246,9 @@ namespace mtconnect::source::adapter::agent_adapter { derived().lowestLayer().expires_after(m_timeout); + LOG(debug) << "Agent adapter making request: " << m_url.getUrlText(nullopt) << " target " + << m_request->getTarget(m_url); + http::async_write(derived().stream(), *m_req, beast::bind_front_handler(&SessionImpl::onWrite, derived().getptr())); } @@ -281,7 +289,7 @@ namespace mtconnect::source::adapter::agent_adapter { { if (ec) { - LOG(error) << "Error getting request header: " << ec.category().name() << " " + LOG(error) << "Agent Adapter Error getting request header: " << ec.category().name() << " " << ec.message(); derived().lowestLayer().close(); if (m_request->m_stream && ec == beast::error::timeout) @@ -304,7 +312,12 @@ namespace mtconnect::source::adapter::agent_adapter { } auto &msg = m_headerParser->get(); - if (auto a = msg.find(beast::http::field::connection); a != msg.end()) + if (msg.version() < 11) + { + LOG(trace) << "Agent adapter: HTTP 10 requires close on read"; + m_closeOnRead = true; + } + else if (auto a = msg.find(beast::http::field::connection); a != msg.end()) { m_closeOnRead = a->value() == "close"; } @@ -357,7 +370,7 @@ namespace mtconnect::source::adapter::agent_adapter { m_request.reset(); if (m_closeOnRead) - derived().disconnect(); + close(); if (next) { @@ -599,8 +612,6 @@ namespace mtconnect::source::adapter::agent_adapter { // For request queuing std::optional m_request; RequestQueue m_queue; - - bool m_closeOnRead = false; }; } // namespace mtconnect::source::adapter::agent_adapter diff --git a/src/mtconnect/source/adapter/shdr/shdr_adapter.cpp b/src/mtconnect/source/adapter/shdr/shdr_adapter.cpp index 616c13e88..fcdb1f185 100644 --- a/src/mtconnect/source/adapter/shdr/shdr_adapter.cpp +++ b/src/mtconnect/source/adapter/shdr/shdr_adapter.cpp @@ -63,7 +63,8 @@ namespace mtconnect::source::adapter::shdr { {configuration::Port, 7878}, {configuration::AutoAvailable, false}, {configuration::RealTime, false}, - {configuration::RelativeTime, false}}); + {configuration::RelativeTime, false}, + {configuration::EnableSourceDeviceModels, false}}); m_server = get(m_options[configuration::Host]); m_port = get(m_options[configuration::Port]); diff --git a/src/mtconnect/utilities.hpp b/src/mtconnect/utilities.hpp index 07e48f10e..491c664f1 100644 --- a/src/mtconnect/utilities.hpp +++ b/src/mtconnect/utilities.hpp @@ -33,7 +33,7 @@ #include "mtconnect/config.hpp" -//####### CONSTANTS ####### +// ####### CONSTANTS ####### // Port number to put server on const unsigned int SERVER_PORT = 8080; diff --git a/test/agent_adapter_test.cpp b/test/agent_adapter_test.cpp index c5f2a7ae0..447954690 100644 --- a/test/agent_adapter_test.cpp +++ b/test/agent_adapter_test.cpp @@ -77,7 +77,7 @@ struct MockPipelineContract : public PipelineContract m_observations.push_back(obs); } void deliverAsset(AssetPtr) override {} - void deliverDevice(DevicePtr) override {} + void deliverDevice(DevicePtr d) override { m_receivedDevice = d; } void deliverAssetCommand(entity::EntityPtr) override {} void deliverCommand(entity::EntityPtr) override {} void deliverConnectStatus(entity::EntityPtr, const StringList &dev, bool flag) override {} @@ -88,6 +88,7 @@ struct MockPipelineContract : public PipelineContract std::string m_result; std::string m_deviceName; DevicePtr m_device; + DevicePtr m_receivedDevice; std::vector m_observations; }; @@ -106,7 +107,8 @@ class AgentAdapterTest : public testing::Test auto parser = make_unique(); m_device = - parser->parseFile(PROJECT_ROOT_DIR "/samples/test_config.xml", printer.get()).front(); + parser->parseFile(PROJECT_ROOT_DIR "/test/resources/samples/test_config.xml", printer.get()) + .front(); m_context = make_shared(); m_context->m_contract = make_unique(m_device); @@ -128,10 +130,10 @@ class AgentAdapterTest : public testing::Test m_adapter.reset(); } - void createAgent(ConfigOptions options = {}) + void createAgent(ConfigOptions options = {}, + std::string deviceFile = "/test/resources/samples/test_config.xml") { - m_agentTestHelper->createAgent("/samples/test_config.xml", 8, 4, "2.0", 25, false, true, - options); + m_agentTestHelper->createAgent(deviceFile, 8, 4, "2.0", 25, false, true, options); m_agentTestHelper->getAgent()->start(); m_agentId = to_string(getCurrentTimeInSec()); } @@ -717,3 +719,43 @@ TEST_F(AgentAdapterTest, should_connect_to_tls_agent) timeout.cancel(); } + +TEST_F(AgentAdapterTest, should_create_device_when_option_supplied) +{ + createAgent({}, "/test/resources/samples/solid_model.xml"); + + auto port = m_agentTestHelper->m_restService->getServer()->getPort(); + auto adapter = createAdapter(port, {{configuration::EnableSourceDeviceModels, true}}); + + addAdapter(); + + unique_ptr handler = make_unique(); + + int rc = 0; + ResponseDocument rd; + handler->m_processData = [&](const string &d, const string &s) { + ResponseDocument::parse(d, rd, m_context); + rc++; + + adapter->getFeedback().m_next = rd.m_next; + }; + handler->m_connecting = [&](const string id) {}; + handler->m_connected = [&](const string id) {}; + + adapter->setHandler(handler); + adapter->start(); + + boost::asio::steady_timer timeout(m_agentTestHelper->m_ioContext, 2s); + timeout.async_wait([](boost::system::error_code ec) { + if (!ec) + { + throw runtime_error("test timed out"); + } + }); + + while (rc < 2) + { + m_agentTestHelper->m_ioContext.run_one(); + } + ASSERT_EQ(2, rc); +} diff --git a/test/agent_device_test.cpp b/test/agent_device_test.cpp index 84899f8a7..a6a75627d 100644 --- a/test/agent_device_test.cpp +++ b/test/agent_device_test.cpp @@ -55,7 +55,7 @@ class AgentDeviceTest : public testing::Test { m_agentTestHelper = make_unique(); auto version = to_string(AGENT_VERSION_MAJOR) + "." + to_string(AGENT_VERSION_MINOR); - m_agentTestHelper->createAgent("/samples/test_config.xml", 8, 4, version, 25); + m_agentTestHelper->createAgent("/test/resources/samples/test_config.xml", 8, 4, version, 25); m_agentId = to_string(getCurrentTimeInSec()); m_agentDevice = m_agentTestHelper->m_agent->getAgentDevice(); } diff --git a/test/agent_test.cpp b/test/agent_test.cpp index 1ed4fc5cf..6b1918aa5 100644 --- a/test/agent_test.cpp +++ b/test/agent_test.cpp @@ -65,7 +65,8 @@ class AgentTest : public testing::Test void SetUp() override { m_agentTestHelper = make_unique(); - m_agentTestHelper->createAgent("/samples/test_config.xml", 8, 4, "1.3", 25, true); + m_agentTestHelper->createAgent("/test/resources/samples/test_config.xml", 8, 4, "1.3", 25, + true); m_agentId = to_string(getCurrentTimeInSec()); } @@ -89,8 +90,9 @@ TEST_F(AgentTest, Constructor) using namespace configuration; ConfigOptions options {{BufferSize, 17}, {MaxAssets, 8}, {SchemaVersion, "1.7"s}}; - unique_ptr agent = make_unique(m_agentTestHelper->m_ioContext, - PROJECT_ROOT_DIR "/samples/badPath.xml", options); + unique_ptr agent = + make_unique(m_agentTestHelper->m_ioContext, + PROJECT_ROOT_DIR "/test/resources/samples/badPath.xml", options); auto context = std::make_shared(); context->m_contract = agent->makePipelineContract(); @@ -98,7 +100,7 @@ TEST_F(AgentTest, Constructor) agent.reset(); agent = make_unique(m_agentTestHelper->m_ioContext, - PROJECT_ROOT_DIR "/samples/test_config.xml", options); + PROJECT_ROOT_DIR "/test/resources/samples/test_config.xml", options); context = std::make_shared(); context->m_contract = agent->makePipelineContract(); @@ -133,8 +135,9 @@ TEST_F(AgentTest, FailWithDuplicateDeviceUUID) using namespace configuration; ConfigOptions options {{BufferSize, 17}, {MaxAssets, 8}, {SchemaVersion, "1.5"s}}; - unique_ptr agent = make_unique(m_agentTestHelper->m_ioContext, - PROJECT_ROOT_DIR "/samples/dup_uuid.xml", options); + unique_ptr agent = + make_unique(m_agentTestHelper->m_ioContext, + PROJECT_ROOT_DIR "/test/resources/samples/dup_uuid.xml", options); auto context = std::make_shared(); context->m_contract = agent->makePipelineContract(); @@ -1051,7 +1054,7 @@ TEST_F(AgentTest, DynamicCalibration) TEST_F(AgentTest, FilterValues13) { - m_agentTestHelper->createAgent("/samples/filter_example_1.3.xml", 8, 4, "1.5", 25); + m_agentTestHelper->createAgent("/test/resources/samples/filter_example_1.3.xml", 8, 4, "1.5", 25); addAdapter(); { @@ -1090,7 +1093,7 @@ TEST_F(AgentTest, FilterValues13) TEST_F(AgentTest, FilterValues) { - m_agentTestHelper->createAgent("/samples/filter_example_1.3.xml", 8, 4, "1.5", 25); + m_agentTestHelper->createAgent("/test/resources/samples/filter_example_1.3.xml", 8, 4, "1.5", 25); addAdapter(); { @@ -1155,7 +1158,7 @@ TEST_F(AgentTest, FilterValues) TEST_F(AgentTest, TestPeriodFilterWithIgnoreTimestamps) { // Test period filter with ignore timestamps - m_agentTestHelper->createAgent("/samples/filter_example_1.3.xml", 8, 4, "1.5", 25); + m_agentTestHelper->createAgent("/test/resources/samples/filter_example_1.3.xml", 8, 4, "1.5", 25); addAdapter({{configuration::IgnoreTimestamps, true}}); { @@ -1186,7 +1189,7 @@ TEST_F(AgentTest, TestPeriodFilterWithIgnoreTimestamps) TEST_F(AgentTest, TestPeriodFilterWithRelativeTime) { // Test period filter with relative time - m_agentTestHelper->createAgent("/samples/filter_example_1.3.xml", 8, 4, "1.5", 25); + m_agentTestHelper->createAgent("/test/resources/samples/filter_example_1.3.xml", 8, 4, "1.5", 25); addAdapter({{configuration::RelativeTime, true}}); { @@ -1240,7 +1243,7 @@ TEST_F(AgentTest, References) { using namespace device_model; - m_agentTestHelper->createAgent("/samples/reference_example.xml"); + m_agentTestHelper->createAgent("/test/resources/samples/reference_example.xml"); addAdapter(); auto agent = m_agentTestHelper->getAgent(); @@ -1300,7 +1303,7 @@ TEST_F(AgentTest, References) TEST_F(AgentTest, Discrete) { - m_agentTestHelper->createAgent("/samples/discrete_example.xml"); + m_agentTestHelper->createAgent("/test/resources/samples/discrete_example.xml"); addAdapter({{configuration::FilterDuplicates, true}}); auto agent = m_agentTestHelper->getAgent(); @@ -1682,7 +1685,7 @@ TEST_F(AgentTest, AdapterCommands) TEST_F(AgentTest, AdapterDeviceCommand) { - m_agentTestHelper->createAgent("/samples/two_devices.xml"); + m_agentTestHelper->createAgent("/test/resources/samples/two_devices.xml"); auto agent = m_agentTestHelper->getAgent(); auto device1 = agent->getDeviceByName("Device1"); @@ -1713,7 +1716,7 @@ TEST_F(AgentTest, AdapterDeviceCommand) TEST_F(AgentTest, adapter_command_should_set_adapter_and_mtconnect_versions) { - m_agentTestHelper->createAgent("/samples/kinematics.xml", 8, 4, "1.7", 25); + m_agentTestHelper->createAgent("/test/resources/samples/kinematics.xml", 8, 4, "1.7", 25); addAdapter(); auto printer = m_agentTestHelper->m_agent->getPrinter("xml"); @@ -1795,7 +1798,8 @@ TEST_F(AgentTest, UUIDChange) TEST_F(AgentTest, AssetStorage) { - auto agent = m_agentTestHelper->createAgent("/samples/test_config.xml", 8, 4, "1.3", 4, true); + auto agent = m_agentTestHelper->createAgent("/test/resources/samples/test_config.xml", 8, 4, + "1.3", 4, true); auto rest = m_agentTestHelper->getRestService(); ASSERT_TRUE(rest->getServer()->arePutsAllowed()); @@ -1830,7 +1834,8 @@ TEST_F(AgentTest, AssetStorage) TEST_F(AgentTest, AssetBuffer) { - auto agent = m_agentTestHelper->createAgent("/samples/test_config.xml", 8, 4, "1.3", 4, true); + auto agent = m_agentTestHelper->createAgent("/test/resources/samples/test_config.xml", 8, 4, + "1.3", 4, true); string body = "TEST 1"; QueryMap queries; @@ -2236,7 +2241,7 @@ TEST_F(AgentTest, AssetRemovalByAdapter) TEST_F(AgentTest, AssetAdditionOfAssetChanged12) { - m_agentTestHelper->createAgent("/samples/min_config.xml", 8, 4, "1.2", 25); + m_agentTestHelper->createAgent("/test/resources/samples/min_config.xml", 8, 4, "1.2", 25); { PARSE_XML_RESPONSE("/LinuxCNC/probe"); @@ -2248,7 +2253,7 @@ TEST_F(AgentTest, AssetAdditionOfAssetChanged12) TEST_F(AgentTest, AssetAdditionOfAssetRemoved13) { - m_agentTestHelper->createAgent("/samples/min_config.xml", 8, 4, "1.3", 25); + m_agentTestHelper->createAgent("/test/resources/samples/min_config.xml", 8, 4, "1.3", 25); { PARSE_XML_RESPONSE("/LinuxCNC/probe"); @@ -2260,7 +2265,7 @@ TEST_F(AgentTest, AssetAdditionOfAssetRemoved13) TEST_F(AgentTest, AssetAdditionOfAssetRemoved15) { - m_agentTestHelper->createAgent("/samples/min_config.xml", 8, 4, "1.5", 25); + m_agentTestHelper->createAgent("/test/resources/samples/min_config.xml", 8, 4, "1.5", 25); { PARSE_XML_RESPONSE("/LinuxCNC/probe"); ASSERT_XML_PATH_COUNT(doc, "//m:DataItem[@type='ASSET_CHANGED']", 1); @@ -2320,7 +2325,8 @@ TEST_F(AgentTest, RemoveLastAssetChanged) TEST_F(AgentTest, RemoveAssetUsingHttpDelete) { - auto agent = m_agentTestHelper->createAgent("/samples/test_config.xml", 8, 4, "1.3", 4, true); + auto agent = m_agentTestHelper->createAgent("/test/resources/samples/test_config.xml", 8, 4, + "1.3", 4, true); addAdapter(); const auto &storage = agent->getAssetStorage(); @@ -2417,7 +2423,8 @@ TEST_F(AgentTest, RemoveAllAssets) TEST_F(AgentTest, AssetProbe) { - auto agent = m_agentTestHelper->createAgent("/samples/test_config.xml", 8, 4, "1.3", 4, true); + auto agent = m_agentTestHelper->createAgent("/test/resources/samples/test_config.xml", 8, 4, + "1.3", 4, true); string body = "TEST 1"; QueryMap queries; const auto &storage = agent->getAssetStorage(); @@ -2443,7 +2450,7 @@ TEST_F(AgentTest, AssetProbe) TEST_F(AgentTest, ResponseToHTTPAssetPutErrors) { - m_agentTestHelper->createAgent("/samples/test_config.xml", 8, 4, "1.3", 4, true); + m_agentTestHelper->createAgent("/test/resources/samples/test_config.xml", 8, 4, "1.3", 4, true); const string body { R"DOC( @@ -2506,7 +2513,7 @@ TEST_F(AgentTest, ResponseToHTTPAssetPutErrors) TEST_F(AgentTest, update_asset_count_data_item_v2_0) { - m_agentTestHelper->createAgent("/samples/test_config.xml", 8, 10, "2.0", 4, true); + m_agentTestHelper->createAgent("/test/resources/samples/test_config.xml", 8, 10, "2.0", 4, true); addAdapter(); m_agentTestHelper->m_adapter->processData( @@ -2722,7 +2729,7 @@ TEST_F(AgentTest, StreamDataObserver) TEST_F(AgentTest, Put) { - m_agentTestHelper->createAgent("/samples/test_config.xml", 8, 4, "1.3", 4, true); + m_agentTestHelper->createAgent("/test/resources/samples/test_config.xml", 8, 4, "1.3", 4, true); QueryMap queries; string body; @@ -2745,7 +2752,7 @@ TEST_F(AgentTest, Put) TEST_F(AgentTest, put_condition_should_parse_condition_data) { - m_agentTestHelper->createAgent("/samples/test_config.xml", 8, 4, "1.3", 4, true); + m_agentTestHelper->createAgent("/test/resources/samples/test_config.xml", 8, 4, "1.3", 4, true); QueryMap queries; string body; @@ -2768,7 +2775,7 @@ TEST_F(AgentTest, put_condition_should_parse_condition_data) TEST_F(AgentTest, shound_add_asset_count_when_20) { - m_agentTestHelper->createAgent("/samples/min_config.xml", 8, 4, "2.0", 25); + m_agentTestHelper->createAgent("/test/resources/samples/min_config.xml", 8, 4, "2.0", 25); { PARSE_XML_RESPONSE("/LinuxCNC/probe"); @@ -2782,7 +2789,8 @@ TEST_F(AgentTest, shound_add_asset_count_when_20) TEST_F(AgentTest, asset_count_should_not_occur_in_header_post_20) { - auto agent = m_agentTestHelper->createAgent("/samples/test_config.xml", 8, 4, "2.0", 4, true); + auto agent = m_agentTestHelper->createAgent("/test/resources/samples/test_config.xml", 8, 4, + "2.0", 4, true); string body = "TEST 1"; QueryMap queries; @@ -2808,7 +2816,8 @@ TEST_F(AgentTest, asset_count_should_not_occur_in_header_post_20) TEST_F(AgentTest, asset_count_should_track_asset_additions_by_type) { - auto agent = m_agentTestHelper->createAgent("/samples/test_config.xml", 8, 4, "2.0", 4, true); + auto agent = m_agentTestHelper->createAgent("/test/resources/samples/test_config.xml", 8, 4, + "2.0", 4, true); string body1 = "TEST 1"; QueryMap queries; @@ -2866,7 +2875,8 @@ TEST_F(AgentTest, asset_count_should_track_asset_additions_by_type) TEST_F(AgentTest, asset_should_also_work_using_post_with_assets) { - auto agent = m_agentTestHelper->createAgent("/samples/test_config.xml", 8, 4, "2.0", 4, true); + auto agent = m_agentTestHelper->createAgent("/test/resources/samples/test_config.xml", 8, 4, + "2.0", 4, true); string body = "TEST 1"; QueryMap queries; @@ -2890,7 +2900,8 @@ TEST_F(AgentTest, pre_start_hook_should_be_called) helper.getAgent()->beforeStartHooks().add(lambda); }; m_agentTestHelper->setAgentCreateHook(helperHook); - auto agent = m_agentTestHelper->createAgent("/samples/test_config.xml", 8, 4, "2.0", 4, true); + auto agent = m_agentTestHelper->createAgent("/test/resources/samples/test_config.xml", 8, 4, + "2.0", 4, true); ASSERT_FALSE(called); agent->start(); @@ -2906,7 +2917,7 @@ TEST_F(AgentTest, pre_initialize_hooks_should_be_called) helper.getAgent()->beforeInitializeHooks().add(lambda); }; m_agentTestHelper->setAgentCreateHook(helperHook); - m_agentTestHelper->createAgent("/samples/test_config.xml", 8, 4, "2.0", 4, true); + m_agentTestHelper->createAgent("/test/resources/samples/test_config.xml", 8, 4, "2.0", 4, true); ASSERT_TRUE(called); } @@ -2919,7 +2930,7 @@ TEST_F(AgentTest, post_initialize_hooks_should_be_called) helper.getAgent()->afterInitializeHooks().add(lambda); }; m_agentTestHelper->setAgentCreateHook(helperHook); - m_agentTestHelper->createAgent("/samples/test_config.xml", 8, 4, "2.0", 4, true); + m_agentTestHelper->createAgent("/test/resources/samples/test_config.xml", 8, 4, "2.0", 4, true); ASSERT_TRUE(called); } @@ -2932,7 +2943,8 @@ TEST_F(AgentTest, pre_stop_hook_should_be_called) helper.getAgent()->beforeStopHooks().add(lambda); }; m_agentTestHelper->setAgentCreateHook(helperHook); - auto agent = m_agentTestHelper->createAgent("/samples/test_config.xml", 8, 4, "2.0", 4, true); + auto agent = m_agentTestHelper->createAgent("/test/resources/samples/test_config.xml", 8, 4, + "2.0", 4, true); ASSERT_FALSE(called); agent->start(); @@ -2943,7 +2955,7 @@ TEST_F(AgentTest, pre_stop_hook_should_be_called) TEST_F(AgentTest, device_should_have_hash_for_2_2) { - m_agentTestHelper->createAgent("/samples/test_config.xml", 8, 4, "2.2", 4, true); + m_agentTestHelper->createAgent("/test/resources/samples/test_config.xml", 8, 4, "2.2", 4, true); auto device = m_agentTestHelper->getAgent()->getDeviceByName("LinuxCNC"); ASSERT_TRUE(device); diff --git a/test/asset_hash_test.cpp b/test/asset_hash_test.cpp index 6d5529e48..16c3a92dc 100644 --- a/test/asset_hash_test.cpp +++ b/test/asset_hash_test.cpp @@ -50,7 +50,7 @@ class AssetHashTest : public testing::Test void SetUp() override { // Create an agent with only 16 slots and 8 data items. m_agentTestHelper = make_unique(); - m_agentTestHelper->createAgent("/samples/solid_model.xml", 8, 4, "2.2", 25); + m_agentTestHelper->createAgent("/test/resources/samples/solid_model.xml", 8, 4, "2.2", 25); m_agentId = to_string(getCurrentTimeInSec()); m_device = m_agentTestHelper->m_agent->getDeviceByName("LinuxCNC"); } diff --git a/test/composition_test.cpp b/test/composition_test.cpp index b9e75879b..2bb788743 100644 --- a/test/composition_test.cpp +++ b/test/composition_test.cpp @@ -52,7 +52,7 @@ class CompositionTest : public testing::Test void SetUp() override { // Create an agent with only 16 slots and 8 data items. m_agentTestHelper = make_unique(); - m_agentTestHelper->createAgent("/samples/configuration.xml", 8, 4, "1.5", 25); + m_agentTestHelper->createAgent("/test/resources/samples/configuration.xml", 8, 4, "1.5", 25); auto device = m_agentTestHelper->m_agent->getDeviceByName("LinuxCNC"); m_component = device->getComponentById("power"); diff --git a/test/config_test.cpp b/test/config_test.cpp index 078de5ed7..9072955db 100644 --- a/test/config_test.cpp +++ b/test/config_test.cpp @@ -90,7 +90,7 @@ namespace { fs::path copyFile(const std::string &src, fs::path target, chrono::seconds delta) { - fs::path file {fs::path(PROJECT_ROOT_DIR) / "samples" / src}; + fs::path file {fs::path(PROJECT_ROOT_DIR) / "test" / "resources" / "samples" / src}; fs::copy_file(file, target, fs::copy_options::overwrite_existing); auto t = fs::last_write_time(target); @@ -143,7 +143,7 @@ namespace { TEST_F(ConfigTest, Device) { - string str("Devices = " PROJECT_ROOT_DIR "/samples/test_config.xml\n"); + string str("Devices = " PROJECT_ROOT_DIR "/test/resources/samples/test_config.xml\n"); m_config->loadConfig(str); const auto agent = m_config->getAgent(); @@ -168,7 +168,7 @@ namespace { using namespace std::chrono_literals; string str("Devices = " PROJECT_ROOT_DIR - "/samples/test_config.xml\n" + "/test/resources/samples/test_config.xml\n" "Adapters { LinuxCNC { \n" "Port = 23\n" "Host = 10.211.55.1\n" @@ -200,7 +200,7 @@ namespace { TEST_F(ConfigTest, DefaultPreserveUUID) { string str("Devices = " PROJECT_ROOT_DIR - "/samples/test_config.xml\n" + "/test/resources/samples/test_config.xml\n" "PreserveUUID = true\n"); m_config->loadConfig(str); @@ -214,7 +214,7 @@ namespace { TEST_F(ConfigTest, DefaultPreserveOverride) { string str("Devices = " PROJECT_ROOT_DIR - "/samples/test_config.xml\n" + "/test/resources/samples/test_config.xml\n" "PreserveUUID = true\n" "Adapters { LinuxCNC { \n" "PreserveUUID = false\n" @@ -231,7 +231,7 @@ namespace { TEST_F(ConfigTest, DisablePut) { string str("Devices = " PROJECT_ROOT_DIR - "/samples/test_config.xml\n" + "/test/resources/samples/test_config.xml\n" "AllowPut = true\n"); m_config->loadConfig(str); @@ -247,7 +247,7 @@ namespace { TEST_F(ConfigTest, LimitPut) { string str("Devices = " PROJECT_ROOT_DIR - "/samples/test_config.xml\n" + "/test/resources/samples/test_config.xml\n" "AllowPutFrom = localhost\n"); m_config->loadConfig(str); @@ -265,7 +265,7 @@ namespace { TEST_F(ConfigTest, LimitPutFromHosts) { string str("Devices = " PROJECT_ROOT_DIR - "/samples/test_config.xml\n" + "/test/resources/samples/test_config.xml\n" "AllowPutFrom = localhost, 192.168.0.1\n"); m_config->loadConfig(str); @@ -358,7 +358,7 @@ namespace { using namespace std::chrono_literals; string str("Devices = " PROJECT_ROOT_DIR - "/samples/test_config.xml\n" + "/test/resources/samples/test_config.xml\n" "LegacyTimeout = 2000\n"); m_config->loadConfig(str); @@ -372,7 +372,7 @@ namespace { TEST_F(ConfigTest, IgnoreTimestamps) { string str("Devices = " PROJECT_ROOT_DIR - "/samples/test_config.xml\n" + "/test/resources/samples/test_config.xml\n" "IgnoreTimestamps = true\n"); m_config->loadConfig(str); @@ -386,7 +386,7 @@ namespace { TEST_F(ConfigTest, IgnoreTimestampsOverride) { string str("Devices = " PROJECT_ROOT_DIR - "/samples/test_config.xml\n" + "/test/resources/samples/test_config.xml\n" "IgnoreTimestamps = true\n" "Adapters { LinuxCNC { \n" "IgnoreTimestamps = false\n" @@ -1228,8 +1228,9 @@ Port = 0 } else { - fs::copy_file(fs::path(PROJECT_ROOT_DIR) / "samples" / "min_config2.xml", devices, - fs::copy_options::overwrite_existing); + fs::copy_file( + fs::path(PROJECT_ROOT_DIR) / "test" / "resources" / "samples" / "min_config2.xml", + devices, fs::copy_options::overwrite_existing); } }); @@ -2091,7 +2092,8 @@ Adapters { using namespace boost::algorithm; if (!ec) - {} + { + } m_config->stop(); }; diff --git a/test/coordinate_system_test.cpp b/test/coordinate_system_test.cpp index 3b9c380a0..aec82b415 100644 --- a/test/coordinate_system_test.cpp +++ b/test/coordinate_system_test.cpp @@ -50,7 +50,7 @@ class CoordinateSystemTest : public testing::Test void SetUp() override { // Create an agent with only 16 slots and 8 data items. m_agentTestHelper = make_unique(); - m_agentTestHelper->createAgent("/samples/configuration.xml", 8, 4, "1.6", 25); + m_agentTestHelper->createAgent("/test/resources/samples/configuration.xml", 8, 4, "1.6", 25); m_agentId = to_string(getCurrentTimeInSec()); m_device = m_agentTestHelper->m_agent->getDeviceByName("LinuxCNC"); } diff --git a/test/cutting_tool_test.cpp b/test/cutting_tool_test.cpp index 85e7afe14..2999209e9 100644 --- a/test/cutting_tool_test.cpp +++ b/test/cutting_tool_test.cpp @@ -60,7 +60,7 @@ class CuttingToolTest : public testing::Test void SetUp() override { // Create an agent with only 16 slots and 8 data items. m_agentTestHelper = make_unique(); - m_agentTestHelper->createAgent("/samples/test_config.xml", 8, 4, "1.7", 25); + m_agentTestHelper->createAgent("/test/resources/samples/test_config.xml", 8, 4, "1.7", 25); m_agentId = to_string(getCurrentTimeInSec()); m_device = m_agentTestHelper->m_agent->getDeviceByName("LinuxCNC"); diff --git a/test/data_set_test.cpp b/test/data_set_test.cpp index 66b781d63..33a38dce1 100644 --- a/test/data_set_test.cpp +++ b/test/data_set_test.cpp @@ -48,7 +48,7 @@ class DataSetTest : public testing::Test void SetUp() override { // Create an agent with only 16 slots and 8 data items. m_agentTestHelper = make_unique(); - m_agentTestHelper->createAgent("/samples/data_set.xml", 8, 4, "1.5", 25); + m_agentTestHelper->createAgent("/test/resources/samples/data_set.xml", 8, 4, "1.5", 25); m_agentId = to_string(getCurrentTimeInSec()); m_checkpoint = nullptr; diff --git a/test/embedded_ruby_test.cpp b/test/embedded_ruby_test.cpp index 4056960b1..444809234 100644 --- a/test/embedded_ruby_test.cpp +++ b/test/embedded_ruby_test.cpp @@ -117,7 +117,7 @@ namespace { void load(const char *file) { string str("Devices = " PROJECT_ROOT_DIR - "/samples/test_config.xml\n" + "/test/resources/samples/test_config.xml\n" "Ruby {\n" " module = " PROJECT_ROOT_DIR "/test/resources/ruby/" + string(file) + diff --git a/test/image_file_test.cpp b/test/image_file_test.cpp index eca9fa5e8..f9cc62b7f 100644 --- a/test/image_file_test.cpp +++ b/test/image_file_test.cpp @@ -50,7 +50,7 @@ class ImageFileTest : public testing::Test void SetUp() override { // Create an agent with only 16 slots and 8 data items. m_agentTestHelper = make_unique(); - m_agentTestHelper->createAgent("/samples/solid_model.xml", 8, 4, "2.2", 25); + m_agentTestHelper->createAgent("/test/resources/samples/solid_model.xml", 8, 4, "2.2", 25); m_agentId = to_string(getCurrentTimeInSec()); m_device = m_agentTestHelper->m_agent->getDeviceByName("LinuxCNC"); } @@ -141,8 +141,8 @@ TEST_F(ImageFileTest, should_print_configuration_with_image_file_in_json) TEST_F(ImageFileTest, should_print_configuration_with_image_file_in_json_v2) { - m_agentTestHelper->createAgent("/samples/solid_model.xml", 8, 4, "2.2", 25, false, false, - {{configuration::JsonVersion, 2}}); + m_agentTestHelper->createAgent("/test/resources/samples/solid_model.xml", 8, 4, "2.2", 25, false, + false, {{configuration::JsonVersion, 2}}); { PARSE_JSON_RESPONSE("/LinuxCNC/probe"); diff --git a/test/json_printer_probe_test.cpp b/test/json_printer_probe_test.cpp index 064c757f8..bc08ddf93 100644 --- a/test/json_printer_probe_test.cpp +++ b/test/json_printer_probe_test.cpp @@ -60,7 +60,7 @@ class JsonPrinterProbeTest : public testing::Test m_printer = std::make_unique(1, true); m_agentTestHelper = make_unique(); - m_agentTestHelper->createAgent("/samples/SimpleDevlce.xml", 8, 4, "1.5", 25); + m_agentTestHelper->createAgent("/test/resources/samples/SimpleDevlce.xml", 8, 4, "1.5", 25); // Asset types are registered in the agent. m_devices = m_agentTestHelper->m_agent->getDevices(); @@ -333,7 +333,7 @@ TEST_F(JsonPrinterProbeTest, PrintDataItemRelationships) auto server = std::make_unique(m_agentTestHelper->m_ioContext); auto cache = std::make_unique(); - m_agentTestHelper->createAgent("/samples/relationship_test.xml", 8, 4, "1.7", 25); + m_agentTestHelper->createAgent("/test/resources/samples/relationship_test.xml", 8, 4, "1.7", 25); auto printer = m_agentTestHelper->m_agent->getPrinter("json"); m_devices = m_agentTestHelper->m_agent->getDevices(); auto doc = printer->printProbe(123, 9999, 1, 1024, 10, m_devices); @@ -376,7 +376,7 @@ TEST_F(JsonPrinterProbeTest, PrintDataItemRelationships) TEST_F(JsonPrinterProbeTest, version_2_with_multiple_devices) { m_printer = std::make_unique(2, true); - m_agentTestHelper->createAgent("/samples/two_devices.xml", 8, 4, "1.5", 25); + m_agentTestHelper->createAgent("/test/resources/samples/two_devices.xml", 8, 4, "1.5", 25); m_devices = m_agentTestHelper->m_agent->getDevices(); auto doc = m_printer->printProbe(123, 9999, 1, 1024, 10, m_devices); diff --git a/test/json_printer_stream_test.cpp b/test/json_printer_stream_test.cpp index ff0db4cc5..ae6365366 100644 --- a/test/json_printer_stream_test.cpp +++ b/test/json_printer_stream_test.cpp @@ -60,8 +60,8 @@ class JsonPrinterStreamTest : public testing::Test m_xmlPrinter = std::make_unique("1.5"); m_printer = std::make_unique(1, true); m_config = std::make_unique(); - m_devices = - m_config->parseFile(PROJECT_ROOT_DIR "/samples/SimpleDevlce.xml", m_xmlPrinter.get()); + m_devices = m_config->parseFile(PROJECT_ROOT_DIR "/test/resources/samples/SimpleDevlce.xml", + m_xmlPrinter.get()); } void TearDown() override @@ -193,7 +193,8 @@ TEST_F(JsonPrinterStreamTest, DeviceStream_version_2_one_device) TEST_F(JsonPrinterStreamTest, DeviceStream_version_2_two_devices) { m_printer = std::make_unique(2, true); - m_devices = m_config->parseFile(PROJECT_ROOT_DIR "/samples/min_config2.xml", m_xmlPrinter.get()); + m_devices = m_config->parseFile(PROJECT_ROOT_DIR "/test/resources/samples/min_config2.xml", + m_xmlPrinter.get()); Checkpoint checkpoint; addObservationToCheckpoint(checkpoint, "Sspeed", 10254804, 100_value); diff --git a/test/kinematics_test.cpp b/test/kinematics_test.cpp index 1dd927cb1..d535294bf 100644 --- a/test/kinematics_test.cpp +++ b/test/kinematics_test.cpp @@ -49,7 +49,7 @@ class KinematicsTest : public testing::Test void SetUp() override { // Create an agent with only 16 slots and 8 data items. m_agentTestHelper = make_unique(); - m_agentTestHelper->createAgent("/samples/kinematics.xml", 8, 4, "1.7", 25); + m_agentTestHelper->createAgent("/test/resources/samples/kinematics.xml", 8, 4, "1.7", 25); m_agentId = to_string(getCurrentTimeInSec()); m_device = m_agentTestHelper->m_agent->getDeviceByName("LinuxCNC"); } diff --git a/test/mqtt_sink_test.cpp b/test/mqtt_sink_test.cpp index 9e91d6ad5..f548fecf7 100644 --- a/test/mqtt_sink_test.cpp +++ b/test/mqtt_sink_test.cpp @@ -84,7 +84,7 @@ class MqttSinkTest : public testing::Test void createAgent(std::string testFile = {}, ConfigOptions options = {}) { if (testFile == "") - testFile = "/samples/test_config.xml"; + testFile = "/test/resources/samples/test_config.xml"; ConfigOptions opts(options); MergeOptions(opts, {{"MqttSink", true}, @@ -396,7 +396,7 @@ TEST_F(MqttSinkTest, mqtt_sink_should_publish_Dataset) }; createClient(options, std::move(handler)); ASSERT_TRUE(startClient()); - createAgent("/samples/data_set.xml"); + createAgent("/test/resources/samples/data_set.xml"); auto service = m_agentTestHelper->getMqttService(); ASSERT_TRUE(waitFor(5s, [&service]() { return service->isConnected(); })); m_client->subscribe( @@ -461,7 +461,7 @@ TEST_F(MqttSinkTest, mqtt_sink_should_publish_Table) }; createClient(options, std::move(handler)); ASSERT_TRUE(startClient()); - createAgent("/samples/data_set.xml"); + createAgent("/test/resources/samples/data_set.xml"); auto service = m_agentTestHelper->getMqttService(); ASSERT_TRUE(waitFor(5s, [&service]() { return service->isConnected(); })); m_client->subscribe( diff --git a/test/mtconnect_xml_transform_test.cpp b/test/mtconnect_xml_transform_test.cpp index dbdc1bc37..3d72005d7 100644 --- a/test/mtconnect_xml_transform_test.cpp +++ b/test/mtconnect_xml_transform_test.cpp @@ -72,7 +72,8 @@ class MTConnectXmlTransformTest : public testing::Test auto parser = make_unique(); m_device = - parser->parseFile(PROJECT_ROOT_DIR "/samples/test_config.xml", printer.get()).front(); + parser->parseFile(PROJECT_ROOT_DIR "/test/resources/samples/test_config.xml", printer.get()) + .front(); m_context = make_shared(); m_context->m_contract = make_unique(m_device); diff --git a/test/pipeline_deliver_test.cpp b/test/pipeline_deliver_test.cpp index 4d611663f..2df4ad8ab 100644 --- a/test/pipeline_deliver_test.cpp +++ b/test/pipeline_deliver_test.cpp @@ -52,7 +52,7 @@ class PipelineDeliverTest : public testing::Test void SetUp() override { // Create an agent with only 16 slots and 8 data items. m_agentTestHelper = make_unique(); - m_agentTestHelper->createAgent("/samples/SimpleDevlce.xml", 8, 4, "1.7", 25); + m_agentTestHelper->createAgent("/test/resources/samples/SimpleDevlce.xml", 8, 4, "1.7", 25); m_agentId = to_string(getCurrentTimeInSec()); m_device = m_agentTestHelper->m_agent->getDeviceByName("LinuxCNC"); } diff --git a/test/qif_document_test.cpp b/test/qif_document_test.cpp index 269353f91..5f14ed616 100644 --- a/test/qif_document_test.cpp +++ b/test/qif_document_test.cpp @@ -61,7 +61,7 @@ class QIFDocumentTest : public testing::Test void SetUp() override { // Create an agent with only 16 slots and 8 data items. m_agentTestHelper = make_unique(); - m_agentTestHelper->createAgent("/samples/test_config.xml", 8, 4, "2.0", 25); + m_agentTestHelper->createAgent("/test/resources/samples/test_config.xml", 8, 4, "2.0", 25); m_agentId = to_string(getCurrentTimeInSec()); m_device = m_agentTestHelper->m_agent->getDeviceByName("LinuxCNC"); diff --git a/test/raw_material_test.cpp b/test/raw_material_test.cpp index 558dd262c..9547ada2a 100644 --- a/test/raw_material_test.cpp +++ b/test/raw_material_test.cpp @@ -61,7 +61,7 @@ class RawMaterialTest : public testing::Test void SetUp() override { // Create an agent with only 16 slots and 8 data items. m_agentTestHelper = make_unique(); - m_agentTestHelper->createAgent("/samples/test_config.xml", 8, 4, "2.0", 25); + m_agentTestHelper->createAgent("/test/resources/samples/test_config.xml", 8, 4, "2.0", 25); m_agentId = to_string(getCurrentTimeInSec()); m_device = m_agentTestHelper->m_agent->getDeviceByName("LinuxCNC"); diff --git a/test/references_test.cpp b/test/references_test.cpp index e81aba959..1648e32ad 100644 --- a/test/references_test.cpp +++ b/test/references_test.cpp @@ -54,8 +54,8 @@ class ReferencesTest : public testing::Test { // Create an agent with only 16 slots and 8 data items. m_agentTestHelper = make_unique(); - m_agentTestHelper->createAgent("/samples/reference_example.xml", 8, 4, "1.6", 25, false, true, - options); + m_agentTestHelper->createAgent("/test/resources/samples/reference_example.xml", 8, 4, "1.6", 25, + false, true, options); m_agentId = to_string(getCurrentTimeInSec()); m_device = m_agentTestHelper->m_agent->getDeviceByName("LinuxCNC"); } diff --git a/test/relationship_test.cpp b/test/relationship_test.cpp index c4feb60a6..e7d8086eb 100644 --- a/test/relationship_test.cpp +++ b/test/relationship_test.cpp @@ -52,7 +52,7 @@ class RelationshipTest : public testing::Test void SetUp() override { // Create an agent with only 16 slots and 8 data items. m_agentTestHelper = make_unique(); - m_agentTestHelper->createAgent("/samples/configuration.xml", 8, 4, "1.7", 25); + m_agentTestHelper->createAgent("/test/resources/samples/configuration.xml", 8, 4, "1.7", 25); m_agentId = to_string(getCurrentTimeInSec()); auto device = m_agentTestHelper->m_agent->getDeviceByName("LinuxCNC"); diff --git a/samples/128.32.164.245.xml b/test/resources/samples/128.32.164.245.xml similarity index 100% rename from samples/128.32.164.245.xml rename to test/resources/samples/128.32.164.245.xml diff --git a/samples/NoNamespace.xml b/test/resources/samples/NoNamespace.xml similarity index 100% rename from samples/NoNamespace.xml rename to test/resources/samples/NoNamespace.xml diff --git a/samples/SimpleDevlce.xml b/test/resources/samples/SimpleDevlce.xml similarity index 100% rename from samples/SimpleDevlce.xml rename to test/resources/samples/SimpleDevlce.xml diff --git a/samples/agent.mtconnect.org.xml b/test/resources/samples/agent.mtconnect.org.xml similarity index 100% rename from samples/agent.mtconnect.org.xml rename to test/resources/samples/agent.mtconnect.org.xml diff --git a/samples/configuration.xml b/test/resources/samples/configuration.xml similarity index 100% rename from samples/configuration.xml rename to test/resources/samples/configuration.xml diff --git a/samples/configuration1.6.xml b/test/resources/samples/configuration1.6.xml similarity index 100% rename from samples/configuration1.6.xml rename to test/resources/samples/configuration1.6.xml diff --git a/samples/data_set.cfg b/test/resources/samples/data_set.cfg similarity index 100% rename from samples/data_set.cfg rename to test/resources/samples/data_set.cfg diff --git a/samples/data_set.xml b/test/resources/samples/data_set.xml similarity index 100% rename from samples/data_set.xml rename to test/resources/samples/data_set.xml diff --git a/samples/data_set_variable.xml b/test/resources/samples/data_set_variable.xml similarity index 100% rename from samples/data_set_variable.xml rename to test/resources/samples/data_set_variable.xml diff --git a/samples/discrete_example.xml b/test/resources/samples/discrete_example.xml similarity index 100% rename from samples/discrete_example.xml rename to test/resources/samples/discrete_example.xml diff --git a/samples/dyn_load.xml b/test/resources/samples/dyn_load.xml similarity index 100% rename from samples/dyn_load.xml rename to test/resources/samples/dyn_load.xml diff --git a/samples/empty.xml b/test/resources/samples/empty.xml similarity index 100% rename from samples/empty.xml rename to test/resources/samples/empty.xml diff --git a/samples/extension.xml b/test/resources/samples/extension.xml similarity index 100% rename from samples/extension.xml rename to test/resources/samples/extension.xml diff --git a/samples/fanuc.xml b/test/resources/samples/fanuc.xml similarity index 100% rename from samples/fanuc.xml rename to test/resources/samples/fanuc.xml diff --git a/samples/filter_example.xml b/test/resources/samples/filter_example.xml similarity index 100% rename from samples/filter_example.xml rename to test/resources/samples/filter_example.xml diff --git a/samples/filter_example_1.3.xml b/test/resources/samples/filter_example_1.3.xml similarity index 100% rename from samples/filter_example_1.3.xml rename to test/resources/samples/filter_example_1.3.xml diff --git a/samples/haas.xml b/test/resources/samples/haas.xml similarity index 100% rename from samples/haas.xml rename to test/resources/samples/haas.xml diff --git a/samples/kinematics.xml b/test/resources/samples/kinematics.xml similarity index 100% rename from samples/kinematics.xml rename to test/resources/samples/kinematics.xml diff --git a/samples/min_config.xml b/test/resources/samples/min_config.xml similarity index 100% rename from samples/min_config.xml rename to test/resources/samples/min_config.xml diff --git a/samples/min_config2.xml b/test/resources/samples/min_config2.xml similarity index 100% rename from samples/min_config2.xml rename to test/resources/samples/min_config2.xml diff --git a/samples/reference_example.xml b/test/resources/samples/reference_example.xml similarity index 100% rename from samples/reference_example.xml rename to test/resources/samples/reference_example.xml diff --git a/samples/relationship_test.xml b/test/resources/samples/relationship_test.xml similarity index 100% rename from samples/relationship_test.xml rename to test/resources/samples/relationship_test.xml diff --git a/samples/solid_model.xml b/test/resources/samples/solid_model.xml similarity index 100% rename from samples/solid_model.xml rename to test/resources/samples/solid_model.xml diff --git a/samples/test_config.xml b/test/resources/samples/test_config.xml similarity index 100% rename from samples/test_config.xml rename to test/resources/samples/test_config.xml diff --git a/samples/two_devices.xml b/test/resources/samples/two_devices.xml similarity index 100% rename from samples/two_devices.xml rename to test/resources/samples/two_devices.xml diff --git a/test/response_document_test.cpp b/test/response_document_test.cpp index 9926cd0ab..bf705e1e4 100644 --- a/test/response_document_test.cpp +++ b/test/response_document_test.cpp @@ -75,7 +75,9 @@ class ResponseDocumentTest : public testing::Test m_doc.emplace(); - m_device = parser->parseFile(PROJECT_ROOT_DIR "/samples/data_set.xml", printer.get()).front(); + m_device = + parser->parseFile(PROJECT_ROOT_DIR "/test/resources/samples/data_set.xml", printer.get()) + .front(); m_context = make_shared(); m_context->m_contract = make_unique(m_device); diff --git a/test/sensor_configuration_test.cpp b/test/sensor_configuration_test.cpp index 1d94d46ab..b3c254028 100644 --- a/test/sensor_configuration_test.cpp +++ b/test/sensor_configuration_test.cpp @@ -50,7 +50,7 @@ class SensorConfigurationTest : public testing::Test void SetUp() override { // Create an agent with only 16 slots and 8 data items. m_agentTestHelper = make_unique(); - m_agentTestHelper->createAgent("/samples/configuration.xml", 8, 4, "1.6", 25); + m_agentTestHelper->createAgent("/test/resources/samples/configuration.xml", 8, 4, "1.6", 25); m_agentId = to_string(getCurrentTimeInSec()); m_device = m_agentTestHelper->m_agent->getDeviceByName("LinuxCNC"); } diff --git a/test/solid_model_test.cpp b/test/solid_model_test.cpp index 169eea1ef..3d9561dc8 100644 --- a/test/solid_model_test.cpp +++ b/test/solid_model_test.cpp @@ -50,7 +50,7 @@ class SolidModelTest : public testing::Test void SetUp() override { // Create an agent with only 16 slots and 8 data items. m_agentTestHelper = make_unique(); - m_agentTestHelper->createAgent("/samples/solid_model.xml", 8, 4, "1.7", 25); + m_agentTestHelper->createAgent("/test/resources/samples/solid_model.xml", 8, 4, "1.7", 25); m_agentId = to_string(getCurrentTimeInSec()); m_device = m_agentTestHelper->m_agent->getDeviceByName("LinuxCNC"); } diff --git a/test/specification_test.cpp b/test/specification_test.cpp index dff297813..4234b324d 100644 --- a/test/specification_test.cpp +++ b/test/specification_test.cpp @@ -51,7 +51,7 @@ class SpecificationTest : public testing::Test void SetUp() override { // Create an agent with only 16 slots and 8 data items. m_agentTestHelper = make_unique(); - m_agentTestHelper->createAgent("/samples/configuration.xml", 8, 4, "1.7", 25); + m_agentTestHelper->createAgent("/test/resources/samples/configuration.xml", 8, 4, "1.7", 25); auto device = m_agentTestHelper->m_agent->getDeviceByName("LinuxCNC"); m_component = device->getComponentById("c"); } @@ -98,7 +98,7 @@ TEST_F(SpecificationTest, ParseDeviceAndComponentRelationships) TEST_F(SpecificationTest, test_1_6_specification_without_id) { m_agentTestHelper = make_unique(); - m_agentTestHelper->createAgent("/samples/configuration1.6.xml", 8, 4, "1.6", 25); + m_agentTestHelper->createAgent("/test/resources/samples/configuration1.6.xml", 8, 4, "1.6", 25); auto device = m_agentTestHelper->m_agent->getDeviceByName("LinuxCNC"); m_component = device->getComponentById("power"); diff --git a/test/table_test.cpp b/test/table_test.cpp index 8da67faa2..14ba3db08 100644 --- a/test/table_test.cpp +++ b/test/table_test.cpp @@ -56,7 +56,7 @@ class TableTest : public testing::Test void SetUp() override { // Create an agent with only 16 slots and 8 data items. m_agentTestHelper = make_unique(); - m_agentTestHelper->createAgent("/samples/data_set.xml", 8, 4, "1.6", 25); + m_agentTestHelper->createAgent("/test/resources/samples/data_set.xml", 8, 4, "1.6", 25); m_agentId = to_string(getCurrentTimeInSec()); m_checkpoint = nullptr; diff --git a/test/unit_conversion_test.cpp b/test/unit_conversion_test.cpp index 970778cab..3debab2f2 100644 --- a/test/unit_conversion_test.cpp +++ b/test/unit_conversion_test.cpp @@ -98,3 +98,9 @@ TEST(UnitConversionTest, check_revolution_per_second) auto conv = UnitConversion::make("REVOLUTION/SECOND", "REVOLUTION/MINUTE"); EXPECT_NEAR(420.0, conv->convert(7.0), 0.0001); } + +TEST(UnitConversionTest, check_cubic_feet_per_minute) +{ + auto conv = UnitConversion::make("CUBIC_FOOT/MINUTE", "CUBIC_MILLIMETER/SECOND"); + EXPECT_NEAR(3303632.15, conv->convert(7.0), 0.1); +} diff --git a/test/xml_parser_test.cpp b/test/xml_parser_test.cpp index 7ce318b93..57b5e7075 100644 --- a/test/xml_parser_test.cpp +++ b/test/xml_parser_test.cpp @@ -53,12 +53,13 @@ class XmlParserTest : public testing::Test { std::unique_ptr printer(new printer::XmlPrinter()); m_xmlParser = new parser::XmlParser(); - m_devices = - m_xmlParser->parseFile(PROJECT_ROOT_DIR "/samples/test_config.xml", printer.get()); + m_devices = m_xmlParser->parseFile(PROJECT_ROOT_DIR "/test/resources/samples/test_config.xml", + printer.get()); } catch (exception &) { - FAIL() << "Could not locate test xml: " << PROJECT_ROOT_DIR << " /samples/test_config.xml"; + FAIL() << "Could not locate test xml: " << PROJECT_ROOT_DIR + << " /test/resources/samples/test_config.xml"; } } @@ -85,13 +86,14 @@ TEST_F(XmlParserTest, Constructor) std::unique_ptr printer(new printer::XmlPrinter()); m_xmlParser = new parser::XmlParser(); - ASSERT_THROW(m_xmlParser->parseFile(PROJECT_ROOT_DIR "/samples/badPath.xml", printer.get()), - std::runtime_error); + ASSERT_THROW( + m_xmlParser->parseFile(PROJECT_ROOT_DIR "/test/resources/samples/badPath.xml", printer.get()), + std::runtime_error); delete m_xmlParser; m_xmlParser = nullptr; m_xmlParser = new parser::XmlParser(); - ASSERT_NO_THROW( - m_xmlParser->parseFile(PROJECT_ROOT_DIR "/samples/test_config.xml", printer.get())); + ASSERT_NO_THROW(m_xmlParser->parseFile(PROJECT_ROOT_DIR "/test/resources/samples/test_config.xml", + printer.get())); } TEST_F(XmlParserTest, GetDevices) @@ -187,11 +189,12 @@ TEST_F(XmlParserTest, GetDataItemsExt) { std::unique_ptr printer(new printer::XmlPrinter()); m_xmlParser = new parser::XmlParser(); - m_xmlParser->parseFile(PROJECT_ROOT_DIR "/samples/extension.xml", printer.get()); + m_xmlParser->parseFile(PROJECT_ROOT_DIR "/test/resources/samples/extension.xml", printer.get()); } catch (exception &) { - FAIL() << "Could not locate test xml: " << PROJECT_ROOT_DIR << "/samples/extension.xml"; + FAIL() << "Could not locate test xml: " << PROJECT_ROOT_DIR + << "/test/resources/samples/extension.xml"; } filter.clear(); @@ -215,11 +218,13 @@ TEST_F(XmlParserTest, ExtendedSchema) { std::unique_ptr printer(new printer::XmlPrinter()); m_xmlParser = new parser::XmlParser(); - m_devices = m_xmlParser->parseFile(PROJECT_ROOT_DIR "/samples/extension.xml", printer.get()); + m_devices = m_xmlParser->parseFile(PROJECT_ROOT_DIR "/test/resources/samples/extension.xml", + printer.get()); } catch (exception &) { - FAIL() << "Could not locate test xml: " << PROJECT_ROOT_DIR << "/samples/extension.xml"; + FAIL() << "Could not locate test xml: " << PROJECT_ROOT_DIR + << "/test/resources/samples/extension.xml"; } ASSERT_EQ((size_t)1, m_devices.size()); @@ -287,8 +292,8 @@ TEST_F(XmlParserTest, NoNamespace) unique_ptr printer(new printer::XmlPrinter()); m_xmlParser = new parser::XmlParser(); - ASSERT_NO_THROW( - m_xmlParser->parseFile(PROJECT_ROOT_DIR "/samples/NoNamespace.xml", printer.get())); + ASSERT_NO_THROW(m_xmlParser->parseFile(PROJECT_ROOT_DIR "/test/resources/samples/NoNamespace.xml", + printer.get())); } TEST_F(XmlParserTest, FilteredDataItem13) @@ -299,13 +304,13 @@ TEST_F(XmlParserTest, FilteredDataItem13) { unique_ptr printer(new printer::XmlPrinter()); m_xmlParser = new parser::XmlParser(); - m_devices = - m_xmlParser->parseFile(PROJECT_ROOT_DIR "/samples/filter_example_1.3.xml", printer.get()); + m_devices = m_xmlParser->parseFile( + PROJECT_ROOT_DIR "/test/resources/samples/filter_example_1.3.xml", printer.get()); } catch (exception &) { FAIL() << "Could not locate test xml: " << PROJECT_ROOT_DIR - << "/samples/filter_example_1.3.xml"; + << "/test/resources/samples/filter_example_1.3.xml"; } DevicePtr dev = m_devices.front(); @@ -327,12 +332,13 @@ TEST_F(XmlParserTest, FilteredDataItem) { unique_ptr printer(new printer::XmlPrinter()); m_xmlParser = new parser::XmlParser(); - m_devices = - m_xmlParser->parseFile(PROJECT_ROOT_DIR "/samples/filter_example.xml", printer.get()); + m_devices = m_xmlParser->parseFile( + PROJECT_ROOT_DIR "/test/resources/samples/filter_example.xml", printer.get()); } catch (exception &) { - FAIL() << "Could not locate test xml: " << PROJECT_ROOT_DIR << "/samples/filter_example.xml"; + FAIL() << "Could not locate test xml: " << PROJECT_ROOT_DIR + << "/test/resources/samples/filter_example.xml"; } auto di = m_devices.front()->getDeviceDataItem("c1"); @@ -359,12 +365,13 @@ TEST_F(XmlParserTest, References) { unique_ptr printer(new printer::XmlPrinter()); m_xmlParser = new parser::XmlParser(); - m_devices = - m_xmlParser->parseFile(PROJECT_ROOT_DIR "/samples/reference_example.xml", printer.get()); + m_devices = m_xmlParser->parseFile( + PROJECT_ROOT_DIR "/test/resources/samples/reference_example.xml", printer.get()); } catch (exception &) { - FAIL() << "Could not locate test xml: " << PROJECT_ROOT_DIR << "/samples/reference_example.xml"; + FAIL() << "Could not locate test xml: " << PROJECT_ROOT_DIR + << "/test/resources/samples/reference_example.xml"; } string id = "mf"; @@ -421,12 +428,13 @@ TEST_F(XmlParserTest, SourceReferences) { unique_ptr printer(new printer::XmlPrinter()); m_xmlParser = new parser::XmlParser(); - m_devices = - m_xmlParser->parseFile(PROJECT_ROOT_DIR "/samples/reference_example.xml", printer.get()); + m_devices = m_xmlParser->parseFile( + PROJECT_ROOT_DIR "/test/resources/samples/reference_example.xml", printer.get()); } catch (exception &) { - FAIL() << "Could not locate test xml: " << PROJECT_ROOT_DIR << "/samples/reference_example.xml"; + FAIL() << "Could not locate test xml: " << PROJECT_ROOT_DIR + << "/test/resources/samples/reference_example.xml"; } const auto item = m_devices.front()->getDeviceDataItem("bfc"); @@ -450,8 +458,8 @@ TEST_F(XmlParserTest, DataItemRelationships) unique_ptr printer(new printer::XmlPrinter()); m_xmlParser = new parser::XmlParser(); - m_devices = - m_xmlParser->parseFile(PROJECT_ROOT_DIR "/samples/relationship_test.xml", printer.get()); + m_devices = m_xmlParser->parseFile( + PROJECT_ROOT_DIR "/test/resources/samples/relationship_test.xml", printer.get()); const auto &device = m_devices.front(); const auto &dataItemsMap = device->getDeviceDataItems(); diff --git a/test/xml_printer_test.cpp b/test/xml_printer_test.cpp index a929b2f1d..9d2099348 100644 --- a/test/xml_printer_test.cpp +++ b/test/xml_printer_test.cpp @@ -57,7 +57,8 @@ class XmlPrinterTest : public testing::Test m_config = new XmlParser(); m_printer = new printer::XmlPrinter(true); m_printer->setSchemaVersion("1.2"); - m_devices = m_config->parseFile(PROJECT_ROOT_DIR "/samples/test_config.xml", m_printer); + m_devices = + m_config->parseFile(PROJECT_ROOT_DIR "/test/resources/samples/test_config.xml", m_printer); } void TearDown() override @@ -271,7 +272,7 @@ TEST_F(XmlPrinterTest, ChangeDevicesNamespace) { XmlParser ext; std::list extdevs = - ext.parseFile(PROJECT_ROOT_DIR "/samples/extension.xml", m_printer); + ext.parseFile(PROJECT_ROOT_DIR "/test/resources/samples/extension.xml", m_printer); PARSE_XML(m_printer->printProbe(123, 9999, 1024, 10, 1, extdevs)); ASSERT_XML_PATH_EQUAL(doc, "/m:MTConnectDevices@schemaLocation", @@ -324,7 +325,7 @@ TEST_F(XmlPrinterTest, ChangeStreamsNamespace) { XmlParser ext; - m_devices = ext.parseFile(PROJECT_ROOT_DIR "/samples/extension.xml", m_printer); + m_devices = ext.parseFile(PROJECT_ROOT_DIR "/test/resources/samples/extension.xml", m_printer); m_printer->addStreamsNamespace("urn:example.com:ExampleDevices:1.3", "ExtensionDevices_1.3.xsd", "x"); @@ -344,7 +345,7 @@ TEST_F(XmlPrinterTest, ChangeStreamsNamespace) { XmlParser ext; - m_devices = ext.parseFile(PROJECT_ROOT_DIR "/samples/extension.xml", m_printer); + m_devices = ext.parseFile(PROJECT_ROOT_DIR "/test/resources/samples/extension.xml", m_printer); m_printer->addStreamsNamespace("urn:example.com:ExampleDevices:1.3", "ExtensionDevices_1.3.xsd", "x"); @@ -713,7 +714,8 @@ TEST_F(XmlPrinterTest, ProbeWithFilter13) delete m_config; m_config = new XmlParser(); - m_devices = m_config->parseFile(PROJECT_ROOT_DIR "/samples/filter_example_1.3.xml", m_printer); + m_devices = m_config->parseFile(PROJECT_ROOT_DIR "/test/resources/samples/filter_example_1.3.xml", + m_printer); PARSE_XML(m_printer->printProbe(123, 9999, 1024, 10, 1, m_devices)); @@ -729,7 +731,8 @@ TEST_F(XmlPrinterTest, ProbeWithFilter) m_config = nullptr; m_config = new XmlParser(); - m_devices = m_config->parseFile(PROJECT_ROOT_DIR "/samples/filter_example.xml", m_printer); + m_devices = + m_config->parseFile(PROJECT_ROOT_DIR "/test/resources/samples/filter_example.xml", m_printer); PARSE_XML(m_printer->printProbe(123, 9999, 1024, 10, 1, m_devices)); @@ -746,7 +749,8 @@ TEST_F(XmlPrinterTest, References) m_config = nullptr; m_config = new XmlParser(); - m_devices = m_config->parseFile(PROJECT_ROOT_DIR "/samples/reference_example.xml", m_printer); + m_devices = m_config->parseFile(PROJECT_ROOT_DIR "/test/resources/samples/reference_example.xml", + m_printer); PARSE_XML(m_printer->printProbe(123, 9999, 1024, 10, 1, m_devices)); @@ -762,7 +766,8 @@ TEST_F(XmlPrinterTest, LegacyReferences) m_config = nullptr; m_config = new XmlParser(); - m_devices = m_config->parseFile(PROJECT_ROOT_DIR "/samples/reference_example.xml", m_printer); + m_devices = m_config->parseFile(PROJECT_ROOT_DIR "/test/resources/samples/reference_example.xml", + m_printer); PARSE_XML(m_printer->printProbe(123, 9999, 1024, 10, 1, m_devices)); @@ -775,7 +780,8 @@ TEST_F(XmlPrinterTest, CheckDeviceChangeTime) { m_printer = new XmlPrinter(true); m_printer->setSchemaVersion("1.7"); - m_devices = m_config->parseFile(PROJECT_ROOT_DIR "/samples/test_config.xml", m_printer); + m_devices = + m_config->parseFile(PROJECT_ROOT_DIR "/test/resources/samples/test_config.xml", m_printer); m_printer->setModelChangeTime(getCurrentTime(GMT_UV_SEC)); ASSERT_FALSE(m_printer->getModelChangeTime().empty()); @@ -796,7 +802,8 @@ TEST_F(XmlPrinterTest, SourceReferences) m_config = nullptr; m_config = new XmlParser(); - m_devices = m_config->parseFile(PROJECT_ROOT_DIR "/samples/reference_example.xml", m_printer); + m_devices = m_config->parseFile(PROJECT_ROOT_DIR "/test/resources/samples/reference_example.xml", + m_printer); PARSE_XML(m_printer->printProbe(123, 9999, 1024, 10, 1, m_devices)); @@ -867,7 +874,8 @@ TEST_F(XmlPrinterTest, PrintDataItemRelationships) m_config = nullptr; m_config = new XmlParser(); - m_devices = m_config->parseFile(PROJECT_ROOT_DIR "/samples/relationship_test.xml", m_printer); + m_devices = m_config->parseFile(PROJECT_ROOT_DIR "/test/resources/samples/relationship_test.xml", + m_printer); PARSE_XML(m_printer->printProbe(123, 9999, 1024, 10, 1, m_devices));