A-Tune-BPF-Collection/add-test-framework-and-testcasese.patch
lvying6 0d37bc9e68 some enhancement for adding testcase and updating README
Signed-off-by: lvying6 <lvying6@huawei.com>
2022-10-17 20:13:05 +08:00

264 lines
7.3 KiB
Diff
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

From 49f525d214694d2be5ad551c2a51ec1f50f232ed Mon Sep 17 00:00:00 2001
From: lvying6 <lvying6@huawei.com>
Date: Sun, 16 Oct 2022 15:42:33 +0800
Subject: [PATCH] add test framework and testcasese
Signed-off-by: lvying6 <lvying6@huawei.com>
---
Makefile | 8 +++++++
README.md | 21 +++++++++++++++++
common_helper.h | 1 +
test/Makefile | 50 ++++++++++++++++++++++++++++++++++++++++
test/evaluate-test.sh | 16 +++++++++++++
test/test-driver.c | 15 ++++++++++++
test/tst-common_helper.c | 46 ++++++++++++++++++++++++++++++++++++
test/tst-conf-file | 7 ++++++
8 files changed, 164 insertions(+)
create mode 100644 test/Makefile
create mode 100755 test/evaluate-test.sh
create mode 100644 test/test-driver.c
create mode 100644 test/tst-common_helper.c
create mode 100644 test/tst-conf-file
diff --git a/Makefile b/Makefile
index f5ba4bb..cac7521 100644
--- a/Makefile
+++ b/Makefile
@@ -6,6 +6,7 @@ PAHOLE ?= pahole
READELF ?= readelf
VMLINUX ?= /usr/lib/debug/lib/modules/`uname -r`/vmlinux
VMLINUX_HEADER ?= $(OUTPUT)/vmlinux.h
+MAKE ?= make
BTF_PAHOLE_PROBE := $(shell $(READELF) -S $(VMLINUX) | grep .BTF 2>&1)
INCLUDES := -I$(OUTPUT)
@@ -39,10 +40,17 @@ all: $(APPS)
debug: DEBUG_FLAGS = -DBPFDEBUG
debug: all
+export CFLAGS OUTPUT Q
.PHONY: clean
clean:
$(call msg,CLEAN)
$(Q)rm -rf $(OUTPUT) $(APPS) $(patsubst %,%.bpf.o,$(APPS))
+ $(Q)$(MAKE) -C test clean
+
+.PHONY: check
+check: all
+ $(call msg, CHECK)
+ $(Q)$(MAKE) -C test
$(OUTPUT):
$(call msg,MKDIR,$@)
diff --git a/README.md b/README.md
index 1750627..de4fd9d 100644
--- a/README.md
+++ b/README.md
@@ -46,6 +46,27 @@ make
编译过程中可能遇到`kenrl-debuginfo`rpm包提供vmlinux路径与`uname -r`不一致的情况导致编译失败。这是由于当前运行的内核版本与`kernel-debuginfo`的版本不一致。openEuler yum源的kernel版本较高可以执行`dnf update kernel`升级当前kernel到yum源的kernel版本重启系统kernel版本便与`kernel-debuginfo`版本一致,再重新编译。
+#### 测试
+##### 执行测试用例
+```bash
+make check
+```
+执行测试用例依赖于源码构建,会自动编译。测试用例运行结果信息示例如下所示:
+```bash
+ CHECK
+ PASS: tst-common_helper
+ Test Summary:
+ Unsupport: 0
+ Fail: 0
+ Pass: 1
+```
+会显示每个测试用例的执行结果,如`tst-common_helper`测试用例执行成功。最后以`Test Summary:`行开头总结所有测试用例执行情况。`Unsupport`表示不支持在当前测试平台上运行的测试用例数目,`Fail`表示失败的测试用例数目,`Pass`表示成功的测试用例数目。
+
+##### 新增测试用例
+如果要新增对源码中目标文件中的函数进行测试,则在`test`目录下新增前缀为`tst-`,后半部分与测试目标文件名一致的测试文件。如要对`common_helper.c`中的函数进行测试,则新建名为`tst-common_helper.c`的测试文件。
+
+测试文件中的测试用例定义在`int do_test(void)`函数中测试用例首先应该检查能否在测试平台上进行运行如果不支持则返回2(unsupport)测试用例运行失败返回1(fail)成功则返回0(pass)。在测试文件结尾添加`#include "test/test-driver.c"`语句即可。
+
#### 参与贡献
1. Fork 本仓库
diff --git a/common_helper.h b/common_helper.h
index 8fc52a6..2680318 100644
--- a/common_helper.h
+++ b/common_helper.h
@@ -2,6 +2,7 @@
#define _COMMON_HELPER_H
#include <syslog.h>
+#include <stdio.h>
#define SHASH 11
#define SYSLOG (1 << 0)
diff --git a/test/Makefile b/test/Makefile
new file mode 100644
index 0000000..bbbdb7a
--- /dev/null
+++ b/test/Makefile
@@ -0,0 +1,50 @@
+.DEFAULT_GOAL := check
+INCLUDES := -I../
+
+evaluate-test := evaluate-test.sh
+# test source code functions in object files
+test_objs := tst-common_helper
+
+# Build C testcases code
+$(patsubst %, %.o, $(test_objs)): %.o: %.c
+ $(Q)$(CC) $(CFLAGS) $(INCLUDES) -c $(filter %.c,$^) -o $@
+
+$(test_objs): %: %.o
+ $(Q)$(CC) $(CFLAGS) $^ ../$(OUTPUT)/$(strip $(subst tst-, ,$@)).o -o $@
+
+# all the lines in the recipe be passed to a single invocation of the shell
+.ONESHELL:
+SHELL = /bin/sh
+
+define run_tests
+ unsupport=0
+ fail=0
+ pass=0
+ for testcase in $1; do
+ ./$$testcase >$$testcase.out 2>&1
+ ret=$$?
+ $(SHELL) $(evaluate-test) $$testcase $$ret
+ if [ $$ret -eq 2 ]; then
+ unsupport=`expr $$unsupport + 1`
+ else
+ if [ $$ret -eq 0 ]; then
+ pass=`expr $$pass + 1`
+ else
+ fail=`expr $$fail + 1`
+ fi
+ fi
+ done
+
+ echo -e " Test Summary:"
+ echo -e " Unsupport: $$unsupport"
+ echo -e " Fail: $$fail"
+ echo -e " Pass: $$pass"
+endef
+
+.PHONY: check
+check: $(test_objs)
+ @$(call run_tests, $<)
+
+.PHONY: clean
+clean:
+ $(Q)rm -rf $(test_objs) $(patsubst %,%.o,$(test_objs)) $(patsubst %,%.out,$(test_objs))
diff --git a/test/evaluate-test.sh b/test/evaluate-test.sh
new file mode 100755
index 0000000..31a8914
--- /dev/null
+++ b/test/evaluate-test.sh
@@ -0,0 +1,16 @@
+#!/bin/bash
+
+test_name=$1
+rc=$2
+
+if [ $rc -eq 2 ]; then
+ result="UNSUPPORTED"
+else
+ if [ $rc -eq 0 ]; then
+ result="PASS"
+ else
+ result="FAIL"
+ fi
+fi
+
+echo -e " $result: $test_name"
diff --git a/test/test-driver.c b/test/test-driver.c
new file mode 100644
index 0000000..6e58c9c
--- /dev/null
+++ b/test/test-driver.c
@@ -0,0 +1,15 @@
+/*
+ * glibc style testcase:
+ * this file should be included from testcases, the testcase should define a function:
+ * int do_test(void)
+ *
+ * The do_test return 0 to indicate a passing test,
+ * 1 to indicate a failing test
+ * 2 to indicate an unsupported test
+ */
+extern int do_test(void);
+
+int main(int argc, char **argv)
+{
+ return do_test();
+}
diff --git a/test/tst-common_helper.c b/test/tst-common_helper.c
new file mode 100644
index 0000000..1f1ce21
--- /dev/null
+++ b/test/tst-common_helper.c
@@ -0,0 +1,46 @@
+#include <string.h>
+#include "common_helper.h"
+
+#define CONFIG_FILE "tst-conf-file"
+
+struct expected_option {
+ const char *name;
+ const char *expected_val;
+};
+
+struct expected_option test_options[] = {
+ {"space_integer", "23"},
+ {"space_float", "3.1415926"},
+ {"no_space_str", "hello world"},
+ {"space_str", "hello world"},
+ {"empty_field", ""}
+};
+
+static int do_test(void)
+{
+ int ret = 0;
+ struct opt **opts = parse_init(SHASH);
+ if (!opts) {
+ log(TERM, LOG_ERR, "parse_init failed\n");
+ return 1;
+ }
+
+ if (parse_config_file(TERM, CONFIG_FILE, opts, SHASH)) {
+ log(TERM, LOG_ERR, "parse_config_file failed\n");
+ return 1;
+ }
+
+ for (int i = 0; i < sizeof(test_options) / sizeof(struct expected_option); i++) {
+ const char *res = config_opt(opts, SHASH, test_options[i].name);
+ if (strcmp(test_options[i].expected_val, res)) {
+ ret = 1;
+ goto out;
+ }
+ }
+
+out:
+ parse_fini(opts, SHASH);
+ return ret;
+}
+
+#include "test/test-driver.c"
diff --git a/test/tst-conf-file b/test/tst-conf-file
new file mode 100644
index 0000000..822de28
--- /dev/null
+++ b/test/tst-conf-file
@@ -0,0 +1,7 @@
+# Test comments
+ space_integer = 23
+ space_float = 3.1415926
+no_space_str=hello world
+space_str = hello world
+ empty_field =
+
--
2.33.0