All of lore.kernel.org
 help / color / mirror / Atom feed
* [LTP] [PATCH] syscalls/send02: Improve message
@ 2020-10-16  7:45 Yang Xu
  2020-10-16 12:30 ` Alexey Kodanev
  0 siblings, 1 reply; 5+ messages in thread
From: Yang Xu @ 2020-10-16  7:45 UTC (permalink / raw)
  To: ltp

This case sometimes fails, output as below:

tst_test.c:1250: TINFO: Timeout per run is 0h 05m 00s
send02.c:86: TFAIL: recv() error: EAGAIN/EWOULDBLOCK (11)
send02.c:86: TFAIL: recv() error: EAGAIN/EWOULDBLOCK (11)
send02.c:86: TFAIL: recv() error: EAGAIN/EWOULDBLOCK (11)
send02.c:86: TFAIL: recv() error: EAGAIN/EWOULDBLOCK (11)

From this output, we don't know which subcase fails(tcp,udp,send,sendto).
So add some message and make this clear.

Now this case fails as below:
tst_test.c:1250: TINFO: Timeout per run is 0h 05m 00s
send02.c:124: TINFO: Testing TCP send
send02.c:87: TFAIL: recv() error at the 776 times(expsize 17): EAGAIN/EWOULDBLOCK (11)
send02.c:124: TINFO: Testing UDP send
send02.c:87: TFAIL: recv() error at the 1 times(expsize 16): EAGAIN/EWOULDBLOCK (11)
send02.c:124: TINFO: Testing UDP sendto
send02.c:87: TFAIL: recv() error at the 1 times(expsize 16): EAGAIN/EWOULDBLOCK (11)
send02.c:124: TINFO: Testing UDP sendmsg
send02.c:87: TFAIL: recv() error at the 1 times(expsize 16): EAGAIN/EWOULDBLOCK (11)

Signed-off-by: Yang Xu <xuyang2018.jy@cn.fujitsu.com>
---
 testcases/kernel/syscalls/send/send02.c | 20 +++++++++++---------
 1 file changed, 11 insertions(+), 9 deletions(-)

diff --git a/testcases/kernel/syscalls/send/send02.c b/testcases/kernel/syscalls/send/send02.c
index 5630230fa..719e86a90 100644
--- a/testcases/kernel/syscalls/send/send02.c
+++ b/testcases/kernel/syscalls/send/send02.c
@@ -71,7 +71,7 @@ static void setup(void)
 	memset(sendbuf, 0x42, SENDSIZE);
 }
 
-static int check_recv(int sock, long expsize)
+static int check_recv(int sock, long expsize, int loop)
 {
 	char recvbuf[RECVSIZE] = {0};
 
@@ -83,19 +83,20 @@ static int check_recv(int sock, long expsize)
 			return 1;
 
 		/* unexpected error */
-		tst_res(TFAIL | TTERRNO, "recv() error");
+		tst_res(TFAIL | TTERRNO, "recv() error at the %d times(expsize"
+			" %ld)", loop, expsize);
 		return 0;
 	}
 
 	if (TST_RET < 0) {
-		tst_res(TFAIL | TTERRNO, "Invalid recv() return value %ld",
-			TST_RET);
+		tst_res(TFAIL | TTERRNO, "Invalid recv() return value %ld at"
+			" the %d times(expsize %ld)", TST_RET, loop, expsize);
 		return 0;
 	}
 
 	if (TST_RET != expsize) {
-		tst_res(TFAIL, "recv() read %ld bytes, expected %ld", TST_RET,
-			expsize);
+		tst_res(TFAIL, "recv() read %ld bytes, expected %ld@the"
+			" %d times", TST_RET, expsize, loop);
 		return 0;
 	}
 
@@ -120,6 +121,7 @@ static void run(unsigned int n)
 	struct test_case *tc = testcase_list + n;
 	socklen_t len = sizeof(addr);
 
+	tst_res(TINFO, "Testing %s", tc->name);
 	tst_init_sockaddr_inet_bin(&addr, INADDR_LOOPBACK, 0);
 	listen_sock = SAFE_SOCKET(tc->domain, tc->type, tc->protocol);
 	dst_sock = listen_sock;
@@ -139,19 +141,19 @@ static void run(unsigned int n)
 			dst_sock = SAFE_ACCEPT(listen_sock, NULL, NULL);
 
 		tc->send(sock, sendbuf, SENDSIZE, 0);
-		ret = check_recv(dst_sock, SENDSIZE);
+		ret = check_recv(dst_sock, SENDSIZE, i + 1);
 
 		if (!ret)
 			break;
 
 		tc->send(sock, sendbuf, SENDSIZE, MSG_MORE);
-		ret = check_recv(dst_sock, 0);
+		ret = check_recv(dst_sock, 0, i + 1);
 
 		if (!ret)
 			break;
 
 		tc->send(sock, sendbuf, 1, 0);
-		ret = check_recv(dst_sock, SENDSIZE + 1);
+		ret = check_recv(dst_sock, SENDSIZE + 1, i + 1);
 
 		if (!ret)
 			break;
-- 
2.23.0




^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [LTP] [PATCH] syscalls/send02: Improve message
  2020-10-16  7:45 [LTP] [PATCH] syscalls/send02: Improve message Yang Xu
@ 2020-10-16 12:30 ` Alexey Kodanev
  2020-10-19  8:10   ` Yang Xu
  2020-10-19 11:36   ` [LTP] [PATCH v2] syscalls/send02: Ensure recv() succeed when not using MSG_MORE flag Yang Xu
  0 siblings, 2 replies; 5+ messages in thread
