[LTP] [PATCH v2 2/2] network/in6_02: Rewrite to the new library
Alexey Kodanev
alexey.kodanev@oracle.com
Thu Apr 19 16:33:41 CEST 2018
On 04/19/2018 04:11 PM, Petr Vorel wrote:
> Signed-off-by: Petr Vorel <pvorel@suse.cz>
> ---
> testcases/network/lib6/in6_02.c | 224 ++++++++++++++++++++--------------------
> 1 file changed, 110 insertions(+), 114 deletions(-)
>
> diff --git a/testcases/network/lib6/in6_02.c b/testcases/network/lib6/in6_02.c
> index e1a71d987..e3a92f519 100644
> --- a/testcases/network/lib6/in6_02.c
> +++ b/testcases/network/lib6/in6_02.c
> @@ -1,115 +1,95 @@
> /*
> + * Copyright (c) International Business Machines Corp., 2001
> + * Copyright (c) 2018 Petr Vorel <pvorel@suse.cz>
> *
> - * Copyright (c) International Business Machines Corp., 2001
> - * Author: David L Stevens
> + * Author: David L Stevens
> *
> - * 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 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.
> + * 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. 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 Street, Fifth Floor, Boston, MA 02110-1301 USA
> - */
> -/*
> - * Description:
> - * Tests for name to index and index to name functions in IPv6
> + * You should have received a copy of the GNU General Public License
> + * along with this program. If not, see <http://www.gnu.org/licenses/>.
> + *
> + * Description:
> + * IPv6 name to index and index to name function tests
> */
>
> +
> +#include <stdlib.h>
> +#include <stdio.h>
> #include <unistd.h>
> #include <errno.h>
> #include <sys/socket.h>
> #include <net/if.h>
>
> -#include "test.h"
> +#include "tst_test.h"
> +
> +#define I2N_RNDCOUNT 10 /* random ints */
> +#define I2N_LOWCOUNT 10 /* sequential from 0 */
>
> static struct {
> char *name;
> int nonzero;
> -} n2i[] = {
> +} test_case[] = {
> { "lo", 1 },
> { NULL, 1 },
> { "hoser75", 0 },
> { "6", 0 },
> };
>
> -#define N2I_COUNT (sizeof(n2i)/sizeof(n2i[0]))
> -#define I2N_RNDCOUNT 10 /* random ints */
> -#define I2N_LOWCOUNT 10 /* sequential from 0 */
> -
> static void setup(void);
> -static void n2itest(void);
> -static void i2ntest(void);
> -static void initest(void);
> -
> -static void (*testfunc[])(void) = { n2itest,
> - i2ntest, initest };
> +static void if_nametoindex_test(void);
> +static void if_indextoname_test(void);
> +static void if_nameindex_test(void);
>
> -char *TCID = "in6_02";
> -int TST_TOTAL = ARRAY_SIZE(testfunc);
> +static void (*testfunc[])(void) = { if_nametoindex_test, if_indextoname_test,
> + if_nameindex_test };
>
> -int main(int argc, char *argv[])
> -{
> - int lc;
> - int i;
> -
> - tst_parse_opts(argc, argv, NULL, NULL);
> -
> - setup();
> -
> - for (lc = 0; TEST_LOOPING(lc); ++lc) {
> - tst_count = 0;
> -
> - for (i = 0; i < TST_TOTAL; i++)
> - (*testfunc[i])();
> - }
> -
> - tst_exit();
> -}
> -
> -/* if_nametoindex tests */
> -void n2itest(void)
> +static void if_nametoindex_test(void)
> {
> unsigned int i;
> char ifname[IF_NAMESIZE], *pifn;
>
> - for (i = 0; i < N2I_COUNT; ++i) {
> - if (n2i[i].name == NULL) {
> - tst_resm(TCONF, "LHOST_IFACES not defined or invalid, skip testing it");
> + tst_res(TINFO, "IPv6 if_nametoindex() test");
> +
> + for (i = 0; i < ARRAY_SIZE(test_case); ++i) {
> + if (test_case[i].name == NULL) {
> + tst_res(TCONF, "LHOST_IFACES not defined or invalid, skip testing it");
> return;
> }
>
> - TEST(if_nametoindex(n2i[i].name));
> - if (!TEST_RETURN != !n2i[i].nonzero) {
> - tst_resm(TFAIL, "if_nametoindex(\"%s\") %ld "
> - "[should be %szero]", n2i[i].name, TEST_RETURN,
> - n2i[i].nonzero ? "non" : "");
> + TEST(if_nametoindex(test_case[i].name));
> + if (!TEST_RETURN != !test_case[i].nonzero) {
> + tst_res(TFAIL, "if_nametoindex(%s) %ld [should be %szero]",
> + test_case[i].name, TEST_RETURN, test_case[i].nonzero ? "non"
This line is over 80 chars. test_case[i].nonzero can be moved to the next line:
> + : "");
test_case[i].nonzero ? "non" : ""
> return;
> }
> if (TEST_RETURN) {
> pifn = if_indextoname(TEST_RETURN, ifname);
> - if (!pifn || strcmp(n2i[i].name, pifn)) {
> - tst_resm(TFAIL, "if_nametoindex(\"%s\") %ld "
> - "doesn't match if_indextoname(%ld) "
> - "\"%s\"", n2i[i].name, TEST_RETURN,
> - TEST_RETURN, pifn ? pifn : "");
> + if (!pifn || strcmp(test_case[i].name, pifn)) {
> + tst_res(TFAIL,
> + "if_nametoindex(%s) %ld doesn't match if_indextoname(%ld) \"%s\"",
> + test_case[i].name, TEST_RETURN, TEST_RETURN, pifn ? pifn
Here as well:
pifn ? pifn : ""
> + : "");
> return;
> }
> }
> - tst_resm(TINFO, "if_nametoindex(\"%s\") %ld",
> - n2i[i].name, TEST_RETURN);
> + tst_res(TINFO, "if_nametoindex(%s) %ld",
> + test_case[i].name, TEST_RETURN);
> }
>
> - tst_resm(TPASS, "if_nametoindex() tests succeed");
> + tst_res(TPASS, "if_nametoindex() test succeed");
> }
I don't think we need to return on TCONF, what about using 'continue' in
this loop. Remove the last "tst_res(TPASS, ...)" in the end of this
function, and change TINFO to TPASS in the end of the loop?
Otherwise it will skip the other test-cases after TCONF.
>
> -int sub_i2ntest(unsigned int if_index)
> +static int sub_if_indextoname_test(unsigned int if_index)
> {
> char ifname[IF_NAMESIZE];
> unsigned int idx;
> @@ -117,48 +97,49 @@ int sub_i2ntest(unsigned int if_index)
> TEST((ifname == if_indextoname(if_index, ifname)));
> if (!TEST_RETURN) {
> if (TEST_ERRNO != ENXIO) {
> - tst_resm(TFAIL, "if_indextoname(%d) returns %ld "
> - "but errno %d != ENXIO", if_index, TEST_RETURN,
> - TEST_ERRNO);
> + tst_res(TFAIL,
> + "if_indextoname(%d) returns %ld but errno %d != ENXIO",
> + if_index, TEST_RETURN, TEST_ERRNO);
> return 0;
> }
> - tst_resm(TINFO, "if_indextoname(%d) returns NULL", if_index);
> + tst_res(TINFO, "if_indextoname(%d) returns NULL", if_index);
> return 1;
> }
> /* else, a valid interface-- double check name */
> idx = if_nametoindex(ifname);
> if (idx != if_index) {
> - tst_resm(TFAIL, "if_indextoname(%u) returns \"%s\" but "
> - "doesn't if_nametoindex(\"%s\") returns %u",
> - if_index, ifname, ifname, idx);
> + tst_res(TFAIL,
> + "if_indextoname(%u) returns \"%s\" but doesn't if_nametoindex(%s) returns %u",
> + if_index, ifname, ifname, idx);
> return 0;
> }
> - tst_resm(TINFO, "if_indextoname(%d) returns \"%s\"", if_index, ifname);
> + tst_res(TINFO, "if_indextoname(%d) returns \"%s\"", if_index, ifname);
> return 1;
> }
>
> -/* if_indextoname tests */
> -void i2ntest(void)
> +static void if_indextoname_test(void)
> {
> unsigned int i;
>
> + tst_res(TINFO, "IPv6 if_indextoname() test");
> +
> /* some low-numbered indexes-- likely to get valid interfaces here */
> for (i = 0; i < I2N_LOWCOUNT; ++i)
> - if (!sub_i2ntest(i))
> + if (!sub_if_indextoname_test(i))
> return; /* skip the rest, if broken */
> /* some random ints; should mostly fail */
> for (i = 0; i < I2N_RNDCOUNT; ++i)
> - if (!sub_i2ntest(rand()))
> + if (!sub_if_indextoname_test(rand()))
> return; /* skip the rest, if broken */
>
> - tst_resm(TPASS, "if_indextoname() tests succeed");
> + tst_res(TPASS, "if_indextoname() test succeed");
> }
>
> /*
> * This is an ugly, linux-only solution. getrusage() doesn't support the
> * current data segment size, so we get it out of /proc
> */
> -int getdatasize(void)
> +static int getdatasize(void)
> {
> char line[128], *p;
> int dsize = -1;
> @@ -181,8 +162,7 @@ int getdatasize(void)
> return dsize;
> }
>
> -/* if_nameindex tests */
> -void initest(void)
> +static void if_nameindex_test(void)
> {
> struct if_nameindex *pini;
> int i;
> @@ -191,79 +171,84 @@ void initest(void)
> int freenicount;
> int dsize_before, dsize_after;
>
> + tst_res(TINFO, "IPv6 if_nameindex() test");
> +
> pini = if_nameindex();
> if (pini == NULL) {
> - tst_resm(TFAIL, "if_nameindex() returns NULL, errno %d (%s)",
> - TEST_ERRNO, strerror(TEST_ERRNO));
> + tst_res(TFAIL, "if_nameindex() returns NULL, errno %d (%s)",
> + TEST_ERRNO, strerror(TEST_ERRNO));
> return;
> }
> for (i = 0; pini[i].if_index; ++i) {
> p = if_indextoname(pini[i].if_index, buf);
> if (!p || strcmp(p, pini[i].if_name)) {
> - tst_resm(TFAIL, "if_nameindex idx %d name \"%s\" but "
> - "if_indextoname(%d) is \"%s\"",
> - pini[i].if_index, pini[i].if_name,
> - pini[i].if_index, p ? p : "");
> + tst_res(TFAIL,
> + "if_nameindex idx %d name \"%s\" but if_indextoname(%d) is \"%s\"",
> + pini[i].if_index, pini[i].if_name,
> + pini[i].if_index, p ? p : "");
> return;
> }
> idx = if_nametoindex(pini[i].if_name);
> if (idx != pini[i].if_index) {
> - tst_resm(TFAIL, "if_nameindex idx %d name \"%s\" but "
> - "if_indextoname(\"%s\") is %d",
> - pini[i].if_index, pini[i].if_name,
> - pini[i].if_name, idx);
> + tst_res(TFAIL,
> + "if_nameindex idx %d name \"%s\" but if_indextoname(%s) is %d",
> + pini[i].if_index, pini[i].if_name,
> + pini[i].if_name, idx);
> return;
> }
> - tst_resm(TINFO, "if_nameindex idx %d name \"%s\"",
> + tst_res(TINFO, "if_nameindex idx %d name \"%s\"",
> pini[i].if_index, pini[i].if_name);
> }
> if_freenameindex(pini);
>
> - /* if_freenameindex() has no error conditions; see if we run
> + /*
> + * if_freenameindex() has no error conditions; see if we run
> * out of memory if we do it a lot.
> */
> dsize_before = getdatasize();
> if (dsize_before < 0) {
> - tst_brkm(TBROK, NULL, "getdatasize failed: errno %d (%s)",
> + tst_brk(TBROK, "getdatasize failed: errno %d (%s)",
> errno, strerror(errno));
> }
> - /* we need to leak at least a page to detect a leak; 1 byte per call
> +
> + /*
> + * we need to leak at least a page to detect a leak; 1 byte per call
> * will be detected with getpagesize() calls.
> */
> freenicount = getpagesize();
> for (i = 0; i < freenicount; ++i) {
> pini = if_nameindex();
> if (pini == NULL) {
> - tst_resm(TINFO, "if_freenameindex test failed "
> - "if_nameindex() iteration %d", i);
> + tst_res(TINFO,
> + "if_freenameindex test failed if_nameindex() iteration %d", i);
> break;
> }
> if_freenameindex(pini);
> }
> dsize_after = getdatasize();
> if (dsize_after < 0) {
> - tst_brkm(TBROK, NULL, "getdatasize failed: errno %d (%s)",
> + tst_brk(TBROK, "getdatasize failed: errno %d (%s)",
> errno, strerror(errno));
> }
> if (dsize_after > dsize_before + getpagesize()) {
> - tst_resm(TFAIL, "if_freenameindex leaking memory "
> - "(%d iterations) dsize before %d dsize after %d", i,
> - dsize_before, dsize_after);
> + tst_res(TFAIL,
> + "if_freenameindex leaking memory (%d iterations) dsize before %d dsize after %d",
> + i, dsize_before, dsize_after);
> return;
> - } else {
> - tst_resm(TINFO, "if_freenameindex passed %d iterations", i);
> }
> + tst_res(TINFO, "if_freenameindex passed %d iterations", i);
>
> - tst_resm(TPASS, "if_nameindex() tests succeed");
> + tst_res(TPASS, "if_nameindex() test succeed");
> }
>
> -void setup(void)
> +static void setup(void)
> {
> - TEST_PAUSE;
> -
> char *ifnames = getenv("LHOST_IFACES");
> - if (!ifnames)
> +
> + if (!ifnames) {
> + tst_res(TINFO, "LHOST_IFACES not defined, it will not be tested");
And this seems to be over 80 too, you could either put it to the next
one or better just edit it a little bit so that it takes less space:
tst_res(TINFO, "LHOST_IFACES not defined, it won't be tested");
So this is going to be printed on TCONF too, may be just left only one?
>
> static char name[256];
> int ret;
> @@ -272,6 +257,17 @@ void setup(void)
> if (ret == -1)
> return;
>
> - tst_resm(TINFO, "get interface name from LHOST_IFACES: '%s'", name);
> - n2i[1].name = name;
> + tst_res(TINFO, "LHOST_IFACES \"%s\"", name);
tst_res(TINFO, "get interface name from LHOST_IFACES: '%s'", name); ?
More information about the ltp
mailing list