From 4bcfae41a92dbe16b4db7e1e4ba72d7aa5590eb3 Mon Sep 17 00:00:00 2001 From: david gauchard Date: Tue, 5 Mar 2019 01:31:17 +0100 Subject: [PATCH 1/7] uart emulation on tty: add cmdline debug option to disable raw tty --- tests/host/common/ArduinoMain.cpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/tests/host/common/ArduinoMain.cpp b/tests/host/common/ArduinoMain.cpp index bb33c65616..3fcdd9b73f 100644 --- a/tests/host/common/ArduinoMain.cpp +++ b/tests/host/common/ArduinoMain.cpp @@ -96,6 +96,7 @@ void help (const char* argv0, int exitcode) " -l - bind tcp/udp servers to interface only (not 0.0.0.0)\n" " -c - ignore CTRL-C (send it via Serial)\n" " -f - no throttle (possibly 100%%CPU)\n" + " -b - blocking tty/mocked-uart (default: not blocking tty)\n" " -S - spiffs size in KBytes (default: %zd)\n" " (negative value will force mismatched size)\n" , argv0, spiffs_kb); @@ -108,6 +109,7 @@ static struct option options[] = { "fast", no_argument, NULL, 'f' }, { "local", no_argument, NULL, 'l' }, { "sigint", no_argument, NULL, 'c' }, + { "blockinguart", no_argument, NULL, 'b' }, { "interface", required_argument, NULL, 'i' }, { "spiffskb", required_argument, NULL, 'S' }, }; @@ -136,10 +138,11 @@ int main (int argc, char* const argv []) signal(SIGINT, control_c); bool fast = false; + bool blocking_uart = false; for (;;) { - int n = getopt_long(argc, argv, "hlcfi:S:", options, NULL); + int n = getopt_long(argc, argv, "hlcfbi:S:", options, NULL); if (n < 0) break; switch (n) @@ -162,9 +165,11 @@ int main (int argc, char* const argv []) case 'S': spiffs_kb = atoi(optarg); break; + case 'b': + blocking_uart = true; + break; default: - fprintf(stderr, MOCK "bad option '%c'\n", n); - exit(EXIT_FAILURE); + help(argv[0], EXIT_FAILURE); } } @@ -180,8 +185,11 @@ int main (int argc, char* const argv []) // setup global global_ipv4_netfmt wifi_get_ip_info(0, nullptr); - // set stdin to non blocking mode - mock_start_uart(); + if (!blocking_uart) + { + // set stdin to non blocking mode + mock_start_uart(); + } // install exit handler in case Esp.restart() is called atexit(cleanup); From b1a1da6971aaaf90e69fcacfe105f3cffb4ef6b9 Mon Sep 17 00:00:00 2001 From: david gauchard Date: Tue, 5 Mar 2019 01:34:41 +0100 Subject: [PATCH 2/7] emulation with socket: read() returning 0 indicates closed peer properly check all return values ClientContext::state() triggers read() to check for closed peer fix nasty delay/bug --- tests/host/common/ClientContextSocket.cpp | 12 +++++++++-- tests/host/common/include/ClientContext.h | 26 ++++++++++++++++++----- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/tests/host/common/ClientContextSocket.cpp b/tests/host/common/ClientContextSocket.cpp index 2bee9fa1cf..9ee03430b6 100644 --- a/tests/host/common/ClientContextSocket.cpp +++ b/tests/host/common/ClientContextSocket.cpp @@ -52,7 +52,8 @@ int mockSockSetup (int sock) int i = 1; if (setsockopt(sock, SOL_SOCKET, SO_NOSIGPIPE, &i, sizeof i) == -1) { - fprintf(stderr, MOCK "sockopt( SO_NOSIGPIPE)(macOS): %s\n", strerror(errno)); + fprintf(stderr, MOCK "sockopt(SO_NOSIGPIPE)(macOS): %s\n", strerror(errno)); + close(sock); return -1; } #endif @@ -84,6 +85,13 @@ ssize_t mockFillInBuf (int sock, char* ccinbuf, size_t& ccinbufsize) { size_t maxread = CCBUFSIZE - ccinbufsize; ssize_t ret = ::read(sock, ccinbuf + ccinbufsize, maxread); + + if (ret == 0) + { + // connection closed + return -1; + } + if (ret == -1) { if (errno != EAGAIN) @@ -163,7 +171,7 @@ ssize_t mockWrite (int sock, const uint8_t* data, size_t size, int timeout_ms) #endif if (ret == -1) { - fprintf(stderr, MOCK "ClientContext::read: write(%d): %s\n", sock, strerror(errno)); + fprintf(stderr, MOCK "ClientContext::write(%d): %s\n", sock, strerror(errno)); return -1; } if (ret != (int)size) diff --git a/tests/host/common/include/ClientContext.h b/tests/host/common/include/ClientContext.h index 3d212d73ec..0ed08cb7b0 100644 --- a/tests/host/common/include/ClientContext.h +++ b/tests/host/common/include/ClientContext.h @@ -52,7 +52,10 @@ class ClientContext err_t abort() { if (_sock >= 0) + { ::close(_sock); + printf(MOCK "socket %d closed\n", _sock); + } _sock = -1; return ERR_ABRT; } @@ -160,7 +163,13 @@ class ClientContext return 0; if (_inbufsize) return _inbufsize; - return mockFillInBuf(_sock, _inbuf, _inbufsize); + ssize_t ret = mockFillInBuf(_sock, _inbuf, _inbufsize); + if (ret < 0) + { + abort(); + return 0; + } + return ret; } int read() @@ -174,7 +183,7 @@ class ClientContext ssize_t ret = mockRead(_sock, dst, size, 0, _inbuf, _inbufsize); if (ret < 0) { - abort(); // close, CLOSED + abort(); return 0; } return ret; @@ -188,7 +197,13 @@ class ClientContext size_t peekBytes(char *dst, size_t size) { - return mockPeekBytes(_sock, dst, size, _timeout_ms, _inbuf, _inbufsize); + ssize_t ret = mockPeekBytes(_sock, dst, size, _timeout_ms, _inbuf, _inbufsize); + if (ret < 0) + { + abort(); + return 0; + } + return ret; } void discard_received() @@ -202,8 +217,9 @@ class ClientContext return true; } - uint8_t state() const + uint8_t state() { + (void)getSize(); // read on socket to force detect closed peer return _sock >= 0? ESTABLISHED: CLOSED; } @@ -212,7 +228,7 @@ class ClientContext ssize_t ret = mockWrite(_sock, data, size, _timeout_ms); if (ret < 0) { - abort(); // close, CLOSED + abort(); return 0; } return ret; From c475c78c6039b9acb77396b5880b75b6c5fa392b Mon Sep 17 00:00:00 2001 From: david gauchard Date: Tue, 5 Mar 2019 01:55:55 +0100 Subject: [PATCH 3/7] emulation on host: hide annoying MOCK messages, add cmdline -v option to show them --- tests/host/common/ArduinoMain.cpp | 19 ++++++++++++-- tests/host/common/ArduinoMainUdp.cpp | 2 +- tests/host/common/ClientContextSocket.cpp | 14 +++++----- tests/host/common/HostWiring.cpp | 10 ++++---- tests/host/common/MockEEPROM.cpp | 8 +++--- tests/host/common/MockEsp.cpp | 2 +- tests/host/common/MockTools.cpp | 2 +- tests/host/common/MockWiFiServer.cpp | 4 +-- tests/host/common/MockWiFiServerSocket.cpp | 2 +- tests/host/common/UdpContextSocket.cpp | 26 +++++++++---------- tests/host/common/include/ClientContext.h | 30 +++++++++++----------- tests/host/common/include/UdpContext.h | 14 +++++----- tests/host/common/mock.h | 2 ++ tests/host/common/user_interface.cpp | 2 +- 14 files changed, 77 insertions(+), 60 deletions(-) diff --git a/tests/host/common/ArduinoMain.cpp b/tests/host/common/ArduinoMain.cpp index 3fcdd9b73f..14a04856b3 100644 --- a/tests/host/common/ArduinoMain.cpp +++ b/tests/host/common/ArduinoMain.cpp @@ -44,11 +44,21 @@ const char* host_interface = nullptr; size_t spiffs_kb = 1024; bool ignore_sigint = false; bool restore_tty = false; +bool mockdebug = false; #define STDIN STDIN_FILENO static struct termios initial_settings; +int mockverbose (const char* fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + if (mockdebug) + return fprintf(stderr, "MOCK: ") + vfprintf(stderr, fmt, ap); + return 0; +} + static int mock_start_uart(void) { struct termios settings; @@ -98,6 +108,7 @@ void help (const char* argv0, int exitcode) " -f - no throttle (possibly 100%%CPU)\n" " -b - blocking tty/mocked-uart (default: not blocking tty)\n" " -S - spiffs size in KBytes (default: %zd)\n" + " -v - mock verbose\n" " (negative value will force mismatched size)\n" , argv0, spiffs_kb); exit(exitcode); @@ -110,6 +121,7 @@ static struct option options[] = { "local", no_argument, NULL, 'l' }, { "sigint", no_argument, NULL, 'c' }, { "blockinguart", no_argument, NULL, 'b' }, + { "verbose", no_argument, NULL, 'v' }, { "interface", required_argument, NULL, 'i' }, { "spiffskb", required_argument, NULL, 'S' }, }; @@ -126,7 +138,7 @@ void control_c (int sig) if (user_exit) { - fprintf(stderr, MOCK "stuck, killing\n"); + mockverbose("stuck, killing\n"); cleanup(); exit(1); } @@ -142,7 +154,7 @@ int main (int argc, char* const argv []) for (;;) { - int n = getopt_long(argc, argv, "hlcfbi:S:", options, NULL); + int n = getopt_long(argc, argv, "hlcfbvi:S:", options, NULL); if (n < 0) break; switch (n) @@ -168,6 +180,9 @@ int main (int argc, char* const argv []) case 'b': blocking_uart = true; break; + case 'v': + mockdebug = true; + break; default: help(argv[0], EXIT_FAILURE); } diff --git a/tests/host/common/ArduinoMainUdp.cpp b/tests/host/common/ArduinoMainUdp.cpp index 99f567fe50..2962f4a483 100644 --- a/tests/host/common/ArduinoMainUdp.cpp +++ b/tests/host/common/ArduinoMainUdp.cpp @@ -58,7 +58,7 @@ void check_incoming_udp () p.events = POLLIN; if (poll(&p, 1, 0) && p.revents == POLLIN) { - fprintf(stderr, MOCK "UDP poll(%d) -> cb\r", p.fd); + mockverbose("UDP poll(%d) -> cb\r", p.fd); udp.second->mock_cb(); } } diff --git a/tests/host/common/ClientContextSocket.cpp b/tests/host/common/ClientContextSocket.cpp index 9ee03430b6..167855c291 100644 --- a/tests/host/common/ClientContextSocket.cpp +++ b/tests/host/common/ClientContextSocket.cpp @@ -43,7 +43,7 @@ int mockSockSetup (int sock) { if (fcntl(sock, F_SETFL, O_NONBLOCK) == -1) { - fprintf(stderr, MOCK "socket fcntl(O_NONBLOCK): %s\n", strerror(errno)); + mockverbose("socket fcntl(O_NONBLOCK): %s\n", strerror(errno)); close(sock); return -1; } @@ -52,7 +52,7 @@ int mockSockSetup (int sock) int i = 1; if (setsockopt(sock, SOL_SOCKET, SO_NOSIGPIPE, &i, sizeof i) == -1) { - fprintf(stderr, MOCK "sockopt(SO_NOSIGPIPE)(macOS): %s\n", strerror(errno)); + mockverbose("sockopt(SO_NOSIGPIPE)(macOS): %s\n", strerror(errno)); close(sock); return -1; } @@ -96,7 +96,7 @@ ssize_t mockFillInBuf (int sock, char* ccinbuf, size_t& ccinbufsize) { if (errno != EAGAIN) { - fprintf(stderr, MOCK "ClientContext::(read/peek fd=%i): filling buffer for %zd bytes: %s\n", sock, maxread, strerror(errno)); + mockverbose("ClientContext::(read/peek fd=%i): filling buffer for %zd bytes: %s\n", sock, maxread, strerror(errno)); return -1; } ret = 0; @@ -108,7 +108,7 @@ ssize_t mockFillInBuf (int sock, char* ccinbuf, size_t& ccinbufsize) ssize_t mockPeekBytes (int sock, char* dst, size_t usersize, int timeout_ms, char* ccinbuf, size_t& ccinbufsize) { if (usersize > CCBUFSIZE) - fprintf(stderr, MOCK "CCBUFSIZE(%d) should be increased by %zd bytes (-> %zd)\n", CCBUFSIZE, usersize - CCBUFSIZE, usersize); + mockverbose("CCBUFSIZE(%d) should be increased by %zd bytes (-> %zd)\n", CCBUFSIZE, usersize - CCBUFSIZE, usersize); struct pollfd p; size_t retsize = 0; @@ -159,7 +159,7 @@ ssize_t mockWrite (int sock, const uint8_t* data, size_t size, int timeout_ms) int ret = poll(&p, 1, timeout_ms); if (ret == -1) { - fprintf(stderr, MOCK "ClientContext::write: poll(%d): %s\n", sock, strerror(errno)); + mockverbose("ClientContext::write: poll(%d): %s\n", sock, strerror(errno)); return 0; } if (ret) @@ -171,12 +171,12 @@ ssize_t mockWrite (int sock, const uint8_t* data, size_t size, int timeout_ms) #endif if (ret == -1) { - fprintf(stderr, MOCK "ClientContext::write(%d): %s\n", sock, strerror(errno)); + mockverbose("ClientContext::write(%d): %s\n", sock, strerror(errno)); return -1; } if (ret != (int)size) { - fprintf(stderr, MOCK "ClientContext::write: short write (%d < %zd) (TODO)\n", ret, size); + mockverbose("ClientContext::write: short write (%d < %zd) (TODO)\n", ret, size); exit(EXIT_FAILURE); } } diff --git a/tests/host/common/HostWiring.cpp b/tests/host/common/HostWiring.cpp index d08733a527..7ec0cd3e50 100644 --- a/tests/host/common/HostWiring.cpp +++ b/tests/host/common/HostWiring.cpp @@ -47,21 +47,21 @@ void pinMode (uint8_t pin, uint8_t mode) default: m="(special)"; } #ifdef DEBUG_ESP_CORE - fprintf(stderr, MOCK "gpio%d: mode='%s'\n", pin, m); + mockverbose("gpio%d: mode='%s'\n", pin, m); #endif } void digitalWrite(uint8_t pin, uint8_t val) { #ifdef DEBUG_ESP_CORE - fprintf(stderr, MOCK "digitalWrite(pin=%d val=%d)\n", pin, val); + mockverbose("digitalWrite(pin=%d val=%d)\n", pin, val); #endif } void analogWrite(uint8_t pin, int val) { #ifdef DEBUG_ESP_CORE - fprintf(stderr, MOCK "analogWrite(pin=%d, val=%d\n", pin, val); + mockverbose("analogWrite(pin=%d, val=%d\n", pin, val); #endif } @@ -74,14 +74,14 @@ int analogRead(uint8_t pin) void analogWriteRange(uint32_t range) { #ifdef DEBUG_ESP_CORE - fprintf(stderr, MOCK "analogWriteRange(range=%d)\n", range); + mockverbose("analogWriteRange(range=%d)\n", range); #endif } int digitalRead(uint8_t pin) { #ifdef DEBUG_ESP_CORE - fprintf(stderr, MOCK "digitalRead(%d)\n", pin); + mockverbose("digitalRead(%d)\n", pin); #endif // pin 0 is most likely a low active input diff --git a/tests/host/common/MockEEPROM.cpp b/tests/host/common/MockEEPROM.cpp index 6357c73dd2..5ccc7f908c 100644 --- a/tests/host/common/MockEEPROM.cpp +++ b/tests/host/common/MockEEPROM.cpp @@ -58,7 +58,7 @@ void EEPROMClass::begin(size_t size) if ( (_fd = open(EEPROM_FILE_NAME, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)) == -1 || ftruncate(_fd, size) == -1) { - fprintf(stderr, MOCK "EEPROM: cannot open/create '%s' for r/w: %s\n\r", EEPROM_FILE_NAME, strerror(errno)); + mockverbose("EEPROM: cannot open/create '%s' for r/w: %s\n\r", EEPROM_FILE_NAME, strerror(errno)); _fd = -1; } } @@ -78,16 +78,16 @@ uint8_t EEPROMClass::read (int x) { char c = 0; if (pread(_fd, &c, 1, x) != 1) - fprintf(stderr, MOCK "eeprom: %s\n\r", strerror(errno)); + mockverbose("eeprom: %s\n\r", strerror(errno)); return c; } void EEPROMClass::write (int x, uint8_t c) { if (x > (int)_size) - fprintf(stderr, MOCK "### eeprom beyond\r\n"); + mockverbose("### eeprom beyond\r\n"); else if (pwrite(_fd, &c, 1, x) != 1) - fprintf(stderr, MOCK "eeprom: %s\n\r", strerror(errno)); + mockverbose("eeprom: %s\n\r", strerror(errno)); } #if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_EEPROM) diff --git a/tests/host/common/MockEsp.cpp b/tests/host/common/MockEsp.cpp index 7410c4cbbf..244debf932 100644 --- a/tests/host/common/MockEsp.cpp +++ b/tests/host/common/MockEsp.cpp @@ -81,7 +81,7 @@ EspClass ESP; void EspClass::restart () { - fprintf(stderr, MOCK "Esp.restart(): exiting\n"); + mockverbose("Esp.restart(): exiting\n"); exit(EXIT_SUCCESS); } diff --git a/tests/host/common/MockTools.cpp b/tests/host/common/MockTools.cpp index ca257891b2..00e20b3e8f 100644 --- a/tests/host/common/MockTools.cpp +++ b/tests/host/common/MockTools.cpp @@ -59,7 +59,7 @@ extern "C" void configTime(long timezone, int daylightOffset_sec, (void)server2; (void)server3; - fprintf(stderr, MOCK "configTime: TODO (tz=%ldH offset=%dS) (time will be host's)\n", timezone, daylightOffset_sec); + mockverbose("configTime: TODO (tz=%ldH offset=%dS) (time will be host's)\n", timezone, daylightOffset_sec); } void stack_thunk_add_ref() { } diff --git a/tests/host/common/MockWiFiServer.cpp b/tests/host/common/MockWiFiServer.cpp index 1b5ef62604..67582371e5 100644 --- a/tests/host/common/MockWiFiServer.cpp +++ b/tests/host/common/MockWiFiServer.cpp @@ -50,7 +50,7 @@ WiFiServer::WiFiServer (const IPAddress& addr, uint16_t port) if (port < 1024) { int newport = port + 9000; - fprintf(stderr, MOCK "WiFiServer port: %d -> %d\n", port, newport); + mockverbose("WiFiServer port: %d -> %d\n", port, newport); port = newport; } _port = port; @@ -61,7 +61,7 @@ WiFiServer::WiFiServer (uint16_t port) if (port < 1024) { int newport = port + 9000; - fprintf(stderr, MOCK "WiFiServer port: %d -> %d\n", port, newport); + mockverbose("WiFiServer port: %d -> %d\n", port, newport); port = newport; } _port = port; diff --git a/tests/host/common/MockWiFiServerSocket.cpp b/tests/host/common/MockWiFiServerSocket.cpp index 5e83c37179..4f094f0a5d 100644 --- a/tests/host/common/MockWiFiServerSocket.cpp +++ b/tests/host/common/MockWiFiServerSocket.cpp @@ -117,7 +117,7 @@ size_t WiFiServer::write (uint8_t c) size_t WiFiServer::write (const uint8_t *buf, size_t size) { - fprintf(stderr, MOCK "todo: WiFiServer::write(%p, %zd)\n", buf, size); + mockverbose("todo: WiFiServer::write(%p, %zd)\n", buf, size); return 0; } diff --git a/tests/host/common/UdpContextSocket.cpp b/tests/host/common/UdpContextSocket.cpp index a1135552c2..6f2cfcbdb8 100644 --- a/tests/host/common/UdpContextSocket.cpp +++ b/tests/host/common/UdpContextSocket.cpp @@ -44,7 +44,7 @@ int mockUDPSocket () int s; if ((s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1 || fcntl(s, F_SETFL, O_NONBLOCK) == -1) { - fprintf(stderr, MOCK "UDP socket: %s", strerror(errno)); + mockverbose("UDP socket: %s", strerror(errno)); exit(EXIT_FAILURE); } return s; @@ -54,10 +54,10 @@ bool mockUDPListen (int sock, uint32_t dstaddr, uint16_t port, uint32_t mcast) { int optval = 1; if (setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, &optval, sizeof(optval)) == -1) - fprintf(stderr, MOCK "SO_REUSEPORT failed\n"); + mockverbose("SO_REUSEPORT failed\n"); optval = 1; if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) == -1) - fprintf(stderr, MOCK "SO_REUSEADDR failed\n"); + mockverbose("SO_REUSEADDR failed\n"); struct sockaddr_in servaddr; memset(&servaddr, 0, sizeof(servaddr)); @@ -71,11 +71,11 @@ bool mockUDPListen (int sock, uint32_t dstaddr, uint16_t port, uint32_t mcast) // Bind the socket with the server address if (bind(sock, (const struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) { - fprintf(stderr, MOCK "UDP bind on port %d failed: %s\n", port, strerror(errno)); + mockverbose("UDP bind on port %d failed: %s\n", port, strerror(errno)); return false; } else - fprintf(stderr, MOCK "UDP server on port %d (sock=%d)\n", (int)port, sock); + mockverbose("UDP server on port %d (sock=%d)\n", (int)port, sock); if (mcast) { @@ -94,14 +94,14 @@ bool mockUDPListen (int sock, uint32_t dstaddr, uint16_t port, uint32_t mcast) #else if (setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, host_interface, strlen(host_interface)) == -1) #endif - fprintf(stderr, MOCK "UDP multicast: can't setup bind/output on interface %s: %s\n", host_interface, strerror(errno)); + mockverbose("UDP multicast: can't setup bind/output on interface %s: %s\n", host_interface, strerror(errno)); if (setsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF, &mreq.imr_interface, sizeof(struct in_addr)) == -1) - fprintf(stderr, MOCK "UDP multicast: can't setup bind/input on interface %s: %s\n", host_interface, strerror(errno)); + mockverbose("UDP multicast: can't setup bind/input on interface %s: %s\n", host_interface, strerror(errno)); } if (setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) { - fprintf(stderr, MOCK "can't join multicast group addr %08x\n", (int)mcast); + mockverbose("can't join multicast group addr %08x\n", (int)mcast); return false; } } @@ -120,7 +120,7 @@ size_t mockUDPFillInBuf (int sock, char* ccinbuf, size_t& ccinbufsize, uint8_t& if (ret == -1) { if (errno != EAGAIN) - fprintf(stderr, MOCK "UDPContext::(read/peek): filling buffer for %zd bytes: %s\n", maxread, strerror(errno)); + mockverbose("UDPContext::(read/peek): filling buffer for %zd bytes: %s\n", maxread, strerror(errno)); ret = 0; } @@ -131,7 +131,7 @@ size_t mockUDPFillInBuf (int sock, char* ccinbuf, size_t& ccinbufsize, uint8_t& memcpy(&addr[0], &(((sockaddr_in*)&addrbuf)->sin_addr.s_addr), addrsize = 4); else { - fprintf(stderr, MOCK "TODO UDP+IPv6\n"); + mockverbose("TODO UDP+IPv6\n"); exit(EXIT_FAILURE); } } @@ -142,7 +142,7 @@ size_t mockUDPFillInBuf (int sock, char* ccinbuf, size_t& ccinbufsize, uint8_t& size_t mockUDPPeekBytes (int sock, char* dst, size_t usersize, int timeout_ms, char* ccinbuf, size_t& ccinbufsize) { if (usersize > CCBUFSIZE) - fprintf(stderr, MOCK "CCBUFSIZE(%d) should be increased by %zd bytes (-> %zd)\n", CCBUFSIZE, usersize - CCBUFSIZE, usersize); + mockverbose("CCBUFSIZE(%d) should be increased by %zd bytes (-> %zd)\n", CCBUFSIZE, usersize - CCBUFSIZE, usersize); size_t retsize = 0; if (ccinbufsize) @@ -180,12 +180,12 @@ size_t mockUDPWrite (int sock, const uint8_t* data, size_t size, int timeout_ms, int ret = ::sendto(sock, data, size, 0/*flags*/, (const sockaddr*)&peer, sizeof(peer)); if (ret == -1) { - fprintf(stderr, MOCK "UDPContext::write: write(%d): %s\n", sock, strerror(errno)); + mockverbose("UDPContext::write: write(%d): %s\n", sock, strerror(errno)); return 0; } if (ret != (int)size) { - fprintf(stderr, MOCK "UDPContext::write: short write (%d < %zd) (TODO)\n", ret, size); + mockverbose("UDPContext::write: short write (%d < %zd) (TODO)\n", ret, size); exit(EXIT_FAILURE); } diff --git a/tests/host/common/include/ClientContext.h b/tests/host/common/include/ClientContext.h index 0ed08cb7b0..f9e4a9e3d5 100644 --- a/tests/host/common/include/ClientContext.h +++ b/tests/host/common/include/ClientContext.h @@ -54,7 +54,7 @@ class ClientContext if (_sock >= 0) { ::close(_sock); - printf(MOCK "socket %d closed\n", _sock); + mockverbose("socket %d closed\n", _sock); } _sock = -1; return ERR_ABRT; @@ -114,12 +114,12 @@ class ClientContext void setNoDelay(bool nodelay) { - fprintf(stderr, MOCK "TODO setNoDelay(%d)\n", (int)nodelay); + mockverbose("TODO setNoDelay(%d)\n", (int)nodelay); } bool getNoDelay() const { - fprintf(stderr, MOCK "TODO getNoDelay()\n"); + mockverbose("TODO getNoDelay()\n"); return false; } @@ -135,25 +135,25 @@ class ClientContext uint32_t getRemoteAddress() const { - fprintf(stderr, MOCK "TODO getRemoteAddress()\n"); + mockverbose("TODO getRemoteAddress()\n"); return 0; } uint16_t getRemotePort() const { - fprintf(stderr, MOCK "TODO getRemotePort()\n"); + mockverbose("TODO getRemotePort()\n"); return 0; } uint32_t getLocalAddress() const { - fprintf(stderr, MOCK "TODO getLocalAddress()\n"); + mockverbose("TODO getLocalAddress()\n"); return 0; } uint16_t getLocalPort() const { - fprintf(stderr, MOCK "TODO getLocalPort()\n"); + mockverbose("TODO getLocalPort()\n"); return 0; } @@ -208,7 +208,7 @@ class ClientContext void discard_received() { - fprintf(stderr, MOCK "TODO: ClientContext::discard_received()\n"); + mockverbose("TODO: ClientContext::discard_received()\n"); } bool wait_until_sent(int max_wait_ms = WIFICLIENT_MAX_FLUSH_WAIT_MS) @@ -258,42 +258,42 @@ class ClientContext void keepAlive (uint16_t idle_sec = TCP_DEFAULT_KEEPALIVE_IDLE_SEC, uint16_t intv_sec = TCP_DEFAULT_KEEPALIVE_INTERVAL_SEC, uint8_t count = TCP_DEFAULT_KEEPALIVE_COUNT) { - fprintf(stderr, MOCK "TODO ClientContext::keepAlive()\n"); + mockverbose("TODO ClientContext::keepAlive()\n"); } bool isKeepAliveEnabled () const { - fprintf(stderr, MOCK "TODO ClientContext::isKeepAliveEnabled()\n"); + mockverbose("TODO ClientContext::isKeepAliveEnabled()\n"); return false; } uint16_t getKeepAliveIdle () const { - fprintf(stderr, MOCK "TODO ClientContext::getKeepAliveIdle()\n"); + mockverbose("TODO ClientContext::getKeepAliveIdle()\n"); return 0; } uint16_t getKeepAliveInterval () const { - fprintf(stderr, MOCK "TODO ClientContext::getKeepAliveInternal()\n"); + mockverbose("TODO ClientContext::getKeepAliveInternal()\n"); return 0; } uint8_t getKeepAliveCount () const { - fprintf(stderr, MOCK "TODO ClientContext::getKeepAliveCount()\n"); + mockverbose("TODO ClientContext::getKeepAliveCount()\n"); return 0; } bool getSync () const { - fprintf(stderr, MOCK "TODO ClientContext::getSync()\n"); + mockverbose("TODO ClientContext::getSync()\n"); return _sync; } void setSync (bool sync) { - fprintf(stderr, MOCK "TODO ClientContext::setSync()\n"); + mockverbose("TODO ClientContext::setSync()\n"); _sync = sync; } diff --git a/tests/host/common/include/UdpContext.h b/tests/host/common/include/UdpContext.h index ebeedb0907..ab7c2a97d6 100644 --- a/tests/host/common/include/UdpContext.h +++ b/tests/host/common/include/UdpContext.h @@ -89,7 +89,7 @@ class UdpContext void setMulticastTTL(int ttl) { (void)ttl; - //fprintf(stderr, MOCK "TODO: UdpContext::setMulticastTTL\n"); + //mockverbose("TODO: UdpContext::setMulticastTTL\n"); } // warning: handler is called from tcp stack context @@ -112,7 +112,7 @@ class UdpContext { if (!isValidOffset(pos)) { - fprintf(stderr, MOCK "UDPContext::seek too far (%zd >= %zd)\n", pos, _inbufsize); + mockverbose("UDPContext::seek too far (%zd >= %zd)\n", pos, _inbufsize); exit(EXIT_FAILURE); } mockUDPSwallow(pos, _inbuf, _inbufsize); @@ -134,13 +134,13 @@ class UdpContext uint32_t getDestAddress() { - fprintf(stderr, MOCK "TODO: implement UDP getDestAddress\n"); + mockverbose("TODO: implement UDP getDestAddress\n"); return 0; //ip_hdr* iphdr = GET_IP_HDR(_rx_buf); } uint16_t getLocalPort() { - fprintf(stderr, MOCK "TODO: implement UDP getLocalPort\n"); + mockverbose("TODO: implement UDP getLocalPort\n"); return 0; // } @@ -175,7 +175,7 @@ class UdpContext void flush() { - //fprintf(stderr, MOCK "UdpContext::flush() does not follow arduino's flush concept\n"); + //mockverbose("UdpContext::flush() does not follow arduino's flush concept\n"); //exit(EXIT_FAILURE); // would be: _inbufsize = 0; @@ -185,7 +185,7 @@ class UdpContext { if (size + _outbufsize > sizeof _outbuf) { - fprintf(stderr, MOCK "UdpContext::append: increase CCBUFSIZE (%d -> %zd)\n", CCBUFSIZE, (size + _outbufsize)); + mockverbose("UdpContext::append: increase CCBUFSIZE (%d -> %zd)\n", CCBUFSIZE, (size + _outbufsize)); exit(EXIT_FAILURE); } @@ -225,7 +225,7 @@ class UdpContext //ip4_addr_set_u32(&ip_2_ip4(_dst), *(uint32_t*)addr); } else - fprintf(stderr, MOCK "TODO unhandled udp address of size %d\n", (int)addrsize); + mockverbose("TODO unhandled udp address of size %d\n", (int)addrsize); } int _sock = -1; diff --git a/tests/host/common/mock.h b/tests/host/common/mock.h index 6cfafc5ff7..8dd743e100 100644 --- a/tests/host/common/mock.h +++ b/tests/host/common/mock.h @@ -77,6 +77,8 @@ extern "C" { int ets_printf (const char* fmt, ...) __attribute__ ((format (printf, 1, 2))); #define os_printf_plus printf +int mockverbose (const char* fmt, ...) __attribute__ ((format (printf, 1, 2))); + extern const char* host_interface; // cmdline parameter #define NO_GLOBAL_BINDING 0xffffffff diff --git a/tests/host/common/user_interface.cpp b/tests/host/common/user_interface.cpp index 13d53ff06f..ac33e209ed 100644 --- a/tests/host/common/user_interface.cpp +++ b/tests/host/common/user_interface.cpp @@ -216,7 +216,7 @@ wifi_event_handler_cb_t wifi_event_handler_cb_emu = nullptr; void wifi_set_event_handler_cb (wifi_event_handler_cb_t cb) { wifi_event_handler_cb_emu = cb; - fprintf(stderr, MOCK "TODO: wifi_set_event_handler_cb set\n"); + mockverbose("TODO: wifi_set_event_handler_cb set\n"); } bool wifi_set_ip_info (uint8 if_index, struct ip_info *info) From 38128083dc18f7f031fb798103f6e8081f70cf91 Mon Sep 17 00:00:00 2001 From: david gauchard Date: Tue, 5 Mar 2019 02:07:09 +0100 Subject: [PATCH 4/7] uart emulation on tty: check more return values --- tests/host/common/ArduinoMain.cpp | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/tests/host/common/ArduinoMain.cpp b/tests/host/common/ArduinoMain.cpp index 14a04856b3..6756046e34 100644 --- a/tests/host/common/ArduinoMain.cpp +++ b/tests/host/common/ArduinoMain.cpp @@ -63,8 +63,16 @@ static int mock_start_uart(void) { struct termios settings; - if (!isatty(STDIN)) return 0; - if (tcgetattr(STDIN, &initial_settings) < 0) return -1; + if (!isatty(STDIN)) + { + perror("isatty(STDIN)"); + return -1; + } + if (tcgetattr(STDIN, &initial_settings) < 0) + { + perror("tcgetattr(STDIN)"); + return -1; + } settings = initial_settings; settings.c_lflag &= ~(ignore_sigint ? ISIG : 0); settings.c_lflag &= ~(ECHO | ICANON); @@ -72,7 +80,11 @@ static int mock_start_uart(void) settings.c_oflag |= (ONLCR); settings.c_cc[VMIN] = 0; settings.c_cc[VTIME] = 0; - if (tcsetattr(STDIN, TCSANOW, &settings) < 0) return -2; + if (tcsetattr(STDIN, TCSANOW, &settings) < 0) + { + perror("tcsetattr(STDIN)"); + return -1; + } restore_tty = true; return 0; } @@ -82,10 +94,13 @@ static int mock_stop_uart(void) if (!restore_tty) return 0; if (!isatty(STDIN)) { perror("isatty(STDIN)"); - //system("stty sane"); <- same error message "Inappropriate ioctl for device" - return 0; + return -1; + } + if (tcsetattr(STDIN, TCSANOW, &initial_settings) < 0) + { + perror("tcsetattr(STDIN)"); + return -1; } - if (tcsetattr(STDIN, TCSANOW, &initial_settings) < 0) return -1; printf("\e[?25h"); // show cursor return (0); } From d5a4ce706818f8755f553140b89a4058f40f114c Mon Sep 17 00:00:00 2001 From: david gauchard Date: Tue, 5 Mar 2019 02:12:34 +0100 Subject: [PATCH 5/7] mockverbose: use MOCK macro --- tests/host/common/ArduinoMain.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/host/common/ArduinoMain.cpp b/tests/host/common/ArduinoMain.cpp index 6756046e34..a61f05491d 100644 --- a/tests/host/common/ArduinoMain.cpp +++ b/tests/host/common/ArduinoMain.cpp @@ -55,7 +55,7 @@ int mockverbose (const char* fmt, ...) va_list ap; va_start(ap, fmt); if (mockdebug) - return fprintf(stderr, "MOCK: ") + vfprintf(stderr, fmt, ap); + return fprintf(stderr, MOCK) + vfprintf(stderr, fmt, ap); return 0; } From 06ee7b2823dcb015cf60ac84c33bcaa12f25c996 Mon Sep 17 00:00:00 2001 From: David Gauchard Date: Tue, 5 Mar 2019 12:42:49 +0100 Subject: [PATCH 6/7] emulation on host: tcp/udp port shifting: new cmdline option --- tests/host/common/ArduinoMain.cpp | 22 ++++++++++++++++++---- tests/host/common/MockWiFiServer.cpp | 12 ------------ tests/host/common/MockWiFiServerSocket.cpp | 12 +++++++++++- tests/host/common/UdpContextSocket.cpp | 14 +++++++++++++- tests/host/common/mock.h | 2 ++ 5 files changed, 44 insertions(+), 18 deletions(-) diff --git a/tests/host/common/ArduinoMain.cpp b/tests/host/common/ArduinoMain.cpp index a61f05491d..753a961a33 100644 --- a/tests/host/common/ArduinoMain.cpp +++ b/tests/host/common/ArduinoMain.cpp @@ -39,12 +39,15 @@ #include #include +#define MOCK_PORT_SHIFTER 9000 + bool user_exit = false; const char* host_interface = nullptr; size_t spiffs_kb = 1024; bool ignore_sigint = false; bool restore_tty = false; bool mockdebug = false; +int mock_port_shifter = MOCK_PORT_SHIFTER; #define STDIN STDIN_FILENO @@ -119,13 +122,14 @@ void help (const char* argv0, int exitcode) " -h\n" " -i - use this interface for IP address\n" " -l - bind tcp/udp servers to interface only (not 0.0.0.0)\n" + " -s - port shifter (default: %d, when root: 0)\n" " -c - ignore CTRL-C (send it via Serial)\n" " -f - no throttle (possibly 100%%CPU)\n" " -b - blocking tty/mocked-uart (default: not blocking tty)\n" " -S - spiffs size in KBytes (default: %zd)\n" " -v - mock verbose\n" " (negative value will force mismatched size)\n" - , argv0, spiffs_kb); + , argv0, MOCK_PORT_SHIFTER, spiffs_kb); exit(exitcode); } @@ -139,6 +143,7 @@ static struct option options[] = { "verbose", no_argument, NULL, 'v' }, { "interface", required_argument, NULL, 'i' }, { "spiffskb", required_argument, NULL, 'S' }, + { "portshifter", required_argument, NULL, 's' }, }; void cleanup () @@ -162,14 +167,18 @@ void control_c (int sig) int main (int argc, char* const argv []) { - signal(SIGINT, control_c); - bool fast = false; bool blocking_uart = false; + signal(SIGINT, control_c); + if (geteuid() == 0) + mock_port_shifter = 0; + else + mock_port_shifter = MOCK_PORT_SHIFTER; + for (;;) { - int n = getopt_long(argc, argv, "hlcfbvi:S:", options, NULL); + int n = getopt_long(argc, argv, "hlcfbvi:S:s:", options, NULL); if (n < 0) break; switch (n) @@ -183,6 +192,9 @@ int main (int argc, char* const argv []) case 'l': global_ipv4_netfmt = NO_GLOBAL_BINDING; break; + case 's': + mock_port_shifter = atoi(optarg); + break; case 'c': ignore_sigint = true; break; @@ -203,6 +215,8 @@ int main (int argc, char* const argv []) } } + mockverbose("server port shifter: %d\n", mock_port_shifter); + if (spiffs_kb) { String name = argv[0]; diff --git a/tests/host/common/MockWiFiServer.cpp b/tests/host/common/MockWiFiServer.cpp index 67582371e5..6b8b7e83c5 100644 --- a/tests/host/common/MockWiFiServer.cpp +++ b/tests/host/common/MockWiFiServer.cpp @@ -47,23 +47,11 @@ extern "C" const ip_addr_t ip_addr_any = IPADDR4_INIT(IPADDR_ANY); WiFiServer::WiFiServer (const IPAddress& addr, uint16_t port) { (void)addr; - if (port < 1024) - { - int newport = port + 9000; - mockverbose("WiFiServer port: %d -> %d\n", port, newport); - port = newport; - } _port = port; } WiFiServer::WiFiServer (uint16_t port) { - if (port < 1024) - { - int newport = port + 9000; - mockverbose("WiFiServer port: %d -> %d\n", port, newport); - port = newport; - } _port = port; } diff --git a/tests/host/common/MockWiFiServerSocket.cpp b/tests/host/common/MockWiFiServerSocket.cpp index 4f094f0a5d..9a3ad184c2 100644 --- a/tests/host/common/MockWiFiServerSocket.cpp +++ b/tests/host/common/MockWiFiServerSocket.cpp @@ -67,8 +67,18 @@ void WiFiServer::begin (uint16_t port) void WiFiServer::begin () { int sock; + int mockport; struct sockaddr_in server; + mockport = _port; + if (mockport < 1024 && mock_port_shifter) + { + mockport += mock_port_shifter; + fprintf(stderr, MOCK "=====> WiFiServer port: %d shifted to %d (use option -s) <=====\n", _port, mockport); + } + else + fprintf(stderr, MOCK "=====> WiFiServer port: %d <=====\n", mockport); + if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror(MOCK "socket()"); @@ -83,7 +93,7 @@ void WiFiServer::begin () } server.sin_family = AF_INET; - server.sin_port = htons(_port); + server.sin_port = htons(mockport); server.sin_addr.s_addr = htonl(INADDR_ANY); if (bind(sock, (struct sockaddr*)&server, sizeof(server)) == -1) { diff --git a/tests/host/common/UdpContextSocket.cpp b/tests/host/common/UdpContextSocket.cpp index 6f2cfcbdb8..cb238d6ae7 100644 --- a/tests/host/common/UdpContextSocket.cpp +++ b/tests/host/common/UdpContextSocket.cpp @@ -52,7 +52,19 @@ int mockUDPSocket () bool mockUDPListen (int sock, uint32_t dstaddr, uint16_t port, uint32_t mcast) { - int optval = 1; + int optval; + int mockport; + + mockport = port; + if (mockport < 1024 && mock_port_shifter) + { + mockport += mock_port_shifter; + fprintf(stderr, MOCK "=====> UdpServer port: %d shifted to %d (use option -s) <=====\n", port, mockport); + } + else + fprintf(stderr, MOCK "=====> UdpServer port: %d <=====\n", mockport); + + optval = 1; if (setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, &optval, sizeof(optval)) == -1) mockverbose("SO_REUSEPORT failed\n"); optval = 1; diff --git a/tests/host/common/mock.h b/tests/host/common/mock.h index 8dd743e100..2db914d783 100644 --- a/tests/host/common/mock.h +++ b/tests/host/common/mock.h @@ -81,6 +81,8 @@ int mockverbose (const char* fmt, ...) __attribute__ ((format (printf, 1, 2))); extern const char* host_interface; // cmdline parameter +extern int mock_port_shifter; + #define NO_GLOBAL_BINDING 0xffffffff extern uint32_t global_ipv4_netfmt; // selected interface addresse to bind to From 049cec128d2747f82c8e1631e86b191185603975 Mon Sep 17 00:00:00 2001 From: David Gauchard Date: Tue, 5 Mar 2019 12:43:59 +0100 Subject: [PATCH 7/7] emulation on host: restore non optional important message --- tests/host/common/ArduinoMain.cpp | 12 +++++----- tests/host/common/ClientContextSocket.cpp | 12 +++++----- tests/host/common/HostWiring.cpp | 26 +++++++++----------- tests/host/common/MockEEPROM.cpp | 8 +++---- tests/host/common/MockWiFiServerSocket.cpp | 3 ++- tests/host/common/UdpContextSocket.cpp | 28 +++++++++++----------- 6 files changed, 43 insertions(+), 46 deletions(-) diff --git a/tests/host/common/ArduinoMain.cpp b/tests/host/common/ArduinoMain.cpp index 753a961a33..dba9ab30fb 100644 --- a/tests/host/common/ArduinoMain.cpp +++ b/tests/host/common/ArduinoMain.cpp @@ -68,12 +68,12 @@ static int mock_start_uart(void) if (!isatty(STDIN)) { - perror("isatty(STDIN)"); + perror("setting tty in raw mode: isatty(STDIN)"); return -1; } if (tcgetattr(STDIN, &initial_settings) < 0) { - perror("tcgetattr(STDIN)"); + perror("setting tty in raw mode: tcgetattr(STDIN)"); return -1; } settings = initial_settings; @@ -85,7 +85,7 @@ static int mock_start_uart(void) settings.c_cc[VTIME] = 0; if (tcsetattr(STDIN, TCSANOW, &settings) < 0) { - perror("tcsetattr(STDIN)"); + perror("setting tty in raw mode: tcsetattr(STDIN)"); return -1; } restore_tty = true; @@ -96,12 +96,12 @@ static int mock_stop_uart(void) { if (!restore_tty) return 0; if (!isatty(STDIN)) { - perror("isatty(STDIN)"); + perror("restoring tty: isatty(STDIN)"); return -1; } if (tcsetattr(STDIN, TCSANOW, &initial_settings) < 0) { - perror("tcsetattr(STDIN)"); + perror("restoring tty: tcsetattr(STDIN)"); return -1; } printf("\e[?25h"); // show cursor @@ -158,7 +158,7 @@ void control_c (int sig) if (user_exit) { - mockverbose("stuck, killing\n"); + fprintf(stderr, MOCK "stuck, killing\n"); cleanup(); exit(1); } diff --git a/tests/host/common/ClientContextSocket.cpp b/tests/host/common/ClientContextSocket.cpp index 167855c291..30ba390385 100644 --- a/tests/host/common/ClientContextSocket.cpp +++ b/tests/host/common/ClientContextSocket.cpp @@ -43,7 +43,7 @@ int mockSockSetup (int sock) { if (fcntl(sock, F_SETFL, O_NONBLOCK) == -1) { - mockverbose("socket fcntl(O_NONBLOCK): %s\n", strerror(errno)); + perror("socket fcntl(O_NONBLOCK)"); close(sock); return -1; } @@ -52,7 +52,7 @@ int mockSockSetup (int sock) int i = 1; if (setsockopt(sock, SOL_SOCKET, SO_NOSIGPIPE, &i, sizeof i) == -1) { - mockverbose("sockopt(SO_NOSIGPIPE)(macOS): %s\n", strerror(errno)); + perror("sockopt(SO_NOSIGPIPE)(macOS)"); close(sock); return -1; } @@ -96,7 +96,7 @@ ssize_t mockFillInBuf (int sock, char* ccinbuf, size_t& ccinbufsize) { if (errno != EAGAIN) { - mockverbose("ClientContext::(read/peek fd=%i): filling buffer for %zd bytes: %s\n", sock, maxread, strerror(errno)); + fprintf(stderr, MOCK "ClientContext::(read/peek fd=%i): filling buffer for %zd bytes: %s\n", sock, maxread, strerror(errno)); return -1; } ret = 0; @@ -159,7 +159,7 @@ ssize_t mockWrite (int sock, const uint8_t* data, size_t size, int timeout_ms) int ret = poll(&p, 1, timeout_ms); if (ret == -1) { - mockverbose("ClientContext::write: poll(%d): %s\n", sock, strerror(errno)); + fprintf(stderr, MOCK "ClientContext::write: poll(%d): %s\n", sock, strerror(errno)); return 0; } if (ret) @@ -171,12 +171,12 @@ ssize_t mockWrite (int sock, const uint8_t* data, size_t size, int timeout_ms) #endif if (ret == -1) { - mockverbose("ClientContext::write(%d): %s\n", sock, strerror(errno)); + fprintf(stderr, MOCK "ClientContext::write(%d): %s\n", sock, strerror(errno)); return -1; } if (ret != (int)size) { - mockverbose("ClientContext::write: short write (%d < %zd) (TODO)\n", ret, size); + fprintf(stderr, MOCK "ClientContext::write: short write (%d < %zd) (FIXME poll loop TODO)\n", ret, size); exit(EXIT_FAILURE); } } diff --git a/tests/host/common/HostWiring.cpp b/tests/host/common/HostWiring.cpp index 7ec0cd3e50..765d4297b6 100644 --- a/tests/host/common/HostWiring.cpp +++ b/tests/host/common/HostWiring.cpp @@ -31,6 +31,12 @@ #include +#ifdef DEBUG_ESP_CORE +#define VERBOSE(x...) fprintf(stderr, MOCK x) +#else +#define VERBOSE(x...) mockverbose(x) +#endif + void pinMode (uint8_t pin, uint8_t mode) { #define xxx(mode) case mode: m=STRHELPER(mode); break @@ -46,23 +52,17 @@ void pinMode (uint8_t pin, uint8_t mode) case WAKEUP_PULLDOWN: m="WAKEUP_PULLDOWN"; break; default: m="(special)"; } -#ifdef DEBUG_ESP_CORE - mockverbose("gpio%d: mode='%s'\n", pin, m); -#endif + VERBOSE("gpio%d: mode='%s'\n", pin, m); } void digitalWrite(uint8_t pin, uint8_t val) { -#ifdef DEBUG_ESP_CORE - mockverbose("digitalWrite(pin=%d val=%d)\n", pin, val); -#endif + VERBOSE("digitalWrite(pin=%d val=%d)\n", pin, val); } void analogWrite(uint8_t pin, int val) { -#ifdef DEBUG_ESP_CORE - mockverbose("analogWrite(pin=%d, val=%d\n", pin, val); -#endif + VERBOSE("analogWrite(pin=%d, val=%d\n", pin, val); } int analogRead(uint8_t pin) @@ -73,16 +73,12 @@ int analogRead(uint8_t pin) void analogWriteRange(uint32_t range) { -#ifdef DEBUG_ESP_CORE - mockverbose("analogWriteRange(range=%d)\n", range); -#endif + VERBOSE("analogWriteRange(range=%d)\n", range); } int digitalRead(uint8_t pin) { -#ifdef DEBUG_ESP_CORE - mockverbose("digitalRead(%d)\n", pin); -#endif + VERBOSE("digitalRead(%d)\n", pin); // pin 0 is most likely a low active input return pin ? 0 : 1; diff --git a/tests/host/common/MockEEPROM.cpp b/tests/host/common/MockEEPROM.cpp index 5ccc7f908c..6357c73dd2 100644 --- a/tests/host/common/MockEEPROM.cpp +++ b/tests/host/common/MockEEPROM.cpp @@ -58,7 +58,7 @@ void EEPROMClass::begin(size_t size) if ( (_fd = open(EEPROM_FILE_NAME, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)) == -1 || ftruncate(_fd, size) == -1) { - mockverbose("EEPROM: cannot open/create '%s' for r/w: %s\n\r", EEPROM_FILE_NAME, strerror(errno)); + fprintf(stderr, MOCK "EEPROM: cannot open/create '%s' for r/w: %s\n\r", EEPROM_FILE_NAME, strerror(errno)); _fd = -1; } } @@ -78,16 +78,16 @@ uint8_t EEPROMClass::read (int x) { char c = 0; if (pread(_fd, &c, 1, x) != 1) - mockverbose("eeprom: %s\n\r", strerror(errno)); + fprintf(stderr, MOCK "eeprom: %s\n\r", strerror(errno)); return c; } void EEPROMClass::write (int x, uint8_t c) { if (x > (int)_size) - mockverbose("### eeprom beyond\r\n"); + fprintf(stderr, MOCK "### eeprom beyond\r\n"); else if (pwrite(_fd, &c, 1, x) != 1) - mockverbose("eeprom: %s\n\r", strerror(errno)); + fprintf(stderr, MOCK "eeprom: %s\n\r", strerror(errno)); } #if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_EEPROM) diff --git a/tests/host/common/MockWiFiServerSocket.cpp b/tests/host/common/MockWiFiServerSocket.cpp index 9a3ad184c2..c791577d0f 100644 --- a/tests/host/common/MockWiFiServerSocket.cpp +++ b/tests/host/common/MockWiFiServerSocket.cpp @@ -127,7 +127,8 @@ size_t WiFiServer::write (uint8_t c) size_t WiFiServer::write (const uint8_t *buf, size_t size) { - mockverbose("todo: WiFiServer::write(%p, %zd)\n", buf, size); + fprintf(stderr, MOCK "todo: WiFiServer::write(%p, %zd)\n", buf, size); + exit(EXIT_FAILURE); return 0; } diff --git a/tests/host/common/UdpContextSocket.cpp b/tests/host/common/UdpContextSocket.cpp index cb238d6ae7..83d47053f7 100644 --- a/tests/host/common/UdpContextSocket.cpp +++ b/tests/host/common/UdpContextSocket.cpp @@ -44,7 +44,7 @@ int mockUDPSocket () int s; if ((s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1 || fcntl(s, F_SETFL, O_NONBLOCK) == -1) { - mockverbose("UDP socket: %s", strerror(errno)); + fprintf(stderr, MOCK "UDP socket: %s", strerror(errno)); exit(EXIT_FAILURE); } return s; @@ -66,10 +66,10 @@ bool mockUDPListen (int sock, uint32_t dstaddr, uint16_t port, uint32_t mcast) optval = 1; if (setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, &optval, sizeof(optval)) == -1) - mockverbose("SO_REUSEPORT failed\n"); + fprintf(stderr, MOCK "SO_REUSEPORT failed\n"); optval = 1; if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) == -1) - mockverbose("SO_REUSEADDR failed\n"); + fprintf(stderr, MOCK "SO_REUSEADDR failed\n"); struct sockaddr_in servaddr; memset(&servaddr, 0, sizeof(servaddr)); @@ -78,16 +78,16 @@ bool mockUDPListen (int sock, uint32_t dstaddr, uint16_t port, uint32_t mcast) servaddr.sin_family = AF_INET; //servaddr.sin_addr.s_addr = global_ipv4_netfmt?: dstaddr; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); - servaddr.sin_port = htons(port); + servaddr.sin_port = htons(mockport); // Bind the socket with the server address if (bind(sock, (const struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) { - mockverbose("UDP bind on port %d failed: %s\n", port, strerror(errno)); + fprintf(stderr, MOCK "UDP bind on port %d failed: %s\n", mockport, strerror(errno)); return false; } else - mockverbose("UDP server on port %d (sock=%d)\n", (int)port, sock); + mockverbose("UDP server on port %d (sock=%d)\n", mockport, sock); if (mcast) { @@ -106,14 +106,14 @@ bool mockUDPListen (int sock, uint32_t dstaddr, uint16_t port, uint32_t mcast) #else if (setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, host_interface, strlen(host_interface)) == -1) #endif - mockverbose("UDP multicast: can't setup bind/output on interface %s: %s\n", host_interface, strerror(errno)); + fprintf(stderr, MOCK "UDP multicast: can't setup bind/output on interface %s: %s\n", host_interface, strerror(errno)); if (setsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF, &mreq.imr_interface, sizeof(struct in_addr)) == -1) - mockverbose("UDP multicast: can't setup bind/input on interface %s: %s\n", host_interface, strerror(errno)); + fprintf(stderr, MOCK "UDP multicast: can't setup bind/input on interface %s: %s\n", host_interface, strerror(errno)); } if (setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) { - mockverbose("can't join multicast group addr %08x\n", (int)mcast); + fprintf(stderr, MOCK "can't join multicast group addr %08x\n", (int)mcast); return false; } } @@ -132,7 +132,7 @@ size_t mockUDPFillInBuf (int sock, char* ccinbuf, size_t& ccinbufsize, uint8_t& if (ret == -1) { if (errno != EAGAIN) - mockverbose("UDPContext::(read/peek): filling buffer for %zd bytes: %s\n", maxread, strerror(errno)); + fprintf(stderr, MOCK "UDPContext::(read/peek): filling buffer for %zd bytes: %s\n", maxread, strerror(errno)); ret = 0; } @@ -143,7 +143,7 @@ size_t mockUDPFillInBuf (int sock, char* ccinbuf, size_t& ccinbufsize, uint8_t& memcpy(&addr[0], &(((sockaddr_in*)&addrbuf)->sin_addr.s_addr), addrsize = 4); else { - mockverbose("TODO UDP+IPv6\n"); + fprintf(stderr, MOCK "TODO UDP+IPv6\n"); exit(EXIT_FAILURE); } } @@ -154,7 +154,7 @@ size_t mockUDPFillInBuf (int sock, char* ccinbuf, size_t& ccinbufsize, uint8_t& size_t mockUDPPeekBytes (int sock, char* dst, size_t usersize, int timeout_ms, char* ccinbuf, size_t& ccinbufsize) { if (usersize > CCBUFSIZE) - mockverbose("CCBUFSIZE(%d) should be increased by %zd bytes (-> %zd)\n", CCBUFSIZE, usersize - CCBUFSIZE, usersize); + fprintf(stderr, MOCK "CCBUFSIZE(%d) should be increased by %zd bytes (-> %zd)\n", CCBUFSIZE, usersize - CCBUFSIZE, usersize); size_t retsize = 0; if (ccinbufsize) @@ -192,12 +192,12 @@ size_t mockUDPWrite (int sock, const uint8_t* data, size_t size, int timeout_ms, int ret = ::sendto(sock, data, size, 0/*flags*/, (const sockaddr*)&peer, sizeof(peer)); if (ret == -1) { - mockverbose("UDPContext::write: write(%d): %s\n", sock, strerror(errno)); + fprintf(stderr, MOCK "UDPContext::write: write(%d): %s\n", sock, strerror(errno)); return 0; } if (ret != (int)size) { - mockverbose("UDPContext::write: short write (%d < %zd) (TODO)\n", ret, size); + fprintf(stderr, MOCK "UDPContext::write: short write (%d < %zd) (TODO)\n", ret, size); exit(EXIT_FAILURE); }