diff --git a/src/TinyMqtt.h b/src/TinyMqtt.h index 664e3e8..d40e959 100644 --- a/src/TinyMqtt.h +++ b/src/TinyMqtt.h @@ -121,6 +121,7 @@ class MqttClient }; public: MqttClient(MqttBroker*); + MqttClient(MqttBroker* brk, const std::string& id) : MqttClient(brk) { clientId=id; } MqttClient() : MqttClient(nullptr) {}; ~MqttClient(); @@ -225,6 +226,8 @@ class MqttBroker void connect(std::string host, uint32_t port=1883); bool connected() const { return state == Connected; } + size_t clientsCount() const { return clients.size(); } + void dump() { Serial << clients.size() << " client/s" << endl; diff --git a/tests/tinymqtt-tests/tinymqtt-tests.ino b/tests/tinymqtt-tests/tinymqtt-tests.ino new file mode 100644 index 0000000..a8c6dad --- /dev/null +++ b/tests/tinymqtt-tests/tinymqtt-tests.ino @@ -0,0 +1,138 @@ +#include +#include +#include + +/** + * TinyMqtt local unit tests. + * + * No wifi connection unit tests. + **/ + +using namespace std; + +MqttBroker broker(1883); + +std::map> published; // map[client_id] => map[topic] = count + +void onPublish(const MqttClient* srce, const Topic& topic, const char* payload, size_t length) +{ + if (srce) + published[srce->id()][topic]++; +} + +test(local_client_should_unregister_when_destroyed) +{ + assertEqual(broker.clientsCount(), (size_t)0); + { + MqttClient client(&broker); + assertEqual(broker.clientsCount(), (size_t)1); + } + assertEqual(broker.clientsCount(), (size_t)0); +} + +test(local_connect) +{ + assertEqual(broker.clientsCount(), (size_t)0); + + MqttClient client(&broker); + assertTrue(client.connected()); + assertEqual(broker.clientsCount(), (size_t)1); +} + +test(local_publish_should_be_dispatched) +{ + published.clear(); + assertEqual(broker.clientsCount(), (size_t)0); + + MqttClient subscriber(&broker); + subscriber.subscribe("a/b"); + subscriber.subscribe("a/c"); + subscriber.setCallback(onPublish); + + MqttClient publisher(&broker); + publisher.publish("a/b"); + publisher.publish("a/c"); + publisher.publish("a/c"); + + assertEqual(published.size(), (size_t)1); // 1 client has received something + assertTrue(published[""]["a/b"] == 1); + assertTrue(published[""]["a/c"] == 2); +} + +test(local_publish_should_be_dispatched_to_local_clients) +{ + published.clear(); + assertEqual(broker.clientsCount(), (size_t)0); + + MqttClient subscriber_a(&broker, "A"); + subscriber_a.setCallback(onPublish); + subscriber_a.subscribe("a/b"); + subscriber_a.subscribe("a/c"); + + MqttClient subscriber_b(&broker, "B"); + subscriber_b.setCallback(onPublish); + subscriber_b.subscribe("a/b"); + + MqttClient publisher(&broker); + publisher.publish("a/b"); + publisher.publish("a/c"); + + assertEqual(published.size(), (size_t)2); // 2 clients have received something + assertTrue(published["A"]["a/b"] == 1); + assertTrue(published["A"]["a/c"] == 1); + assertTrue(published["B"]["a/b"] == 1); + assertTrue(published["B"]["a/c"] == 0); +} + +test(local_unsubscribe) +{ + published.clear(); + assertEqual(broker.clientsCount(), (size_t)0); + + MqttClient subscriber(&broker); + subscriber.setCallback(onPublish); + subscriber.subscribe("a/b"); + + MqttClient publisher(&broker); + publisher.publish("a/b"); + + // subscriber.unsubscribe("a/b"); TODO not yet implemented + + publisher.publish("a/b"); + + assertTrue(published[""]["a/b"] == 1); // Only one publish has been received +} + +test(local_nocallback_when_destroyed) +{ + published.clear(); + assertEqual(broker.clientsCount(), (size_t)0); + + { + MqttClient subscriber(&broker); + subscriber.setCallback(onPublish); + subscriber.subscribe("a/b"); + } + + MqttClient publisher(&broker); + publisher.publish("a/b"); + + assertEqual(published.size(), (size_t)0); // Only one publish has been received +} + + +//---------------------------------------------------------------------------- +// setup() and loop() +void setup() { + delay(1000); + Serial.begin(115200); + while(!Serial); + + Serial.println("=============[ NO WIFI CONNECTION TinyMqtt TESTS ]========================"); +} + +void loop() { + aunit::TestRunner::run(); + + if (Serial.available()) ESP.reset(); +}