foxBMS - Unit Tests  1.5.1
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-02-23 (date of last update)
47  * @version v1.5.1
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 #include "debug_default_cfg.h"
63 
64 #include "afe.h"
65 #include "debug_default.h"
66 
67 #include <stdbool.h>
68 #include <stdint.h>
69 
70 /* it's important to mention the implementation in debug_default.c
71 here in order to test the correct implementation */
72 TEST_FILE("debug_default.c")
73 
74 /*========== Definitions and Implementations for Unit Test ==================*/
75 #define FAKE_CELL_VOLTAGE_mV (BC_VOLTAGE_NOMINAL_mV)
76 
77 #define FAKE_CELL_TEMPERATURE_ddegC ((BC_TEMPERATURE_MAX_CHARGE_MOL_ddegC + BC_TEMPERATURE_MIN_CHARGE_MOL_ddegC) / 2u)
78 
79 static void TEST_assertEqualFakeState(FAKE_STATE_s *pExpected, FAKE_STATE_s *pActual);
80 
81 /** assert that the values and values behind the pointers in #FAKE_STATE_s are the same */
82 static void TEST_assertEqualFakeState(FAKE_STATE_s *pExpected, FAKE_STATE_s *pActual) {
83  TEST_ASSERT_EQUAL_UINT16_MESSAGE(
84  88,
85  sizeof(*pExpected),
86  "The data structure changed, update tests: "
87  "1: Add tests for the added/changed data structure. "
88  "2: Update the data structure length.");
89 
90  /* compare memory contents of database entries */
91  TEST_ASSERT_EQUAL_MEMORY(
92  pExpected->data.cellVoltage, pActual->data.cellVoltage, sizeof(*pExpected->data.cellVoltage));
93  TEST_ASSERT_EQUAL_MEMORY(
94  pExpected->data.cellTemperature, pActual->data.cellTemperature, sizeof(*pExpected->data.cellTemperature));
95  TEST_ASSERT_EQUAL_MEMORY(
96  pExpected->data.balancingFeedback, pActual->data.balancingFeedback, sizeof(*pExpected->data.balancingFeedback));
97  TEST_ASSERT_EQUAL_MEMORY(
98  pExpected->data.balancingControl, pActual->data.balancingControl, sizeof(*pExpected->data.balancingControl));
99  TEST_ASSERT_EQUAL_MEMORY(
100  pExpected->data.slaveControl, pActual->data.slaveControl, sizeof(*pExpected->data.slaveControl));
101  TEST_ASSERT_EQUAL_MEMORY(
102  pExpected->data.allGpioVoltages, pActual->data.allGpioVoltages, sizeof(*pExpected->data.allGpioVoltages));
103  TEST_ASSERT_EQUAL_MEMORY(pExpected->data.openWire, pActual->data.openWire, sizeof(*pExpected->data.openWire));
104 
105  TEST_ASSERT_EQUAL_UINT16(pExpected->timer, pActual->timer);
106  TEST_ASSERT_EQUAL_UINT8(pExpected->triggerEntry, pActual->triggerEntry);
107  TEST_ASSERT_EQUAL_UINT8(pExpected->currentState, pActual->currentState);
108  TEST_ASSERT_EQUAL_UINT8(pExpected->previousState, pActual->previousState);
109  TEST_ASSERT_EQUAL_UINT8(pExpected->nextSubstate, pActual->nextSubstate);
110  TEST_ASSERT_EQUAL_UINT8(pExpected->currentSubstate, pActual->currentSubstate);
111  TEST_ASSERT_EQUAL_UINT8(pExpected->previousSubstate, pActual->previousSubstate);
112  TEST_ASSERT_EQUAL_UINT8(pExpected->firstMeasurementFinished, pActual->firstMeasurementFinished);
113 }
114 
115 /*========== Setup and Teardown =============================================*/
116 void setUp(void) {
117 }
118 
119 void tearDown(void) {
120 }
121 
122 /*========== Test Cases =====================================================*/
123 
125  OS_EnterTaskCritical_Expect();
126  OS_ExitTaskCritical_Expect();
127 
128  FAKE_STATE_s state = {0};
129  bool reentrance = 0;
130  reentrance = TEST_FAKE_CheckMultipleCalls(&state);
131  TEST_ASSERT_EQUAL_UINT8(false, reentrance);
132 
133  OS_EnterTaskCritical_Expect();
134  OS_ExitTaskCritical_Expect();
135  state.triggerEntry = 1;
136  reentrance = TEST_FAKE_CheckMultipleCalls(&state);
137  TEST_ASSERT_EQUAL_UINT8(true, reentrance);
138 }
139 
141  OS_EnterTaskCritical_Expect();
142  OS_ExitTaskCritical_Expect();
143  DATA_Write2DataBlocks_IgnoreAndReturn(STD_OK);
144  DATA_Write4DataBlocks_IgnoreAndReturn(STD_OK);
145 
146  static DATA_BLOCK_CELL_VOLTAGE_s test_fake_cellVoltage = {.header.uniqueId = DATA_BLOCK_ID_CELL_VOLTAGE_BASE};
147  static DATA_BLOCK_CELL_TEMPERATURE_s test_fake_cellTemperature = {
149  static DATA_BLOCK_BALANCING_FEEDBACK_s test_fake_balancingFeedback = {
151  static DATA_BLOCK_BALANCING_CONTROL_s test_fake_balancingControl = {
153  static DATA_BLOCK_SLAVE_CONTROL_s test_fake_slaveControl = {.header.uniqueId = DATA_BLOCK_ID_SLAVE_CONTROL};
154  static DATA_BLOCK_ALL_GPIO_VOLTAGES_s test_fake_allGpioVoltage = {
156  static DATA_BLOCK_OPEN_WIRE_s test_fake_openWire = {.header.uniqueId = DATA_BLOCK_ID_OPEN_WIRE_BASE};
157  FAKE_STATE_s test_fake_state = {
158  .timer = 0,
159  .firstMeasurementFinished = false,
160  .triggerEntry = 0,
161  .nextState = FAKE_FSM_STATE_HAS_NEVER_RUN,
162  .currentState = FAKE_FSM_STATE_HAS_NEVER_RUN,
163  .previousState = FAKE_FSM_STATE_HAS_NEVER_RUN,
164  .nextSubstate = FAKE_FSM_SUBSTATE_DUMMY,
165  .currentSubstate = FAKE_FSM_SUBSTATE_DUMMY,
166  .previousSubstate = FAKE_FSM_SUBSTATE_DUMMY,
167  .data.allGpioVoltages = &test_fake_allGpioVoltage,
168  .data.balancingControl = &test_fake_balancingControl,
169  .data.balancingFeedback = &test_fake_balancingFeedback,
170  .data.cellTemperature = &test_fake_cellTemperature,
171  .data.cellVoltage = &test_fake_cellVoltage,
172  .data.openWire = &test_fake_openWire,
173  .data.slaveControl = &test_fake_slaveControl,
174  };
175 
176  static DATA_BLOCK_CELL_VOLTAGE_s test_fake_cellVoltageCompare = {
178  static DATA_BLOCK_CELL_TEMPERATURE_s test_fake_cellTemperatureCompare = {
180  static DATA_BLOCK_BALANCING_FEEDBACK_s test_fake_balancingFeedbackCompare = {
182  static DATA_BLOCK_BALANCING_CONTROL_s test_fake_balancingControlCompare = {
184  static DATA_BLOCK_SLAVE_CONTROL_s test_fake_slaveControlCompare = {.header.uniqueId = DATA_BLOCK_ID_SLAVE_CONTROL};
185  static DATA_BLOCK_ALL_GPIO_VOLTAGES_s test_fake_allGpioVoltageCompare = {
187  static DATA_BLOCK_OPEN_WIRE_s test_fake_openWireCompare = {.header.uniqueId = DATA_BLOCK_ID_OPEN_WIRE_BASE};
188 
189  FAKE_STATE_s test_fake_stateCompare = {
190  .timer = 0,
191  .firstMeasurementFinished = true,
192  .triggerEntry = 0,
193  .nextState = FAKE_FSM_STATE_HAS_NEVER_RUN,
194  .currentState = FAKE_FSM_STATE_HAS_NEVER_RUN,
195  .previousState = FAKE_FSM_STATE_HAS_NEVER_RUN,
196  .nextSubstate = FAKE_FSM_SUBSTATE_DUMMY,
197  .currentSubstate = FAKE_FSM_SUBSTATE_DUMMY,
198  .previousSubstate = FAKE_FSM_SUBSTATE_DUMMY,
199  .data.allGpioVoltages = &test_fake_allGpioVoltageCompare,
200  .data.balancingControl = &test_fake_balancingControlCompare,
201  .data.balancingFeedback = &test_fake_balancingFeedbackCompare,
202  .data.cellTemperature = &test_fake_cellTemperatureCompare,
203  .data.cellVoltage = &test_fake_cellVoltageCompare,
204  .data.openWire = &test_fake_openWireCompare,
205  .data.slaveControl = &test_fake_slaveControlCompare,
206  };
207 
208  uint16_t i = 0;
209 
210  for (uint8_t s = 0u; s < BS_NR_OF_STRINGS; s++) {
211  for (i = 0; i < BS_NR_OF_CELL_BLOCKS_PER_STRING; i++) {
212  test_fake_stateCompare.data.cellVoltage->cellVoltage_mV[s][i] = FAKE_CELL_VOLTAGE_mV;
213  }
214  test_fake_stateCompare.data.cellVoltage->stringVoltage_mV[s] = FAKE_CELL_VOLTAGE_mV *
216 
217  for (i = 0; i < BS_NR_OF_TEMP_SENSORS_PER_STRING; i++) {
219  }
220 
221  test_fake_stateCompare.data.slaveControl->eepromReadAddressLastUsed = 0xFFFFFFFF;
222  test_fake_stateCompare.data.slaveControl->eepromReadAddressToUse = 0xFFFFFFFF;
223  test_fake_stateCompare.data.slaveControl->eepromWriteAddressLastUsed = 0xFFFFFFFF;
224  test_fake_stateCompare.data.slaveControl->eepromWriteAddressToUse = 0xFFFFFFFF;
225  }
226  test_fake_stateCompare.firstMeasurementFinished = true;
227 
228  test_fake_state.firstMeasurementFinished = false;
230 
231  TEST_ASSERT_EQUAL_UINT8(true, test_fake_state.firstMeasurementFinished);
232  TEST_assertEqualFakeState(&test_fake_stateCompare, &test_fake_state);
233 }
234 
236  TEST_ASSERT_EQUAL(STD_OK, FAKE_Initialize());
237 }
238 
240 }
241 
243 }
AFE driver header.
Configuration of the battery cell (e.g., minimum and maximum cell voltage)
#define BS_NR_OF_STRINGS
Number of parallel strings in the battery pack.
#define BS_NR_OF_CELL_BLOCKS_PER_STRING
#define BS_NR_OF_TEMP_SENSORS_PER_STRING
@ DATA_BLOCK_ID_BALANCING_CONTROL
Definition: database_cfg.h:83
@ DATA_BLOCK_ID_CELL_TEMPERATURE_BASE
Definition: database_cfg.h:101
@ DATA_BLOCK_ID_OPEN_WIRE_BASE
Definition: database_cfg.h:87
@ DATA_BLOCK_ID_SLAVE_CONTROL
Definition: database_cfg.h:84
@ DATA_BLOCK_ID_CELL_VOLTAGE_BASE
Definition: database_cfg.h:100
@ DATA_BLOCK_ID_ALL_GPIO_VOLTAGES_BASE
Definition: database_cfg.h:88
@ DATA_BLOCK_ID_BALANCING_FEEDBACK_BASE
Definition: database_cfg.h:85
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
Header for the configuration for the fake AFE.
@ STD_OK
Definition: fstd_types.h:83
DATA_BLOCK_HEADER_s header
Definition: database_cfg.h:318
DATA_BLOCK_HEADER_s header
Definition: database_cfg.h:250
DATA_BLOCK_HEADER_s header
Definition: database_cfg.h:285
DATA_BLOCK_HEADER_s header
Definition: database_cfg.h:149
int16_t cellTemperature_ddegC[BS_NR_OF_STRINGS][BS_NR_OF_TEMP_SENSORS_PER_STRING]
Definition: database_cfg.h:151
DATA_BLOCK_HEADER_s header
Definition: database_cfg.h:132
int32_t stringVoltage_mV[BS_NR_OF_STRINGS]
Definition: database_cfg.h:134
int16_t cellVoltage_mV[BS_NR_OF_STRINGS][BS_NR_OF_CELL_BLOCKS_PER_STRING]
Definition: database_cfg.h:135
DATA_BLOCK_ID_e uniqueId
Definition: database_cfg.h:122
DATA_BLOCK_HEADER_s header
Definition: database_cfg.h:305
DATA_BLOCK_HEADER_s header
Definition: database_cfg.h:266
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)