From: Ross Zwisler <zwisler@google.com>
To: Stevie Alvarez <stevie.6strings@gmail.com>
Cc: linux-trace-devel@vger.kernel.org, Steven Rostedt <rostedt@goodmis.org>
Subject: Re: [PATCH 5/5] histograms: Add struct traceeval unit tests
Date: Thu, 3 Aug 2023 10:27:42 -0600 [thread overview]
Message-ID: <20230803162742.GA3575843@google.com> (raw)
In-Reply-To: <20230728190515.23088-5-stevie.6strings@gmail.com>
On Fri, Jul 28, 2023 at 03:04:40PM -0400, Stevie Alvarez wrote:
> From: "Stevie Alvarez (Google)" <stevie.6strings@gmail.com>
>
> Add unit tests for traceeval_init(), traceeval_release(), and
> traceeval_compare() to check edge cases and ensure the interface is
> functional.
>
> Signed-off-by: Stevie Alvarez (Google) <stevie.6strings@gmail.com>
> ---
> utest/.gitignore | 1 +
> utest/Makefile | 35 +++++++
> utest/eval-test.h | 10 ++
> utest/eval-utest.c | 27 +++++
> utest/traceeval-utest.c | 222 ++++++++++++++++++++++++++++++++++++++++
> 5 files changed, 295 insertions(+)
> create mode 100644 utest/.gitignore
> create mode 100644 utest/Makefile
> create mode 100644 utest/eval-test.h
> create mode 100644 utest/eval-utest.c
> create mode 100644 utest/traceeval-utest.c
>
> diff --git a/utest/.gitignore b/utest/.gitignore
> new file mode 100644
> index 0000000..ca0ac10
> --- /dev/null
> +++ b/utest/.gitignore
> @@ -0,0 +1 @@
> +eval-utest
> diff --git a/utest/Makefile b/utest/Makefile
> new file mode 100644
> index 0000000..955f91e
> --- /dev/null
> +++ b/utest/Makefile
> @@ -0,0 +1,35 @@
> +# SPDX-License-Identifier: MIT
> +
> +include $(src)/scripts/utils.mk
> +
> +bdir := $(obj)/utest
> +eval_lib := $(obj)/lib/libtraceeval.a
> +
> +TARGETS = $(bdir)/eval-utest
> +
> +OBJS := eval-utest.o
> +OBJS += traceeval-utest.o
> +
> +LIBS += -lcunit \
> + -ldl \
> + $(eval_lib)
> +
> +OBJS := $(OBJS:%.o=$(bdir)/%.o)
> +
> +$(bdir):
> + @mkdir -p $(bdir)
> +
> +$(OBJS): | $(bdir)
> +
> +$(bdir)/eval-utest: $(OBJS) $(eval_lib)
> + $(Q)$(do_app_build)
> +
> +$(bdir)/%.o: %.c
> + $(Q)$(call do_fpic_compile)
> +
> +-include .*.d
> +
> +test: $(TARGETS)
> +
> +clean:
> + $(Q)$(call do_clean,$(TARGETS) $(bdir)/*.o $(bdir)/.*.d)
> diff --git a/utest/eval-test.h b/utest/eval-test.h
> new file mode 100644
> index 0000000..f3372e8
> --- /dev/null
> +++ b/utest/eval-test.h
> @@ -0,0 +1,10 @@
> +/* SPDX-License-Identifier: MIT */
> +/*
> + * Copyright (C) 2023 Google Inc, Stevie Alvarez <stevie.6strings@gmail.com>
> + */
> +#ifndef _EVAL_UTEST_H_
> +#define _EVAL_UTEST_H_
> +
> +void test_traceeval_lib(void);
> +
> +#endif /* _EVAL_UTEST_H_ */
> diff --git a/utest/eval-utest.c b/utest/eval-utest.c
> new file mode 100644
> index 0000000..771a0c4
> --- /dev/null
> +++ b/utest/eval-utest.c
> @@ -0,0 +1,27 @@
> +
> +// SPDX-License-Identifier: MIT
> +/*
> + * Copyright (C) 2023 Google Inc, Stevie Alvarez <stevie.6strings@gmail.com>
> + */
> +#include <stdio.h>
> +#include <stdlib.h>
> +
> +#include <CUnit/CUnit.h>
> +#include <CUnit/Basic.h>
> +
> +#include "eval-test.h"
> +
> +int main(int argc, char **argv)
> +{
> + if (CU_initialize_registry() != CUE_SUCCESS) {
> + printf("Test registry cannot be initialized\n");
> + return EXIT_FAILURE;
> + }
> +
> + test_traceeval_lib();
> +
> + CU_basic_set_mode(CU_BRM_VERBOSE);
> + CU_basic_run_tests();
> + CU_cleanup_registry();
> + return EXIT_SUCCESS;
> +}
> diff --git a/utest/traceeval-utest.c b/utest/traceeval-utest.c
> new file mode 100644
> index 0000000..2bcb4b9
> --- /dev/null
> +++ b/utest/traceeval-utest.c
> @@ -0,0 +1,222 @@
> +// SPDX-License-Identifier: MIT
> +/*
> + * Copyright (C) 2023 Google Inc, Stevie Alvarez <stevie.6strings@gmail.com>
> + */
> +
> +#include <string.h>
> +#include <stdio.h>
> +#include <stdbool.h>
> +#include <CUnit/CUnit.h>
> +#include <CUnit/Basic.h>
> +
> +#include <histograms.h>
> +
> +#define TRACEEVAL_SUITE "traceeval library"
> +#define TRACEEVAL_SUCCESS 0
> +#define TRACEEVAL_FAILURE -1
> +#define TRACEEVAL_NOT_SAME 1
> +
> +/**
> + * Test traceeval_init(), traceeval_release(), and traceeval_compare() with
> + * NULL values.
> + */
> +void test_eval_null(void)
All functions except test_traceeval_lib() should be static.
> +{
> + // set up
> + char *name = "test null";
> + enum traceeval_data_type type = TRACEEVAL_TYPE_NONE;
> + const struct traceeval_type test_data[] = {
> + {
> + .type = TRACEEVAL_TYPE_NUMBER,
> + .name = name
> + },
> + {
> + .type = type,
.type = TRACEEVAL_TYPE_NONE,
and you can get rid of the 'type' variable.
> + .name = NULL
> + }
> + };
> +
> + // test init
> + struct traceeval *result_null = traceeval_init(NULL, NULL);
> + struct traceeval *result_key = traceeval_init(test_data, NULL);
> + struct traceeval *result_val = traceeval_init(NULL, test_data);
> +
> + // analyze init
> + CU_ASSERT(!result_null);
> + CU_ASSERT(result_key != NULL);
> + CU_ASSERT(!result_val);
> +
> + // release
> + traceeval_release(NULL);
> + traceeval_release(result_key);
> +}
> +
> +/**
> + * Use provided data to test traceeval_init(), traceeval_compare(), and
> + * traceeval_release().
> + */
> +void test_eval_base(const struct traceeval_type *keys1,
> + const struct traceeval_type *vals1,
> + const struct traceeval_type *keys2,
> + const struct traceeval_type *vals2,
> + bool init_not_null1, bool init_not_null2,
> + int compare_result)
> +{
> + struct traceeval *init1;
> + struct traceeval *init2;
> + int result;
> +
> + // test init
> + init1 = traceeval_init(keys1, vals1);
> + init2 = traceeval_init(keys2, vals2);
> +
> + result = init1 != NULL;
> + if (init_not_null1) {
> + CU_ASSERT(result);
> + } else {
> + CU_ASSERT(!result);
> + }
> +
> + result = init2 != NULL;
> + if (init_not_null2) {
> + CU_ASSERT(result);
> + } else {
> + CU_ASSERT(!result);
> + }
> +
> + // test compare
> + result = traceeval_compare(init1, init2);
> +
> + // analyze compare
> + CU_ASSERT(result == compare_result);
> +
> + // release
> + traceeval_release(init1);
> + traceeval_release(init2);
> +}
> +
> +/**
> + * Test traceeval_init(), traceeval_release(), and traceeval_compare() with
> + * TRACEEVAL_TYPE_NONE.
> + */
> +void test_eval_none(void)
> +{
> + // set up
> + char *name = "test none";
> + char *name2 = "test none (some)";
> + const struct traceeval_type test_data_none[] = {
> + {
> + .type = TRACEEVAL_TYPE_NONE,
> + .name = name
> + }
> + };
> + const struct traceeval_type test_data_some[] = {
> + {
> + .type = TRACEEVAL_TYPE_NUMBER,
> + .name = name2
> + },
> + {
> + .type = TRACEEVAL_TYPE_NONE,
> + .name = NULL
> + }
> + };
> +
> + test_eval_base(test_data_some, test_data_none, test_data_some,
> + test_data_none, true, true, TRACEEVAL_SUCCESS);
> + test_eval_base(test_data_none, test_data_none, test_data_some,
> + test_data_none, false, true, TRACEEVAL_FAILURE);
> + test_eval_base(test_data_none, test_data_none, test_data_none,
> + test_data_none, false, false, TRACEEVAL_FAILURE);
> +}
> +
> +/**
> + * Test traceeval_init() and traceeval_release() with equivalent values.
> + */
> +void test_eval_same(void)
> +{
> + // set up
> + char *name = "test data";
> + char *name2 = "test done";
char *name2 = "test none";
?
> + const struct traceeval_type test_data[] = {
> + {
> + .type = TRACEEVAL_TYPE_NUMBER,
> + .name = name
> + },
> + {
> + .type = TRACEEVAL_TYPE_NONE,
> + .name = name2
> + }
> + };
> +
> + test_eval_base(test_data, test_data, test_data, test_data, true, true,
> + TRACEEVAL_SUCCESS);
> +}
> +
> +/**
> + * Test traceeval_init() and traceeval_release() with non-equivalent values.
> + */
> +void test_eval_not_same(void)
> +{
> + const struct traceeval_type test_data1[] = {
> + {
> + .type = TRACEEVAL_TYPE_NUMBER,
> + .name = "test data 1"
nit: maybe just inline all the names in other test functions, like you have in
this one? Saves some variables & is more readable.
> + },
> + {
> + .type = TRACEEVAL_TYPE_NONE,
> + .name = NULL
> + }
> + };
> + const struct traceeval_type test_data2[] = {
> + {
> + .type = TRACEEVAL_TYPE_NUMBER,
> + .name = "test data 2"
> + },
> + {
> + .type = TRACEEVAL_TYPE_NONE,
> + .name = NULL
> + }
> + };
> +
> + // type 1 key diff
> + test_eval_base(test_data2, test_data1, test_data1, test_data1, true,
> + true, TRACEEVAL_NOT_SAME);
> + // type 1 data diff
> + test_eval_base(test_data1, test_data2, test_data1, test_data1, true,
> + true, TRACEEVAL_NOT_SAME);
> + // type 2 key diff
> + test_eval_base(test_data1, test_data1, test_data2, test_data1, true,
> + true, TRACEEVAL_NOT_SAME);
> + // type 2 data diff
> + test_eval_base(test_data1, test_data1, test_data1, test_data2, true,
> + true, TRACEEVAL_NOT_SAME);
> +}
> +
> +/**
> + * Tests the traceeval_init() and traceeval_release() functions.
> + */
> +void test_eval(void)
> +{
> + test_eval_null();
> + test_eval_none();
> + test_eval_same();
> + test_eval_not_same();
> +}
> +
> +/**
> + * Register tests with CUnit.
> + */
> +void test_traceeval_lib(void)
> +{
> + CU_pSuite suite = NULL;
> +
> + // set up suite
> + suite = CU_add_suite(TRACEEVAL_SUITE, NULL, NULL);
> + if (suite == NULL) {
> + fprintf(stderr, "Suite %s cannot be created\n", TRACEEVAL_SUITE);
> + return;
> + }
> +
> + // add tests to suite
> + CU_add_test(suite, "Test traceeval alloc and release", test_eval);
> +}
> --
> 2.41.0
>
next prev parent reply other threads:[~2023-08-03 16:27 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-07-28 19:04 [PATCH 1/5] histograms: initial histograms interface Stevie Alvarez
2023-07-28 19:04 ` [PATCH 2/5] histograms: traceeval initialize Stevie Alvarez
2023-07-28 22:03 ` Steven Rostedt
2023-08-02 21:07 ` Ross Zwisler
2023-08-02 21:39 ` Steven Rostedt
2023-07-28 19:04 ` [PATCH 3/5] histograms: traceeval release Stevie Alvarez
2023-07-28 22:07 ` Steven Rostedt
2023-08-02 21:54 ` Ross Zwisler
2023-08-02 22:20 ` Steven Rostedt
2023-08-02 22:21 ` Steven Rostedt
2023-07-28 19:04 ` [PATCH 4/5] histograms: traceeval compare Stevie Alvarez
2023-07-28 22:25 ` Steven Rostedt
2023-08-02 22:51 ` Ross Zwisler
2023-07-28 19:04 ` [PATCH 5/5] histograms: Add struct traceeval unit tests Stevie Alvarez
2023-07-28 22:30 ` Steven Rostedt
2023-08-03 16:27 ` Ross Zwisler [this message]
2023-07-28 20:25 ` [PATCH 1/5] histograms: initial histograms interface Steven Rostedt
2023-07-31 20:53 ` Stevie Alvarez
2023-07-31 21:04 ` Steven Rostedt
2023-08-01 19:08 ` Stevie Alvarez
2023-08-01 19:29 ` Steven Rostedt
2023-08-01 0:36 ` Ross Zwisler
2023-08-01 1:25 ` Steven Rostedt
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=20230803162742.GA3575843@google.com \
--to=zwisler@google.com \
--cc=linux-trace-devel@vger.kernel.org \
--cc=rostedt@goodmis.org \
--cc=stevie.6strings@gmail.com \
/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.