[PATCH v2 3/3] ttest01: New test

Gedare Bloom gedare at rtems.org
Tue Oct 1 21:40:19 UTC 2019


On Fri, Mar 22, 2019 at 3:20 AM Sebastian Huber
<sebastian.huber at embedded-brains.de> wrote:
>
> 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).
> + */
Is there any standing for dual-licensing 2BSD with CC-BY-SA?

> 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
paste

> +enables a constent line numbering between the documentation code fragements and
constant ... fragments

> +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
licensed
> +BSD-2-Clause and CC-BY-SA-4.0.
> +
Thanks for the above explanation, it was helpful for this example. For
future tests, do you anticipate any text here such as a short
narrative description? Or this text should be deleted if it gets
copy-paste into new tests?

> +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
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel


More information about the devel mailing list