Stefano Garzarella
2023-Jul-25 15:39 UTC
[RFC PATCH v2 3/4] vsock/test: rework MSG_PEEK test for SOCK_STREAM
On Wed, Jul 19, 2023 at 10:27:07PM +0300, Arseniy Krasnov wrote:>This new version makes test more complicated by adding empty read, >partial read and data comparisons between MSG_PEEK and normal reads. > >Signed-off-by: Arseniy Krasnov <AVKrasnov at sberdevices.ru> >--- > tools/testing/vsock/vsock_test.c | 78 ++++++++++++++++++++++++++++++-- > 1 file changed, 75 insertions(+), 3 deletions(-)Reviewed-by: Stefano Garzarella <sgarzare at redhat.com>> >diff --git a/tools/testing/vsock/vsock_test.c b/tools/testing/vsock/vsock_test.c >index ac1bd3ac1533..444a3ff0681f 100644 >--- a/tools/testing/vsock/vsock_test.c >+++ b/tools/testing/vsock/vsock_test.c >@@ -255,9 +255,14 @@ static void test_stream_multiconn_server(const struct test_opts *opts) > close(fds[i]); > } > >+#define MSG_PEEK_BUF_LEN 64 >+ > static void test_stream_msg_peek_client(const struct test_opts *opts) > { >+ unsigned char buf[MSG_PEEK_BUF_LEN]; >+ ssize_t send_size; > int fd; >+ int i; > > fd = vsock_stream_connect(opts->peer_cid, 1234); > if (fd < 0) { >@@ -265,12 +270,32 @@ static void test_stream_msg_peek_client(const struct test_opts *opts) > exit(EXIT_FAILURE); > } > >- send_byte(fd, 1, 0); >+ for (i = 0; i < sizeof(buf); i++) >+ buf[i] = rand() & 0xFF; >+ >+ control_expectln("SRVREADY"); >+ >+ send_size = send(fd, buf, sizeof(buf), 0); >+ >+ if (send_size < 0) { >+ perror("send"); >+ exit(EXIT_FAILURE); >+ } >+ >+ if (send_size != sizeof(buf)) { >+ fprintf(stderr, "Invalid send size %zi\n", send_size); >+ exit(EXIT_FAILURE); >+ } >+ > close(fd); > } > > static void test_stream_msg_peek_server(const struct test_opts *opts) > { >+ unsigned char buf_half[MSG_PEEK_BUF_LEN / 2]; >+ unsigned char buf_normal[MSG_PEEK_BUF_LEN]; >+ unsigned char buf_peek[MSG_PEEK_BUF_LEN]; >+ ssize_t res; > int fd; > > fd = vsock_stream_accept(VMADDR_CID_ANY, 1234, NULL); >@@ -279,8 +304,55 @@ static void test_stream_msg_peek_server(const struct test_opts *opts) > exit(EXIT_FAILURE); > } > >- recv_byte(fd, 1, MSG_PEEK); >- recv_byte(fd, 1, 0); >+ /* Peek from empty socket. */ >+ res = recv(fd, buf_peek, sizeof(buf_peek), MSG_PEEK | MSG_DONTWAIT); >+ if (res != -1) { >+ fprintf(stderr, "expected recv(2) failure, got %zi\n", res); >+ exit(EXIT_FAILURE); >+ } >+ >+ if (errno != EAGAIN) { >+ perror("EAGAIN expected"); >+ exit(EXIT_FAILURE); >+ } >+ >+ control_writeln("SRVREADY"); >+ >+ /* Peek part of data. */ >+ res = recv(fd, buf_half, sizeof(buf_half), MSG_PEEK); >+ if (res != sizeof(buf_half)) { >+ fprintf(stderr, "recv(2) + MSG_PEEK, expected %zu, got %zi\n", >+ sizeof(buf_half), res); >+ exit(EXIT_FAILURE); >+ } >+ >+ /* Peek whole data. */ >+ res = recv(fd, buf_peek, sizeof(buf_peek), MSG_PEEK); >+ if (res != sizeof(buf_peek)) { >+ fprintf(stderr, "recv(2) + MSG_PEEK, expected %zu, got %zi\n", >+ sizeof(buf_peek), res); >+ exit(EXIT_FAILURE); >+ } >+ >+ /* Compare partial and full peek. */ >+ if (memcmp(buf_half, buf_peek, sizeof(buf_half))) { >+ fprintf(stderr, "Partial peek data mismatch\n"); >+ exit(EXIT_FAILURE); >+ } >+ >+ res = recv(fd, buf_normal, sizeof(buf_normal), 0); >+ if (res != sizeof(buf_normal)) { >+ fprintf(stderr, "recv(2), expected %zu, got %zi\n", >+ sizeof(buf_normal), res); >+ exit(EXIT_FAILURE); >+ } >+ >+ /* Compare full peek and normal read. */ >+ if (memcmp(buf_peek, buf_normal, sizeof(buf_peek))) { >+ fprintf(stderr, "Full peek data mismatch\n"); >+ exit(EXIT_FAILURE); >+ } >+ > close(fd); > } > >-- >2.25.1 >