Skip to content

Commit 9958855

Browse files
Added unit test for virtual destructors
The purpose of this tests is to hihglight the need for a virtual destructor through valgrind unit test execution
1 parent e97e5e2 commit 9958855

File tree

4 files changed

+125
-0
lines changed

4 files changed

+125
-0
lines changed

test/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ set(TEST_SRCS
112112
src/WCharacter/test_isUpperCase.cpp
113113
src/WCharacter/test_isWhitespace.cpp
114114
src/WCharacter/test_toAscii.cpp
115+
src/Interfaces/test_virtualDestructor.cpp
115116
)
116117

117118
set(TEST_DUT_SRCS

test/include/TCPClientMock.h

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/*
2+
* Copyright (c) 2020 Arduino. All rights reserved.
3+
*
4+
* SPDX-License-Identifier: LGPL-2.1-or-later
5+
*/
6+
7+
#ifndef TCPCLIENT_MOCK_H_
8+
#define TCPCLIENT_MOCK_H_
9+
10+
/**************************************************************************************
11+
* INCLUDE
12+
**************************************************************************************/
13+
14+
#include <api/Client.h>
15+
16+
/**************************************************************************************
17+
* CLASS DECLARATION
18+
**************************************************************************************/
19+
20+
/*
21+
* The purpose of this class is currently to highlight the effects of lacking virtual destructor
22+
*/
23+
24+
#pragma GCC diagnostic push
25+
#pragma GCC diagnostic ignored "-Wunused-parameter"
26+
27+
class TCPClientMock : public Client {
28+
public:
29+
virtual int connect(IPAddress ip, uint16_t port) { return 0; }
30+
virtual int connect(const char *host, uint16_t port) { return 0; }
31+
virtual size_t write(uint8_t) { return 0; }
32+
virtual size_t write(const uint8_t *buf, size_t size) { return 0;}
33+
virtual int available() { return 0; }
34+
virtual int read() { return 0; }
35+
virtual int read(uint8_t *buf, size_t size) { return 0;}
36+
virtual int peek() { return 0; }
37+
virtual void flush() {}
38+
virtual void stop() {}
39+
virtual uint8_t connected() { return 0;}
40+
virtual operator bool() { return true; }
41+
};
42+
#pragma GCC diagnostic pop
43+
44+
45+
#endif /* TCPCLIENT_MOCK_H_ */
+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#!/bin/bash
2+
3+
FQBNS=(
4+
arduino-git:renesas_portenta_main:unor4wifi
5+
# arduino-git:mbed:envie_m7
6+
# arduino-git:avr:uno
7+
# arduino-git:samd:mkrwifi1010
8+
# arduino-git:mbed:opta
9+
)
10+
11+
branches=(
12+
master
13+
virtual-destructors
14+
)
15+
16+
for branch in "${branches[@]}"; do
17+
git checkout $branch
18+
for fqbn in $"${FQBNS[@]}"; do
19+
echo "compiling for " $fqbn.$branch
20+
# arduino-cli compile -b $fqbn | tee $fqbn.$branch.log
21+
arduino-cli compile -b $fqbn --build-property "compiler.cpp.extra_flags=\"-fdump-record-layouts\""
22+
# /home/agilardoni/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-size -A /tmp/arduino/sketches/97A7C8915D2115841AF9E1023FFD9539/virtual_destructors_testing.ino.elf | tee $fqbn.$branch.size.log
23+
done
24+
done
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
2+
#if defined(ARDUINO_SAMD_MKR1000)
3+
#include <WiFi101.h>
4+
#include <WiFiUdp.h>
5+
#elif defined(ARDUINO_SAMD_MKRWIFI1010) || defined(ARDUINO_SAMD_NANO_33_IOT) || defined(ARDUINO_AVR_UNO_WIFI_REV2) || defined (ARDUINO_NANO_RP2040_CONNECT)
6+
#include <WiFiNINA.h>
7+
#include <WiFiUdp.h>
8+
#elif defined(ARDUINO_PORTENTA_H7_M7) || defined(ARDUINO_PORTENTA_H7_M7) || \
9+
defined(ARDUINO_NICLA_VISION) || defined(ARDUINO_OPTA) || defined(ARDUINO_GIGA)
10+
#include <WiFi.h>
11+
#include <WiFiUdp.h>
12+
#elif defined(ARDUINO_PORTENTA_C33)
13+
#include <WiFiC3.h>
14+
#include <WiFiUdp.h>
15+
#elif defined(ARDUINO_ARCH_ESP8266)
16+
#include <ESP8266WiFi.h>
17+
#include <WiFiUdp.h>
18+
#elif defined(ARDUINO_ARCH_ESP32)
19+
#include <WiFi.h>
20+
#include <WiFiUdp.h>
21+
#elif defined(ARDUINO_UNOR4_WIFI)
22+
#include <WiFiS3.h>
23+
#elif defined(ARDUINO_RASPBERRY_PI_PICO_W)
24+
#include <WiFi.h>
25+
#include <WiFiUdp.h>
26+
#endif
27+
void setup() {
28+
Serial.begin(115200);
29+
30+
while(!Serial);
31+
32+
Serial.println("Hello world");
33+
34+
#if defined(ARDUINO_SAMD_MKR1000) || \
35+
defined(ARDUINO_SAMD_MKRWIFI1010) || \
36+
defined(ARDUINO_SAMD_NANO_33_IOT) || \
37+
defined(ARDUINO_AVR_UNO_WIFI_REV2) || \
38+
defined(ARDUINO_NANO_RP2040_CONNECT) || \
39+
defined(ARDUINO_PORTENTA_H7_M7) || \
40+
defined(ARDUINO_PORTENTA_H7_M7) || \
41+
defined(ARDUINO_NICLA_VISION) || \
42+
defined(ARDUINO_OPTA) || \
43+
defined(ARDUINO_GIGA) || \
44+
defined(ARDUINO_PORTENTA_C33) || \
45+
defined(ARDUINO_ARCH_ESP8266) || \
46+
defined(ARDUINO_ARCH_ESP32) || \
47+
defined(ARDUINO_UNOR4_WIFI) || \
48+
defined(ARDUINO_RASPBERRY_PI_PICO_W)
49+
Client *c = new WiFiClient(); // sizeof // as global variable
50+
delete c;
51+
#endif
52+
}
53+
54+
void loop() {
55+
}

0 commit comments

Comments
 (0)