[LTP] [PATCH 1/2] lgetxattr/lgetxattr01.c: add new testcase
Cyril Hrubis
chrubis@suse.cz
Wed Jul 13 14:22:48 CEST 2016
Hi!
> @@ -0,0 +1,119 @@
> +/*
> +* Copyright (c) 2016 Fujitsu Ltd.
> +* Author: Jinbao Huang <huangjb.jy@cn.fujitsu.com>
> +*
> +* 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.
> +*
> +* You should have received a copy of the GNU General Public License
> +* alone with this program.
> +*/
> +
> +/*
> +* Test Name: lgetxattr01
> +*
> +* Description:
> +* The testcase checks the basic functionality of the lgetxattr(2).
> +* In the case of a symbolic link, we only get the value of the
> +* extended attribute related to the link itself by name.
> +*/
> +
> +#include "config.h"
> +#include <errno.h>
> +#include <sys/types.h>
> +#include <string.h>
> +
> +#ifdef HAVE_ATTR_XATTR_H
> +#include <attr/xattr.h>
> +#endif
> +
> +#include "tst_test.h"
> +
> +#ifdef HAVE_ATTR_XATTR_H
> +#define SECURITY_KEY1 "security.ltptest1"
> +#define SECURITY_KEY2 "security.ltptest2"
> +#define VALUE1 "test1"
> +#define VALUE2 "test2"
> +#define VALUE_SIZE 5
> +
> +static void set_xattr(char *path, char *key, void *value)
> +{
> + int res;
> +
> + res = lsetxattr(path, key, value, VALUE_SIZE, XATTR_CREATE);
^
Should be either defined to
sizeof() or we can do strlen()
on the value as well.
I would either add size parameter to this function so that it could be
called in setup as:
set_xattr("testfile", SECURITY_KEY1, VALUE1, sizeof(VALUE1));
Which will include the terminating null character at the end, but I
doubt that we care about if it's there or not.
Or we can alternatively get the size with strlen(value) since it's a
string.
> + if (res == -1) {
> + if (errno == ENOTSUP) {
> + tst_brk(TCONF,
> + "no xattr support in fs or mounted "
> + "without user_xattr option");
> + }
> +
> + if (errno == EEXIST)
> + tst_brk(TBROK, "exist attribute %s", key);
> + else
> + tst_brk(TBROK | TERRNO, "lsetxattr() failed");
Why do we have special branch for the EEXIST case here?
We can just instead do:
tst_brk(TBROK | TERRNO, "lsetxattr(%s)", key);
> + }
> +}
> +
> +static void setup(void)
> +{
> + SAFE_TOUCH("testfile", 0644, NULL);
> + SAFE_SYMLINK("testfile", "symlink");
> +
> + set_xattr("testfile", SECURITY_KEY1, VALUE1);
> + set_xattr("symlink", SECURITY_KEY2, VALUE2);
> +}
> +
> +static void verify_lgetxattr(void)
> +{
> + int size = 64;
> + char buf[size];
> +
> + TEST(lgetxattr("symlink", SECURITY_KEY2, buf, size));
> + if (TEST_RETURN == -1) {
> + tst_res(TFAIL | TTERRNO, "lgetxattr() failed");
> + return;
> + }
> +
> + if (TEST_RETURN != VALUE_SIZE) {
> + tst_res(TFAIL, "lgetxattr() got unexpected value size");
We may as well try to print the buffer here somehow, possibly as
hexadecimal data, since when we fail we will get pretty much random data
. Unfortunately the tst_resm_hexd() is not implemented in the new
library yet.
> + return;
> + }
Well we can possibly do goto next; here instead of the return so that we
do not skipp the next test if the first one fails, but I'm fine with
code as it is as well.
> + if (!strncmp(buf, VALUE2, TEST_RETURN))
> + tst_res(TPASS, "lgetxattr() get expect value");
> + else
> + tst_res(TFAIL, "lgetxattr() got unexpected value");
> +
> + TEST(lgetxattr("symlink", SECURITY_KEY1, buf, size));
> +
> + if (TEST_RETURN != -1) {
> + tst_res(TFAIL, "lgetxattr() succeeded unexpectedly");
> + return;
> + }
> +
> + if (TEST_ERRNO == ENODATA) {
> + tst_res(TPASS | TTERRNO, "lgetxattr() failed as expected");
> + } else {
> + tst_res(TFAIL | TTERRNO,
> + "lgetxattr() failed unexpectedly,"
> + "expected %s", tst_strerrno(ENODATA));
> + }
> +}
> +
> +static struct tst_test test = {
> + .tid = "lgetxattr01",
> + .needs_tmpdir = 1,
> + .needs_root = 1,
> + .test_all = verify_lgetxattr,
> + .setup = setup,
> +};
> +
> +#else
> + TST_TEST_TCONF("<attr/xattr.h> does not exist.");
> +#endif /* HAVE_ATTR_XATTR_H */
Otherwise this looks good.
--
Cyril Hrubis
chrubis@suse.cz
More information about the ltp
mailing list