[PATCH v2 3/3] ttest01: New test

Sebastian Huber sebastian.huber at embedded-brains.de
Fri Mar 22 09:20:05 UTC 2019


This is an example test using the RTEMS Test Framework.  It tests also
the framework itself.

Add T_FILE_NAME command line define to get rid of the full file path.
This is important to reduce the read-only data of test files and make
them build system independent.

Update #3199.
---
 testsuites/automake/compile.am             |   1 +
 testsuites/libtests/Makefile.am            |  10 ++
 testsuites/libtests/configure.ac           |   1 +
 testsuites/libtests/ttest01/init.c         | 183 +++++++++++++++++++++++++++++
 testsuites/libtests/ttest01/t-self-test.h  |  46 ++++++++
 testsuites/libtests/ttest01/test-example.c |  57 +++++++++
 testsuites/libtests/ttest01/ttest01.doc    |  19 +++
 testsuites/libtests/ttest01/ttest01.scn    |  26 ++++
 8 files changed, 343 insertions(+)
 create mode 100644 testsuites/libtests/ttest01/init.c
 create mode 100644 testsuites/libtests/ttest01/t-self-test.h
 create mode 100644 testsuites/libtests/ttest01/test-example.c
 create mode 100644 testsuites/libtests/ttest01/ttest01.doc
 create mode 100644 testsuites/libtests/ttest01/ttest01.scn

diff --git a/testsuites/automake/compile.am b/testsuites/automake/compile.am
index 83d4ab111c..66ea9a8421 100644
--- a/testsuites/automake/compile.am
+++ b/testsuites/automake/compile.am
@@ -11,6 +11,7 @@ STRIP = @STRIP@
 TEST_LD_FLAGS = -Wl,--wrap=printf -Wl,--wrap=puts -Wl,--wrap=putchar
 
 AM_CPPFLAGS = $(TEST_FLAGS) @RTEMS_CPPFLAGS@ @RTEMS_BSP_CPPFLAGS@
+AM_CPPFLAGS += -DT_FILE_NAME='"$(notdir $<)"'
 AM_CFLAGS   = $(TEST_C_FLAGS)
 AM_CXXFLAGS = $(TEST_CXX_FLAGS)
 
diff --git a/testsuites/libtests/Makefile.am b/testsuites/libtests/Makefile.am
index fe6f7d8ee8..1b80283123 100644
--- a/testsuites/libtests/Makefile.am
+++ b/testsuites/libtests/Makefile.am
@@ -1500,6 +1500,16 @@ top_SOURCES = top/init.c top/task1.c top/task2.c top/task3.c \
 top_CPPFLAGS = $(AM_CPPFLAGS) $(TEST_FLAGS_top) $(support_includes)
 endif
 
+if TEST_ttest01
+lib_tests += ttest01
+lib_screens += ttest01/ttest01.scn
+lib_docs += ttest01/ttest01.doc
+ttest01_SOURCES = ttest01/init.c
+ttest01_SOURCES += ttest01/test-example.c
+ttest01_CPPFLAGS = $(AM_CPPFLAGS) $(TEST_FLAGS_ttest01) \
+	$(support_includes)
+endif
+
 if TEST_tztest
 lib_tests += tztest
 lib_screens += tztest/tztest.scn
diff --git a/testsuites/libtests/configure.ac b/testsuites/libtests/configure.ac
index a6879a7430..c02b42a5f9 100644
--- a/testsuites/libtests/configure.ac
+++ b/testsuites/libtests/configure.ac
@@ -226,6 +226,7 @@ RTEMS_TEST_CHECK([termios07])
 RTEMS_TEST_CHECK([termios08])
 RTEMS_TEST_CHECK([termios09])
 RTEMS_TEST_CHECK([top])
+RTEMS_TEST_CHECK([ttest01])
 RTEMS_TEST_CHECK([tztest])
 RTEMS_TEST_CHECK([uid01])
 RTEMS_TEST_CHECK([unlink])
