From: Stevie Alvarez <stevie.6strings@gmail.com>
To: linux-trace-devel@vger.kernel.org
Cc: "Stevie Alvarez (Google)" <stevie.6strings@gmail.com>,
Steven Rostedt <rostedt@goodmis.org>,
Ross Zwisler <zwisler@google.com>
Subject: [PATCH v2 5/5] histograms: Initial unit tests
Date: Thu, 3 Aug 2023 18:54:03 -0400 [thread overview]
Message-ID: <20230803225413.40697-6-stevie.6strings@gmail.com> (raw)
In-Reply-To: <20230803225413.40697-1-stevie.6strings@gmail.com>
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>
---
include/traceeval-test.h | 1 -
utest/.gitignore | 1 +
utest/Makefile | 35 +++++++
utest/eval-test.h | 13 +++
utest/eval-utest.c | 28 +++++
utest/traceeval-utest.c | 217 +++++++++++++++++++++++++++++++++++++++
6 files changed, 294 insertions(+), 1 deletion(-)
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/include/traceeval-test.h b/include/traceeval-test.h
index bb8092a..45cf13b 100644
--- a/include/traceeval-test.h
+++ b/include/traceeval-test.h
@@ -2,7 +2,6 @@
/*
* libtraceeval interface for unit testing.
*
- * Copyright (C) 2023 Google Inc, Steven Rostedt <rostedt@goodmis.org>
* Copyright (C) 2023 Google Inc, Stevie Alvarez <stevie.6strings@gmail.com>
*/
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..f6e594e
--- /dev/null
+++ b/utest/eval-test.h
@@ -0,0 +1,13 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * libtraceeval cunit interface.
+ *
+ * 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..94d04c6
--- /dev/null
+++ b/utest/eval-utest.c
@@ -0,0 +1,28 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * libtraceeval cunit handler.
+ *
+ * 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..de23821
--- /dev/null
+++ b/utest/traceeval-utest.c
@@ -0,0 +1,217 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright (C) 2023 Google Inc, Stevie Alvarez <stevie.6strings@gmail.com>
+ */
+
+#include <CUnit/CUnit.h>
+#include <CUnit/Basic.h>
+#include <stdbool.h>
+#include <string.h>
+#include <stdio.h>
+
+#include <traceeval-hist.h>
+#include <traceeval-test.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.
+ */
+static void test_eval_null(void)
+{
+ /* set up */
+ const struct traceeval_type test_data[] = {
+ {
+ .type = TRACEEVAL_TYPE_NUMBER,
+ .name = "test null"
+ },
+ {
+ .type = TRACEEVAL_TYPE_NONE,
+ .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().
+ */
+static 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.
+ */
+static void test_eval_none(void)
+{
+ /* set up */
+ const struct traceeval_type test_data_none[] = {
+ {
+ .type = TRACEEVAL_TYPE_NONE,
+ .name = "test none"
+ }
+ };
+ const struct traceeval_type test_data_some[] = {
+ {
+ .type = TRACEEVAL_TYPE_NUMBER,
+ .name = "test none (some)"
+ },
+ {
+ .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.
+ */
+static void test_eval_same(void)
+{
+ /* set up */
+ const struct traceeval_type test_data[] = {
+ {
+ .type = TRACEEVAL_TYPE_NUMBER,
+ .name = "test data"
+ },
+ {
+ .type = TRACEEVAL_TYPE_NONE,
+ .name = NULL
+ }
+ };
+
+ 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.
+ */
+static void test_eval_not_same(void)
+{
+ const struct traceeval_type test_data1[] = {
+ {
+ .type = TRACEEVAL_TYPE_NUMBER,
+ .name = "test data 1"
+ },
+ {
+ .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.
+ */
+static 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 22:54 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-03 22:53 [PATCH v2 0/5] histograms: bug fixes and convention compliance Stevie Alvarez
2023-08-03 22:53 ` [PATCH v2 1/5] histograms: Initial histograms interface Stevie Alvarez
2023-08-04 13:50 ` Steven Rostedt
2023-08-04 17:41 ` Stevie Alvarez
2023-08-04 17:57 ` Steven Rostedt
2023-08-04 18:25 ` Stevie Alvarez
2023-08-03 22:54 ` [PATCH v2 2/5] histograms: Add traceeval initialize Stevie Alvarez
2023-08-04 14:40 ` Steven Rostedt
2023-08-04 18:23 ` Stevie Alvarez
2023-08-04 19:20 ` Steven Rostedt
2023-08-03 22:54 ` [PATCH v2 3/5] histograms: Add traceeval release Stevie Alvarez
2023-08-04 14:55 ` Steven Rostedt
2023-08-03 22:54 ` [PATCH v2 4/5] histograms: Add traceeval compare Stevie Alvarez
2023-08-04 15:24 ` Steven Rostedt
2023-08-07 23:40 ` Ross Zwisler
2023-08-03 22:54 ` Stevie Alvarez [this message]
2023-08-04 12:37 ` [PATCH v2 0/5] histograms: bug fixes and convention compliance 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=20230803225413.40697-6-stevie.6strings@gmail.com \
--to=stevie.6strings@gmail.com \
--cc=linux-trace-devel@vger.kernel.org \
--cc=rostedt@goodmis.org \
--cc=zwisler@google.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.