From 3c77f7cafd4a6750f04903342ca8cb5988077190 Mon Sep 17 00:00:00 2001 From: hsaturn Date: Sun, 9 Apr 2023 20:36:25 +0200 Subject: [PATCH] Added a test for instances count (memory leak again) --- src/TinyMqtt.cpp | 17 ++++++++++++++ src/TinyMqtt.h | 4 ++++ tests/network-tests/network-tests.ino | 34 +++++++++++++++++++++++++++ 3 files changed, 55 insertions(+) diff --git a/src/TinyMqtt.cpp b/src/TinyMqtt.cpp index c634eeb..3f11eed 100644 --- a/src/TinyMqtt.cpp +++ b/src/TinyMqtt.cpp @@ -9,10 +9,14 @@ static auto red = TinyConsole::red; static auto yellow = TinyConsole::yellow; int TinyMqtt::debug=2; + #endif #ifdef EPOXY_DUINO std::map MqttClient::counters; + int MqttBroker::instances = 0; + int MqttClient::instances = 0; + #endif MqttBroker::MqttBroker(uint16_t port, uint8_t max_retain_size) @@ -23,10 +27,16 @@ MqttBroker::MqttBroker(uint16_t port, uint8_t max_retain_size) #ifdef TINY_MQTT_ASYNC server->onClient(onClient, this); #endif +#ifdef EPOXY_DUINO + instances++; +#endif } MqttBroker::~MqttBroker() { +#ifdef EPOXY_DUINO + instances--; +#endif while(clients.size()) { auto client = clients[0]; @@ -56,6 +66,7 @@ MqttClient::MqttClient(MqttBroker* local_broker, TcpClient* new_client) #endif #ifdef EPOXY_DUINO alive = millis()+500000; + instances++; #else alive = millis()+5000; // TODO MAGIC client expires after 5s if no CONNECT msg #endif @@ -68,10 +79,16 @@ MqttClient::MqttClient(MqttBroker* local_broker, const string& id) keep_alive = 0; if (local_broker) local_broker->addClient(this); +#ifdef EPOXY_DUINO + instances++; +#endif } MqttClient::~MqttClient() { +#ifdef EPOXY_DUINO + instances--; +#endif close(); delete tcp_client; debug("*** MqttClient delete()"); diff --git a/src/TinyMqtt.h b/src/TinyMqtt.h index 87b48b1..911d20a 100644 --- a/src/TinyMqtt.h +++ b/src/TinyMqtt.h @@ -289,6 +289,7 @@ class MqttClient #ifdef EPOXY_DUINO static std::map counters; // Number of processed messages + static int instances; #endif uint32_t keepAlive() const { return keep_alive; } @@ -354,6 +355,9 @@ class MqttBroker } const std::vector getClients() const { return clients; } +#ifdef EPOXY_DUINO + static int instances; +#endif private: friend class MqttClient; diff --git a/tests/network-tests/network-tests.ino b/tests/network-tests/network-tests.ino index bb2285e..8e249c4 100644 --- a/tests/network-tests/network-tests.ino +++ b/tests/network-tests/network-tests.ino @@ -144,6 +144,40 @@ test(suback) assertEqual(MqttClient::counters[MqttMessage::Type::SubAck], 1); } +test(broker_connect_and_client_deletion) +{ + assertEqual(MqttClient::instances, 0); + { + start_many_wifi_esp(2, true); + assertEqual(WiFi.status(), WL_CONNECTED); + + MqttBroker broker(1883); + broker.begin(); + + ESP8266WiFiClass::selectInstance(2); + MqttBroker remote_broker(1883); + remote_broker.begin(); + IPAddress remote_broker_ip = WiFi.localIP(); + assertEqual(MqttClient::instances, 0); + + ESP8266WiFiClass::selectInstance(1); + broker.connect(remote_broker_ip.toString().c_str()); + remote_broker.loop(); + assertEqual(remote_broker.clientsCount(), (size_t)1); + + // Here, we have two MqttClient + // The client that connects broker to remote_broker + // The client created by remote_broker + assertEqual(MqttClient::instances, 2); + + broker.connect(""); + remote_broker.loop(); broker.loop(); + remote_broker.loop(); broker.loop(); + assertEqual(remote_broker.clientsCount(), (size_t)0); + } + assertEqual(MqttClient::instances, 0); +} + test(client_keep_alive_high) { const uint32_t keep_alive=1000;