From: Alexey Kodanev @ 2020-10-16 12:30 UTC (permalink / raw)
  To: ltp

On 16.10.2020 10:45, Yang Xu wrote:
> This case sometimes fails, output as below:
> 
> tst_test.c:1250: TINFO: Timeout per run is 0h 05m 00s
> send02.c:86: TFAIL: recv() error: EAGAIN/EWOULDBLOCK (11)
> send02.c:86: TFAIL: recv() error: EAGAIN/EWOULDBLOCK (11)
> send02.c:86: TFAIL: recv() error: EAGAIN/EWOULDBLOCK (11)
> send02.c:86: TFAIL: recv() error: EAGAIN/EWOULDBLOCK (11)
> 
> From this output, we don't know which subcase fails(tcp,udp,send,sendto).
> So add some message and make this clear.
> 
> Now this case fails as below:
> tst_test.c:1250: TINFO: Timeout per run is 0h 05m 00s
> send02.c:124: TINFO: Testing TCP send
> send02.c:87: TFAIL: recv() error at the 776 times(expsize 17): EAGAIN/EWOULDBLOCK (11)

recv(..., MSG_DONTWAIT) can fail with EAGAIN/EWOULDBLOCK at any time,
so it should be a valid error... why it is a failure in the test?

If we expect some message to receive, we should call recv() again
for EAGAIN/EWOULDBLOCK errors. And with MSG_MORE case, just return
immediately, i.e. something like this:

       while (1) {
                TEST(recv(sock, recvbuf, RECVSIZE, MSG_DONTWAIT));

                if (TST_RET == -1) {
                        if (TST_ERR == EAGAIN || TST_ERR == EWOULDBLOCK) {
                                if (expsize)
                                        continue;
                                else
                                        break;
                        }

                        /* unexpected error */
                        tst_res(TFAIL | TTERRNO, "recv() error, expsize %ld, it %d", expsize, i);
                        return 0;
                }

		if (TST_RET < 0) {
                        tst_res(TFAIL | TTERRNO, "Invalid recv() return value %ld",
                                TST_RET);
                        return 0;
                }

                if (!expsize || TST_RET != expsize) {
                        tst_res(TFAIL, "recv() read %ld bytes, expected %ld", TST_RET,
                                expsize);
                        return 0;
                }

		break;
	}


