foxBMS - Unit Tests  1.6.0
The foxBMS Unit Tests API Documentation
test_debug_default.c
Go to the documentation of this file.
1 /**
2  *
3  * @copyright © 2010 - 2023, Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V.
4  * All rights reserved.
5  *
6  * SPDX-License-Identifier: BSD-3-Clause
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions are met:
10  *
11  * 1. Redistributions of source code must retain the above copyright notice, this
12  * list of conditions and the following disclaimer.
13  *
14  * 2. Redistributions in binary form must reproduce the above copyright notice,
15  * this list of conditions and the following disclaimer in the documentation
16  * and/or other materials provided with the distribution.
17  *
18  * 3. Neither the name of the copyright holder nor the names of its
19  * contributors may be used to endorse or promote products derived from
20  * this software without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
25  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
26  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
28  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  *
33  * We kindly request you to use one or more of the following phrases to refer to
34  * foxBMS in your hardware, software, documentation or advertising materials:
35  *
36  * - ″This product uses parts of foxBMS®″
37  * - ″This product includes parts of foxBMS®″
38  * - ″This product is derived from foxBMS®″
39  *
40  */
41 
42 /**
43  * @file test_debug_default.c
44  * @author foxBMS Team
45  * @date 2020-09-17 (date of creation)
46  * @updated 2023-10-12 (date of last update)
47  * @version v1.6.0
48  * @ingroup UNIT_TEST_IMPLEMENTATION
49  * @prefix TEST
50  *
51  * @brief Test of the afe.c module
52  *
53  */
54 
55 /*========== Includes =======================================================*/
56 
57 #include "unity.h"
58 #include "Mockdatabase.h"
59 #include "Mockos.h"
60 
61 #include "battery_cell_cfg.h"
62 
63 #include "afe.h"
64 #include "debug_default.h"
65 
66 #include <stdbool.h>
67 #include <stdint.h>
68 
69 /*========== Unit Testing Framework Directives ==============================*/
70 TEST_SOURCE_FILE("debug_default.c")
71 
72 TEST_INCLUDE_PATH("../../src/app/driver/afe/api")
73 TEST_INCLUDE_PATH("../../src/app/driver/afe/debug/default")
74 TEST_INCLUDE_PATH("../../src/app/engine/diag")
75 
76 /*========== Definitions and Implementations for Unit Test ==================*/
77 #define FAKE_CELL_VOLTAGE_mV (BC_VOLTAGE_NOMINAL_mV)
78 
79 #define FAKE_CELL_TEMPERATURE_ddegC ((BC_TEMPERATURE_MAX_CHARGE_MOL_ddegC + BC_TEMPERATURE_MIN_CHARGE_MOL_ddegC) / 2u)
80 
81 static void TEST_assertEqualFakeState(FAKE_STATE_s *pExpected, FAKE_STATE_s *pActual);
82 
83 /** assert that the values and values behind the pointers in #FAKE_STATE_s are the same */
84 static void TEST_assertEqualFakeState(FAKE_STATE_s *pExpected, FAKE_STATE_s *pActual) {
85  TEST_ASSERT_EQUAL_UINT16_MESSAGE(
86  88,
87  sizeof(*pExpected),
88  "The data structure changed, update tests: "
89  "1: Add tests for the added/changed data structure. "
90  "2: Update the data structure length.");
91 
92  /* compare memory contents of database entries */
93  TEST_ASSERT_EQUAL_MEMORY(
94  pExpected->data.cellVoltage, pActual->data.cellVoltage, sizeof(*pExpected->data.cellVoltage));
95  TEST_ASSERT_EQUAL_MEMORY(
96  pExpected->data.cellTemperature, pActual->data.cellTemperature, sizeof(*pExpected->data.cellTemperature));
97  TEST_ASSERT_EQUAL_MEMORY(
98  pExpected->data.balancingFeedback, pActual->data.balancingFeedback, sizeof(*pExpected->data.balancingFeedback));
99  TEST_ASSERT_EQUAL_MEMORY(
100  pExpected->data.balancingControl, pActual->data.balancingControl, sizeof(*pExpected->data.balancingControl));
101  TEST_ASSERT_EQUAL_MEMORY(
102  pExpected->data.slaveControl, pActual->data.slaveControl, sizeof(*pExpected->data.slaveControl));
103  TEST_ASSERT_EQUAL_MEMORY(
104  pExpected->data.allGpioVoltages, pActual->data.allGpioVoltages, sizeof(*pExpected->data.allGpioVoltages));
105  TEST_ASSERT_EQUAL_MEMORY(pExpected->data.openWire, pActual->data.openWire, sizeof(*pExpected->data.openWire));
106 
107  TEST_ASSERT_EQUAL_UINT16(pExpected->timer, pActual->timer);
108  TEST_ASSERT_EQUAL_UINT8(pExpected->triggerEntry, pActual->triggerEntry);
109  TEST_ASSERT_EQUAL_UINT8(pExpected->currentState, pActual->currentState);
110  TEST_ASSERT_EQUAL_UINT8(pExpected->previousState, pActual->previousState);
111  TEST_ASSERT_EQUAL_UINT8(pExpected->nextSubstate, pActual->nextSubstate);
112  TEST_ASSERT_EQUAL_UINT8(pExpected->currentSubstate, pActual->currentSubstate);
113  TEST_ASSERT_EQUAL_UINT8(pExpected->previousSubstate, pActual->previousSubstate);
114  TEST_ASSERT_EQUAL_UINT8(pExpected->firstMeasurementFinished, pActual->firstMeasurementFinished);
115 }
116 
117 /*========== Setup and Teardown =============================================*/
118 void setUp(void) {
119 }
120 
121 void tearDown(void) {
122 }
123 
124 /*========== Test Cases =====================================================*/
125 
127  OS_EnterTaskCritical_Expect();
128  OS_ExitTaskCritical_Expect();
129 
130  FAKE_STATE_s state = {0};
131  bool reentrance = 0;
132  reentrance = TEST_FAKE_CheckMultipleCalls(&state);
133  TEST_ASSERT_EQUAL_UINT8(false, reentrance);
134 
135  OS_EnterTaskCritical_Expect();
136  OS_ExitTaskCritical_Expect();
137  state.triggerEntry = 1;
138  reentrance = TEST_FAKE_CheckMultipleCalls(&state);
139  TEST_ASSERT_EQUAL_UINT8(true, reentrance);
140 }
141 
143  OS_EnterTaskCritical_Expect();
144  OS_ExitTaskCritical_Expect();
145  DATA_Write2DataBlocks_IgnoreAndReturn(STD_OK);
146  DATA_Write4DataBlocks_IgnoreAndReturn(STD_OK);
147 
148  static DATA_BLOCK_CELL_VOLTAGE_s test_fake_cellVoltage = {.header.uniqueId = DATA_BLOCK_ID_CELL_VOLTAGE_BASE};
149  static DATA_BLOCK_CELL_TEMPERATURE_s test_fake_cellTemperature = {
151  static DATA_BLOCK_BALANCING_FEEDBACK_s test_fake_balancingFeedback = {
153  static DATA_BLOCK_BALANCING_CONTROL_s test_fake_balancingControl = {
155  static DATA_BLOCK_SLAVE_CONTROL_s test_fake_slaveControl = {.header.uniqueId = DATA_BLOCK_ID_SLAVE_CONTROL};
156  static DATA_BLOCK_ALL_GPIO_VOLTAGES_s test_fake_allGpioVoltage = {
158  static DATA_BLOCK_OPEN_WIRE_s test_fake_openWire = {.header.uniqueId = DATA_BLOCK_ID_OPEN_WIRE_BASE};
159  FAKE_STATE_s test_fake_state = {
160  .timer = 0,
161  .firstMeasurementFinished = false,
162  .triggerEntry = 0,
163  .nextState = FAKE_FSM_STATE_HAS_NEVER_RUN,
164  .currentState = FAKE_FSM_STATE_HAS_NEVER_RUN,
165  .previousState = FAKE_FSM_STATE_HAS_NEVER_RUN,
166  .nextSubstate = FAKE_FSM_SUBSTATE_DUMMY,
167  .currentSubstate = FAKE_FSM_SUBSTATE_DUMMY,
168  .previousSubstate = FAKE_FSM_SUBSTATE_DUMMY,
169  .data.allGpioVoltages = &test_fake_allGpioVoltage,
170  .data.balancingControl = &test_fake_balancingControl,
171  .data.balancingFeedback = &test_fake_balancingFeedback,
172  .data.cellTemperature = &test_fake_cellTemperature,
173  .data.cellVoltage = &test_fake_cellVoltage,
174  .data.openWire = &test_fake_openWire,
175  .data.slaveControl = &test_fake_slaveControl,
176  };
177 
178  static DATA_BLOCK_CELL_VOLTAGE_s test_fake_cellVoltageCompare = {
180  static DATA_BLOCK_CELL_TEMPERATURE_s test_fake_cellTemperatureCompare = {
182  static DATA_BLOCK_BALANCING_FEEDBACK_s test_fake_balancingFeedbackCompare = {
184  static DATA_BLOCK_BALANCING_CONTROL_s test_fake_balancingControlCompare = {
186  static DATA_BLOCK_SLAVE_CONTROL_s test_fake_slaveControlCompare = {.header.uniqueId = DATA_BLOCK_ID_SLAVE_CONTROL};
187  static DATA_BLOCK_ALL_GPIO_VOLTAGES_s test_fake_allGpioVoltageCompare = {
189  static DATA_BLOCK_OPEN_WIRE_s test_fake_openWireCompare = {.header.uniqueId = DATA_BLOCK_ID_OPEN_WIRE_BASE};
190 
191  FAKE_STATE_s test_fake_stateCompare = {
192  .timer = 0,
193  .firstMeasurementFinished = true,
194  .triggerEntry = 0,
195  .nextState = FAKE_FSM_STATE_HAS_NEVER_RUN,
196  .currentState = FAKE_FSM_STATE_HAS_NEVER_RUN,
197  .previousState = FAKE_FSM_STATE_HAS_NEVER_RUN,
198  .nextSubstate = FAKE_FSM_SUBSTATE_DUMMY,
199  .currentSubstate = FAKE_FSM_SUBSTATE_DUMMY,
200  .previousSubstate = FAKE_FSM_SUBSTATE_DUMMY,
201  .data.allGpioVoltages = &test_fake_allGpioVoltageCompare,
202  .data.balancingControl = &test_fake_balancingControlCompare,
203  .data.balancingFeedback = &test_fake_balancingFeedbackCompare,
204  .data.cellTemperature = &test_fake_cellTemperatureCompare,
205  .data.cellVoltage = &test_fake_cellVoltageCompare,
206  .data.openWire = &test_fake_openWireCompare,
207  .data.slaveControl = &test_fake_slaveControlCompare,
208  };
209 
210  for (uint8_t s = 0u; s < BS_NR_OF_STRINGS; s++) {
211  for (uint8_t m = 0u; m < BS_NR_OF_MODULES_PER_STRING; m++) {
212  for (uint8_t cb = 0u; cb < BS_NR_OF_CELL_BLOCKS_PER_MODULE; cb++) {
213  test_fake_stateCompare.data.cellVoltage->cellVoltage_mV[s][m][cb] = FAKE_CELL_VOLTAGE_mV;
214  }
215  }
216  test_fake_stateCompare.data.cellVoltage->stringVoltage_mV[s] = FAKE_CELL_VOLTAGE_mV *
218 
219  for (uint8_t m = 0u; m < BS_NR_OF_MODULES_PER_STRING; m++) {
220  for (uint8_t ts = 0; ts < BS_NR_OF_TEMP_SENSORS_PER_MODULE; ts++) {
221  test_fake_stateCompare.data.cellTemperature->cellTemperature_ddegC[s][m][ts] =
223  }
224  }
225 
226  test_fake_stateCompare.data.slaveControl->eepromReadAddressLastUsed = 0xFFFFFFFF;
227  test_fake_stateCompare.data.slaveControl->eepromReadAddressToUse = 0xFFFFFFFF;
228  test_fake_stateCompare.data.slaveControl->eepromWriteAddressLastUsed = 0xFFFFFFFF;
229  test_fake_stateCompare.data.slaveControl->eepromWriteAddressToUse = 0xFFFFFFFF;
230  }
231  test_fake_stateCompare.firstMeasurementFinished = true;
232 
233  test_fake_state.firstMeasurementFinished = false;
235 
236  TEST_ASSERT_EQUAL_UINT8(true, test_fake_state.firstMeasurementFinished);
237  TEST_assertEqualFakeState(&test_fake_stateCompare, &test_fake_state);
238 }
239 
241  TEST_ASSERT_EQUAL(STD_OK, FAKE_Initialize());
242 }
243 
245 }
246 
248 }
AFE driver header.
Configuration of the battery cell (e.g., minimum and maximum cell voltage)
#define BS_NR_OF_CELL_BLOCKS_PER_MODULE
number of cells per module
#define BS_NR_OF_STRINGS
Number of parallel strings in the battery pack.
#define BS_NR_OF_TEMP_SENSORS_PER_MODULE
number of temperature sensors per battery module
#define BS_NR_OF_CELL_BLOCKS_PER_STRING
#define BS_NR_OF_MODULES_PER_STRING
number of modules in a string
@ DATA_BLOCK_ID_BALANCING_CONTROL
Definition: database_cfg.h:83
@ DATA_BLOCK_ID_CELL_TEMPERATURE_BASE
Definition: database_cfg.h:87
@ DATA_BLOCK_ID_OPEN_WIRE_BASE
Definition: database_cfg.h:103
@ DATA_BLOCK_ID_SLAVE_CONTROL
Definition: database_cfg.h:107
@ DATA_BLOCK_ID_CELL_VOLTAGE_BASE
Definition: database_cfg.h:90
@ DATA_BLOCK_ID_ALL_GPIO_VOLTAGES_BASE
Definition: database_cfg.h:81
@ DATA_BLOCK_ID_BALANCING_FEEDBACK_BASE
Definition: database_cfg.h:84
STD_RETURN_TYPE_e FAKE_Initialize(void)
initialize driver
void TEST_FAKE_SetFirstMeasurementCycleFinished(FAKE_STATE_s *pFakeState)
bool TEST_FAKE_CheckMultipleCalls(FAKE_STATE_s *pFakeState)
Header for the driver of the fake AFE driver.
@ FAKE_FSM_SUBSTATE_DUMMY
Definition: debug_default.h:81
@ FAKE_FSM_STATE_HAS_NEVER_RUN
Definition: debug_default.h:72
static DIAG_DIAGNOSIS_STATE_s diag
Definition: diag.c:71
@ STD_OK
Definition: fstd_types.h:83
DATA_BLOCK_HEADER_s header
Definition: database_cfg.h:323
DATA_BLOCK_HEADER_s header
Definition: database_cfg.h:255
DATA_BLOCK_HEADER_s header
Definition: database_cfg.h:290
int16_t cellTemperature_ddegC[BS_NR_OF_STRINGS][BS_NR_OF_MODULES_PER_STRING][BS_NR_OF_TEMP_SENSORS_PER_MODULE]
Definition: database_cfg.h:156
DATA_BLOCK_HEADER_s header
Definition: database_cfg.h:153
int16_t cellVoltage_mV[BS_NR_OF_STRINGS][BS_NR_OF_MODULES_PER_STRING][BS_NR_OF_CELL_BLOCKS_PER_MODULE]
Definition: database_cfg.h:139
DATA_BLOCK_HEADER_s header
Definition: database_cfg.h:135
int32_t stringVoltage_mV[BS_NR_OF_STRINGS]
Definition: database_cfg.h:137
DATA_BLOCK_ID_e uniqueId
Definition: database_cfg.h:125
DATA_BLOCK_HEADER_s header
Definition: database_cfg.h:310
DATA_BLOCK_HEADER_s header
Definition: database_cfg.h:271
DATA_BLOCK_BALANCING_CONTROL_s * balancingControl
Definition: debug_default.h:95
DATA_BLOCK_SLAVE_CONTROL_s * slaveControl
Definition: debug_default.h:96
DATA_BLOCK_OPEN_WIRE_s * openWire
Definition: debug_default.h:98
DATA_BLOCK_CELL_VOLTAGE_s * cellVoltage
Definition: debug_default.h:92
DATA_BLOCK_BALANCING_FEEDBACK_s * balancingFeedback
Definition: debug_default.h:94
DATA_BLOCK_CELL_TEMPERATURE_s * cellTemperature
Definition: debug_default.h:93
DATA_BLOCK_ALL_GPIO_VOLTAGES_s * allGpioVoltages
Definition: debug_default.h:97
FAKE_FSM_SUBSTATES_e nextSubstate
FAKE_FSM_STATES_e currentState
FAKE_FSM_SUBSTATES_e previousSubstate
uint16_t timer
FAKE_FSM_STATES_e previousState
FAKE_DATABASE_ENTRIES_s data
uint8_t triggerEntry
FAKE_FSM_SUBSTATES_e currentSubstate
bool firstMeasurementFinished
void testFAKE_Initialize(void)
void testTEST_FAKE_CheckMultipleCalls(void)
#define FAKE_CELL_TEMPERATURE_ddegC
#define FAKE_CELL_VOLTAGE_mV
static void TEST_assertEqualFakeState(FAKE_STATE_s *pExpected, FAKE_STATE_s *pActual)
void testFAKE_SetFirstMeasurementCycleFinished(void)
void testFAKE_TriggerAfe(void)
void setUp(void)
void tearDown(void)
void testFAKE_IsFirstMeasurementCycleFinished(void)