From: Cyril Hrubis <chrubis@suse.cz>
To: Avinesh Kumar <akumar@suse.de>
Cc: ltp@lists.linux.it
Subject: Re: [LTP] [PATCH 1/9] Rewrite rename01.c using new LTP API
Date: Wed, 22 Jun 2022 16:53:49 +0200 [thread overview]
Message-ID: <YrMs/dt/ioC8p3Sx@yuki> (raw)
In-Reply-To: <20220622070137.24286-2-akumar@suse.de>
Hi!
> +/*\
> + * [DESCRIPTION]
^
Description
> *
> - * ALGORITHM
> - * Setup:
> - * Setup signal handling.
> - * Create temporary directory.
> - * Pause for SIGUSR1 if option specified.
> - *
> - * Test:
> - * Loop if the proper options are given.
> - * 1. "old" is plain file, new does not exists
> - * create the "old" file, make sure the "new" file
> - * dose not exist
> - * rename the "old" to the "new" file
> - * verify the "new" file points to the "old" file
> - * verify the "old" file does not exist
> - *
> - * 2. "old" is a directory,"new" does not exists
> - * create the "old" directory, make sure "new"
> - * dose not exist
> - * rename the "old" to the "new"
> - * verify the "new" points to the "old"
> - * verify the "old" does not exist
> - * Cleanup:
> - * Print errno log and/or timing stats if options given
> - * Delete the temporary directory created.
> - *
> - * USAGE
> - * rename01 [-c n] [-f] [-i n] [-I x] [-P x] [-t]
> - * where, -c n : Run n copies concurrently.
> - * -f : Turn off functionality Testing.
> - * -i n : Execute test n times.
> - * -I x : Execute test for x seconds.
> - * -P x : Pause for x seconds between iterations.
> - * -t : Turn on syscall timing.
> - *
> - * HISTORY
> - * 07/2001 Ported by Wayne Boyer
> - *
> - * RESTRICTIONS
> - * None.
> + * Verify rename() when the newpath file or directory does not exist.
> */
> -#include <sys/types.h>
> -#include <fcntl.h>
> -#include <sys/stat.h>
> -#include <unistd.h>
> -#include <errno.h>
>
> -#include "test.h"
> -#include "safe_macros.h"
> -
> -void setup();
> -void cleanup();
> -
> -char *TCID = "rename01";
> -int TST_TOTAL = 2;
> +#include <sys/stat.h>
> +#include <stdio.h>
> +#include "tst_test.h"
>
> -char fname[255], mname[255];
> -char fdir[255], mdir[255];
> -struct stat buf1;
> -dev_t f_olddev, d_olddev;
> -ino_t f_oldino, d_oldino;
> +#define OLD_FILE_NAME "oldfile"
> +#define NEW_FILE_NAME "newfile"
> +#define OLD_DIR_NAME "olddir"
> +#define NEW_DIR_NAME "newdir"
>
> -struct test_case_t {
> - char *name1;
> - char *name2;
> - char *desc;
> - dev_t *olddev;
> - ino_t *oldino;
> -} TC[] = {
> - /* comment goes here */
> - {
> - fname, mname, "file", &f_olddev, &f_oldino},
> - /* comment goes here */
> - {
> - fdir, mdir, "directory", &d_olddev, &d_oldino}
> -};
> +static struct stat old_file_st, old_dir_st, new_file_st, new_dir_st;
>
> -int main(int ac, char **av)
> +static void setup(void)
> {
> - int lc;
> - int i;
> -
> - /*
> - * parse standard options
> - */
> - tst_parse_opts(ac, av, NULL, NULL);
> -
> - /*
> - * perform global setup for test
> - */
> - setup();
> -
> - /*
> - * check looping state if -i option given
> - */
> - for (lc = 0; TEST_LOOPING(lc); lc++) {
> -
> - tst_count = 0;
> -
> - /* loop through the test cases */
> - for (i = 0; i < TST_TOTAL; i++) {
> -
> - TEST(rename(TC[i].name1, TC[i].name2));
> -
> - if (TEST_RETURN == -1) {
> - tst_resm(TFAIL, "call failed unexpectedly");
> - continue;
> - }
> -
> - SAFE_STAT(cleanup, TC[i].name2, &buf1);
> -
> - /*
> - * verify the new file or directory is the
> - * same as the old one
> - */
> - if (buf1.st_dev != *TC[i].olddev ||
> - buf1.st_ino != *TC[i].oldino) {
> - tst_resm(TFAIL, "rename() failed: the "
> - "new %s points to a different "
> - "inode/location", TC[i].desc);
> - continue;
> - }
> - /*
> - * verify that the old file or directory
> - * does not exist
> - */
> - if (stat(fname, &buf1) != -1) {
> - tst_resm(TFAIL, "the old %s still "
> - "exists", TC[i].desc);
> - continue;
> - }
> -
> - tst_resm(TPASS, "functionality is correct "
> - "for renaming a %s", TC[i].desc);
> - }
> - /* reset things in case we are looping */
> - SAFE_RENAME(cleanup, mname, fname);
> -
> - SAFE_RENAME(cleanup, mdir, fdir);
This was there for a reason, the test now fails with -i 2
I guess that better solution would be swapping the old and new directory
pointers after each iteration as:
static const char *old_file_name = "oldfile";
static const char *old_dir_name = "olddir";
static const char *new_file_name = "newfile";
static const char *new_dir_name = "newdir";
#define SWAP(a, b) do { \
const char *tmp__ = a; \
a = b; \
b = tmp__; \
} while (0)
static void run(void)
{
...
SWAP(old_file_name, new_file_name);
SWAP(old_dir_name, new_dir_name);
}
> - }
> -
> - cleanup();
> - tst_exit();
> + SAFE_TOUCH(OLD_FILE_NAME, 0700, NULL);
> + SAFE_MKDIR(OLD_DIR_NAME, 00770);
>
> + SAFE_STAT(OLD_FILE_NAME, &old_file_st);
> + SAFE_STAT(OLD_DIR_NAME, &old_dir_st);
> }
>
> -/*
> - * setup() - performs all ONE TIME setup for this test.
> - */
> -void setup(void)
> +static void run(void)
> {
> -
> - tst_sig(NOFORK, DEF_HANDLER, cleanup);
> -
> - TEST_PAUSE;
> -
> - /* Create a temporary directory and make it current. */
> - tst_tmpdir();
> -
> - sprintf(fname, "./tfile_%d", getpid());
> - sprintf(mname, "./rnfile_%d", getpid());
> - sprintf(fdir, "./tdir_%d", getpid());
> - sprintf(mdir, "./rndir_%d", getpid());
> -
> - SAFE_TOUCH(cleanup, fname, 0700, NULL);
> -
> - SAFE_STAT(cleanup, fname, &buf1);
> -
> - f_olddev = buf1.st_dev;
> - f_oldino = buf1.st_ino;
> -
> - /* create "old" directory */
> - SAFE_MKDIR(cleanup, fdir, 00770);
> -
> - SAFE_STAT(cleanup, fdir, &buf1);
> -
> - d_olddev = buf1.st_dev;
> - d_oldino = buf1.st_ino;
> + TST_EXP_PASS(rename(OLD_FILE_NAME, NEW_FILE_NAME),
> + "rename(%s, %s)",
> + OLD_FILE_NAME, NEW_FILE_NAME);
> + TST_EXP_PASS(rename(OLD_DIR_NAME, NEW_DIR_NAME),
> + "rename(%s, %s)",
> + OLD_DIR_NAME, NEW_DIR_NAME);
It would be better to do return; if either of the renames had failed,
i.e. to add after each:
if (!TST_PASS)
return;
> + SAFE_STAT(NEW_FILE_NAME, &new_file_st);
> + SAFE_STAT(NEW_DIR_NAME, &new_dir_st);
> +
> + TST_EXP_EQ_LI(old_file_st.st_dev, new_file_st.st_dev);
> + TST_EXP_EQ_LI(old_file_st.st_ino, new_file_st.st_ino);
> +
> + TST_EXP_EQ_LI(old_dir_st.st_dev, new_dir_st.st_dev);
> + TST_EXP_EQ_LI(old_dir_st.st_ino, new_dir_st.st_ino);
> +
> + TST_EXP_FAIL(stat(OLD_FILE_NAME, &old_file_st),
> + ENOENT,
> + "stat(%s, &old_file_st)",
> + OLD_FILE_NAME);
> + TST_EXP_FAIL(stat(OLD_DIR_NAME, &old_dir_st),
> + ENOENT,
> + "stat(%s, &old_dir_st)",
> + OLD_DIR_NAME);
> }
>
> -/*
> - * cleanup() - performs all ONE TIME cleanup for this test at
> - * completion or premature exit.
> - */
> -void cleanup(void)
> -{
> -
> - /*
> - * Remove the temporary directory.
> - */
> - tst_rmdir();
> -}
> +static struct tst_test test = {
> + .setup = setup,
> + .test_all = run,
> + .needs_tmpdir = 1
> +};
> --
> 2.36.1
>
>
> --
> Mailing list info: https://lists.linux.it/listinfo/ltp
--
Cyril Hrubis
chrubis@suse.cz
--
Mailing list info: https://lists.linux.it/listinfo/ltp
next prev parent reply other threads:[~2022-06-22 14:51 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-22 7:01 [LTP] [PATCH 0/9] Simplify and convert some of rename tests to new LTP API Avinesh Kumar
2022-06-22 7:01 ` [LTP] [PATCH 1/9] Rewrite rename01.c using " Avinesh Kumar
2022-06-22 14:53 ` Cyril Hrubis [this message]
2022-06-22 7:01 ` [LTP] [PATCH 2/9] Remove rename02.c Avinesh Kumar
2022-06-22 7:01 ` [LTP] [PATCH 3/9] Rewrite rename03.c using new LTP API Avinesh Kumar
2022-06-22 7:01 ` [LTP] [PATCH 4/9] Rewrite rename04.c " Avinesh Kumar
2022-06-22 7:01 ` [LTP] [PATCH 5/9] Rewrite rename05.c " Avinesh Kumar
2022-06-22 7:01 ` [LTP] [PATCH 6/9] Rewrite rename06.c " Avinesh Kumar
2022-06-22 7:01 ` [LTP] [PATCH 7/9] Rewrite rename07.c " Avinesh Kumar
2022-06-22 7:01 ` [LTP] [PATCH 8/9] Rewrite rename08.c " Avinesh Kumar
2022-06-22 7:01 ` [LTP] [PATCH 9/9] Rewrite rename10.c " Avinesh Kumar
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YrMs/dt/ioC8p3Sx@yuki \
--to=chrubis@suse.cz \
--cc=akumar@suse.de \
--cc=ltp@lists.linux.it \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.