All of lore.kernel.org
 help / color / mirror / Atom feed
From: Namhyung Kim <namhyung@kernel.org>
To: Ian Rogers <irogers@google.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>,
	Kan Liang <kan.liang@linux.intel.com>,
	Jiri Olsa <jolsa@kernel.org>,
	Adrian Hunter <adrian.hunter@intel.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Ingo Molnar <mingo@kernel.org>,
	LKML <linux-kernel@vger.kernel.org>,
	linux-perf-users@vger.kernel.org
Subject: Re: [PATCH 2/3] perf test: Add libsubcmd help tests
Date: Tue, 1 Jul 2025 12:56:04 -0700	[thread overview]
Message-ID: <aGQ9VC_x3xSJLcEI@google.com> (raw)
In-Reply-To: <CAP-5=fVBrysrjdhabfbGO3P6wsQL_mfECzCC_MmJLBMKK8SrOw@mail.gmail.com>

On Tue, Jul 01, 2025 at 08:54:25AM -0700, Ian Rogers wrote:
> On Mon, Jun 30, 2025 at 4:32 PM Namhyung Kim <namhyung@kernel.org> wrote:
> >
> > Add a set of tests for subcmd routines.  Currently it fails the last one
> > since there's a bug.  It'll be fixed by the next commit.
> >
> >   $ perf test subcmd
> >    69: libsubcmd help tests                                            :
> >    69.1: Load subcmd names                                             : Ok
> >    69.2: Uniquify subcmd names                                         : Ok
> >    69.3: Exclude duplicate subcmd names                                : FAILED!
> >
> > Signed-off-by: Namhyung Kim <namhyung@kernel.org>
> 
> Reviewed-by: Ian Rogers <irogers@google.com>

Thanks for your review!

> 
> > ---
> >  tools/perf/tests/Build          |   1 +
> >  tools/perf/tests/builtin-test.c |   1 +
> >  tools/perf/tests/subcmd-help.c  | 109 ++++++++++++++++++++++++++++++++
> >  tools/perf/tests/tests.h        |   1 +
> >  4 files changed, 112 insertions(+)
> >  create mode 100644 tools/perf/tests/subcmd-help.c
> >
> > diff --git a/tools/perf/tests/Build b/tools/perf/tests/Build
> > index 2181f5a92148b0b9..13a81154ec1e4cd2 100644
> > --- a/tools/perf/tests/Build
> > +++ b/tools/perf/tests/Build
> > @@ -69,6 +69,7 @@ perf-test-y += symbols.o
> >  perf-test-y += util.o
> >  perf-test-y += hwmon_pmu.o
> >  perf-test-y += tool_pmu.o
> > +perf-test-y += subcmd-help.o
> >
> >  ifeq ($(SRCARCH),$(filter $(SRCARCH),x86 arm arm64 powerpc))
> >  perf-test-$(CONFIG_DWARF_UNWIND) += dwarf-unwind.o
> > diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c
> > index dfaff4185eb05a1a..2da9b69864da53c2 100644
> > --- a/tools/perf/tests/builtin-test.c
> > +++ b/tools/perf/tests/builtin-test.c
> > @@ -139,6 +139,7 @@ static struct test_suite *generic_tests[] = {
> >         &suite__event_groups,
> >         &suite__symbols,
> >         &suite__util,
> > +       &suite__subcmd_help,
> >         NULL,
> >  };
> >
> > diff --git a/tools/perf/tests/subcmd-help.c b/tools/perf/tests/subcmd-help.c
> > new file mode 100644
> > index 0000000000000000..d31259340ae302af
> > --- /dev/null
> > +++ b/tools/perf/tests/subcmd-help.c
> > @@ -0,0 +1,109 @@
> > +// SPDX-License-Identifier: GPL-2.0
> > +#include "tests.h"
> > +#include <stdio.h>
> > +#include <subcmd/help.h>
> > +#include "debug.h"
> 
> nit: I don't think stdio.h and debug.h are used here.

Yeah, will remove.  I think I added it for debugging and removed the
debug code later.

Thanks,
Namhyung

