[v6,27/33] eal/trace: add unit test cases

Message ID 20200419100133.3232316-28-jerinj@marvell.com (mailing list archive)
State Superseded, archived
Delegated to: David Marchand
Headers
Series DPDK Trace support |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK

Commit Message

Jerin Jacob Kollanukkaran April 19, 2020, 10:01 a.m. UTC
  From: Sunil Kumar Kori <skori@marvell.com>

Example commands to run UT and check the traces with babeltrace viewer.

- Delete the existing /root/dpdk-traces/ directory if needed.
> sudo rm -rf /root/dpdk-traces/

- Start the dpdk-test
> sudo ./build/app/test/dpdk-test  -c 0x3 - --trace=.*

- Run trace_autotest
> trace_autotest

- View the traces with babletrace viewer.
> sudo babeltrace /root/dpdk-traces/

Signed-off-by: Sunil Kumar Kori <skori@marvell.com>
---
 app/test/Makefile              |   3 +-
 app/test/meson.build           |   2 +
 app/test/test_trace.c          | 223 +++++++++++++++++++++++++++++++++
 app/test/test_trace.h          |  15 +++
 app/test/test_trace_register.c |  17 +++
 5 files changed, 259 insertions(+), 1 deletion(-)
 create mode 100644 app/test/test_trace.c
 create mode 100644 app/test/test_trace.h
 create mode 100644 app/test/test_trace_register.c
  

Comments

David Marchand April 21, 2020, 12:52 p.m. UTC | #1
On Sun, Apr 19, 2020 at 12:03 PM <jerinj@marvell.com> wrote:
>
> From: Sunil Kumar Kori <skori@marvell.com>
>
> Example commands to run UT and check the traces with babeltrace viewer.
>
> - Delete the existing /root/dpdk-traces/ directory if needed.
> > sudo rm -rf /root/dpdk-traces/
>
> - Start the dpdk-test
> > sudo ./build/app/test/dpdk-test  -c 0x3 - --trace=.*

Unit tests are there to do sanity/non regression checks.
Here you describe a manual test procedure.
Could it work in the CI for the functional parts?


>
> - Run trace_autotest
> > trace_autotest
>
> - View the traces with babletrace viewer.
> > sudo babeltrace /root/dpdk-traces/
>
> Signed-off-by: Sunil Kumar Kori <skori@marvell.com>

[snip]

