[CRIU] [PATCH 2/2] zdtm: Check that 'tcp-close' option closes sockets
Pavel Begunkov
asml.silence at gmail.com
Tue Jun 20 22:14:57 MSK 2017
On Tue, Jun 20, 2017 at 9:41 PM, Andrei Vagin <avagin at virtuozzo.com> wrote:
> Pavel, pls take a look at this and fix ASAP. Thanks!
I'll look. Thanks for the notice.
--
Pavel
>
>
> https://ci.openvz.org/job/CRIU/job/CRIU-dump-only/job/criu-dev/2557/consoleFull
>
> [root at fc24 criu]# python test/zdtm.py run -t zdtm/static/socket-tcp-close0 --norst
> ==================== Run zdtm/static/socket-tcp-close0 in h ====================
> Start test
> ./socket-tcp-close0 --pidfile=socket-tcp-close0.pid --outfile=socket-tcp-close0.out
> Run criu dump
> Send the 15 signal to 24
> Wait for zdtm/static/socket-tcp-close0(24) to die for 0.100000
> ########### Test zdtm/static/socket-tcp-close0 FAIL at result check ############
> Test output: ================================
> 18:08:38.015: 24: ERR: socket-tcp-close0.c:25: Invalid socket state (1)
> 18:08:38.016: 24: FAIL: socket-tcp-close0.c:63: Server socket isn't closed
> (errno = 11 (Resource temporarily unavailable))
>
> <<< ================================
>
> On Fri, Jun 02, 2017 at 09:32:27AM +0300, Pavel Begunkov wrote:
>> There are 2 test cases:
>> 1. Connected socket should be restored in the closed state
>> 2. Listening socket state should not change after restore
>>
>> Signed-off-by: Pavel Begunkov <asml.silence at gmail.com>
>> Signed-off-by: Eugene Batalov <eabatalov89 at gmail.com>
>> ---
>> test/zdtm/static/Makefile | 2 +
>> test/zdtm/static/socket-tcp-close0.c | 72 +++++++++++++++++++++++++++++++++
>> test/zdtm/static/socket-tcp-close0.desc | 1 +
>> test/zdtm/static/socket-tcp-close1.c | 50 +++++++++++++++++++++++
>> test/zdtm/static/socket-tcp-close1.desc | 1 +
>> 5 files changed, 126 insertions(+)
>> create mode 100644 test/zdtm/static/socket-tcp-close0.c
>> create mode 100644 test/zdtm/static/socket-tcp-close0.desc
>> create mode 100644 test/zdtm/static/socket-tcp-close1.c
>> create mode 120000 test/zdtm/static/socket-tcp-close1.desc
>>
>> diff --git a/test/zdtm/static/Makefile b/test/zdtm/static/Makefile
>> index 1ea9393c..d5eeadc8 100644
>> --- a/test/zdtm/static/Makefile
>> +++ b/test/zdtm/static/Makefile
>> @@ -82,6 +82,8 @@ TST_NOFILE := \
>> socket-tcp-closed \
>> socket-tcp-closed-last-ack \
>> socket-tcp6-closed \
>> + socket-tcp-close0 \
>> + socket-tcp-close1 \
>> socket-tcp-unconn \
>> socket-tcp6-unconn \
>> socket-tcp-syn-sent \
>> diff --git a/test/zdtm/static/socket-tcp-close0.c b/test/zdtm/static/socket-tcp-close0.c
>> new file mode 100644
>> index 00000000..2bc0f64f
>> --- /dev/null
>> +++ b/test/zdtm/static/socket-tcp-close0.c
>> @@ -0,0 +1,72 @@
>> +#include <errno.h>
>> +#include <sys/types.h>
>> +#include <sys/socket.h>
>> +#include <netinet/tcp.h>
>> +#include <netinet/in.h>
>> +
>> +#include "zdtmtst.h"
>> +
>> +const char *test_doc = "Check that tcp-close option closes connected tcp socket";
>> +const char *test_author = "Pavel Begunkov <asml.silence at gmail.com>";
>> +
>> +static int port = 8880;
>> +
>> +static int check_socket_closed(int sk)
>> +{
>> + int err, buffer = 0;
>> + struct tcp_info info;
>> + socklen_t len = sizeof(info);
>> +
>> + err = getsockopt(sk, IPPROTO_TCP, TCP_INFO, (void *)&info, &len);
>> + if (err != 0) {
>> + pr_perror("Can't get socket state\n");
>> + return -1;
>> + } else if (info.tcpi_state != TCP_CLOSE) {
>> + pr_err("Invalid socket state (%i)\n", (int)info.tcpi_state);
>> + return -1;
>> + }
>> +
>> + err = recv(sk, &buffer, sizeof(buffer), 0);
>> + if (!err || errno != ENOTCONN) {
>> + pr_perror("Invalid recv response\n");
>> + return -1;
>> + }
>> + return 0;
>> +}
>> +
>> +int main(int argc, char **argv)
>> +{
>> + int fd, fd_s, clt;
>> +
>> + test_init(argc, argv);
>> +
>> + fd_s = tcp_init_server(AF_INET, &port);
>> + if (fd_s < 0) {
>> + pr_err("Server initializations failed\n");
>> + return 1;
>> + }
>> + clt = tcp_init_client(AF_INET, "localhost", port);
>> + if (clt < 0)
>> + return 1;
>> +
>> + fd = tcp_accept_server(fd_s);
>> + if (fd < 0) {
>> + pr_err("Can't accept client connection\n");
>> + return 1;
>> + }
>> + close(fd_s);
>> +
>> + test_daemon();
>> + test_waitsig();
>> +
>> + if (check_socket_closed(fd)) {
>> + fail("Server socket isn't closed\n");
>> + return 1;
>> + }
>> + if (check_socket_closed(clt)) {
>> + fail("Client socket isn't closed\n");
>> + return 1;
>> + }
>> + pass();
>> + return 0;
>> +}
>> diff --git a/test/zdtm/static/socket-tcp-close0.desc b/test/zdtm/static/socket-tcp-close0.desc
>> new file mode 100644
>> index 00000000..e85de0e6
>> --- /dev/null
>> +++ b/test/zdtm/static/socket-tcp-close0.desc
>> @@ -0,0 +1 @@
>> +{'dopts': '--tcp-established', 'ropts': '--tcp-close'}
>> diff --git a/test/zdtm/static/socket-tcp-close1.c b/test/zdtm/static/socket-tcp-close1.c
>> new file mode 100644
>> index 00000000..54511a34
>> --- /dev/null
>> +++ b/test/zdtm/static/socket-tcp-close1.c
>> @@ -0,0 +1,50 @@
>> +#include <sys/types.h>
>> +#include <sys/socket.h>
>> +#include <netinet/tcp.h>
>> +#include <netinet/in.h>
>> +
>> +#include "zdtmtst.h"
>> +
>> +const char *test_doc = "Check that tcp-close option doesn't close listening tcp socket";
>> +const char *test_author = "Pavel Begunkov <asml.silence at gmail.com>";
>> +
>> +static int port = 8880;
>> +
>> +static int check_socket_state(int sk, int state)
>> +{
>> + int err;
>> + struct tcp_info info;
>> + socklen_t len = sizeof(info);
>> +
>> + err = getsockopt(sk, IPPROTO_TCP, TCP_INFO, (void *)&info, &len);
>> + if (err != 0) {
>> + pr_perror("Can't get socket state\n");
>> + return -1;
>> + }
>> + return info.tcpi_state == state ? 0 : -1;
>> +}
>> +
>> +int main(int argc, char **argv)
>> +{
>> + int fd_s;
>> +
>> + test_init(argc, argv);
>> +
>> + fd_s = tcp_init_server(AF_INET, &port);
>> + if (fd_s < 0) {
>> + pr_err("Server initializations failed\n");
>> + return 1;
>> + }
>> +
>> + test_daemon();
>> + test_waitsig();
>> +
>> + if (check_socket_state(fd_s, TCP_LISTEN)) {
>> + fail("Listen socket state is changed\n");
>> + close(fd_s);
>> + return 1;
>> + }
>> + close(fd_s);
>> + pass();
>> + return 0;
>> +}
>> diff --git a/test/zdtm/static/socket-tcp-close1.desc b/test/zdtm/static/socket-tcp-close1.desc
>> new file mode 120000
>> index 00000000..836b8fa5
>> --- /dev/null
>> +++ b/test/zdtm/static/socket-tcp-close1.desc
>> @@ -0,0 +1 @@
>> +socket-tcp-close0.desc
>> \ No newline at end of file
>> --
>> 2.11.1
>>
>> _______________________________________________
>> CRIU mailing list
>> CRIU at openvz.org
>> https://lists.openvz.org/mailman/listinfo/criu
More information about the CRIU
mailing list