Added a test for instances count (memory leak again)
This commit is contained in:
@@ -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()");
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user