27
27
#include < string>
28
28
#include < vector>
29
29
30
+ #include " mtconnect/configuration/config_options.hpp"
30
31
#include " mtconnect/pipeline/pipeline_context.hpp"
31
32
#include " mtconnect/source/adapter/mqtt/mqtt_adapter.hpp"
32
33
33
34
using namespace std ;
34
35
using namespace mtconnect ;
35
36
using namespace mtconnect ::source::adapter;
36
37
using namespace mtconnect ::source::adapter::mqtt_adapter;
38
+ using namespace mtconnect ::pipeline;
39
+ using namespace mtconnect ::asset;
40
+
37
41
namespace asio = boost::asio;
42
+ using namespace std ::literals;
38
43
39
44
// main
40
45
int main (int argc, char *argv[])
@@ -43,6 +48,32 @@ int main(int argc, char *argv[])
43
48
return RUN_ALL_TESTS ();
44
49
}
45
50
51
+ class MockPipelineContract : public PipelineContract
52
+ {
53
+ public:
54
+ MockPipelineContract (int32_t schemaVersion)
55
+ : m_schemaVersion(schemaVersion)
56
+ {}
57
+ DevicePtr findDevice (const std::string &) override { return nullptr ; }
58
+ DataItemPtr findDataItem (const std::string &device, const std::string &name) override
59
+ {
60
+ return nullptr ;
61
+ }
62
+ void eachDataItem (EachDataItem fun) override {}
63
+ void deliverObservation (observation::ObservationPtr obs) override {}
64
+ void deliverAsset (AssetPtr) override {}
65
+ void deliverDevices (std::list<DevicePtr>) override {}
66
+ void deliverDevice (DevicePtr) override {}
67
+ int32_t getSchemaVersion () const override { return m_schemaVersion; }
68
+ void deliverAssetCommand (entity::EntityPtr) override {}
69
+ void deliverCommand (entity::EntityPtr) override {}
70
+ void deliverConnectStatus (entity::EntityPtr, const StringList &, bool ) override {}
71
+ void sourceFailed (const std::string &id) override {}
72
+ const ObservationPtr checkDuplicate (const ObservationPtr &obs) const override { return obs; }
73
+
74
+ int32_t m_schemaVersion;
75
+ };
76
+
46
77
class MqttAdapterTest : public testing ::Test
47
78
{
48
79
protected:
@@ -51,4 +82,110 @@ class MqttAdapterTest : public testing::Test
51
82
void TearDown () override {}
52
83
};
53
84
54
- TEST_F (MqttAdapterTest, should_find_data_item_from_topic) {}
85
+ TEST_F (MqttAdapterTest, should_create_a_unique_id_based_on_topic)
86
+ {
87
+ asio::io_context ioc;
88
+ asio::io_context::strand strand (ioc);
89
+ ConfigOptions options {{configuration::Url, " mqtt://mybroker.com:1883" s},
90
+ {configuration::Host, " mybroker.com" s},
91
+ {configuration::Port, 1883 },
92
+ {configuration::Protocol, " mqtt" s},
93
+ {configuration::Topics, StringList {" pipeline/#" s}}};
94
+ boost::property_tree::ptree tree;
95
+ pipeline::PipelineContextPtr context = make_shared<pipeline::PipelineContext>();
96
+ context->m_contract = make_unique<MockPipelineContract>(SCHEMA_VERSION (2 , 5 ));
97
+ auto adapter = make_unique<MqttAdapter>(ioc, context, options, tree);
98
+
99
+ ASSERT_EQ (" mqtt://mybroker.com:1883/" , adapter->getName ());
100
+ ASSERT_EQ (" _89c11f795e" , adapter->getIdentity ());
101
+ }
102
+
103
+ TEST_F (MqttAdapterTest, should_change_if_topics_change)
104
+ {
105
+ asio::io_context ioc;
106
+ asio::io_context::strand strand (ioc);
107
+ ConfigOptions options {{configuration::Url, " mqtt://mybroker.com:1883" s},
108
+ {configuration::Host, " mybroker.com" s},
109
+ {configuration::Port, 1883 },
110
+ {configuration::Protocol, " mqtt" s},
111
+ {configuration::Topics, StringList {" pipeline/#" s}}};
112
+ boost::property_tree::ptree tree;
113
+ pipeline::PipelineContextPtr context = make_shared<pipeline::PipelineContext>();
114
+ context->m_contract = make_unique<MockPipelineContract>(SCHEMA_VERSION (2 , 5 ));
115
+ auto adapter = make_unique<MqttAdapter>(ioc, context, options, tree);
116
+
117
+ ASSERT_EQ (" mqtt://mybroker.com:1883/" , adapter->getName ());
118
+ ASSERT_EQ (" _89c11f795e" , adapter->getIdentity ());
119
+
120
+ options[configuration::Topics] = StringList {" pipline/#" s, " topic/" s};
121
+ adapter = make_unique<MqttAdapter>(ioc, context, options, tree);
122
+
123
+ ASSERT_EQ (" _29e17b8870" , adapter->getIdentity ());
124
+ }
125
+
126
+ TEST_F (MqttAdapterTest, should_change_if_port_changes)
127
+ {
128
+ asio::io_context ioc;
129
+ asio::io_context::strand strand (ioc);
130
+ ConfigOptions options {{configuration::Url, " mqtt://mybroker.com:1883" s},
131
+ {configuration::Host, " mybroker.com" s},
132
+ {configuration::Port, 1883 },
133
+ {configuration::Protocol, " mqtt" s},
134
+ {configuration::Topics, StringList {" pipeline/#" s}}};
135
+ boost::property_tree::ptree tree;
136
+ pipeline::PipelineContextPtr context = make_shared<pipeline::PipelineContext>();
137
+ context->m_contract = make_unique<MockPipelineContract>(SCHEMA_VERSION (2 , 5 ));
138
+ auto adapter = make_unique<MqttAdapter>(ioc, context, options, tree);
139
+
140
+ ASSERT_EQ (" mqtt://mybroker.com:1883/" , adapter->getName ());
141
+ ASSERT_EQ (" _89c11f795e" , adapter->getIdentity ());
142
+
143
+ options[configuration::Port] = 1882 ;
144
+ adapter = make_unique<MqttAdapter>(ioc, context, options, tree);
145
+
146
+ ASSERT_EQ (" mqtt://mybroker.com:1882/" , adapter->getName ());
147
+ ASSERT_EQ (" _7042e8f45e" , adapter->getIdentity ());
148
+ }
149
+
150
+ TEST_F (MqttAdapterTest, should_change_if_host_changes)
151
+ {
152
+ asio::io_context ioc;
153
+ asio::io_context::strand strand (ioc);
154
+ ConfigOptions options {{configuration::Url, " mqtt://mybroker.com:1883" s},
155
+ {configuration::Host, " mybroker.com" s},
156
+ {configuration::Port, 1883 },
157
+ {configuration::Protocol, " mqtt" s},
158
+ {configuration::Topics, StringList {" pipeline/#" s}}};
159
+ boost::property_tree::ptree tree;
160
+ pipeline::PipelineContextPtr context = make_shared<pipeline::PipelineContext>();
161
+ context->m_contract = make_unique<MockPipelineContract>(SCHEMA_VERSION (2 , 5 ));
162
+ auto adapter = make_unique<MqttAdapter>(ioc, context, options, tree);
163
+
164
+ ASSERT_EQ (" mqtt://mybroker.com:1883/" , adapter->getName ());
165
+ ASSERT_EQ (" _89c11f795e" , adapter->getIdentity ());
166
+
167
+ options[configuration::Host] = " localhost" s;
168
+ adapter = make_unique<MqttAdapter>(ioc, context, options, tree);
169
+
170
+ ASSERT_EQ (" mqtt://localhost:1883/" , adapter->getName ());
171
+ ASSERT_EQ (" _4cd2e64d4e" , adapter->getIdentity ());
172
+ }
173
+
174
+ TEST_F (MqttAdapterTest, should_be_able_to_set_adapter_identity)
175
+ {
176
+ asio::io_context ioc;
177
+ asio::io_context::strand strand (ioc);
178
+ ConfigOptions options {{configuration::Url, " mqtt://mybroker.com:1883" s},
179
+ {configuration::Host, " mybroker.com" s},
180
+ {configuration::Port, 1883 },
181
+ {configuration::Protocol, " mqtt" s},
182
+ {configuration::AdapterIdentity, " MyIdentity" s},
183
+ {configuration::Topics, StringList {" pipeline/#" s}}};
184
+ boost::property_tree::ptree tree;
185
+ pipeline::PipelineContextPtr context = make_shared<pipeline::PipelineContext>();
186
+ context->m_contract = make_unique<MockPipelineContract>(SCHEMA_VERSION (2 , 5 ));
187
+ auto adapter = make_unique<MqttAdapter>(ioc, context, options, tree);
188
+
189
+ ASSERT_EQ (" mqtt://mybroker.com:1883/" , adapter->getName ());
190
+ ASSERT_EQ (" MyIdentity" , adapter->getIdentity ());
191
+ }
0 commit comments