Poornima,
Please resend it as a patch containing the source code/directories,
Makefile(s), scripts(if any) and entry inside runtest/syscalls, all
together integrated. I can test then.
Regards--
Subrata
On Thu, 2008-07-31 at 18:30 +0530, B. N. Poornima wrote:
> Hi,
> I have developed test cases for sync_file_range() system call which will
> do the basic sanity (error) checking for the system call. These tests
> have to be run on 2.6.17 kernel and above.
> The test cases have been currently tested only on x86 and x86_64
> architecture.
> Also, I have hard coded the system call number in the test case for
> review purposes and will be later on moving it to
> linux_syscall_numbers.h file in the LTP framework.
> Please review the test cases and provide your comments so that I can
> improve the same.
>
> Thanks,
> Poornima.
>
> /******************************************************************************
> * syncfilerange01.c
> * Copyright (c) International Business Machines Corp., 2008
> * Email: [EMAIL PROTECTED]
>
> *****************************************************************************/
>
> /******************************************************************************/
> /*
>
> */
> /* 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; if not, write to the Free
> Software */
> /* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
> USA */
> /*
> */
> /******************************************************************************/
>
>
> /*****************************************************************************
> * TEST IDENTIFIER : syncfilerange01
> *
> * EXECUTED BY : anyone
> *
> * TEST TITLE : Checks for Errors from sync_file_range()
> *
> * TEST CASE TOTAL : 5
> *
> * CPU ARCHITECTURES : All
> *
> * AUTHOR : B N Poornima
> *
> * DATE STARTED : 21/07/2008
> *
> * TEST CASES
> * (Tests sync_file_range() for different test cases as reported in
> the man
> * page)
> *
> * INPUT SPECIFICATIONS
> * No input needs to be specified
> * sync_file_data() in-puts are specified through test_data
> *
> * OUTPUT SPECIFICATIONS
> * sync_file_data() error message matches with the expected
> error
> * message.
> *
> *
> * ENVIRONMENTAL NEEDS
> * None
> *
> * SPECIAL PROCEDURAL REQUIREMENTS
> * None
> *
> * DETAILED DESCRIPTION
> * This is a test case for sync_file_range() system call.
> * This test suite tests various error messages from the
> system call
> * If the error message received matches with the expected
> * test is considered passed else test fails
> *
> * Total 5 Test Cases :-
> * Various error messages from the man page
> *
> * Setup:
> * Setup files on which sync_file_range is to be called
> *
> * Test:
> * Loop if the proper options are given.
> * Execute system call
> * Check return code.
> * If error obtained matches with the expected error
> * PASS the test, otherwise TEST FAILS
> *
> * Cleanup:
> * Cleanup the temporary folder
> *
>
> ******************************************************************************/
>
>
> #define _GNU_SOURCE
>
> /* Standard Include Files */
> #include <stdio.h>
> #include <stdlib.h>
> #include <errno.h>
> #include <sys/stat.h>
> #include <sys/types.h>
> #include <fcntl.h>
> #include <sys/utsname.h>
> #include <unistd.h>
>
> /* Harness Specific Include Files. */
> #include "test.h"
> #include "usctest.h"
> #include "linux_syscall_numbers.h"
>
>
> #ifndef __NR_sync_file_range
> #define __NR_sync_file_range -1 //DUMMY VALUE
> int arch_support = 0; //Architecure is not supported
> #else
> int arch_support = 1; //Architecture is supported
>
> #endif
>
> #ifdef __powerpc64__
> # ifndef __NR_sync_file_range2
> # define __NR_sync_file_range2 308
> #endif
> #endif
>
> #ifndef SYNC_FILE_RANGE_WAIT_BEFORE
> #define SYNC_FILE_RANGE_WAIT_BEFORE 1
> #define SYNC_FILE_RANGE_WRITE 2 //DUMMY VALUES
> #define SYNC_FILE_RANGE_WAIT_AFTER 4
> #endif
>
> #define SYNC_FILE_RANGE_INVALID 8
>
> /* Extern Global Variables */
> extern int Tst_count; /* counter for tst_xxx
> routines. */
> extern char *TESTDIR; /* temporary dir created by
> tst_tmpdir() */
>
> /* Global Variables */
> char *TCID = "syncfilerange01"; /* test program identifier. */
> char filename[255]; /* file used for testing */
> char spl_file[] = "/dev/null";
> int filed, sfd; /* normal and special fds */
> int bfd = -1; /* Bad file descriptor */
>
> struct test_data_t
> {
> int *fd;
> off64_t offset;
> off64_t nbytes;
> unsigned int flags;
> int error;
> } test_data[] = {
> {&bfd, 0, 1, SYNC_FILE_RANGE_WRITE, EBADF},
> {&sfd, 0, 1, SYNC_FILE_RANGE_WAIT_AFTER, ESPIPE},
> {&filed, -1, 1, SYNC_FILE_RANGE_WAIT_BEFORE, EINVAL},
> {&filed, 0, -1, SYNC_FILE_RANGE_WRITE, EINVAL},
> {&filed, 0, 1, SYNC_FILE_RANGE_INVALID, EINVAL}
> };
>
> int TST_TOTAL = sizeof(test_data) / sizeof(test_data[0]);
>
> /* Extern Global Functions */
> /******************************************************************************/
> /*
>
> */
> /* Function:
> cleanup
> */
> /*
>
> */
> /* Description: Performs all one time clean up for this test on
> successful */
> /* completion, premature exit or failure. Closes all
> temporary */
> /* files, removes all temporary directories exits the test
> with */
> /* appropriate return code by calling tst_exit()
> function. */
> /*
>
> */
> /* Input:
> None.
> */
> /*
>
> */
> /* Output:
> None.
> */
> /*
>
> */
> /* Return: On failure - Exits calling tst_exit(). Non '0' return
> code. */
> /* On success - Exits calling tst_exit(). With '0' return
> code. */
> /*
>
> */
> /******************************************************************************/
> extern void
> cleanup()
> {
> /*
> * print timing stats if that option was specified.
> * print errno log if that option was specified.
> */
> TEST_CLEANUP;
>
> /* close the file we have open */
> if (close(filed) == -1) {
> tst_resm(TWARN, "close(%s) Failed, errno=%d : %s", filename,
> errno, strerror(errno));
> }
>
> /* Remove tmp dir and all files in it */
> tst_rmdir();
>
> /* exit with return code appropriate for results */
> tst_exit();
>
> tst_exit();
> }
>
>
> /* Local Functions */
> /******************************************************************************/
> /*
>
> */
> /* Function:
> setup
> */
> /*
>
> */
> /* Description: Performs all one time setup for this test. This function
> is */
> /* typically used to capture signals, create temporary
> dirs */
> /* and temporary files that may be used in the course of
> this */
> /*
> test.
> */
> /*
>
> */
> /* Input:
> None.
> */
> /*
>
> */
> /*
>
> */
> /* Output:
> None.
> */
> /*
>
> */
> /* Return: On failure - Exits by calling
> cleanup().
> */
> /* On success - returns
> 0.
> */
> /*
>
> */
> /******************************************************************************/
> void
> setup()
> {
> /* capture signals */
> tst_sig(NOFORK, DEF_HANDLER, cleanup);
>
> /* Pause if that option was specified */
> TEST_PAUSE;
>
> /* make a temp directory and cd to it */
> tst_tmpdir();
>
> sprintf(filename,"tmpfile_%d",getpid());
> if ((filed = open(filename,O_RDWR|O_CREAT,0700)) == -1) {
> tst_brkm(TBROK, cleanup,
> "open(%s, O_RDWR|O_CREAT,0700) Failed, errno=%d : %s",
> filename, errno, strerror(errno));
>
> sfd = open(spl_file, O_RDWR|O_CREAT, 0700);
>
> }
>
> return;
> }
>
> /*****************************************************************************
> * Wraper function to call sync_file_range system call
>
> ******************************************************************************/
> static inline long syncfilerange(int fd, off64_t offset, off64_t nbytes,
> unsigned int flags)
> {
>
> #if defined(__powerpc64__) && (__WORDSIZE==32)
>
> return syscall(__NR_sync_file_range2, fd, flags,
> (int)(offset >>32), \
> (int)offset, (int)(nbytes >>32),
> (int)nbytes);
>
> #elif defined(__powerpc64__) && (__WORDSIZE==64)
>
> return syscall(__NR_sync_file_range2, fd, flags,
> offset, nbytes);
> #endif
>
> return syscall(__NR_sync_file_range, fd, offset,
> nbytes, flags);
>
> return 0;
> }
> /******************************************************************************/
> /*
>
> */
> /* Function:
> main
> */
> /*
>
> */
> /* Description: Entry point to this test-case. It parses all the command
> line */
> /* inputs, calls the global setup and executes the test. It
> logs */
> /* the test status and results appropriately using the LTP
> API's */
> /* On successful completion or premature failure, cleanup()
> func */
> /* is called and test exits with an appropriate return
> code. */
> /*
>
> */
> /* Input: Describe input arguments to this
> test-case
> */
> /* -l - Number of
> iteration
> */
> /* -v - Prints verbose
> output
> */
> /* -V - Prints the version
> number
> */
> /*
>
> */
> /* Exit: On failure - Exits by calling
> cleanup().
> */
> /* On success - exits with 0 exit
> value.
> */
> /*
>
> */
> /******************************************************************************/
> int
> main(int ac, /* number of command line
> parameters */
> char **av) /* pointer to the array of the command line
> parameters. */
> {
>
> int test_index = 0;
> int lc;
> char *msg;
>
> /***************************************************************
> parse standard options
> ********************************************************************/
> if ( (msg=parse_opts(ac, av, (option_t *) NULL, NULL)) != (char
> *) NULL )
> tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg);
>
> /* This test needs kernel version > 2.6.16 */
>
> if ( !arch_support || (tst_kvercmp(2,6,17) < 0)) {
> tst_resm(TWARN," System doesn't support execution of the
> test");
> exit(0);
> }
>
>
> /* perform global test setup, call setup() function. */
> setup();
>
> for (lc=0; TEST_LOOPING(lc); lc++) {
> /* reset Tst_count in case we are looping. */
> Tst_count=0;
>
> for(test_index = 0 ; test_index < TST_TOTAL; test_index ++)
> {
> TEST(syncfilerange(*(test_data[test_index].fd),
> test_data[test_index].offset, \
> test_data[test_index].nbytes,
> test_data[test_index].flags));
>
>
> if (TEST_RETURN != -1) {
> tst_resm(TFAIL, "call succeeded
> unexpectedly");
> continue;
> }
>
> TEST_ERROR_LOG(TEST_ERRNO);
>
> if (TEST_ERRNO == test_data[test_index].error) {
> tst_resm(TPASS, "expected failure - "
> "errno = %d : %s", TEST_ERRNO,
> strerror(TEST_ERRNO));
> } else {
> tst_resm(TFAIL, "unexpected error - %d :
> %s - "
> "expected %d", TEST_ERRNO,
> strerror(TEST_ERRNO),
> test_data[test_index].error);
> }
> }
>
> }
>
> cleanup();
> return(0);
> }
>
>
>
>
>
>
-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list