1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-04-19 23:22:16 +03:00

Add valgrind mocked test to CI (#7501)

Run valgrind on host mock example runs to catch more bugs in CI.  These
tests would have caught the problem in #7464 before users did.

Add a list of some randomly picked examples to run, and add an option to
run the loop exactly once in the host mock routine, so the test will
actually exit under valgrind.
This commit is contained in:
Earle F. Philhower, III 2020-08-03 19:00:51 -07:00 committed by GitHub
parent fc1aa554cd
commit a8e35a579c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 31 additions and 4 deletions

View File

@ -44,6 +44,8 @@ void setup() {
} }
void loop() { void loop() {
static bool wait = false;
Serial.print("connecting to "); Serial.print("connecting to ");
Serial.print(host); Serial.print(host);
Serial.print(':'); Serial.print(':');
@ -87,5 +89,8 @@ void loop() {
Serial.println("closing connection"); Serial.println("closing connection");
client.stop(); client.stop();
delay(300000); // execute once every 5 minutes, don't flood remote service if (wait) {
delay(300000); // execute once every 5 minutes, don't flood remote service
}
wait = true;
} }

View File

@ -6,5 +6,18 @@ set -ev
cd $TRAVIS_BUILD_DIR/tests/host cd $TRAVIS_BUILD_DIR/tests/host
make CI
make -j2 ssl
for i in ../../libraries/ESP8266WiFi/examples/WiFiClient/WiFiClient \
../../libraries/ESP8266WiFi/examples/BearSSL_Validation/BearSSL_Validation \
../../libraries/ESP8266WebServer/examples/HelloServer/HelloServer \
../../libraries/SD/examples/Files/Files \
../../libraries/LittleFS/examples/LittleFS_Timestamp/LittleFS_Timestamp \
../../libraries/LittleFS/examples/SpeedTest/SpeedTest ; do
make -j2 D=1 $i
valgrind --leak-check=full --track-origins=yes --error-limit=no --show-leak-kinds=all --error-exitcode=999 bin/$(basename $i)/$(basename $i) -1
done
make -j2 CI
make clean-objects make clean-objects

View File

@ -42,6 +42,7 @@
#define MOCK_PORT_SHIFTER 9000 #define MOCK_PORT_SHIFTER 9000
bool user_exit = false; bool user_exit = false;
bool run_once = false;
const char* host_interface = nullptr; const char* host_interface = nullptr;
size_t spiffs_kb = 1024; size_t spiffs_kb = 1024;
size_t littlefs_kb = 1024; size_t littlefs_kb = 1024;
@ -137,6 +138,7 @@ void help (const char* argv0, int exitcode)
"\tgeneral:\n" "\tgeneral:\n"
"\t-c - ignore CTRL-C (send it via Serial)\n" "\t-c - ignore CTRL-C (send it via Serial)\n"
"\t-f - no throttle (possibly 100%%CPU)\n" "\t-f - no throttle (possibly 100%%CPU)\n"
"\t-1 - run loop once then exit (for host testing)\n"
"\t-v - verbose\n" "\t-v - verbose\n"
, argv0, MOCK_PORT_SHIFTER, argv0, spiffs_kb, littlefs_kb); , argv0, MOCK_PORT_SHIFTER, argv0, spiffs_kb, littlefs_kb);
exit(exitcode); exit(exitcode);
@ -152,10 +154,11 @@ static struct option options[] =
{ "verbose", no_argument, NULL, 'v' }, { "verbose", no_argument, NULL, 'v' },
{ "timestamp", no_argument, NULL, 'T' }, { "timestamp", no_argument, NULL, 'T' },
{ "interface", required_argument, NULL, 'i' }, { "interface", required_argument, NULL, 'i' },
{ "fspath", required_argument, NULL, 'P' }, { "fspath", required_argument, NULL, 'P' },
{ "spiffskb", required_argument, NULL, 'S' }, { "spiffskb", required_argument, NULL, 'S' },
{ "littlefskb", required_argument, NULL, 'L' }, { "littlefskb", required_argument, NULL, 'L' },
{ "portshifter", required_argument, NULL, 's' }, { "portshifter", required_argument, NULL, 's' },
{ "once", no_argument, NULL, '1' },
}; };
void cleanup () void cleanup ()
@ -209,7 +212,7 @@ int main (int argc, char* const argv [])
for (;;) for (;;)
{ {
int n = getopt_long(argc, argv, "hlcfbvTi:S:s:L:P:", options, NULL); int n = getopt_long(argc, argv, "hlcfbvTi:S:s:L:P:1", options, NULL);
if (n < 0) if (n < 0)
break; break;
switch (n) switch (n)
@ -250,6 +253,9 @@ int main (int argc, char* const argv [])
case 'T': case 'T':
serial_timestamp = true; serial_timestamp = true;
break; break;
case '1':
run_once = true;
break;
default: default:
help(argv[0], EXIT_FAILURE); help(argv[0], EXIT_FAILURE);
} }
@ -300,6 +306,9 @@ int main (int argc, char* const argv [])
usleep(1000); // not 100% cpu, ~1000 loops per second usleep(1000); // not 100% cpu, ~1000 loops per second
loop(); loop();
check_incoming_udp(); check_incoming_udp();
if (run_once)
user_exit = true;
} }
cleanup(); cleanup();