> send02.c:124: TINFO: Testing UDP send
> send02.c:87: TFAIL: recv() error at the 1 times(expsize 16): EAGAIN/EWOULDBLOCK (11)
> send02.c:124: TINFO: Testing UDP sendto
> send02.c:87: TFAIL: recv() error at the 1 times(expsize 16): EAGAIN/EWOULDBLOCK (11)
> send02.c:124: TINFO: Testing UDP sendmsg
> send02.c:87: TFAIL: recv() error at the 1 times(expsize 16): EAGAIN/EWOULDBLOCK (11)
> 
> Signed-off-by: Yang Xu <xuyang2018.jy@cn.fujitsu.com>
> ---
>  testcases/kernel/syscalls/send/send02.c | 20 +++++++++++---------
>  1 file changed, 11 insertions(+), 9 deletions(-)
> 
> diff --git a/testcases/kernel/syscalls/send/send02.c b/testcases/kernel/syscalls/send/send02.c
> index 5630230fa..719e86a90 100644
> --- a/testcases/kernel/syscalls/send/send02.c
> +++ b/testcases/kernel/syscalls/send/send02.c
> @@ -71,7 +71,7 @@ static void setup(void)
>  	memset(sendbuf, 0x42, SENDSIZE);
>  }
>  
> -static int check_recv(int sock, long expsize)
> +static int check_recv(int sock, long expsize, int loop)
>  {
>  	char recvbuf[RECVSIZE] = {0};
>  
> @@ -83,19 +83,20 @@ static int check_recv(int sock, long expsize)
>  			return 1;
>  
>  		/* unexpected error */
> -		tst_res(TFAIL | TTERRNO, "recv() error");
> +		tst_res(TFAIL | TTERRNO, "recv() error at the %d times(expsize"
> +			" %ld)", loop, expsize);

It's better to have a single line message, and arguments on another one:
tst_res(TFAIL | TTERRNO, "recv() error at step %d, expsize %ld",
        ...);

>  		return 0;
>  	}
>  
>  	if (TST_RET < 0) {
> -		tst_res(TFAIL | TTERRNO, "Invalid recv() return value %ld",
> -			TST_RET);
> +		tst_res(TFAIL | TTERRNO, "Invalid recv() return value %ld at"
> +			" the %d times(expsize %ld)", TST_RET, loop, expsize);
>  		return 0;
>  	}
>  
>  	if (TST_RET != expsize) {
> -		tst_res(TFAIL, "recv() read %ld bytes, expected %ld", TST_RET,
> -			expsize);
> +		tst_res(TFAIL, "recv() read %ld bytes, expected %ld at the"
> +			" %d times", TST_RET, expsize, loop);
>  		return 0;
>  	}
>  
> @@ -120,6 +121,7 @@ static void run(unsigned int n)
>  	struct test_case *tc = testcase_list + n;
>  	socklen_t len = sizeof(addr);
>  
> +	tst_res(TINFO, "Testing %s", tc->name);
>  	tst_init_sockaddr_inet_bin(&addr, INADDR_LOOPBACK, 0);
>  	listen_sock = SAFE_SOCKET(tc->domain, tc->type, tc->protocol);
>  	dst_sock = listen_sock;
> @@ -139,19 +141,19 @@ static void run(unsigned int n)
>  			dst_sock = SAFE_ACCEPT(listen_sock, NULL, NULL);
>  
>  		tc->send(sock, sendbuf, SENDSIZE, 0);
> -		ret = check_recv(dst_sock, SENDSIZE);
> +		ret = check_recv(dst_sock, SENDSIZE, i + 1);
>  
>  		if (!ret)
>  			break;
>  
>  		tc->send(sock, sendbuf, SENDSIZE, MSG_MORE);
> -		ret = check_recv(dst_sock, 0);
> +		ret = check_recv(dst_sock, 0, i + 1);
>  
>  		if (!ret)
>  			break;
>  
>  		tc->send(sock, sendbuf, 1, 0);
> -		ret = check_recv(dst_sock, SENDSIZE + 1);
> +		ret = check_recv(dst_sock, SENDSIZE + 1, i + 1);
>  
>  		if (!ret)
>  			break;
> 


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [LTP] [PATCH] syscalls/send02: Improve message
  2020-10-16 12:30 ` Alexey Kodanev
@ 2020-10-19  8:10   ` Yang Xu
  2020-10-19 11:36   ` [LTP] [PATCH v2] syscalls/send02: Ensure recv() succeed when not using MSG_MORE flag Yang Xu
  1 sibling, 0 replies; 5+ messages in thread
From: Yang Xu @ 2020-10-19  8:10 UTC (permalink / raw)
  To: ltp

Hi Alexey
> On 16.10.2020 10:45, Yang Xu wrote:
>> This case sometimes fails, output as below:
>>
>> tst_test.c:1250: TINFO: Timeout per run is 0h 05m 00s
>> send02.c:86: TFAIL: recv() error: EAGAIN/EWOULDBLOCK (11)
>> send02.c:86: TFAIL: recv() error: EAGAIN/EWOULDBLOCK (11)
>> send02.c:86: TFAIL: recv() error: EAGAIN/EWOULDBLOCK (11)
>> send02.c:86: TFAIL: recv() error: EAGAIN/EWOULDBLOCK (11)
>>
>>  From this output, we don't know which subcase fails(tcp,udp,send,sendto).
>> So add some message and make this clear.
>>
>> Now this case fails as below:
>> tst_test.c:1250: TINFO: Timeout per run is 0h 05m 00s
>> send02.c:124: TINFO: Testing TCP send
>> send02.c:87: TFAIL: recv() error at the 776 times(expsize 17): EAGAIN/EWOULDBLOCK (11)
>
> recv(..., MSG_DONTWAIT) can fail with EAGAIN/EWOULDBLOCK at any time,
> so it should be a valid error... why it is a failure in the test?
I guess  it only sends a small data and works well on most machines, so 
we think it is a failure.
>
> If we expect some message to receive, we should call recv() again
> for EAGAIN/EWOULDBLOCK errors. And with MSG_MORE case, just return
> immediately, i.e. something like this:
>
>         while (1) {
>                  TEST(recv(sock, recvbuf, RECVSIZE, MSG_DONTWAIT));
>
>                  if (TST_RET == -1) {
>                          if (TST_ERR == EAGAIN || TST_ERR == EWOULDBLOCK) {
>                                  if (expsize)
>                                          continue;
>                                  else
>                                          break;
>                          }
>
>                          /* unexpected error */
>                          tst_res(TFAIL | TTERRNO, "recv() error, expsize %ld, it %d", expsize, i);
>                          return 0;
>                  }
>
> 		if (TST_RET<  0) {
>                          tst_res(TFAIL | TTERRNO, "Invalid recv() return value %ld",
>                                  TST_RET);
>                          return 0;
>                  }
>
>                  if (!expsize || TST_RET != expsize) {
>                          tst_res(TFAIL, "recv() read %ld bytes, expected %ld", TST_RET,
>                                  expsize);
>                          return 0;
>                  }
>
> 		break;
> 	}

It looks ok. This test only checks MSG_MORE whether can get 
EAGAIN/EWOULDBLOCK erro immediately, so for other situations, we just
ensure it can receive message sucessfully.

>
>
>> send02.c:124: TINFO: Testing UDP send
>> send02.c:87: TFAIL: recv() error at the 1 times(expsize 16): EAGAIN/EWOULDBLOCK (11)
>> send02.c:124: TINFO: Testing UDP sendto
>> send02.c:87: TFAIL: recv() error at the 1 times(expsize 16): EAGAIN/EWOULDBLOCK (11)
>> send02.c:124: TINFO: Testing UDP sendmsg
>> send02.c:87: TFAIL: recv() error at the 1 times(expsize 16): EAGAIN/EWOULDBLOCK (11)
>>
>> Signed-off-by: Yang Xu<xuyang2018.jy@cn.fujitsu.com>
>> ---
>>   testcases/kernel/syscalls/send/send02.c | 20 +++++++++++---------
>>   1 file changed, 11 insertions(+), 9 deletions(-)
>>
>> diff --git a/testcases/kernel/syscalls/send/send02.c b/testcases/kernel/syscalls/send/send02.c
>> index 5630230fa..719e86a90 100644
>> --- a/testcases/kernel/syscalls/send/send02.c
>> +++ b/testcases/kernel/syscalls/send/send02.c
>> @@ -71,7 +71,7 @@ static void setup(void)
>>   	memset(sendbuf, 0x42, SENDSIZE);
>>   }
>>
>> -static int check_recv(int sock, long expsize)
>> +static int check_recv(int sock, long expsize, int loop)
>>   {
>>   	char recvbuf[RECVSIZE] = {0};
>>
>> @@ -83,19 +83,20 @@ static int check_recv(int sock, long expsize)
>>   			return 1;
>>
>>   		/* unexpected error */
>> -		tst_res(TFAIL | TTERRNO, "recv() error");
>> +		tst_res(TFAIL | TTERRNO, "recv() error at the %d times(expsize"
>> +			" %ld)", loop, expsize);
>
> It's better to have a single line message, and arguments on another one:
> tst_res(TFAIL | TTERRNO, "recv() error at step %d, expsize %ld",
>          ...);
OK. Will do it in v2 patch

Best Regards
Yang Xu
>
>>   		return 0;
>>   	}
>>
>>   	if (TST_RET<  0) {
>> -		tst_res(TFAIL | TTERRNO, "Invalid recv() return value %ld",
>> -			TST_RET);
>> +		tst_res(TFAIL | TTERRNO, "Invalid recv() return value %ld at"
>> +			" the %d times(expsize %ld)", TST_RET, loop, expsize);
>>   		return 0;
>>   	}
>>
>>   	if (TST_RET != expsize) {
>> -		tst_res(TFAIL, "recv() read %ld bytes, expected %ld", TST_RET,
>> -			expsize);
>> +		tst_res(TFAIL, "recv() read %ld bytes, expected %ld at the"
>> +			" %d times", TST_RET, expsize, loop);
>>   		return 0;
>>   	}
>>
>> @@ -120,6 +121,7 @@ static void run(unsigned int n)
>>   	struct test_case *tc = testcase_list + n;
>>   	socklen_t len = sizeof(addr);
>>
>> +	tst_res(TINFO, "Testing %s", tc->name);
>>   	tst_init_sockaddr_inet_bin(&addr, INADDR_LOOPBACK, 0);
>>   	listen_sock = SAFE_SOCKET(tc->domain, tc->type, tc->protocol);
>>   	dst_sock = listen_sock;
>> @@ -139,19 +141,19 @@ static void run(unsigned int n)
>>   			dst_sock = SAFE_ACCEPT(listen_sock, NULL, NULL);
>>
>>   		tc->send(sock, sendbuf, SENDSIZE, 0);
>> -		ret = check_recv(dst_sock, SENDSIZE);
>> +		ret = check_recv(dst_sock, SENDSIZE, i + 1);
>>
>>   		if (!ret)
>>   			break;
>>
>>   		tc->send(sock, sendbuf, SENDSIZE, MSG_MORE);
>> -		ret = check_recv(dst_sock, 0);
>> +		ret = check_recv(dst_sock, 0, i + 1);
>>
>>   		if (!ret)
>>   			break;
>>
>>   		tc->send(sock, sendbuf, 1, 0);
>> -		ret = check_recv(dst_sock, SENDSIZE + 1);
>> +		ret = check_recv(dst_sock, SENDSIZE + 1, i + 1);
>>
>>   		if (!ret)
>>   			break;
>>
>
>
>
> .
>




^ permalink raw reply	[flat|nested] 5+ messages in thread

* [LTP] [PATCH v2] syscalls/send02: Ensure recv() succeed when not using MSG_MORE flag
  2020-10-16 12:30 ` Alexey Kodanev
  2020-10-19  8:10   ` Yang Xu
@ 2020-10-19 11:36   ` Yang Xu
  2020-10-19 15:31     ` Alexey Kodanev
  1 sibling, 1 reply; 5+ messages in thread
From: Yang Xu @ 2020-10-19 11:36 UTC (permalink / raw)
  To: ltp

In this test, we only check send()/sendto()/sendmsg() calls
with MSG_MORE flag whether get EAGAIN/EWOULDBLOCK error immediately.

For other flag, we just call recv again when meeting EAGAIN/EWOULDBLOCK
error.

Also, improve message and make this case more clean when failed.

Signed-off-by: Yang Xu <xuyang2018.jy@cn.fujitsu.com>
---
 testcases/kernel/syscalls/send/send02.c | 65 +++++++++++++++----------
 1 file changed, 38 insertions(+), 27 deletions(-)

diff --git a/testcases/kernel/syscalls/send/send02.c b/testcases/kernel/syscalls/send/send02.c
index 5630230fa..b2ab3b79c 100644
--- a/testcases/kernel/syscalls/send/send02.c
+++ b/testcases/kernel/syscalls/send/send02.c
@@ -71,32 +71,41 @@ static void setup(void)
 	memset(sendbuf, 0x42, SENDSIZE);
 }
 
-static int check_recv(int sock, long expsize)
+static int check_recv(int sock, long expsize, int loop)
 {
 	char recvbuf[RECVSIZE] = {0};
 
-	TEST(recv(sock, recvbuf, RECVSIZE, MSG_DONTWAIT));
-
-	if (TST_RET == -1) {
-		/* expected error immediately after send(MSG_MORE) */
-		if (!expsize && (TST_ERR == EAGAIN || TST_ERR == EWOULDBLOCK))
-			return 1;
-
-		/* unexpected error */
-		tst_res(TFAIL | TTERRNO, "recv() error");
-		return 0;
-	}
-
-	if (TST_RET < 0) {
-		tst_res(TFAIL | TTERRNO, "Invalid recv() return value %ld",
-			TST_RET);
-		return 0;
-	}
-
-	if (TST_RET != expsize) {
-		tst_res(TFAIL, "recv() read %ld bytes, expected %ld", TST_RET,
-			expsize);
-		return 0;
+	while (1) {
+		TEST(recv(sock, recvbuf, RECVSIZE, MSG_DONTWAIT));
+
+		if (TST_RET == -1) {
+			/* expected error immediately after send(MSG_MORE) */
+			if (TST_ERR == EAGAIN || TST_ERR == EWOULDBLOCK) {
+				if (expsize)
+					continue;
+				else
+					break;
+			}
+
+			/* unexpected error */
+			tst_res(TFAIL | TTERRNO, "recv() error at step %d, expsize %ld",
+				loop, expsize);
+			return 0;
+		}
+
+		if (TST_RET < 0) {
+			tst_res(TFAIL | TTERRNO, "Invalid recv() return value %ld"
+				" at step %d, expsize is %ld",
+				TST_RET, loop, expsize);
+			return 0;
+		}
+
+		if (TST_RET != expsize) {
+			tst_res(TFAIL, "recv() read %ld bytes, expected %ld"
+				"@step %d ", TST_RET, expsize, loop);
+			return 0;
+		}
+		return 1;
 	}
 
 	return 1;
@@ -120,6 +129,8 @@ static void run(unsigned int n)
 	struct test_case *tc = testcase_list + n;
 	socklen_t len = sizeof(addr);
 
+	tst_res(TINFO, "Tesing %s", tc->name);
+
 	tst_init_sockaddr_inet_bin(&addr, INADDR_LOOPBACK, 0);
 	listen_sock = SAFE_SOCKET(tc->domain, tc->type, tc->protocol);
 	dst_sock = listen_sock;
@@ -139,19 +150,19 @@ static void run(unsigned int n)
 			dst_sock = SAFE_ACCEPT(listen_sock, NULL, NULL);
 
 		tc->send(sock, sendbuf, SENDSIZE, 0);
-		ret = check_recv(dst_sock, SENDSIZE);
+		ret = check_recv(dst_sock, SENDSIZE, i + 1);
 
 		if (!ret)
 			break;
 
 		tc->send(sock, sendbuf, SENDSIZE, MSG_MORE);
-		ret = check_recv(dst_sock, 0);
+		ret = check_recv(dst_sock, 0, i + 1);
 
 		if (!ret)
 			break;
 
 		tc->send(sock, sendbuf, 1, 0);
-		ret = check_recv(dst_sock, SENDSIZE + 1);
+		ret = check_recv(dst_sock, SENDSIZE + 1, i + 1);
 
 		if (!ret)
 			break;
@@ -163,7 +174,7 @@ static void run(unsigned int n)
 	}
 
 	if (ret)
-		tst_res(TPASS, "%s(MSG_MORE) works correctly", tc->name);
+		tst_res(TPASS, "MSG_MORE works correctly");
 
 	cleanup();
 	dst_sock = -1;
-- 
2.23.0




^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [LTP] [PATCH v2] syscalls/send02: Ensure recv() succeed when not using MSG_MORE flag
  2020-10-19 11:36   ` [LTP] [PATCH v2] syscalls/send02: Ensure recv() succeed when not using MSG_MORE flag Yang Xu
