Message ID | 1603107373-20807-1-git-send-email-xuyang2018.jy@cn.fujitsu.com |
---|---|
State | Accepted |
Headers | show |
Series | [v2] syscalls/send02: Ensure recv() succeed when not using MSG_MORE flag | expand |
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; >
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;
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(-)