[LTP] [PATCH v2 3/3] writev01: rewrite and drop partially valid iovec tests

Cyril Hrubis chrubis@suse.cz
Mon Oct 10 18:03:46 CEST 2016


Hi!
> +/*
> + *   Copyright (c) International Business Machines  Corp., 2001
> + *                 Linux Test Project, 2016
> + *
> + *   This program is free software;  you can redistribute it and/or modify
> + *   it under the terms of the GNU General Public License as published by
> + *   the Free Software Foundation; either version 2 of the License, or
> + *   (at your option) any later version.
> + *
> + *   This program is distributed in the hope that it will be useful,
> + *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
> + *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
> + *   the GNU General Public License for more details.
> + *
> + *   You should have received a copy of the GNU General Public License
> + *   along with this program;
> + */
> +
> +/*
> + * DESCRIPTION
> + *	Testcase to check the basic functionality of writev(2) system call.
> + *	Create IO vectors and attempt to writev various components of it.
> + */
> +
> +#include <errno.h>
> +#include <signal.h>
> +#include <sys/uio.h>
> +#include "tst_test.h"
> +
> +#define	CHUNK		64
> +#define	TESTFILE	"writev_data_file"
> +
> +static int valid_fd;
> +static int invalid_fd = -1;
> +static int pipe_fd[2];
> +
> +static char buf[CHUNK * 4];
> +
> +struct iovec iovec_badlen[] = {
> +	{ buf, -1 },
> +	{ buf + CHUNK, CHUNK },
> +	{ buf + CHUNK * 2, CHUNK },
> +};
> +
> +struct iovec iovec_simple[] = {
> +	{ buf, CHUNK },
> +};
> +
> +struct iovec iovec_zero_null[] = {
> +	{ buf, CHUNK },
> +	{ buf + CHUNK, 0 },
> +	{ NULL, 0 },
> +	{ NULL, 0 }
> +};
> +
> +struct testcase_t {
> +	const char *desc;
> +	int *pfd;
> +	struct iovec (*piovec)[];
> +	int iovcnt;
> +	int exp_ret;
> +	int exp_errno;
> +} testcases[] = {
> +	{
> +		.desc = "invalid iov_len",
> +		.pfd = &valid_fd,
> +		.piovec = &iovec_badlen,
> +		.iovcnt = ARRAY_SIZE(iovec_badlen),
> +		.exp_ret = -1,
> +		.exp_errno = EINVAL
> +	},
> +	{
> +		.desc = "invalid fd",
> +		.pfd = &invalid_fd,
> +		.piovec = &iovec_simple,
> +		.iovcnt = ARRAY_SIZE(iovec_simple),
> +		.exp_ret = -1,
> +		.exp_errno = EBADF
> +	},
> +	{
> +		.desc = "invalid iovcnt",
> +		.pfd = &valid_fd,
> +		.piovec = &iovec_simple,
> +		.iovcnt = -1,
> +		.exp_ret = -1,
> +		.exp_errno = EINVAL
> +	},
> +	{
> +		.desc = "zero iovcnt",
> +		.pfd = &valid_fd,
> +		.piovec = &iovec_simple,
> +		.iovcnt = 0,
> +		.exp_ret = 0,
> +	},
> +	{
> +		.desc = "NULL and zero length iovec",
> +		.pfd = &valid_fd,
> +		.piovec = &iovec_zero_null,
> +		.iovcnt = ARRAY_SIZE(iovec_zero_null),
> +		.exp_ret = CHUNK,
> +	},
> +	{
> +		.desc = "write to closed pipe",
> +		.pfd = &(pipe_fd[1]),
> +		.piovec = &iovec_simple,
> +		.iovcnt = ARRAY_SIZE(iovec_simple),
> +		.exp_ret = -1,
> +		.exp_errno = EPIPE,
> +	},
> +};
> +
> +void setup(void)
> +{
> +	sigset_t block_mask;
> +
> +	sigemptyset(&block_mask);
> +	sigaddset(&block_mask, SIGPIPE);
> +	sigprocmask(SIG_BLOCK, &block_mask, NULL);
> +
> +	valid_fd = SAFE_OPEN(TESTFILE, O_RDWR | O_CREAT, 0644);
> +
> +	SAFE_PIPE(pipe_fd);
> +	SAFE_CLOSE(pipe_fd[0]);
> +}
> +
> +static void test_writev(unsigned int i)
> +{
> +	struct testcase_t *tcase = &testcases[i];
> +	int ret;
> +
> +	TEST(writev(*(tcase->pfd), *(tcase->piovec), tcase->iovcnt));
> +
> +	ret = (TEST_RETURN == tcase->exp_ret);
> +	if (TEST_RETURN < 0 || tcase->exp_ret < 0)
> +		ret &= (TEST_ERRNO == tcase->exp_errno);
> +
> +	if (ret) {
> +		tst_res(TPASS | TTERRNO, "%s, ret: %ld", tcase->desc,
> +			TEST_RETURN);
> +	} else {
> +		tst_res(TPASS | TTERRNO, "%s, ret: %ld", tcase->desc,
                         ^
			 TFAIL?

> +			TEST_RETURN);
> +	}

Also I would have created separate functions for failure/success tests
so that we can print more informative results, i.e. include the expected
errno in the TFAIL result message.

Apart from that this is much better than the original.

-- 
Cyril Hrubis
chrubis@suse.cz


More information about the ltp mailing list