[LTP] [RFC PATCH 1/6] exit02: Rewrite to new library
Jan Stancek
jstancek@redhat.com
Fri Apr 6 10:47:50 CEST 2018
----- Original Message -----
> We get rid of the ridiculous sleep(2) in the test as a side effect.
>
> Signed-off-by: Cyril Hrubis <chrubis@suse.cz>
ACK to 3/6 4/6 5/6 patches.
Just a small observation here, subject doesn't have "syscalls/" as
the rest of series.
One more note below.
> ---
> testcases/kernel/syscalls/exit/exit02.c | 249
> ++++++++------------------------
> 1 file changed, 60 insertions(+), 189 deletions(-)
>
> diff --git a/testcases/kernel/syscalls/exit/exit02.c
> b/testcases/kernel/syscalls/exit/exit02.c
> index 7858c894d..8143870e8 100644
> --- a/testcases/kernel/syscalls/exit/exit02.c
> +++ b/testcases/kernel/syscalls/exit/exit02.c
> @@ -1,212 +1,83 @@
> /*
> + * Copyright (c) International Business Machines Corp., 2001
> + * 07/2001 Ported by Wayne Boyer
> + * Copyright (c) 2018 Cyril Hrubis <chrubis@suse.cz>
> *
> - * Copyright (c) International Business Machines Corp., 2001
> + * 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 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.
> *
> - * 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; if not, write to the Free Software
> - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
> 02110-1301 USA
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
> USA
> */
> -
> /*
> - * NAME
> - * exit02.c
> - *
> - * DESCRIPTION
> - * Check that exit flushes output file buffers and closes files upon
> - * exitting
> - *
> - * ALGORITHM
> - * Fork a process that creates a file and writes a few bytes, and
> - * calls exit WITHOUT calling close(). The parent then reads the
> - * file. If everything that was written is present in the file, then
> - * the test passes.
> - *
> - * USAGE
> - * exit02
> - *
> - * HISTORY
> - * 07/2001 Ported by Wayne Boyer
> - *
> - * RESTRICTIONS
> - * None
> + * Fork a process that creates a file and writes a few bytes, and
> + * calls exit WITHOUT calling close(). The parent then reads the
> + * file. If everything that was written is present in the file, then
> + * the test passes.
> */
> -#include <sys/types.h>
> -#include <sys/wait.h>
> -#include <sys/stat.h>
> -#include <stdio.h>
> -#include <string.h>
> -#include <errno.h>
> -#include <signal.h>
> -#include <fcntl.h>
> -#include <string.h>
> -#include "test.h"
> -
> -void cleanup(void);
> -void setup(void);
> -
> -char *TCID = "exit02";
> -int TST_TOTAL = 1;
> -
> -#define READ 0
> -#define WRITE 1
> -#define MODE 0666
> -
> -char filen[40];
> -
> -int main(int ac, char **av)
> +
> +#include <stdlib.h>
> +#include "tst_test.h"
> +
> +#define FNAME "test_file"
> +
> +static void child_write(void)
> {
> - int pid, npid, sig, nsig, exno, nexno, status;
> - int filed;
> - char wbuf[BUFSIZ], rbuf[BUFSIZ];
> - int len, rlen;
> - int rval = 0;
> - int lc;
> -
> - /*
> - * parse standard options
> - */
> - tst_parse_opts(ac, av, NULL, NULL);
> -
> - setup(); /* global setup for test */
> -
> - /*
> - * The following loop checks looping state if -i option given
> - */
> - for (lc = 0; TEST_LOOPING(lc); lc++) {
> - /*
> - * reset tst_count in case we are looping.
> - */
> - tst_count = 0;
> -
> - strcpy(wbuf, "abcd");
> - len = strlen(wbuf);
> -
> - exno = sig = 0;
> -
> - if ((pid = FORK_OR_VFORK()) == -1)
> - tst_brkm(TBROK | TERRNO, cleanup, "fork() failed");
> -
> - if (pid == 0) { /* child */
> - sleep(1);
> - if ((filed = creat(filen, MODE)) == -1) {
> - tst_resm(TINFO, "creat error: unable to"
> - "open output file");
> - exit(2);
> - }
> - if (write(filed, wbuf, len) != len) {
> - tst_resm(TINFO, "write error");
> - exit(2);
> - }
> - exit(exno);
> - } else { /* parent */
> - npid = wait(&status);
> -
> - if (npid != pid) {
> - tst_resm(TFAIL, "wait error: "
> - "unexpected pid returned");
> - rval = 1;
> - }
> -
> - nsig = status % 256;
> -
> - /*
> - * to check if the core dump bit has been
> - * set, bit # 7
> - */
> - if (nsig >= 128)
> - nsig = nsig - 128;
> -
> - /*
> - * nsig is the signal number returned by
> - * wait
> - */
> - if (nsig != sig) {
> - tst_resm(TFAIL, "wait error: unexpected "
> - "signal returned %d", nsig);
> - rval = 1;
> - }
> -
> - /*
> - * nexno is the exit number returned by wait
> - */
> - nexno = status / 256;
> - if (nexno != exno) {
> - tst_resm(TFAIL, "wait error: unexpected exit "
> - "number %d", nexno);
> - rval = 1;
> - }
> -
> - sleep(2); /* let child's exit close opened file */
> -
> - filed = open(filen, O_RDONLY, READ);
> - if (filed == -1) {
> - tst_resm(TFAIL, "open error: "
> - "unable to open input file");
> - rval = 1;
> - } else {
> - rlen = read(filed, rbuf, len);
> - if (len != rlen) {
> - tst_resm(TFAIL, "exit error: file "
> - "buffer was not flushed");
> - rval = 1;
> - } else if (strncmp(rbuf, wbuf, len) != 0) {
> - tst_resm(TFAIL, "exit error: file "
> - "buffer was not flushed");
> - rval = 1;
> - }
> - }
> - close(filed);
> - unlink(filen);
> - }
> - if (!rval) {
> - tst_resm(TPASS, "exit() test PASSED");
> - }
> - }
> - cleanup();
> - tst_exit();
> + int fd;
> +
> + fd = SAFE_CREAT(FNAME, 0666);
> + SAFE_WRITE(1, fd, FNAME, sizeof(FNAME));
> + exit(0);
> }
>
> -/*
> - * setup() - perform all ONE TIME setup for this test
> - */
> -void setup(void)
> +static void check_file(void)
> {
> + int fd, len;
> + char buf[256];
>
> - tst_sig(FORK, DEF_HANDLER, cleanup);
> + fd = SAFE_OPEN(FNAME, O_RDONLY);
> + len = SAFE_READ(0, fd, buf, sizeof(buf));
>
> - umask(0);
> + if (len != sizeof(FNAME)) {
> + tst_res(TFAIL, "Wrong length %i expected %zu", len, sizeof(buf));
> + return;
> + }
>
> - TEST_PAUSE;
> + if (memcmp(buf, FNAME, sizeof(FNAME))) {
> + tst_res(TFAIL, "Wrong data read back");
We don't close fd here, but things are already going south,
so it's not that big deal.
ACK
Regards,
Jan
> + return;
> + }
>
> - tst_tmpdir();
> + SAFE_CLOSE(fd);
>
> - sprintf(filen, "tfile_%d", getpid());
> + tst_res(TPASS, "File written by child read back correctly");
> }
>
> -/*
> - * cleanup() - performs all ONE TIME cleanup for this test at completion or
> - * premature exit.
> - */
> -void cleanup(void)
> +static void run(void)
> {
> + int pid;
>
> - /*
> - * Remove tmp dir and all files in it
> - */
> - tst_rmdir();
> + pid = SAFE_FORK();
> + if (!pid)
> + child_write();
>
> - /*
> - * exit with return code appropriate for results
> - */
> + tst_reap_children();
>
> + check_file();
> +
> + SAFE_UNLINK(FNAME);
> }
> +
> +static struct tst_test test = {
> + .needs_tmpdir = 1,
> + .forks_child = 1,
> + .test_all = run,
> +};
> --
> 2.13.6
>
>
> --
> Mailing list info: https://lists.linux.it/listinfo/ltp
>
More information about the ltp
mailing list