> diff --git a/app/test/test_trace.c b/app/test/test_trace.c
> new file mode 100644
> index 000000000..26b403e62
> --- /dev/null
> +++ b/app/test/test_trace.c
> @@ -0,0 +1,223 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright(C) 2020 Marvell International Ltd.
> + */
> +
> +#include <rte_lcore.h>
> +#include <rte_trace.h>
> +#include <rte_trace_eal.h>
> +
> +#include "test.h"
> +#include "test_trace.h"
> +
> +static int32_t
> +test_trace_point_globbing(void)
> +{
> +       bool val;
> +       int rc;
> +
> +       rc = rte_trace_pattern("app.dpdk.test*", false);
> +       if (rc != 1)
> +               goto failed;
> +
> +       val = rte_trace_point_is_enabled(&__app_dpdk_test_tp);
> +       if (val == true)
> +               goto failed;

No need to test a boolean against true/false values.
Idem for the rest of this code.


> +
> +       rc = rte_trace_pattern("app.dpdk.test*", true);
> +       if (rc != 1)
> +               goto failed;
> +
> +       val = rte_trace_point_is_enabled(&__app_dpdk_test_tp);
> +       if (val == false)
> +               goto failed;
> +

[snip]

> +static int
> +test_trace_mode(void)
> +{
> +       enum rte_trace_mode current;
> +
> +       current = rte_trace_mode_get();
> +
> +       if (rte_trace_is_enabled() == false)
> +               return TEST_SKIPPED;

This test would always be skipped if we called it from the CI, as it
requires the dpdk-test binary to be started with traces on.


> +
> +       rte_trace_mode_set(RTE_TRACE_MODE_DISCARD);
> +       if (rte_trace_mode_get() != RTE_TRACE_MODE_DISCARD)
> +               goto failed;
> +

[snip]

> diff --git a/app/test/test_trace_register.c b/app/test/test_trace_register.c
> new file mode 100644
> index 000000000..1735149a2
> --- /dev/null
> +++ b/app/test/test_trace_register.c
> @@ -0,0 +1,17 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright(C) 2020 Marvell International Ltd.
> + */
> +#define RTE_TRACE_POINT_REGISTER_SELECT /* Select trace point register macros */

I noticed this comment is copy/pasted in all trace points "register" code.
This does not help.

The documentation on the other side does not describe this macro which
is quite important for developers adding tracepoints to their code
(Thomas already commented about it on the doc patch).


> +
> +#include "test_trace.h"
> +
> +/* Define trace points */
> +RTE_TRACE_POINT_DEFINE(app_dpdk_test_tp);
> +RTE_TRACE_POINT_DEFINE(app_dpdk_test_fp);
> +
> +RTE_INIT(register_valid_trace_points)
> +{
> +       RTE_TRACE_POINT_REGISTER(app_dpdk_test_tp, app.dpdk.test.tp);
> +       RTE_TRACE_POINT_REGISTER(app_dpdk_test_fp, app.dpdk.test.fp);
> +}
> +
> --
> 2.25.1
>
  
Jerin Jacob April 21, 2020, 1:54 p.m. UTC | #2
On Tue, Apr 21, 2020 at 6:23 PM David Marchand
<david.marchand@redhat.com> wrote:
>
> On Sun, Apr 19, 2020 at 12:03 PM <jerinj@marvell.com> wrote:
> >
> > From: Sunil Kumar Kori <skori@marvell.com>
> >
> > Example commands to run UT and check the traces with babeltrace viewer.
> >
> > - Delete the existing /root/dpdk-traces/ directory if needed.
> > > sudo rm -rf /root/dpdk-traces/
> >
> > - Start the dpdk-test
> > > sudo ./build/app/test/dpdk-test  -c 0x3 - --trace=.*
>
> Unit tests are there to do sanity/non regression checks.
> Here you describe a manual test procedure.
> Could it work in the CI for the functional parts?

Except for test_trace_mode() all test cases run with trace disabled.
The trace memory will be allocated per thread IFF the trace is enabled.
I would like to disable trace by default and enable only if " --trace=.*"
provided. Not sure what is the next step here?

1) Add this test case in app/test/meson.build under "fast_tests" ?
2) Can CI start with --trace=? If yes, is it required? what would the
integration challenges like
filesystem need for storing the traces etc.

Thoughts?



