# SPDX-License-Identifier: BSD-2-Clause """ Unit tests for the rtemsspec.validation module. """ # Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de) # # 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. import os import pytest from rtemsspec.validation import generate from rtemsspec.items import EmptyItemCache, ItemCache from rtemsspec.tests.util import create_item_cache_config_and_copy_spec def test_validation(tmpdir): validation_config = {} base_directory = os.path.join(tmpdir, "base") validation_config["base-directory"] = base_directory generate(validation_config, EmptyItemCache()) item_cache_config = create_item_cache_config_and_copy_spec( tmpdir, "spec-validation", with_spec_types=True) generate(validation_config, ItemCache(item_cache_config)) with open(os.path.join(base_directory, "ts.c"), "r") as src: content = """/* SPDX-License-Identifier: BSD-2-Clause */ /** * @file * * @ingroup RTEMSTestSuiteTs */ /* * Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de) * * 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. */ /* * This file was automatically generated. Do not edit it manually. * Please have a look at * * https://docs.rtems.org/branches/master/eng/req/howto.html * * for information how to maintain and re-generate this file. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "green.h" #include /** * @defgroup RTEMSTestSuiteTs spec:/ts * * @ingroup RTEMSTestSuites * * @brief The Blue Green brief description. * * The Blue Green description. * * @{ */ /* Blue green code */ /** @} */ """ assert content == src.read() with open(os.path.join(base_directory, "tc12.c"), "r") as src: content = """/* SPDX-License-Identifier: BSD-2-Clause */ /** * @file * * @ingroup RTEMSTestCaseDirective * @ingroup RTEMSTestCaseTc * @ingroup RTEMSTestCaseTc2 */ /* * Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de) * * 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. */ /* * This file was automatically generated. Do not edit it manually. * Please have a look at * * https://docs.rtems.org/branches/master/eng/req/howto.html * * for information how to maintain and re-generate this file. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include "x.h" #include "y.h" #include /** * @defgroup RTEMSTestCaseDirective spec:/directive * * @ingroup RTEMSTestSuiteTs * * @brief Test rtems_task_ident() brief description. * * Test rtems_task_ident() description. * * @{ */ typedef enum { Directive_Pre_Name_Invalid, Directive_Pre_Name_Self, Directive_Pre_Name_Valid, Directive_Pre_Name_NA } Directive_Pre_Name; typedef enum { Directive_Pre_Node_Local, Directive_Pre_Node_Remote, Directive_Pre_Node_Invalid, Directive_Pre_Node_SearchAll, Directive_Pre_Node_SearchOther, Directive_Pre_Node_SearchLocal, Directive_Pre_Node_NA } Directive_Pre_Node; typedef enum { Directive_Pre_Id_NullPtr, Directive_Pre_Id_Valid, Directive_Pre_Id_NA } Directive_Pre_Id; typedef enum { Directive_Post_Status_Ok, Directive_Post_Status_InvAddr, Directive_Post_Status_InvName, Directive_Post_Status_InvNode, Directive_Post_Status_InvId, Directive_Post_Status_NA } Directive_Post_Status; typedef enum { Directive_Post_Id_Nop, Directive_Post_Id_NullPtr, Directive_Post_Id_Self, Directive_Post_Id_LocalTask, Directive_Post_Id_RemoteTask, Directive_Post_Id_NA } Directive_Post_Id; /** * @brief Test context for spec:/directive test case. */ typedef struct { /** * @brief Brief context member description. * * Context member description. */ rtems_status_code status; rtems_name name; uint32_t node; rtems_id *id; rtems_id id_value; rtems_id id_local_task; rtems_id id_remote_task; /** * @brief This member defines the pre-condition states for the next action. */ size_t pcs[ 3 ]; /** * @brief This member indicates if the test action loop is currently * executed. */ bool in_action_loop; } Directive_Context; static Directive_Context Directive_Instance; static const char * const Directive_PreDesc_Name[] = { "Invalid", "Self", "Valid", "NA" }; static const char * const Directive_PreDesc_Node[] = { "Local", "Remote", "Invalid", "SearchAll", "SearchOther", "SearchLocal", "NA" }; static const char * const Directive_PreDesc_Id[] = { "NullPtr", "Valid", "NA" }; static const char * const * const Directive_PreDesc[] = { Directive_PreDesc_Name, Directive_PreDesc_Node, Directive_PreDesc_Id, NULL }; /* Test rtems_task_ident() support */ static void Directive_Pre_Name_Prepare( Directive_Context *ctx, Directive_Pre_Name state ) { /* Prologue */ switch ( state ) { case Directive_Pre_Name_Invalid: { ctx->name = 1; break; } case Directive_Pre_Name_Self: { ctx->name = RTEMS_SELF; break; } case Directive_Pre_Name_Valid: { ctx->name = rtems_build_name( 'T', 'A', 'S', 'K' ); break; } case Directive_Pre_Name_NA: break; } /* Epilogue */ } static void Directive_Pre_Node_Prepare( Directive_Context *ctx, Directive_Pre_Node state ) { switch ( state ) { case Directive_Pre_Node_Local: { ctx->node = 1; break; } case Directive_Pre_Node_Remote: { ctx->node = 2; break; } case Directive_Pre_Node_Invalid: { ctx->node = 256; break; } case Directive_Pre_Node_SearchAll: { ctx->node = RTEMS_SEARCH_ALL_NODES; break; } case Directive_Pre_Node_SearchOther: { ctx->node = RTEMS_SEARCH_OTHER_NODES; break; } case Directive_Pre_Node_SearchLocal: { ctx->node = RTEMS_SEARCH_LOCAL_NODE; break; } case Directive_Pre_Node_NA: break; } } static void Directive_Pre_Id_Prepare( Directive_Context *ctx, Directive_Pre_Id state ) { switch ( state ) { case Directive_Pre_Id_NullPtr: { ctx->id = NULL; break; } case Directive_Pre_Id_Valid: { ctx->id_value = 0xffffffff; ctx->id = &ctx->id_value; break; } case Directive_Pre_Id_NA: break; } } static void Directive_Post_Status_Check( Directive_Context *ctx, Directive_Post_Status state ) { switch ( state ) { case Directive_Post_Status_Ok: { T_rsc(ctx->status, RTEMS_SUCCESSFUL); break; } case Directive_Post_Status_InvAddr: { T_rsc(ctx->status, RTEMS_INVALID_ADDRESS); break; } case Directive_Post_Status_InvName: { T_rsc(ctx->status, RTEMS_INVALID_NAME); break; } case Directive_Post_Status_InvNode: { T_rsc(ctx->status, RTEMS_INVALID_NODE); break; } case Directive_Post_Status_InvId: { T_rsc(ctx->status, RTEMS_INVALID_ID); break; } case Directive_Post_Status_NA: break; } } static void Directive_Post_Id_Check( Directive_Context *ctx, Directive_Post_Id state ) { switch ( state ) { case Directive_Post_Id_Nop: { T_eq_ptr(ctx->id, &ctx->id_value); T_eq_u32(ctx->id_value, 0xffffffff); break; } case Directive_Post_Id_NullPtr: { T_null(ctx->id) break; } case Directive_Post_Id_Self: { T_eq_ptr(ctx->id, &ctx->id_value); T_eq_u32(ctx->id_value, rtems_task_self()); break; } case Directive_Post_Id_LocalTask: { T_eq_ptr(ctx->id, &ctx->id_value); T_eq_u32(ctx->id_value, ctx->id_local_task); break; } case Directive_Post_Id_RemoteTask: { T_eq_ptr(ctx->id, &ctx->id_value); T_eq_u32(ctx->id_value, ctx->id_remote_task); break; } case Directive_Post_Id_NA: break; } } /** * @brief Setup brief description. * * Setup description. */ static void Directive_Setup( Directive_Context *ctx ) { rtems_status_code sc; sc = rtems_task_create( rtems_build_name( 'T', 'A', 'S', 'K' ), 1, RTEMS_MINIMUM_STACK_SIZE, RTEMS_DEFAULT_MODES, RTEMS_DEFAULT_ATTRIBUTES, &ctx->id_local_task ); T_assert_rsc_success( sc ); } static void Directive_Setup_Wrap( void *arg ) { Directive_Context *ctx; ctx = arg; ctx->in_action_loop = false; Directive_Setup( ctx ); } static void Directive_Teardown( Directive_Context *ctx ) { rtems_status_code sc; if ( ctx->id_local_task != 0 ) { sc = rtems_task_delete( ctx->id_local_task ); T_rsc_success( sc ); } } static void Directive_Teardown_Wrap( void *arg ) { Directive_Context *ctx; ctx = arg; ctx->in_action_loop = false; Directive_Teardown( ctx ); } static size_t Directive_Scope( void *arg, char *buf, size_t n ) { Directive_Context *ctx; ctx = arg; if ( ctx->in_action_loop ) { return T_get_scope( Directive_PreDesc, buf, n, ctx->pcs ); } return 0; } static T_fixture Directive_Fixture = { .setup = Directive_Setup_Wrap, .stop = NULL, .teardown = Directive_Teardown_Wrap, .scope = Directive_Scope, .initial_context = &Directive_Instance }; static const uint8_t Directive_TransitionMap[][ 2 ] = { { Directive_Post_Status_InvAddr, Directive_Post_Id_NullPtr }, { Directive_Post_Status_InvName, Directive_Post_Id_Nop }, { Directive_Post_Status_InvAddr, Directive_Post_Id_NullPtr }, { Directive_Post_Status_InvName, Directive_Post_Id_Nop }, { Directive_Post_Status_InvAddr, Directive_Post_Id_NullPtr }, { Directive_Post_Status_InvName, Directive_Post_Id_Nop }, { Directive_Post_Status_InvAddr, Directive_Post_Id_NullPtr }, { Directive_Post_Status_InvName, Directive_Post_Id_Nop }, { Directive_Post_Status_InvAddr, Directive_Post_Id_NullPtr }, { Directive_Post_Status_InvName, Directive_Post_Id_Nop }, { Directive_Post_Status_InvAddr, Directive_Post_Id_NullPtr }, { Directive_Post_Status_InvName, Directive_Post_Id_Nop }, { Directive_Post_Status_InvAddr, Directive_Post_Id_NullPtr }, { Directive_Post_Status_Ok, Directive_Post_Id_Self }, { Directive_Post_Status_InvAddr, Directive_Post_Id_NullPtr }, { Directive_Post_Status_Ok, Directive_Post_Id_Self }, { Directive_Post_Status_InvAddr, Directive_Post_Id_NullPtr }, { Directive_Post_Status_Ok, Directive_Post_Id_Self }, { Directive_Post_Status_InvAddr, Directive_Post_Id_NullPtr }, { Directive_Post_Status_Ok, Directive_Post_Id_Self }, { Directive_Post_Status_InvAddr, Directive_Post_Id_NullPtr }, { Directive_Post_Status_Ok, Directive_Post_Id_Self }, { Directive_Post_Status_InvAddr, Directive_Post_Id_NullPtr }, { Directive_Post_Status_Ok, Directive_Post_Id_Self }, { Directive_Post_Status_InvAddr, Directive_Post_Id_NullPtr }, { Directive_Post_Status_Ok, Directive_Post_Id_LocalTask }, { Directive_Post_Status_InvAddr, Directive_Post_Id_NullPtr }, { #if defined(RTEMS_MULTIPROCESSING) Directive_Post_Status_Ok, Directive_Post_Id_RemoteTask #else Directive_Post_Status_InvName, Directive_Post_Id_Nop #endif }, { Directive_Post_Status_InvAddr, Directive_Post_Id_NullPtr }, { Directive_Post_Status_InvName, Directive_Post_Id_Nop }, { Directive_Post_Status_InvAddr, Directive_Post_Id_NullPtr }, { Directive_Post_Status_Ok, Directive_Post_Id_LocalTask }, { Directive_Post_Status_InvAddr, Directive_Post_Id_NullPtr }, { #if defined(RTEMS_MULTIPROCESSING) Directive_Post_Status_Ok, Directive_Post_Id_RemoteTask #else Directive_Post_Status_InvName, Directive_Post_Id_Nop #endif }, { Directive_Post_Status_InvAddr, Directive_Post_Id_NullPtr }, { Directive_Post_Status_Ok, Directive_Post_Id_LocalTask } }; static const struct { uint8_t Skip : 1; uint8_t Pre_Name_NA : 1; uint8_t Pre_Node_NA : 1; uint8_t Pre_Id_NA : 1; } Directive_TransitionInfo[] = { { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { #if defined(RTEMS_MULTIPROCESSING) 0, 0, 0, 0 #else 0, 0, 0, 0 #endif }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { #if defined(RTEMS_MULTIPROCESSING) 0, 0, 0, 0 #else 0, 0, 0, 0 #endif }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } }; static void Directive_Action( Directive_Context *ctx ) { ctx->status = rtems_task_ident( ctx->name, ctx->node, ctx->id ); } /** * @fn void T_case_body_Directive( void ) */ T_TEST_CASE_FIXTURE( Directive, &Directive_Fixture ) { Directive_Context *ctx; size_t index; ctx = T_fixture_context(); ctx->in_action_loop = true; index = 0; for ( ctx->pcs[ 0 ] = Directive_Pre_Name_Invalid; ctx->pcs[ 0 ] < Directive_Pre_Name_NA; ++ctx->pcs[ 0 ] ) { if ( Directive_TransitionInfo[ index ].Pre_Name_NA ) { ctx->pcs[ 0 ] = Directive_Pre_Name_NA; index += ( Directive_Pre_Name_NA - 1 ) * Directive_Pre_Node_NA * Directive_Pre_Id_NA; } for ( ctx->pcs[ 1 ] = Directive_Pre_Node_Local; ctx->pcs[ 1 ] < Directive_Pre_Node_NA; ++ctx->pcs[ 1 ] ) { if ( Directive_TransitionInfo[ index ].Pre_Node_NA ) { ctx->pcs[ 1 ] = Directive_Pre_Node_NA; index += ( Directive_Pre_Node_NA - 1 ) * Directive_Pre_Id_NA; } for ( ctx->pcs[ 2 ] = Directive_Pre_Id_NullPtr; ctx->pcs[ 2 ] < Directive_Pre_Id_NA; ++ctx->pcs[ 2 ] ) { if ( Directive_TransitionInfo[ index ].Pre_Id_NA ) { ctx->pcs[ 2 ] = Directive_Pre_Id_NA; index += ( Directive_Pre_Id_NA - 1 ); } if ( Directive_TransitionInfo[ index ].Skip ) { ++index; continue; } Directive_Pre_Name_Prepare( ctx, ctx->pcs[ 0 ] ); Directive_Pre_Node_Prepare( ctx, ctx->pcs[ 1 ] ); Directive_Pre_Id_Prepare( ctx, ctx->pcs[ 2 ] ); Directive_Action( ctx ); Directive_Post_Status_Check( ctx, Directive_TransitionMap[ index ][ 0 ] ); Directive_Post_Id_Check( ctx, Directive_TransitionMap[ index ][ 1 ] ); ++index; } } } } /** @} */ /** * @defgroup RTEMSTestCaseTc spec:/tc * * @ingroup RTEMSTestSuiteTs * * @brief Test case brief description. * * Test case description. * * This test case performs the following actions: * * - Test case action 0 description. * * - Test case action 0 check 0 description. * * - Test case action 0 check 1 description. * * - Test case action 1 description. * * - Test case action 1 check 0 description. * * - Test case action 1 check 1 description. * * @{ */ /* Test case support code */ /** * @fn void T_case_body_Tc( void ) */ T_TEST_CASE( Tc ) { /* Test case prologue code */ T_plan(125); /* Test case action 0 code */ /* Test case action 0 check 0 code: Accounts for 123 test plan steps */ /* Test case action 0 check 1 code; step 123 */ /* Test case action 1 code */ /* Test case action 1 check 0 code; step 124 */ /* Test case action 1 check 1 code */ /* Test case epilogue code */ } /** @} */ /** * @defgroup RTEMSTestCaseTc2 spec:/tc2 * * @ingroup RTEMSTestSuiteTs * * @brief Test case 2 brief description. * * Test case 2 description. * * This test case performs the following actions: * * - Test case 2 action 0 description. * * - Test case 2 action 0 check 0 description. * * - Test case 2 action 0 check 1 description. * * - Test case 2 action 1 description. * * @{ */ /** * @fn void T_case_body_Tc2( void ) */ T_TEST_CASE_FIXTURE( Tc2, &test_case_2_fixture ) { /* Test case 2 action 0 code */ /* Test case 2 action 0 check 0 code */ /* Test case 2 action 0 check 1 code */ /* Test case 2 action 1 code */ } /** @} */ """ assert content == src.read() with open(os.path.join(base_directory, "tc34.c"), "r") as src: content = """/* SPDX-License-Identifier: BSD-2-Clause */ /** * @file * * @ingroup RTEMSTestCaseTc3 * @ingroup RTEMSTestCaseTc4 * @ingroup RTEMSTestCaseTc5 * @ingroup RTEMSTestCaseTc6 */ /* * Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de) * * 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. */ /* * This file was automatically generated. Do not edit it manually. * Please have a look at * * https://docs.rtems.org/branches/master/eng/req/howto.html * * for information how to maintain and re-generate this file. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "z.h" #include /** * @defgroup RTEMSTestCaseTc3 spec:/tc3 * * @ingroup RTEMSTestSuiteTs * * @brief Test case 3 brief description. * * Test case 3 description. * * This test case performs the following actions: * * - Test case 3 action 0 description. * * - Test case 3 action 0 check 0 description. * * @{ */ /** * @fn void T_case_body_Tc3( void ) */ T_TEST_CASE( Tc3 ) { T_plan(1); /* Test case 3 action 0 code */ /* Test case 3 action 0 check 0 code; step 0 */ } /** @} */ /** * @defgroup RTEMSTestCaseTc4 spec:/tc4 * * @ingroup RTEMSTestSuiteTs * * @brief Test case 4 brief description. * * Test case 4 description. * * @{ */ /** * @fn void T_case_body_Tc4( void ) */ T_TEST_CASE( Tc4 ) { /* Test case 4 epilogue code */ } /** @} */ /** * @defgroup RTEMSTestCaseTc5 spec:/tc5 * * @ingroup RTEMSTestSuiteTs * * @brief Test case 5 brief description. * * Test case 5 description. * * This test case performs the following actions: * * - Test case action 0 description. * * - Test case action 0 check 0 description. * * - Test case action 0 check 1 description. * * - Test case action 1 description. * * - Test case action 1 check 0 description. * * - Test case action 1 check 1 description. * * @{ */ static void Tc5_Wrap( int *a, int b, int *c ) { T_plan(2); /* Test case action 0 code */ /* Test case action 0 check 0 code */ /* Test case action 0 check 1 code; step 0 */ /* Test case action 1 code */ /* Test case action 1 check 0 code; step 1 */ /* Test case action 1 check 1 code */ /* Test case 5 epilogue code */ } static T_fixture_node Tc5_Node; void Tc5_Run( int *a, int b, int *c ) { T_push_fixture( &Tc5_Node, &T_empty_fixture ); Tc5_Wrap( a, b, c ); T_pop_fixture(); } /** @} */ /** * @defgroup RTEMSTestCaseTc6 spec:/tc6 * * @ingroup RTEMSTestSuiteTs * * @{ */ void Tc6_Run( void ) { } /** @} */ """ assert content == src.read() with open(os.path.join(base_directory, "tc5.h"), "r") as src: content = """/* SPDX-License-Identifier: BSD-2-Clause */ /** * @file * * @ingroup RTEMSTestCaseTc5 */ /* * Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de) * * 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. */ /* * This file was automatically generated. Do not edit it manually. * Please have a look at * * https://docs.rtems.org/branches/master/eng/req/howto.html * * for information how to maintain and re-generate this file. */ #ifndef _TC5_H #define _TC5_H #include #include "e.h" #ifdef __cplusplus extern "C" { #endif /** * @addtogroup RTEMSTestCaseTc5 * * @{ */ /* Header code for Tc5_Run() */ /** * @brief Runs the parameterized test case. * * @param[in] a Parameter A description. * * @param b Parameter B description. * * @param[out] c Parameter C description. */ void Tc5_Run( int *a, int b, int *c ); /** @} */ #ifdef __cplusplus } #endif #endif /* _TC5_H */ """ assert content == src.read() with open(os.path.join(base_directory, "tc6.h"), "r") as src: content = """/* SPDX-License-Identifier: BSD-2-Clause */ /** * @file * * @ingroup RTEMSTestCaseTc6 */ /* * Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de) * * 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. */ /* * This file was automatically generated. Do not edit it manually. * Please have a look at * * https://docs.rtems.org/branches/master/eng/req/howto.html * * for information how to maintain and re-generate this file. */ #ifndef _TC6_H #define _TC6_H #ifdef __cplusplus extern "C" { #endif /** * @addtogroup RTEMSTestCaseTc6 * * @{ */ /** * @brief Runs the parameterized test case. */ void Tc6_Run( void ); /** @} */ #ifdef __cplusplus } #endif #endif /* _TC6_H */ """ assert content == src.read() with open(os.path.join(base_directory, "action2.h"), "r") as src: content = """/* SPDX-License-Identifier: BSD-2-Clause */ /** * @file * * @ingroup RTEMSTestCaseAction2 */ /* * Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de) * * 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. */ /* * This file was automatically generated. Do not edit it manually. * Please have a look at * * https://docs.rtems.org/branches/master/eng/req/howto.html * * for information how to maintain and re-generate this file. */ #ifndef _ACTION2_H #define _ACTION2_H #include #include "e.h" #ifdef __cplusplus extern "C" { #endif /** * @addtogroup RTEMSTestCaseAction2 * * @{ */ typedef enum { Action2_Pre_A_X, Action2_Pre_A_Y, Action2_Pre_A_NA } Action2_Pre_A; typedef enum { Action2_Pre_B_X, Action2_Pre_B_Y, Action2_Pre_B_Z, Action2_Pre_B_NA } Action2_Pre_B; typedef enum { Action2_Post_A_X, Action2_Post_A_Y, Action2_Post_A_NA } Action2_Post_A; typedef enum { Action2_Post_B_X, Action2_Post_B_Y, Action2_Post_B_NA } Action2_Post_B; /* Header code for Action 2 with Action2_Run() */ /** * @brief Runs the parameterized test case. * * @param[in] a Parameter A description. * * @param b Parameter B description. * * @param[out] c Parameter C description. */ void Action2_Run( int *a, int b, int *c ); /** @} */ #ifdef __cplusplus } #endif #endif /* _ACTION2_H */ """ assert content == src.read() with open(os.path.join(base_directory, "action2.c"), "r") as src: content = """/* SPDX-License-Identifier: BSD-2-Clause */ /** * @file * * @ingroup RTEMSTestCaseAction2 */ /* * Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de) * * 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. */ /* * This file was automatically generated. Do not edit it manually. * Please have a look at * * https://docs.rtems.org/branches/master/eng/req/howto.html * * for information how to maintain and re-generate this file. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "b.h" #include /** * @defgroup RTEMSTestCaseAction2 spec:/action2 * * @ingroup RTEMSTestSuiteTs * * @brief Test brief. * * Test description. * * @{ */ /* Context support code */ /** * @brief Test context for spec:/action2 test case. */ typedef struct { /** * @brief Context member brief. * * Context member description. */ int member; /** * @brief This member contains a copy of the corresponding Action2_Run() * parameter. */ int *a; /** * @brief This member contains a copy of the corresponding Action2_Run() * parameter. */ int b; /** * @brief This member contains a copy of the corresponding Action2_Run() * parameter. */ int *c; /** * @brief This member defines the pre-condition states for the next action. */ size_t pcs[ 2 ]; /** * @brief This member indicates if the test action loop is currently * executed. */ bool in_action_loop; } Action2_Context; static Action2_Context Action2_Instance; static const char * const Action2_PreDesc_A[] = { "X", "Y", "NA" }; static const char * const Action2_PreDesc_B[] = { "X", "Y", "Z", "NA" }; static const char * const * const Action2_PreDesc[] = { Action2_PreDesc_A, Action2_PreDesc_B, NULL }; /* Support code */ static void Action2_Pre_A_Prepare( Action2_Context *ctx, Action2_Pre_A state ) { /* Pre A prologue. */ switch ( state ) { case Action2_Pre_A_X: { /* Pre A X */ break; } case Action2_Pre_A_Y: { /* Pre A Y */ break; } case Action2_Pre_A_NA: break; } /* Pre A epilogue. */ } static void Action2_Pre_B_Prepare( Action2_Context *ctx, Action2_Pre_B state ) { /* Pre B prologue. */ switch ( state ) { case Action2_Pre_B_X: { /* Pre B X */ break; } case Action2_Pre_B_Y: { /* Pre B Y */ break; } case Action2_Pre_B_Z: { /* Pre B Z */ break; } case Action2_Pre_B_NA: break; } /* Pre B epilogue. */ } static void Action2_Post_A_Check( Action2_Context *ctx, Action2_Post_A state ) { /* Post A prologue. */ switch ( state ) { case Action2_Post_A_X: { /* Post A X */ break; } case Action2_Post_A_Y: { /* Post A Y */ break; } case Action2_Post_A_NA: break; } /* Post A epilogue. */ } static void Action2_Post_B_Check( Action2_Context *ctx, Action2_Post_B state ) { /* Post B prologue. */ switch ( state ) { case Action2_Post_B_X: { /* Post B X */ break; } case Action2_Post_B_Y: { /* Post B Y */ break; } case Action2_Post_B_NA: break; } /* Post B epilogue. */ } /** * @brief Setup brief. * * Setup description. */ static void Action2_Setup( Action2_Context *ctx ) { /* Setup code */ } static void Action2_Setup_Wrap( void *arg ) { Action2_Context *ctx; ctx = arg; ctx->in_action_loop = false; Action2_Setup( ctx ); } /** * @brief Teardown brief. * * Teardown description. */ static void Action2_Teardown( Action2_Context *ctx ) { /* Teardown code */ } static void Action2_Teardown_Wrap( void *arg ) { Action2_Context *ctx; ctx = arg; ctx->in_action_loop = false; Action2_Teardown( ctx ); } static size_t Action2_Scope( void *arg, char *buf, size_t n ) { Action2_Context *ctx; ctx = arg; if ( ctx->in_action_loop ) { return T_get_scope( Action2_PreDesc, buf, n, ctx->pcs ); } return 0; } static T_fixture Action2_Fixture = { .setup = Action2_Setup_Wrap, .stop = NULL, .teardown = Action2_Teardown_Wrap, .scope = Action2_Scope, .initial_context = &Action2_Instance }; static const uint8_t Action2_TransitionMap[][ 2 ] = { { Action2_Post_A_X, Action2_Post_B_Y }, { Action2_Post_A_Y, Action2_Post_B_X }, { Action2_Post_A_X, Action2_Post_B_X }, { Action2_Post_A_X, Action2_Post_B_Y }, { Action2_Post_A_Y, Action2_Post_B_X }, { Action2_Post_A_NA, Action2_Post_B_NA } }; static const struct { uint8_t Skip : 1; uint8_t Pre_A_NA : 1; uint8_t Pre_B_NA : 1; } Action2_TransitionInfo[] = { { 0, 0, 0 }, { 0, 1, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 1, 0 }, { 1, 0, 0 } }; static void Action2_Prepare( Action2_Context *ctx ) { /* Prepare */ } static void Action2_Action( Action2_Context *ctx ) { /* Action */ } static void Action2_Cleanup( Action2_Context *ctx ) { /* Cleanup */ } static T_fixture_node Action2_Node; void Action2_Run( int *a, int b, int *c ) { Action2_Context *ctx; size_t index; ctx = T_push_fixture( &Action2_Node, &Action2_Fixture ); ctx->a = a; ctx->b = b; ctx->c = c; ctx->in_action_loop = true; index = 0; for ( ctx->pcs[ 0 ] = Action2_Pre_A_X; ctx->pcs[ 0 ] < Action2_Pre_A_NA; ++ctx->pcs[ 0 ] ) { if ( Action2_TransitionInfo[ index ].Pre_A_NA ) { ctx->pcs[ 0 ] = Action2_Pre_A_NA; index += ( Action2_Pre_A_NA - 1 ) * Action2_Pre_B_NA; } for ( ctx->pcs[ 1 ] = Action2_Pre_B_X; ctx->pcs[ 1 ] < Action2_Pre_B_NA; ++ctx->pcs[ 1 ] ) { if ( Action2_TransitionInfo[ index ].Pre_B_NA ) { ctx->pcs[ 1 ] = Action2_Pre_B_NA; index += ( Action2_Pre_B_NA - 1 ); } if ( Action2_TransitionInfo[ index ].Skip ) { ++index; continue; } Action2_Prepare( ctx ); Action2_Pre_A_Prepare( ctx, ctx->pcs[ 0 ] ); Action2_Pre_B_Prepare( ctx, ctx->pcs[ 1 ] ); Action2_Action( ctx ); Action2_Post_A_Check( ctx, Action2_TransitionMap[ index ][ 0 ] ); Action2_Post_B_Check( ctx, Action2_TransitionMap[ index ][ 1 ] ); Action2_Cleanup( ctx ); ++index; } } T_pop_fixture(); } /** @} */ """ assert content == src.read()