From patchwork Thu Apr 19 13:11:35 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Petr Vorel X-Patchwork-Id: 901080 X-Patchwork-Delegate: akodanev@gmail.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=lists.linux.it (client-ip=2001:1418:10:5::2; helo=picard.linux.it; envelope-from=ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=suse.cz Received: from picard.linux.it (picard.linux.it [IPv6:2001:1418:10:5::2]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 40RfXF1L01z9s3D for ; Thu, 19 Apr 2018 23:11:57 +1000 (AEST) Received: from picard.linux.it (localhost [IPv6:::1]) by picard.linux.it (Postfix) with ESMTP id 6568D3E76D5 for ; Thu, 19 Apr 2018 15:11:54 +0200 (CEST) X-Original-To: ltp@lists.linux.it Delivered-To: ltp@picard.linux.it Received: from in-3.smtp.seeweb.it (in-3.smtp.seeweb.it [217.194.8.3]) by picard.linux.it (Postfix) with ESMTP id 242B73E6C12 for ; Thu, 19 Apr 2018 15:11:49 +0200 (CEST) Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) (using TLSv1 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by in-3.smtp.seeweb.it (Postfix) with ESMTPS id 2C3AE1A01488 for ; Thu, 19 Apr 2018 15:11:46 +0200 (CEST) Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id C3137AE6A; Thu, 19 Apr 2018 13:11:45 +0000 (UTC) From: Petr Vorel To: ltp@lists.linux.it Date: Thu, 19 Apr 2018 15:11:35 +0200 Message-Id: <20180419131135.23693-2-pvorel@suse.cz> X-Mailer: git-send-email 2.16.3 In-Reply-To: <20180419131135.23693-1-pvorel@suse.cz> References: <20180419131135.23693-1-pvorel@suse.cz> X-Virus-Scanned: clamav-milter 0.99.2 at in-3.smtp.seeweb.it X-Virus-Status: Clean X-Spam-Status: No, score=-0.0 required=7.0 tests=SPF_PASS autolearn=disabled version=3.4.0 X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on in-3.smtp.seeweb.it Subject: [LTP] [PATCH v2 2/2] network/in6_02: Rewrite to the new library X-BeenThere: ltp@lists.linux.it X-Mailman-Version: 2.1.18 Precedence: list List-Id: Linux Test Project List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it Sender: "ltp" Signed-off-by: Petr Vorel --- 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 * - * 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 . + * + * Description: + * IPv6 name to index and index to name function tests */ + +#include +#include #include #include #include #include -#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" + : ""); 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 + : ""); 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"); } -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"); return; + } 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); + test_case[1].name = name; +} + +static void do_test(unsigned int i) +{ + testfunc[i](); } + +static struct tst_test test = { + .tcnt = ARRAY_SIZE(testfunc), + .setup = setup, + .test = do_test, +};