From 8ec9f6b430cd59fe7a1af2fb7b79718aad2ec4f1 Mon Sep 17 00:00:00 2001 From: Wolfgang Betz Date: Tue, 21 Nov 2017 08:45:06 +0100 Subject: [PATCH] Correct test `socket_sigio` A call to `TCPSocket::recv(void *data, nsapi_size_t size)` returns, following the mbed documentation, the number of received bytes on success, and a negative error code on failure. So in case of success, the return value depends on both the value of parameter `size` but also on the amount of data already available. This means, that the value returned can be lower than or equal to the `size` of the `data` buffer passed as argument to the call. Therefore, in the cases of `test_tcp_hello_world()` & `find_substring()` (i.e. test `socket_sigio`), the calls to `TCPSocket::recv()` might return from one byte up to `sizeof(buffer) - 1` (i.e. 511) bytes for each single call, while the tests expect to receive the whole response string with a single call. This commit applies a fix to this situation by implementing a receive loop which exits once there is no data anymore available to be read from the socket. --- TESTS/netsocket/socket_sigio/main.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/TESTS/netsocket/socket_sigio/main.cpp b/TESTS/netsocket/socket_sigio/main.cpp index e0949f7e37..853d157a92 100644 --- a/TESTS/netsocket/socket_sigio/main.cpp +++ b/TESTS/netsocket/socket_sigio/main.cpp @@ -67,16 +67,17 @@ bool find_substring(const char *first, const char *last, const char *s_first, co void get_data(TCPSocket* sock){ bool result = false; // Server will respond with HTTP GET's success code - const int ret = sock->recv(buffer, sizeof(buffer) - 1); - if(ret <= 0) - return; - - buffer[ret] = '\0'; + int len = 0; + int ret; + while((ret = sock->recv(buffer+len, sizeof(buffer) - 1 - len)) > 0) { + len += ret; + } + buffer[len] = '\0'; // Find 200 OK HTTP status in reply - bool found_200_ok = find_substring(buffer, buffer + ret, HTTP_OK_STR, HTTP_OK_STR + strlen(HTTP_OK_STR)); + bool found_200_ok = find_substring(buffer, buffer + len, HTTP_OK_STR, HTTP_OK_STR + strlen(HTTP_OK_STR)); // Find "Hello World!" string in reply - bool found_hello = find_substring(buffer, buffer + ret, HTTP_HELLO_STR, HTTP_HELLO_STR + strlen(HTTP_HELLO_STR)); + bool found_hello = find_substring(buffer, buffer + len, HTTP_HELLO_STR, HTTP_HELLO_STR + strlen(HTTP_HELLO_STR)); TEST_ASSERT_TRUE(found_200_ok); TEST_ASSERT_TRUE(found_hello); @@ -85,7 +86,7 @@ void get_data(TCPSocket* sock){ TEST_ASSERT_EQUAL(result, true); - printf("HTTP: Received %d chars from server\r\n", ret); + printf("HTTP: Received %d chars from server\r\n", len); printf("HTTP: Received 200 OK status ... %s\r\n", found_200_ok ? "[OK]" : "[FAIL]"); printf("HTTP: Received '%s' status ... %s\r\n", HTTP_HELLO_STR, found_hello ? "[OK]" : "[FAIL]"); printf("HTTP: Received message:\r\n");