>
>
> >
> > - Run trace_autotest
> > > trace_autotest
> >
> > - View the traces with babletrace viewer.
> > > sudo babeltrace /root/dpdk-traces/
> >
> > Signed-off-by: Sunil Kumar Kori <skori@marvell.com>
>
> [snip]
>
> > diff --git a/app/test/test_trace.c b/app/test/test_trace.c
> > new file mode 100644
> > index 000000000..26b403e62
> > --- /dev/null
> > +++ b/app/test/test_trace.c
> > @@ -0,0 +1,223 @@
> > +/* SPDX-License-Identifier: BSD-3-Clause
> > + * Copyright(C) 2020 Marvell International Ltd.
> > + */
> > +
> > +#include <rte_lcore.h>
> > +#include <rte_trace.h>
> > +#include <rte_trace_eal.h>
> > +
> > +#include "test.h"
> > +#include "test_trace.h"
> > +
> > +static int32_t
> > +test_trace_point_globbing(void)
> > +{
> > +       bool val;
> > +       int rc;
> > +
> > +       rc = rte_trace_pattern("app.dpdk.test*", false);
> > +       if (rc != 1)
> > +               goto failed;
> > +
> > +       val = rte_trace_point_is_enabled(&__app_dpdk_test_tp);
> > +       if (val == true)
> > +               goto failed;
>
> No need to test a boolean against true/false values.
> Idem for the rest of this code.

Ack.

>
>
> > +
> > +       rc = rte_trace_pattern("app.dpdk.test*", true);
> > +       if (rc != 1)
> > +               goto failed;
> > +
> > +       val = rte_trace_point_is_enabled(&__app_dpdk_test_tp);
> > +       if (val == false)
> > +               goto failed;
> > +
>
> [snip]
>
> > +static int
> > +test_trace_mode(void)
> > +{
> > +       enum rte_trace_mode current;
> > +
> > +       current = rte_trace_mode_get();
> > +
> > +       if (rte_trace_is_enabled() == false)
> > +               return TEST_SKIPPED;
>
> This test would always be skipped if we called it from the CI, as it
> requires the dpdk-test binary to be started with traces on.

See above.

>
>
> > +
> > +       rte_trace_mode_set(RTE_TRACE_MODE_DISCARD);
> > +       if (rte_trace_mode_get() != RTE_TRACE_MODE_DISCARD)
> > +               goto failed;
> > +
>
> [snip]
>
> > diff --git a/app/test/test_trace_register.c b/app/test/test_trace_register.c
> > new file mode 100644
> > index 000000000..1735149a2
> > --- /dev/null
> > +++ b/app/test/test_trace_register.c
> > @@ -0,0 +1,17 @@
> > +/* SPDX-License-Identifier: BSD-3-Clause
> > + * Copyright(C) 2020 Marvell International Ltd.
> > + */
> > +#define RTE_TRACE_POINT_REGISTER_SELECT /* Select trace point register macros */
>
> I noticed this comment is copy/pasted in all trace points "register" code.
> This does not help.
>
> The documentation on the other side does not describe this macro which
> is quite important for developers adding tracepoints to their code
> (Thomas already commented about it on the doc patch).


We have the following comments in the header file.
Let me know, what else you would like to mention here?

/**
 * Macro to select rte_trace_point_emit_* definition for trace register function
 *
 * rte_trace_point_emit_* emits different definitions for trace function.
 * Application must define RTE_TRACE_POINT_REGISTER_SELECT before including
 * rte_trace_point.h in the C file where RTE_TRACE_POINT_REGISTER used.
 *
 * @see RTE_TRACE_POINT_REGISTER
 */
#define RTE_TRACE_POINT_REGISTER_SELECT
  
David Marchand April 21, 2020, 2:24 p.m. UTC | #3
On Tue, Apr 21, 2020 at 3:54 PM Jerin Jacob <jerinjacobk@gmail.com> wrote:
>
> On Tue, Apr 21, 2020 at 6:23 PM David Marchand
> <david.marchand@redhat.com> wrote:
> >
> > On Sun, Apr 19, 2020 at 12:03 PM <jerinj@marvell.com> wrote:
> > >
> > > From: Sunil Kumar Kori <skori@marvell.com>
> > >
> > > Example commands to run UT and check the traces with babeltrace viewer.
> > >
> > > - Delete the existing /root/dpdk-traces/ directory if needed.
> > > > sudo rm -rf /root/dpdk-traces/
> > >
> > > - Start the dpdk-test
> > > > sudo ./build/app/test/dpdk-test  -c 0x3 - --trace=.*
> >
> > Unit tests are there to do sanity/non regression checks.
> > Here you describe a manual test procedure.
> > Could it work in the CI for the functional parts?
>
> Except for test_trace_mode() all test cases run with trace disabled.
> The trace memory will be allocated per thread IFF the trace is enabled.
> I would like to disable trace by default and enable only if " --trace=.*"
> provided. Not sure what is the next step here?
>
> 1) Add this test case in app/test/meson.build under "fast_tests" ?
> 2) Can CI start with --trace=? If yes, is it required? what would the
> integration challenges like
> filesystem need for storing the traces etc.
>
> Thoughts?

