[LTP] [PATCH 1/2] lgetxattr/lgetxattr01.c: add new testcase

Xiao Yang yangx.jy@cn.fujitsu.com
Thu Jul 14 08:21:22 CEST 2016


On 2016/07/13 20:22, Cyril Hrubis wrote:
Hi Cyril

I'm afraid that huangjb.jy@cn.fujitsu.com no longer works as huang was 
here only for his internship.
Thanks for your review, and i will send these patches v2.

Regards,
Xiao Yang
> 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.
>





More information about the ltp mailing list