From: Eryu G. <eg...@re...> - 2011-12-22 11:56:35
|
Basic tests for setxattr(2) and make sure setxattr(2) handles error conditions correctly. There are 7 test cases: 1. Any other flags being set except XATTR_CREATE and XATTR_REPLACE, setxattr(2) should return -1 and set errno to EINVAL 2. With XATTR_REPLACE flag set but the attribute does not exist, setxattr(2) should return -1 and set errno to ENOATTR 3. Create new attr with name length greater than XATTR_NAME_MAX(255) setxattr(2) should return -1 and set errno to ERANGE 4. Create new attr whose value length is greater than XATTR_SIZE_MAX(65536) setxattr(2) should return -1 and set errno to E2BIG 5. Create new attr whose value length is zero, setxattr(2) should succeed 6. Replace the attr value without XATTR_REPLACE flag being set, setxattr(2) should return -1 and set errno to EEXIST 7. Replace attr value with XATTR_REPLACE flag being set, setxattr(2) should succeed Signed-off-by: Eryu Guan <eg...@re...> --- runtest/syscalls | 2 + testcases/kernel/syscalls/setxattr/Makefile | 23 +++ testcases/kernel/syscalls/setxattr/setxattr01.c | 207 +++++++++++++++++++++++ 3 files changed, 232 insertions(+), 0 deletions(-) create mode 100644 testcases/kernel/syscalls/setxattr/Makefile create mode 100644 testcases/kernel/syscalls/setxattr/setxattr01.c |
From: Eryu G. <eg...@re...> - 2011-12-22 11:56:37
|
Basic tests for getxattr(2) and make sure getxattr(2) handles error conditions correctly. There are 4 test cases: 1. Get an non-existing attribute, getxattr(2) should return -1 and set errno to ENOATTR 2. Buffer size is smaller than attribute value size, getxattr(2) should return -1 and set errno to ERANGE 3. Get attribute, getxattr(2) should succeed 4. Verify the attribute got by getxattr(2) is same as the value we set Signed-off-by: Eryu Guan <eg...@re...> --- runtest/syscalls | 2 + testcases/kernel/syscalls/getxattr/Makefile | 23 +++ testcases/kernel/syscalls/getxattr/getxattr01.c | 175 +++++++++++++++++++++++ 3 files changed, 200 insertions(+), 0 deletions(-) create mode 100644 testcases/kernel/syscalls/getxattr/Makefile create mode 100644 testcases/kernel/syscalls/getxattr/getxattr01.c |
From: Cyril H. <ch...@su...> - 2011-12-22 12:38:50
|
Hi! > diff --git a/runtest/syscalls b/runtest/syscalls > index 3056659..48caaae 100644 > --- a/runtest/syscalls > +++ b/runtest/syscalls > @@ -420,6 +420,8 @@ getuid02_16 getuid02_16 > getuid03 getuid03 > getuid03_16 getuid03_16 > > +getxattr01 getxattr01 > + > #Needs tty device. > #ioctl01 ioctl01 -D /dev/tty0 > #ioctl02 ioctl02 -D /dev/tty0 > diff --git a/testcases/kernel/syscalls/getxattr/Makefile b/testcases/kernel/syscalls/getxattr/Makefile > new file mode 100644 > index 0000000..72544c1 > --- /dev/null > +++ b/testcases/kernel/syscalls/getxattr/Makefile > @@ -0,0 +1,23 @@ > +# > +# Copyright (c) Red Hat Inc., 2011 > +# > +# 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > +# > + > +top_srcdir ?= ../../../.. > + > +include $(top_srcdir)/include/mk/testcases.mk > + > +include $(top_srcdir)/include/mk/generic_leaf_target.mk > diff --git a/testcases/kernel/syscalls/getxattr/getxattr01.c b/testcases/kernel/syscalls/getxattr/getxattr01.c > new file mode 100644 > index 0000000..e05628f > --- /dev/null > +++ b/testcases/kernel/syscalls/getxattr/getxattr01.c > @@ -0,0 +1,175 @@ > +/* > + * Copyright (C) 2011 Red Hat, Inc. > + * > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of version 2 of the GNU General Public > + * License as published by the Free Software Foundation. > + * > + * This program is distributed in the hope that it would be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. > + * > + * Further, this software is distributed without any warranty that it > + * is free of the rightful claim of any third person regarding > + * infringement or the like. Any license provided herein, whether > + * implied or otherwise, applies only to this software file. Patent > + * licenses, if any, provided herein do not apply to combinations of > + * this program with other software, or any other product whatsoever. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write the Free Software > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA > + * 02110-1301, USA. > + */ > + > +/* > + * Basic tests for getxattr(2) and make sure getxattr(2) handles error > + * conditions correctly. > + * > + * There are 4 test cases: > + * 1. Get an non-existing attribute, > + * getxattr(2) should return -1 and set errno to ENOATTR > + * 2. Buffer size is smaller than attribute value size, > + * getxattr(2) should return -1 and set errno to ERANGE > + * 3. Get attribute, getxattr(2) should succeed > + * 4. Verify the attribute got by getxattr(2) is same as the value we set > + */ > + > +#include <sys/types.h> > +#include <sys/stat.h> > +#include <attr/xattr.h> > +#include <errno.h> > +#include <fcntl.h> > +#include <unistd.h> > +#include <stdio.h> > +#include <stdlib.h> > +#include <string.h> > + > +#include "test.h" > +#include "usctest.h" > + > +#define XATTR_TEST_KEY "user.testkey" > +#define XATTR_TEST_VALUE "this is a test value" > +#define BUFFSIZE 64 > +#define NR_TEST 3 > + > +static void setup(void); > +static void cleanup(void); > + > +char *TCID = "getxattr01"; > +char filename[BUFSIZ]; > +int TST_TOTAL = NR_TEST + 1; > + > +struct test_case { > + char *fname; > + char *key; > + char *value; > + size_t size; > + int exp_err; > +}; > +struct test_case tc[NR_TEST]; > + > +int main(int argc, char *argv[]) > +{ > + int lc; > + int i; > + char *msg; > + char *tname; > + char *tkey; > + char *tvalue; > + size_t tsize; > + int texp_err; > + > + > + msg = parse_opts(argc, argv, NULL, NULL); > + if (msg != NULL) > + tst_brkm(TBROK, tst_exit, "OPTION PARSING ERROR - %s", msg); > + > + setup(); > + > + for (lc = 0; TEST_LOOPING(lc); lc++) { > + Tst_count = 0; > + > + for (i = 0; i < NR_TEST; i++) { > + tname = tc[i].fname; > + tkey = tc[i].key; > + tvalue = tc[i].value; > + tsize = tc[i].size; > + texp_err = tc[i].exp_err; > + > + TEST(getxattr(tname, tkey, tvalue, tsize)); > + > + if (TEST_ERRNO == texp_err) { > + tst_resm(TPASS, "expected behavior - errno = %d" > + " : %s", TEST_ERRNO, strerror(TEST_ERRNO)); > + } else { > + tst_resm(TFAIL, "unexpected behavior - %d : %s " > + "- expected %d", TEST_ERRNO, > + strerror(TEST_ERRNO), texp_err); The same here, you could use TTERRNO here. > + } > + } > + > + if (strcmp(tvalue, XATTR_TEST_VALUE)) > + tst_resm(TFAIL, "Wrong value, expect \"%s\" got \"%s\"", > + XATTR_TEST_VALUE, tvalue); > + else > + tst_resm(TPASS, "Got the right value"); > + } > + > + cleanup(); > + tst_exit(); > +} > + > +static void setup(void) > +{ > + int fd; > + int i; > + > + tst_require_root(NULL); > + > + tst_tmpdir(); > + > + /* Create test file and setup initial xattr */ > + snprintf(filename, BUFSIZ, "getxattr01testfile"); > + fd = creat(filename, 0644); > + if (fd == -1) > + tst_brkm(TBROK | TERRNO, cleanup, "Create test file(%s) failed", > + filename); > + close(fd); > + if (setxattr(filename, XATTR_TEST_KEY, XATTR_TEST_VALUE, > + strlen(XATTR_TEST_VALUE), XATTR_CREATE) == -1) { > + if (errno == ENOTSUP) { > + tst_brkm(TCONF, cleanup, "No xattr support in fs or " > + "mount without user_xattr option"); > + } > + } > + > + /* Prepare test cases */ > + memset(tc, 0, NR_TEST * sizeof(tc[0])); > + for (i = 0; i < NR_TEST; i++) { > + tc[i].fname = filename; > + tc[i].key = XATTR_TEST_KEY; > + tc[i].value = malloc(BUFFSIZE); > + if (tc[i].value == NULL) { > + tst_brkm(TBROK | TERRNO, cleanup, > + "Cannot allocate memory"); > + } > + tc[i].size = BUFFSIZE - 1; > + } > + > + tc[0].key = "user.nosuchkey"; > + tc[0].exp_err = ENOATTR; > + > + tc[1].size = 1; > + tc[1].exp_err = ERANGE; > + > + tc[2].exp_err = 0; This part could be initalized statically as a whole, or not? > + TEST_PAUSE; > +} > + > +static void cleanup(void) > +{ > + TEST_CLEANUP; > + tst_rmdir(); > +} -- Cyril Hrubis ch...@su... |
From: Cyril H. <ch...@su...> - 2011-12-22 12:35:46
|
Hi! > diff --git a/testcases/kernel/syscalls/setxattr/setxattr01.c b/testcases/kernel/syscalls/setxattr/setxattr01.c > new file mode 100644 > index 0000000..cfe5e52 > --- /dev/null > +++ b/testcases/kernel/syscalls/setxattr/setxattr01.c > @@ -0,0 +1,207 @@ > +/* > + * Copyright (C) 2011 Red Hat, Inc. > + * > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of version 2 of the GNU General Public > + * License as published by the Free Software Foundation. > + * > + * This program is distributed in the hope that it would be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. > + * > + * Further, this software is distributed without any warranty that it > + * is free of the rightful claim of any third person regarding > + * infringement or the like. Any license provided herein, whether > + * implied or otherwise, applies only to this software file. Patent > + * licenses, if any, provided herein do not apply to combinations of > + * this program with other software, or any other product whatsoever. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write the Free Software > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA > + * 02110-1301, USA. > + */ > + > +/* > + * Basic tests for setxattr(2) and make sure setxattr(2) handles error > + * conditions correctly. > + * > + * There are 7 test cases: > + * 1. Any other flags being set except XATTR_CREATE and XATTR_REPLACE, > + * setxattr(2) should return -1 and set errno to EINVAL > + * 2. With XATTR_REPLACE flag set but the attribute does not exist, > + * setxattr(2) should return -1 and set errno to ENOATTR > + * 3. Create new attr with name length greater than XATTR_NAME_MAX(255) > + * setxattr(2) should return -1 and set errno to ERANGE > + * 4. Create new attr whose value length is greater than XATTR_SIZE_MAX(65536) > + * setxattr(2) should return -1 and set errno to E2BIG > + * 5. Create new attr whose value length is zero, > + * setxattr(2) should succeed > + * 6. Replace the attr value without XATTR_REPLACE flag being set, > + * setxattr(2) should return -1 and set errno to EEXIST > + * 7. Replace attr value with XATTR_REPLACE flag being set, > + * setxattr(2) should succeed > + */ > + > +#include <sys/types.h> > +#include <sys/stat.h> > +#include <sys/wait.h> > +#include <attr/xattr.h> > +#include <errno.h> > +#include <fcntl.h> > +#include <unistd.h> > +#include <signal.h> > +#include <stdio.h> > +#include <stdlib.h> > +#include <string.h> > + > +#include "test.h" > +#include "usctest.h" > + > +#define XATTR_NAME_MAX 255 > +#define XATTR_NAME_LEN (XATTR_NAME_MAX + 2) > +#define XATTR_SIZE_MAX 65536 > +#define XATTR_TEST_KEY "user.testkey" > +#define XATTR_TEST_VALUE "this is a test value" > +#define NR_TEST 7 > + > +static void setup(void); > +static void cleanup(void); > + > +char *TCID = "setxattr01"; > +char filename[BUFSIZ]; > +char long_key[XATTR_NAME_LEN]; > +char *long_value; > +int TST_TOTAL = NR_TEST; > + > +struct test_case { > + char *fname; > + char *key; > + char *value; > + size_t size; > + int flags; > + int exp_err; > +}; > +struct test_case tc[NR_TEST]; > + > +int main(int argc, char *argv[]) > +{ > + int lc; > + int i; > + char *msg; > + char *tname; > + char *tkey; > + char *tvalue; > + size_t tsize; > + int tflags; > + int texp_err; > + > + > + msg = parse_opts(argc, argv, NULL, NULL); > + if (msg != NULL) > + tst_brkm(TBROK, tst_exit, "OPTION PARSING ERROR - %s", msg); > + > + setup(); > + > + for (lc = 0; TEST_LOOPING(lc); lc++) { > + Tst_count = 0; > + > + for (i = 0; i < NR_TEST; i++) { > + tname = tc[i].fname; > + tkey = tc[i].key; > + tvalue = tc[i].value; > + tsize = tc[i].size; > + tflags = tc[i].flags; > + texp_err = tc[i].exp_err; > + > + TEST(setxattr(tname, tkey, tvalue, tsize, tflags)); > + > + if (TEST_ERRNO == texp_err) { > + tst_resm(TPASS, "expected behavior - errno = %d" > + " : %s", TEST_ERRNO, strerror(TEST_ERRNO)); You can use TTERRNO flag together with TPASS to print TEST_ERRNO > + } else { > + tst_resm(TFAIL, "unexpected behavior - %d : %s " > + "- expected %d", TEST_ERRNO, > + strerror(TEST_ERRNO), texp_err); > + } Here as well. > + } > + } > + > + cleanup(); > + tst_exit(); > +} > + > +static void setup(void) > +{ > + int fd; > + int i; > + > + tst_require_root(NULL); > + > + tst_tmpdir(); > + > + /* Test for xattr support */ > + fd = creat("testfile", 0644); > + if (fd == -1) > + tst_brkm(TBROK | TERRNO, cleanup, "Create testfile failed"); > + close(fd); > + if (setxattr("testfile", "user.test", "test", 4, XATTR_CREATE) == -1) > + if (errno == ENOTSUP) > + tst_brkm(TCONF, cleanup, "No xattr support in fs or " > + "mount without user_xattr option"); > + > + /* Create test file */ > + snprintf(filename, BUFSIZ, "setxattr01testfile"); > + fd = creat(filename, 0644); > + if (fd == -1) > + tst_brkm(TBROK | TERRNO, cleanup, "Create test file(%s) failed", > + filename); > + close(fd); > + > + /* Prepare test cases */ > + memset(tc, 0, NR_TEST * sizeof(tc[0])); > + for (i = 0; i < NR_TEST; i++) { > + tc[i].fname = filename; > + tc[i].key = XATTR_TEST_KEY; > + tc[i].value = XATTR_TEST_VALUE; > + tc[i].size = strlen(XATTR_TEST_VALUE); > + tc[i].flags = XATTR_CREATE; > + } > + > + tc[0].flags = ~0; > + tc[0].exp_err = EINVAL; > + > + tc[1].flags = XATTR_REPLACE; > + tc[1].exp_err = ENOATTR; > + > + snprintf(long_key, 6, "%s", "user."); > + memset(long_key + 5, 'k', XATTR_NAME_LEN - 5); > + long_key[XATTR_NAME_LEN - 1] = '\0'; > + tc[2].key = long_key; > + tc[2].exp_err = ERANGE; > + > + long_value = malloc(XATTR_SIZE_MAX + 2); > + if (!long_value) > + tst_brkm(TBROK | TERRNO, cleanup, "malloc failed"); > + memset(long_value, 'v', XATTR_SIZE_MAX + 2); > + long_value[XATTR_SIZE_MAX + 1] = '\0'; > + tc[3].value = long_value; > + tc[3].size = XATTR_SIZE_MAX + 1; > + tc[3].exp_err = E2BIG; > + > + tc[4].size = 0; > + tc[4].exp_err = 0; > + > + tc[5].exp_err = EEXIST; > + > + tc[6].flags = XATTR_REPLACE; > + tc[6].exp_err = 0; Hmm is there any reason why most of this couldn't be statically initalized as it's usually done in the most of the testcases? The only part that is not static value seems to be the malloc(). > + TEST_PAUSE; > +} > + > +static void cleanup(void) > +{ > + TEST_CLEANUP; > + tst_rmdir(); > +} -- Cyril Hrubis ch...@su... |
From: Eryu G. <eg...@re...> - 2011-12-26 04:05:59
|
Basic tests for setxattr(2) and make sure setxattr(2) handles error conditions correctly. There are 7 test cases: 1. Any other flags being set except XATTR_CREATE and XATTR_REPLACE, setxattr(2) should return -1 and set errno to EINVAL 2. With XATTR_REPLACE flag set but the attribute does not exist, setxattr(2) should return -1 and set errno to ENOATTR 3. Create new attr with name length greater than XATTR_NAME_MAX(255) setxattr(2) should return -1 and set errno to ERANGE 4. Create new attr whose value length is greater than XATTR_SIZE_MAX(65536) setxattr(2) should return -1 and set errno to E2BIG 5. Create new attr whose value length is zero, setxattr(2) should succeed 6. Replace the attr value without XATTR_REPLACE flag being set, setxattr(2) should return -1 and set errno to EEXIST 7. Replace attr value with XATTR_REPLACE flag being set, setxattr(2) should succeed Signed-off-by: Eryu Guan <eg...@re...> --- V2: 1. Statically initialize test case array 2. Use TTERRNO with TPASS and TFAIL to print TEST_ERRNO message runtest/syscalls | 2 + testcases/kernel/syscalls/setxattr/Makefile | 23 +++ testcases/kernel/syscalls/setxattr/setxattr01.c | 236 +++++++++++++++++++++++ 3 files changed, 261 insertions(+), 0 deletions(-) create mode 100644 testcases/kernel/syscalls/setxattr/Makefile create mode 100644 testcases/kernel/syscalls/setxattr/setxattr01.c |
From: Eryu G. <eg...@re...> - 2011-12-26 04:06:03
|
Basic tests for getxattr(2) and make sure getxattr(2) handles error conditions correctly. There are 4 test cases: 1. Get an non-existing attribute, getxattr(2) should return -1 and set errno to ENOATTR 2. Buffer size is smaller than attribute value size, getxattr(2) should return -1 and set errno to ERANGE 3. Get attribute, getxattr(2) should succeed 4. Verify the attribute got by getxattr(2) is same as the value we set Signed-off-by: Eryu Guan <eg...@re...> --- V2: 1. Statically initialize test case array 2. Use TTERRNO with TPASS and TFAIL to print TEST_ERRNO message runtest/syscalls | 2 + testcases/kernel/syscalls/getxattr/Makefile | 23 +++ testcases/kernel/syscalls/getxattr/getxattr01.c | 184 +++++++++++++++++++++++ 3 files changed, 209 insertions(+), 0 deletions(-) create mode 100644 testcases/kernel/syscalls/getxattr/Makefile create mode 100644 testcases/kernel/syscalls/getxattr/getxattr01.c |
From: Caspar Z. <ca...@ca...> - 2011-12-28 03:53:00
|
On 12/26/2011 12:04 PM, Eryu Guan wrote: > + tname = tc[i].fname; > + tkey = tc[i].key; > + tvalue = tc[i].value; > + tsize = tc[i].size; > + tflags = tc[i].flags; > + texp_err = tc[i].exp_err; > + > + TEST(setxattr(tname, tkey, tvalue, tsize, tflags)); I wonder whether it's necessary. all of the variables be used once only. Others looks good for me. Caspar |
From: Cyril H. <ch...@su...> - 2011-12-29 19:31:12
|
Hi! > > + tname = tc[i].fname; > > + tkey = tc[i].key; > > + tvalue = tc[i].value; > > + tsize = tc[i].size; > > + tflags = tc[i].flags; > > + texp_err = tc[i].exp_err; > > + > > + TEST(setxattr(tname, tkey, tvalue, tsize, tflags)); > > I wonder whether it's necessary. all of the variables be used once only. I slightly for removing that too. So if you wan't to change that, resend new patch, otherwise let me know, I'll commit this as it is. -- Cyril Hrubis ch...@su... |
From: Eryu G. <eg...@re...> - 2011-12-30 02:54:00
|
On Thu, Dec 29, 2011 at 08:41:32PM +0100, Cyril Hrubis wrote: > Hi! > > > + tname = tc[i].fname; > > > + tkey = tc[i].key; > > > + tvalue = tc[i].value; > > > + tsize = tc[i].size; > > > + tflags = tc[i].flags; > > > + texp_err = tc[i].exp_err; > > > + > > > + TEST(setxattr(tname, tkey, tvalue, tsize, tflags)); > > > > I wonder whether it's necessary. all of the variables be used once only. > > I slightly for removing that too. > > So if you wan't to change that, resend new patch, otherwise let me know, > I'll commit this as it is. Ok, I'll resent a new patchset. Thanks for reviewing. Eryu Guan > > -- > Cyril Hrubis > ch...@su... |