@ 2020-10-19 15:31     ` Alexey Kodanev
  0 siblings, 0 replies; 5+ messages in thread
From: Alexey Kodanev @ 2020-10-19 15:31 UTC (permalink / raw)
  To: ltp

On 19.10.2020 14:36, Yang Xu wrote:
> In this test, we only check send()/sendto()/sendmsg() calls
> with MSG_MORE flag whether get EAGAIN/EWOULDBLOCK error immediately.
> 
> For other flag, we just call recv again when meeting EAGAIN/EWOULDBLOCK
> error.
> 
> Also, improve message and make this case more clean when failed.
> 

Hi Yang,

Fixed quoted strings and applied, thanks!

> Signed-off-by: Yang Xu <xuyang2018.jy@cn.fujitsu.com>
> ---
>  testcases/kernel/syscalls/send/send02.c | 65 +++++++++++++++----------
>  1 file changed, 38 insertions(+), 27 deletions(-)
> 
> diff --git a/testcases/kernel/syscalls/send/send02.c b/testcases/kernel/syscalls/send/send02.c
> index 5630230fa..b2ab3b79c 100644
> --- a/testcases/kernel/syscalls/send/send02.c
> +++ b/testcases/kernel/syscalls/send/send02.c
> @@ -71,32 +71,41 @@ static void setup(void)
>  	memset(sendbuf, 0x42, SENDSIZE);
>  }
>  
> -static int check_recv(int sock, long expsize)
> +static int check_recv(int sock, long expsize, int loop)
>  {
>  	char recvbuf[RECVSIZE] = {0};
>  
> -	TEST(recv(sock, recvbuf, RECVSIZE, MSG_DONTWAIT));
> -
> -	if (TST_RET == -1) {
> -		/* expected error immediately after send(MSG_MORE) */
> -		if (!expsize && (TST_ERR == EAGAIN || TST_ERR == EWOULDBLOCK))
> -			return 1;
> -
> -		/* unexpected error */
> -		tst_res(TFAIL | TTERRNO, "recv() error");
> -		return 0;
> -	}
> -
> -	if (TST_RET < 0) {
> -		tst_res(TFAIL | TTERRNO, "Invalid recv() return value %ld",
> -			TST_RET);
> -		return 0;
> -	}
> -
> -	if (TST_RET != expsize) {
> -		tst_res(TFAIL, "recv() read %ld bytes, expected %ld", TST_RET,
> -			expsize);
> -		return 0;
> +	while (1) {
> +		TEST(recv(sock, recvbuf, RECVSIZE, MSG_DONTWAIT));
> +
> +		if (TST_RET == -1) {
> +			/* expected error immediately after send(MSG_MORE) */
> +			if (TST_ERR == EAGAIN || TST_ERR == EWOULDBLOCK) {
> +				if (expsize)
> +					continue;
> +				else
> +					break;
> +			}
> +
> +			/* unexpected error */
> +			tst_res(TFAIL | TTERRNO, "recv() error at step %d, expsize %ld",
> +				loop, expsize);
> +			return 0;
> +		}
> +
> +		if (TST_RET < 0) {
> +			tst_res(TFAIL | TTERRNO, "Invalid recv() return value %ld"
> +				" at step %d, expsize is %ld",
> +				TST_RET, loop, expsize);
> +			return 0;
> +		}
> +
> +		if (TST_RET != expsize) {
> +			tst_res(TFAIL, "recv() read %ld bytes, expected %ld"
> +				" at step %d ", TST_RET, expsize, loop);
> +			return 0;
> +		}
> +		return 1;
>  	}
>  
>  	return 1;
> @@ -120,6 +129,8 @@ static void run(unsigned int n)
>  	struct test_case *tc = testcase_list + n;
>  	socklen_t len = sizeof(addr);
>  
> +	tst_res(TINFO, "Tesing %s", tc->name);
> +
>  	tst_init_sockaddr_inet_bin(&addr, INADDR_LOOPBACK, 0);
>  	listen_sock = SAFE_SOCKET(tc->domain, tc->type, tc->protocol);
>  	dst_sock = listen_sock;
> @@ -139,19 +150,19 @@ static void run(unsigned int n)
>  			dst_sock = SAFE_ACCEPT(listen_sock, NULL, NULL);
>  
>  		tc->send(sock, sendbuf, SENDSIZE, 0);
> -		ret = check_recv(dst_sock, SENDSIZE);
> +		ret = check_recv(dst_sock, SENDSIZE, i + 1);
>  
>  		if (!ret)
>  			break;
>  
>  		tc->send(sock, sendbuf, SENDSIZE, MSG_MORE);
> -		ret = check_recv(dst_sock, 0);
> +		ret = check_recv(dst_sock, 0, i + 1);
>  
>  		if (!ret)
>  			break;
>  
>  		tc->send(sock, sendbuf, 1, 0);
> -		ret = check_recv(dst_sock, SENDSIZE + 1);
> +		ret = check_recv(dst_sock, SENDSIZE + 1, i + 1);
>  
>  		if (!ret)
>  			break;
> @@ -163,7 +174,7 @@ static void run(unsigned int n)
>  	}
>  
>  	if (ret)
> -		tst_res(TPASS, "%s(MSG_MORE) works correctly", tc->name);
> +		tst_res(TPASS, "MSG_MORE works correctly");
>  
>  	cleanup();
>  	dst_sock = -1;
> 


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2020-10-19 15:31 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-10-16  7:45 [LTP] [PATCH] syscalls/send02: Improve message Yang Xu
2020-10-16 12:30 ` Alexey Kodanev
2020-10-19  8:10   ` Yang Xu
2020-10-19 11:36   ` [LTP] [PATCH v2] syscalls/send02: Ensure recv() succeed when not using MSG_MORE flag Yang Xu
2020-10-19 15:31     ` Alexey Kodanev

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.