- At least putting in fast_tests will get us basic checks on the rte_trace_ API.

- Running with the traces on and checking against a reference (but
ignoring the timestamps) would be nice.
I did not think this through.


> > > diff --git a/app/test/test_trace_register.c b/app/test/test_trace_register.c
> > > new file mode 100644
> > > index 000000000..1735149a2
> > > --- /dev/null
> > > +++ b/app/test/test_trace_register.c
> > > @@ -0,0 +1,17 @@
> > > +/* SPDX-License-Identifier: BSD-3-Clause
> > > + * Copyright(C) 2020 Marvell International Ltd.
> > > + */
> > > +#define RTE_TRACE_POINT_REGISTER_SELECT /* Select trace point register macros */
> >
> > I noticed this comment is copy/pasted in all trace points "register" code.
> > This does not help.
> >
> > The documentation on the other side does not describe this macro which
> > is quite important for developers adding tracepoints to their code
> > (Thomas already commented about it on the doc patch).
>
>
> We have the following comments in the header file.
> Let me know, what else you would like to mention here?
>
> /**
>  * Macro to select rte_trace_point_emit_* definition for trace register function
>  *
>  * rte_trace_point_emit_* emits different definitions for trace function.
>  * Application must define RTE_TRACE_POINT_REGISTER_SELECT before including
>  * rte_trace_point.h in the C file where RTE_TRACE_POINT_REGISTER used.
>  *
>  * @see RTE_TRACE_POINT_REGISTER
>  */
> #define RTE_TRACE_POINT_REGISTER_SELECT
>

Maybe summarize this in doc/guides/prog_guide/trace_lib.rst:

 the trace function and its name to be similar. However, it is recommended to
 have a similar name for a better naming convention.

+The special macro ``RTE_TRACE_POINT_REGISTER_SELECT`` must be defined before
+including the header for the tracepoint registration to work properly.
+
 The user must register the tracepoint before the ``rte_eal_init`` invocation.
 The user can use the ``RTE_INIT`` construction scheme to achieve the same.
  
Jerin Jacob April 21, 2020, 2:58 p.m. UTC | #4
On Tue, Apr 21, 2020 at 7:55 PM David Marchand
<david.marchand@redhat.com> wrote:
>
> On Tue, Apr 21, 2020 at 3:54 PM Jerin Jacob <jerinjacobk@gmail.com> wrote:
> >
> > On Tue, Apr 21, 2020 at 6:23 PM David Marchand
> > <david.marchand@redhat.com> wrote:
> > >
> > > On Sun, Apr 19, 2020 at 12:03 PM <jerinj@marvell.com> wrote:
> > > >
> > > > From: Sunil Kumar Kori <skori@marvell.com>
> > > >
> > > > Example commands to run UT and check the traces with babeltrace viewer.
> > > >
> > > > - Delete the existing /root/dpdk-traces/ directory if needed.
> > > > > sudo rm -rf /root/dpdk-traces/
> > > >
> > > > - Start the dpdk-test
> > > > > sudo ./build/app/test/dpdk-test  -c 0x3 - --trace=.*
> > >
> > > Unit tests are there to do sanity/non regression checks.
> > > Here you describe a manual test procedure.
> > > Could it work in the CI for the functional parts?
> >
> > Except for test_trace_mode() all test cases run with trace disabled.
> > The trace memory will be allocated per thread IFF the trace is enabled.
> > I would like to disable trace by default and enable only if " --trace=.*"
> > provided. Not sure what is the next step here?
> >
> > 1) Add this test case in app/test/meson.build under "fast_tests" ?
> > 2) Can CI start with --trace=? If yes, is it required? what would the
> > integration challenges like
> > filesystem need for storing the traces etc.
> >
> > Thoughts?
>
> - At least putting in fast_tests will get us basic checks on the rte_trace_ API.

I will add UT and performance test cases to meson UT in v7.

