Added a test for instances count (memory leak again)

This commit is contained in:
hsaturn
2023-04-09 20:36:25 +02:00
parent ff3ff6e80e
commit 3c77f7cafd
3 changed files with 55 additions and 0 deletions

View File

@@ -9,10 +9,14 @@ static auto red = TinyConsole::red;
static auto yellow = TinyConsole::yellow; static auto yellow = TinyConsole::yellow;
int TinyMqtt::debug=2; int TinyMqtt::debug=2;
#endif #endif
#ifdef EPOXY_DUINO #ifdef EPOXY_DUINO
std::map<MqttMessage::Type, int> MqttClient::counters; std::map<MqttMessage::Type, int> MqttClient::counters;
int MqttBroker::instances = 0;
int MqttClient::instances = 0;
#endif #endif
MqttBroker::MqttBroker(uint16_t port, uint8_t max_retain_size) 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 #ifdef TINY_MQTT_ASYNC
server->onClient(onClient, this); server->onClient(onClient, this);
#endif #endif
#ifdef EPOXY_DUINO
instances++;
#endif
} }
MqttBroker::~MqttBroker() MqttBroker::~MqttBroker()
{ {
#ifdef EPOXY_DUINO
instances--;
#endif
while(clients.size()) while(clients.size())
{ {
auto client = clients[0]; auto client = clients[0];
@@ -56,6 +66,7 @@ MqttClient::MqttClient(MqttBroker* local_broker, TcpClient* new_client)
#endif #endif
#ifdef EPOXY_DUINO #ifdef EPOXY_DUINO
alive = millis()+500000; alive = millis()+500000;
instances++;
#else #else
alive = millis()+5000; // TODO MAGIC client expires after 5s if no CONNECT msg alive = millis()+5000; // TODO MAGIC client expires after 5s if no CONNECT msg
#endif #endif
@@ -68,10 +79,16 @@ MqttClient::MqttClient(MqttBroker* local_broker, const string& id)
keep_alive = 0; keep_alive = 0;
if (local_broker) local_broker->addClient(this); if (local_broker) local_broker->addClient(this);
#ifdef EPOXY_DUINO
instances++;
#endif
} }
MqttClient::~MqttClient() MqttClient::~MqttClient()
{ {
#ifdef EPOXY_DUINO
instances--;
#endif
close(); close();
delete tcp_client; delete tcp_client;
debug("*** MqttClient delete()"); debug("*** MqttClient delete()");

View File

@@ -289,6 +289,7 @@ class MqttClient
#ifdef EPOXY_DUINO #ifdef EPOXY_DUINO
static std::map<MqttMessage::Type, int> counters; // Number of processed messages static std::map<MqttMessage::Type, int> counters; // Number of processed messages
static int instances;
#endif #endif
uint32_t keepAlive() const { return keep_alive; } uint32_t keepAlive() const { return keep_alive; }
@@ -354,6 +355,9 @@ class MqttBroker
} }
const std::vector<MqttClient*> getClients() const { return clients; } const std::vector<MqttClient*> getClients() const { return clients; }
#ifdef EPOXY_DUINO
static int instances;
#endif
private: private:
friend class MqttClient; friend class MqttClient;

View File

@@ -144,6 +144,40 @@ test(suback)
assertEqual(MqttClient::counters[MqttMessage::Type::SubAck], 1); 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) test(client_keep_alive_high)
{ {
const uint32_t keep_alive=1000; const uint32_t keep_alive=1000;