> 
> > +
> > +static int test__load_cmdnames(struct test_suite *test __maybe_unused,
> > +                              int subtest __maybe_unused)
> > +{
> > +       struct cmdnames cmds = {};
> > +
> > +       add_cmdname(&cmds, "aaa", 3);
> > +       add_cmdname(&cmds, "foo", 3);
> > +       add_cmdname(&cmds, "xyz", 3);
> > +
> > +       TEST_ASSERT_VAL("cannot find cmd", is_in_cmdlist(&cmds, "aaa") == 1);
> > +       TEST_ASSERT_VAL("wrong cmd", is_in_cmdlist(&cmds, "bar") == 0);
> > +       TEST_ASSERT_VAL("case sensitive", is_in_cmdlist(&cmds, "XYZ") == 0);
> > +
> > +       clean_cmdnames(&cmds);
> > +       return TEST_OK;
> > +}
> > +
> > +static int test__uniq_cmdnames(struct test_suite *test __maybe_unused,
> > +                              int subtest __maybe_unused)
> > +{
> > +       struct cmdnames cmds = {};
> > +
> > +       /* uniq() assumes it's sorted */
> > +       add_cmdname(&cmds, "aaa", 3);
> > +       add_cmdname(&cmds, "aaa", 3);
> > +       add_cmdname(&cmds, "bbb", 3);
> > +
> > +       TEST_ASSERT_VAL("invalid original size", cmds.cnt == 3);
> > +       /* uniquify command names (to remove second 'aaa') */
> > +       uniq(&cmds);
> > +       TEST_ASSERT_VAL("invalid final size", cmds.cnt == 2);
> > +
> > +       TEST_ASSERT_VAL("cannot find cmd", is_in_cmdlist(&cmds, "aaa") == 1);
> > +       TEST_ASSERT_VAL("cannot find cmd", is_in_cmdlist(&cmds, "bbb") == 1);
> > +       TEST_ASSERT_VAL("wrong cmd", is_in_cmdlist(&cmds, "ccc") == 0);
> > +
> > +       clean_cmdnames(&cmds);
> > +       return TEST_OK;
> > +}
> > +
> > +static int test__exclude_cmdnames(struct test_suite *test __maybe_unused,
> > +                                 int subtest __maybe_unused)
> > +{
> > +       struct cmdnames cmds1 = {};
> > +       struct cmdnames cmds2 = {};
> > +
> > +       add_cmdname(&cmds1, "aaa", 3);
> > +       add_cmdname(&cmds1, "bbb", 3);
> > +       add_cmdname(&cmds1, "ccc", 3);
> > +       add_cmdname(&cmds1, "ddd", 3);
> > +       add_cmdname(&cmds1, "eee", 3);
> > +       add_cmdname(&cmds1, "fff", 3);
> > +       add_cmdname(&cmds1, "ggg", 3);
> > +       add_cmdname(&cmds1, "hhh", 3);
> > +       add_cmdname(&cmds1, "iii", 3);
> > +       add_cmdname(&cmds1, "jjj", 3);
> > +
> > +       add_cmdname(&cmds2, "bbb", 3);
> > +       add_cmdname(&cmds2, "eee", 3);
> > +       add_cmdname(&cmds2, "jjj", 3);
> > +
> > +       TEST_ASSERT_VAL("invalid original size", cmds1.cnt == 10);
> > +       TEST_ASSERT_VAL("invalid original size", cmds2.cnt == 3);
> > +
> > +       /* remove duplicate command names in cmds1 */
> > +       exclude_cmds(&cmds1, &cmds2);
> > +
> > +       TEST_ASSERT_VAL("invalid excluded size", cmds1.cnt == 7);
> > +       TEST_ASSERT_VAL("invalid excluded size", cmds2.cnt == 3);
> > +
> > +       /* excluded commands should not belong to cmds1 */
> > +       TEST_ASSERT_VAL("cannot find cmd", is_in_cmdlist(&cmds1, "aaa") == 1);
> > +       TEST_ASSERT_VAL("wrong cmd", is_in_cmdlist(&cmds1, "bbb") == 0);
> > +       TEST_ASSERT_VAL("cannot find cmd", is_in_cmdlist(&cmds1, "ccc") == 1);
> > +       TEST_ASSERT_VAL("cannot find cmd", is_in_cmdlist(&cmds1, "ddd") == 1);
> > +       TEST_ASSERT_VAL("wrong cmd", is_in_cmdlist(&cmds1, "eee") == 0);
> > +       TEST_ASSERT_VAL("cannot find cmd", is_in_cmdlist(&cmds1, "fff") == 1);
> > +       TEST_ASSERT_VAL("cannot find cmd", is_in_cmdlist(&cmds1, "ggg") == 1);
> > +       TEST_ASSERT_VAL("cannot find cmd", is_in_cmdlist(&cmds1, "hhh") == 1);
> > +       TEST_ASSERT_VAL("cannot find cmd", is_in_cmdlist(&cmds1, "iii") == 1);
> > +       TEST_ASSERT_VAL("wrong cmd", is_in_cmdlist(&cmds1, "jjj") == 0);
> > +
> > +       /* they should be only in cmds2 */
> > +       TEST_ASSERT_VAL("cannot find cmd", is_in_cmdlist(&cmds2, "bbb") == 1);
> > +       TEST_ASSERT_VAL("cannot find cmd", is_in_cmdlist(&cmds2, "eee") == 1);
> > +       TEST_ASSERT_VAL("cannot find cmd", is_in_cmdlist(&cmds2, "jjj") == 1);
> > +
> > +       clean_cmdnames(&cmds1);
> > +       clean_cmdnames(&cmds2);
> > +       return TEST_OK;
> > +}
> > +
> > +static struct test_case tests__subcmd_help[] = {
> > +       TEST_CASE("Load subcmd names", load_cmdnames),
> > +       TEST_CASE("Uniquify subcmd names", uniq_cmdnames),
> > +       TEST_CASE("Exclude duplicate subcmd names", exclude_cmdnames),
> > +       {       .name = NULL, }
> > +};
> > +
> > +struct test_suite suite__subcmd_help = {
> > +       .desc = "libsubcmd help tests",
> > +       .test_cases = tests__subcmd_help,
> > +};
> > diff --git a/tools/perf/tests/tests.h b/tools/perf/tests/tests.h
> > index 4c128a9594413b32..13cabf85185ed2d3 100644
> > --- a/tools/perf/tests/tests.h
> > +++ b/tools/perf/tests/tests.h
> > @@ -177,6 +177,7 @@ DECLARE_SUITE(sigtrap);
> >  DECLARE_SUITE(event_groups);
> >  DECLARE_SUITE(symbols);
> >  DECLARE_SUITE(util);
> > +DECLARE_SUITE(subcmd_help);
> >
> >  /*
> >   * PowerPC and S390 do not support creation of instruction breakpoints using the
> > --
> > 2.50.0.727.gbf7dc18ff4-goog
> >

  reply	other threads:[~2025-07-01 19:56 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-06-30 23:32 [PATCH 1/3] perf test: Check test suite description only Namhyung Kim
2025-06-30 23:32 ` [PATCH 2/3] perf test: Add libsubcmd help tests Namhyung Kim
2025-07-01 15:54   ` Ian Rogers
2025-07-01 19:56     ` Namhyung Kim [this message]
2025-06-30 23:32 ` [PATCH 3/3] perf tools: Fix use-after-free in help_unknown_cmd() Namhyung Kim
2025-07-01 16:03   ` Ian Rogers
2025-07-01 19:57     ` Namhyung Kim
2025-07-01 15:51 ` [PATCH 1/3] perf test: Check test suite description only Ian Rogers
2025-07-01 19:49   ` Namhyung Kim

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=aGQ9VC_x3xSJLcEI@google.com \
    --to=namhyung@kernel.org \
    --cc=acme@kernel.org \
    --cc=adrian.hunter@intel.com \
    --cc=irogers@google.com \
    --cc=jolsa@kernel.org \
    --cc=kan.liang@linux.intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=peterz@infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.