>
> - Running with the traces on and checking against a reference (but
> ignoring the timestamps) would be nice.
> I did not think this through.

Probably we need to install the babeltrace app in CI to check the
sanity of the trace. I think,
we can take it up later.

>
>
> > > > diff --git a/app/test/test_trace_register.c b/app/test/test_trace_register.c
> > > > new file mode 100644
> > > > index 000000000..1735149a2
> > > > --- /dev/null
> > > > +++ b/app/test/test_trace_register.c
> > > > @@ -0,0 +1,17 @@
> > > > +/* SPDX-License-Identifier: BSD-3-Clause
> > > > + * Copyright(C) 2020 Marvell International Ltd.
> > > > + */
> > > > +#define RTE_TRACE_POINT_REGISTER_SELECT /* Select trace point register macros */
> > >
> > > I noticed this comment is copy/pasted in all trace points "register" code.
> > > This does not help.
> > >
> > > The documentation on the other side does not describe this macro which
> > > is quite important for developers adding tracepoints to their code
> > > (Thomas already commented about it on the doc patch).
> >
> >
> > We have the following comments in the header file.
> > Let me know, what else you would like to mention here?
> >
> > /**
> >  * Macro to select rte_trace_point_emit_* definition for trace register function
> >  *
> >  * rte_trace_point_emit_* emits different definitions for trace function.
> >  * Application must define RTE_TRACE_POINT_REGISTER_SELECT before including
> >  * rte_trace_point.h in the C file where RTE_TRACE_POINT_REGISTER used.
> >  *
> >  * @see RTE_TRACE_POINT_REGISTER
> >  */
> > #define RTE_TRACE_POINT_REGISTER_SELECT
> >
>
> Maybe summarize this in doc/guides/prog_guide/trace_lib.rst:
>
>  the trace function and its name to be similar. However, it is recommended to
>  have a similar name for a better naming convention.
>
> +The special macro ``RTE_TRACE_POINT_REGISTER_SELECT`` must be defined before
> +including the header for the tracepoint registration to work properly.
> +
>  The user must register the tracepoint before the ``rte_eal_init`` invocation.
>  The user can use the ``RTE_INIT`` construction scheme to achieve the same.

Yes. I planned to add the same in .rst based on Thomas's comment.

>
>
> --
> David Marchand
>
  

Patch

diff --git a/app/test/Makefile b/app/test/Makefile
index be53d33c3..9fb7b843f 100644
--- a/app/test/Makefile
+++ b/app/test/Makefile
@@ -148,7 +148,8 @@  SRCS-y += test_alarm.c
 SRCS-y += test_interrupts.c
 SRCS-y += test_version.c
 SRCS-y += test_func_reentrancy.c
-
+SRCS-y += test_trace.c
+SRCS-y += test_trace_register.c
 SRCS-y += test_service_cores.c
 
 ifeq ($(CONFIG_RTE_LIBRTE_PMD_RING),y)
diff --git a/app/test/meson.build b/app/test/meson.build
index 04b59cffa..78023ee71 100644
--- a/app/test/meson.build
+++ b/app/test/meson.build
@@ -121,6 +121,8 @@  test_sources = files('commands.c',
 	'test_timer_racecond.c',
 	'test_timer_secondary.c',
 	'test_ticketlock.c',
+	'test_trace.c',
+	'test_trace_register.c',
 	'test_version.c',
 	'virtual_pmd.c'
 )