diff --git a/testsuites/libtests/ttest01/init.c b/testsuites/libtests/ttest01/init.c
new file mode 100644
index 0000000000..6a76eec123
--- /dev/null
+++ b/testsuites/libtests/ttest01/init.c
@@ -0,0 +1,183 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (C) 2018, 2019 embedded brains GmbH
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <t.h>
+
+#include <sys/time.h>
+#include <string.h>
+
+#include <rtems.h>
+#include <rtems/bspIo.h>
+
+#include "t-self-test.h"
+
+#include <tmacros.h>
+
+const char rtems_test_name[] = "TTEST 1";
+
+#define test_assert(e) (e) ? (void)0 : test_failed(__LINE__, #e)
+
+RTEMS_LINKER_ROSET(t_self_test, const char *);
+
+typedef struct {
+	const char *c;
+	BSP_output_char_function_type output_char;
+	size_t case_begin_count;
+	size_t case_end_count;
+} test_context;
+
+static test_context test_instance;
+
+static void
+test_failed(int line, const char *e)
+{
+	BSP_output_char = test_instance.output_char;
+	printk("FAILED:%i:%s\n", line, e);
+	rtems_test_exit(1);
+}
+
+static void
+output_char(char c)
+{
+	test_context *ctx;
+
+	ctx = &test_instance;
+
+	if (c != '\r' && ctx->c != NULL) {
+		test_assert(*ctx->c == c);
+		++ctx->c;
+	}
+
+	(*ctx->output_char)(c);
+}
+
+static void
+case_early(const char *name)
+{
+	test_context *ctx;
+	const char **item;
+	ssize_t n;
+
+	ctx = &test_instance;
+	++ctx->case_begin_count;
+	n = strlen(name);
+
+	RTEMS_LINKER_SET_FOREACH(t_self_test, item) {
+		const char *to;
+
+		to = *item;
+
+		if (strncmp(name, to, n) == 0 && to[n] == ':') {
+			ctx->c = to + n + 1;
+			return;
+		}
+	}
+
+	test_assert(0);
+}
+
+static void
+case_late(const char *name)
+{
+	test_context *ctx;
+
+	ctx = &test_instance;
+	++ctx->case_end_count;
+	test_assert(ctx->c != NULL);
+	test_assert(*ctx->c == '\0');
+	ctx->c = NULL;
+}
+
+static void
+action(T_event event, const char *name)
+{
+	(void)name;
+
+	switch (event) {
+	case T_EVENT_CASE_EARLY:
+		case_early(name);
+		break;
+	case T_EVENT_CASE_LATE:
+		case_late(name);
+		break;
+	default:
+		break;
+	};
+}
+
+static Atomic_Ulong counter;
+
+static T_time
+now(void)
+{
+	return _Atomic_Fetch_add_ulong(&counter, SBT_1MS, ATOMIC_ORDER_RELAXED);
+}
+
+static const T_action actions[] = { action };
+
+static const T_config config = {
+	.name = "ttest01",
+	.verbosity = T_VERBOSE,
+	.now = now,
+	.action_count = T_ARRAY_SIZE(actions),
+	.actions = actions
+};
+
+static void
+Init(rtems_task_argument arg)
+{
+	test_context *ctx;
+	int exit_code;
+	size_t case_count;
+
+	(void)arg;
+	TEST_BEGIN();
+	ctx = &test_instance;
+	ctx->output_char = BSP_output_char;
+	BSP_output_char = output_char;
+	test_assert(!T_is_runner());
+	T_register();
+	test_assert(!T_is_runner());
+	exit_code = T_main(&config);
+	test_assert(exit_code == 1);
+	test_assert(!T_is_runner());
+	case_count = RTEMS_LINKER_SET_ITEM_COUNT(t_self_test);
+	test_assert(ctx->case_begin_count == case_count);
+	test_assert(ctx->case_end_count == case_count);
+	TEST_END();
+	rtems_test_exit(0);
+}
+
+#define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 1
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#define CONFIGURE_INIT
+
+#include <rtems/confdefs.h>
diff --git a/testsuites/libtests/ttest01/t-self-test.h b/testsuites/libtests/ttest01/t-self-test.h
new file mode 100644
index 0000000000..1035872c9d
--- /dev/null
+++ b/testsuites/libtests/ttest01/t-self-test.h
@@ -0,0 +1,46 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (C) 2019 embedded brains GmbH
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef THE_T_TEST_FRAMEWORK_SELF_TEST_H
+#define THE_T_TEST_FRAMEWORK_SELF_TEST_H
+
+#include <rtems/linkersets.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+RTEMS_LINKER_ROSET_DECLARE(t_self_test, const char *);
+
+#define T_TEST_OUTPUT(name, output) \
+    RTEMS_LINKER_ROSET_ITEM(t_self_test, const char *, name) = #name ":" output
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* THE_T_TEST_FRAMEWORK_SELF_TEST_H */
diff --git a/testsuites/libtests/ttest01/test-example.c b/testsuites/libtests/ttest01/test-example.c
new file mode 100644
index 0000000000..bcbf7b33b0
--- /dev/null
+++ b/testsuites/libtests/ttest01/test-example.c
@@ -0,0 +1,57 @@
+#include <t.h>
+
+T_TEST_CASE(example)
+{
+	T_true(true, "test passes, no message output");
+	T_true(false, "test fails");
+	T_quiet_true(true, "quiet test passes, no output at all");
+	T_quiet_true(false, "quiet test fails");
+	T_step_true(2, true, "step test passes, no message output");
+	T_step_true(3, false, "step test fails");
+	T_assert_false(true, "this is a format %s", "string");
+}
+
+#include "t-self-test.h"
+
+T_TEST_OUTPUT(example,
+"B:example\n"
+"P:0:0:UI1:test-example.c:5\n"
+"F:1:0:UI1:test-example.c:6:test fails\n"
+"F:*:0:UI1:test-example.c:8:quiet test fails\n"
+"P:2:0:UI1:test-example.c:9\n"
+"F:3:0:UI1:test-example.c:10:step test fails\n"
+"F:4:0:UI1:test-example.c:11:this is a format string\n"
+"E:example:N:5:F:4:D:0.001000\n");
+
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ * SPDX-License-Identifier: CC-BY-SA-4.0
+ *
+ * Copyright (C) 2018, 2019 embedded brains GmbH
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * ALTERNATIVELY, this software may be distributed under the terms of the
+ * Creative Commons Attribution-ShareAlike 4.0 International Public License as
+ * published by Creative Commons, PO Box 1866, Mountain View, CA 94042
+ * (https://creativecommons.org/licenses/by-sa/4.0/legalcode).
+ */
diff --git a/testsuites/libtests/ttest01/ttest01.doc b/testsuites/libtests/ttest01/ttest01.doc
new file mode 100644
index 0000000000..37d9ff8535
--- /dev/null
+++ b/testsuites/libtests/ttest01/ttest01.doc
@@ -0,0 +1,19 @@
+This file describes the directives and concepts tested by this test set.
+
+test set name: ttest01
+
+The test-*.c files must place the license header at the bottom of the file.
+This allows a copy and past of the test code into documentation sources and
+enables a constent line numbering between the documentation code fragements and
+the actual test output.  For the same reason the T_TEST_OUTPUT() macros must be
+placed after the actual test cases.  The test source files are dual licensesd
+BSD-2-Clause and CC-BY-SA-4.0.
+
+directives:
+
+  - T Test Framework
+
+concepts:
+
+  - Provide examples for the T Test Framework.
+  - Ensure that the T Test Framework works.
diff --git a/testsuites/libtests/ttest01/ttest01.scn b/testsuites/libtests/ttest01/ttest01.scn
new file mode 100644
index 0000000000..05bd1eaa3e
--- /dev/null
+++ b/testsuites/libtests/ttest01/ttest01.scn
@@ -0,0 +1,26 @@
+*** BEGIN OF TEST TTEST 1 ***
+*** TEST VERSION: 5.0.0.286e9354e008b08983e6390a68f8ecc5071de069
+*** TEST STATE: EXPECTED-PASS
+*** TEST BUILD: RTEMS_DEBUG RTEMS_NETWORKING RTEMS_POSIX_API RTEMS_SMP
+*** TEST TOOLS: 7.4.0 20181206 (RTEMS 5, RSB e0aec65182449a4e22b820e773087636edaf5b32, Newlib 1d35a003f)
+A:ttest01
+S:Platform:RTEMS
+S:Compiler:7.4.0 20181206 (RTEMS 5, RSB e0aec65182449a4e22b820e773087636edaf5b32, Newlib 1d35a003f)
+S:Version:5.0.0.286e9354e008b08983e6390a68f8ecc5071de069
+S:BSP:erc32
+S:RTEMS_DEBUG:1
+S:RTEMS_MULTIPROCESSING:0
+S:RTEMS_POSIX_API:1
+S:RTEMS_PROFILING:0
+S:RTEMS_SMP:1
+B:example
+P:0:0:UI1:test-example.c:5
+F:1:0:UI1:test-example.c:6:test fails
+F:*:0:UI1:test-example.c:8:quiet test fails
+P:2:0:UI1:test-example.c:9
+F:3:0:UI1:test-example.c:10:step test fails
+F:4:0:UI1:test-example.c:11:this is a format string
+E:example:N:5:F:4:D:0.001000
+Z:ttest01:C:1:N:5:F:4:D:0.003000
+
+*** END OF TEST TTEST 1 ***
-- 
2.16.4




More information about the devel mailing list