diff --git a/app/test/test_trace.c b/app/test/test_trace.c
new file mode 100644
index 000000000..26b403e62
--- /dev/null
+++ b/app/test/test_trace.c
@@ -0,0 +1,223 @@ 
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2020 Marvell International Ltd.
+ */
+
+#include <rte_lcore.h>
+#include <rte_trace.h>
+#include <rte_trace_eal.h>
+
+#include "test.h"
+#include "test_trace.h"
+
+static int32_t
+test_trace_point_globbing(void)
+{
+	bool val;
+	int rc;
+
+	rc = rte_trace_pattern("app.dpdk.test*", false);
+	if (rc != 1)
+		goto failed;
+
+	val = rte_trace_point_is_enabled(&__app_dpdk_test_tp);
+	if (val == true)
+		goto failed;
+
+	rc = rte_trace_pattern("app.dpdk.test*", true);
+	if (rc != 1)
+		goto failed;
+
+	val = rte_trace_point_is_enabled(&__app_dpdk_test_tp);
+	if (val == false)
+		goto failed;
+
+	rc = rte_trace_pattern("invalid_testpoint.*", true);
+	if (rc != 0)
+		goto failed;
+
+	return TEST_SUCCESS;
+
+failed:
+	return TEST_FAILED;
+}
+
+static int32_t
+test_trace_point_regex(void)
+{
+	bool val;
+	int rc;
+
+
+	rc = rte_trace_regexp("app.dpdk.test*", false);
+	if (rc != 1)
+		goto failed;
+
+	val = rte_trace_point_is_enabled(&__app_dpdk_test_tp);
+	if (val == true)
+		goto failed;
+
+	rc = rte_trace_regexp("app.dpdk.test*", true);
+	if (rc != 1)
+		goto failed;
+
+	val = rte_trace_point_is_enabled(&__app_dpdk_test_tp);
+	if (val == false)
+		goto failed;
+
+	rc = rte_trace_regexp("invalid_testpoint.*", true);
+	if (rc != 0)
+		goto failed;
+
+	return TEST_SUCCESS;
+
+failed:
+	return TEST_FAILED;
+}
+
+static int32_t
+test_trace_point_disable_enable(void)
+{
+	bool val;
+	int rc;
+
+	rc = rte_trace_point_disable(&__app_dpdk_test_tp);
+	if (rc < 0)
+		goto failed;
+
+	val = rte_trace_point_is_enabled(&__app_dpdk_test_tp);
+	if (val == true)
+		goto failed;
+
+	rc = rte_trace_point_enable(&__app_dpdk_test_tp);
+	if (rc < 0)
+		goto failed;
+
+	val = rte_trace_point_is_enabled(&__app_dpdk_test_tp);
+	if (val == false)
+		goto failed;
+
+	/* Emit the trace */
+	app_dpdk_test_tp("app.dpdk.test.tp");
+	return TEST_SUCCESS;
+
+failed:
+	return TEST_FAILED;
+}
+
+static int
+test_trace_mode(void)
+{
+	enum rte_trace_mode current;
+
+	current = rte_trace_mode_get();
+
+	if (rte_trace_is_enabled() == false)
+		return TEST_SKIPPED;
+
+	rte_trace_mode_set(RTE_TRACE_MODE_DISCARD);
+	if (rte_trace_mode_get() != RTE_TRACE_MODE_DISCARD)
+		goto failed;
+
+	rte_trace_mode_set(RTE_TRACE_MODE_OVERWRITE);
+	if (rte_trace_mode_get() != RTE_TRACE_MODE_OVERWRITE)
+		goto failed;
+
+	rte_trace_mode_set(current);
+	return TEST_SUCCESS;
+
+failed:
+	return TEST_FAILED;
+
+}
+
+static int
+test_trace_points_lookup(void)
+{
+	rte_trace_point_t *trace;
+
+	trace =  rte_trace_point_lookup("app.dpdk.test.tp");
+	if (trace == NULL)
+		goto fail;
+	trace = rte_trace_point_lookup("this_trace_point_does_not_exist");
+	if (trace != NULL)
+		goto fail;
+
+	return TEST_SUCCESS;
+fail:
+	return TEST_FAILED;
+}
+
+static int
+test_trace_fastpath_point(void)
+{
+	/* Emit the FP trace */
+	app_dpdk_test_fp();
+
+	return TEST_SUCCESS;
+}
+
+static int
+test_generic_trace_points(void)
+{
+	int tmp;
+
+	rte_trace_lib_eal_generic_void();
+	rte_trace_lib_eal_generic_u64(0x10000000000000);
+	rte_trace_lib_eal_generic_u32(0x10000000);
+	rte_trace_lib_eal_generic_u16(0xffee);
+	rte_trace_lib_eal_generic_u8(0xc);
+	rte_trace_lib_eal_generic_i64(-1234);
+	rte_trace_lib_eal_generic_i32(-1234567);
+	rte_trace_lib_eal_generic_i16(12);
+	rte_trace_lib_eal_generic_i8(-3);
+	rte_trace_lib_eal_generic_int(3333333);
+	rte_trace_lib_eal_generic_long(333);
+	rte_trace_lib_eal_generic_float(20.45);
+	rte_trace_lib_eal_generic_double(20000.5000004);
+	rte_trace_lib_eal_generic_ptr(&tmp);
+	rte_trace_lib_eal_generic_str("my string");
+	RTE_TRACE_LIB_EAL_GENERIC_FUNC;
+
+	return TEST_SUCCESS;
+}
+
+static struct unit_test_suite trace_tests = {
+	.suite_name = "trace autotest",
+	.setup = NULL,
+	.teardown = NULL,
+	.unit_test_cases = {
+		TEST_CASE(test_trace_mode),
+		TEST_CASE(test_generic_trace_points),
+		TEST_CASE(test_trace_fastpath_point),
+		TEST_CASE(test_trace_point_disable_enable),
+		TEST_CASE(test_trace_point_globbing),
+		TEST_CASE(test_trace_point_regex),
+		TEST_CASE(test_trace_points_lookup),
+		TEST_CASES_END()
+	}
+};
+
+static int
+test_trace(void)
+{
+	return unit_test_suite_runner(&trace_tests);
+}
+
+REGISTER_TEST_COMMAND(trace_autotest, test_trace);
+
+static int
+test_trace_dump(void)
+{
+	rte_trace_dump(stdout);
+	return 0;
+}
+
+REGISTER_TEST_COMMAND(trace_dump, test_trace_dump);
+
+static int
+test_trace_metadata_dump(void)
+{
+	return rte_trace_metadata_dump(stdout);
+}
+
+REGISTER_TEST_COMMAND(trace_metadata_dump, test_trace_metadata_dump);
diff --git a/app/test/test_trace.h b/app/test/test_trace.h
new file mode 100644
index 000000000..413842f60
--- /dev/null
+++ b/app/test/test_trace.h
@@ -0,0 +1,15 @@ 
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2020 Marvell International Ltd.
+ */
+#include <rte_trace_point.h>
+
+RTE_TRACE_POINT(
+	app_dpdk_test_tp,
+	RTE_TRACE_POINT_ARGS(const char *str),
+	rte_trace_point_emit_string(str);
+)
+
+RTE_TRACE_POINT_FP(
+	app_dpdk_test_fp,
+	RTE_TRACE_POINT_ARGS(void),
+)
diff --git a/app/test/test_trace_register.c b/app/test/test_trace_register.c
new file mode 100644
index 000000000..1735149a2
--- /dev/null
+++ b/app/test/test_trace_register.c
@@ -0,0 +1,17 @@ 
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(C) 2020 Marvell International Ltd.
+ */
+#define RTE_TRACE_POINT_REGISTER_SELECT /* Select trace point register macros */
+
+#include "test_trace.h"
+
+/* Define trace points */
+RTE_TRACE_POINT_DEFINE(app_dpdk_test_tp);
+RTE_TRACE_POINT_DEFINE(app_dpdk_test_fp);
+
+RTE_INIT(register_valid_trace_points)
+{
+	RTE_TRACE_POINT_REGISTER(app_dpdk_test_tp, app.dpdk.test.tp);
+	RTE_TRACE_POINT_REGISTER(app_dpdk_test_fp, app.dpdk.test.fp);
+}
+