GCC Code Coverage Report


Directory: ./
File: unit_tests/tests/actuators/test_etb_integrated.cpp
Date: 2025-10-03 00:57:22
Coverage Exec Excl Total
Lines: 100.0% 116 0 116
Functions: 100.0% 16 0 16
Branches: 46.6% 124 0 266
Decisions: 100.0% 4 - 4

Line Branch Decision Exec Source
1 #include "pch.h"
2 #include "init.h"
3 #include "electronic_throttle_impl.h"
4 #include "live_data.h"
5 #include "live_data_ids.h"
6
7 extern int ebtResetCounter;
8
9 3 static EtbController * initEtbIntegratedTest() {
10 3 etbPidReset(); // ETB controlles are global shared instances :(
11
12 3 engineConfiguration->tps1_1AdcChannel = EFI_ADC_3;
13 3 engineConfiguration->tps1_2AdcChannel = EFI_ADC_3;
14
15 3 engineConfiguration->throttlePedalPositionAdcChannel = EFI_ADC_3;
16 3 engineConfiguration->throttlePedalPositionSecondAdcChannel = EFI_ADC_3;
17
18
19 3 Sensor::setMockValue(SensorType::Tps1, 25.0f, true);
20
21 3 initTps();
22 3 doInitElectronicThrottle(/*isInit*/true);
23
24 3 engine->etbControllers[0]->setIdlePosition(0);
25
26 3 return (EtbController*)engine->etbControllers[0];
27 }
28
29 4 TEST(etb, integrated) {
30
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE); // we have a destructor so cannot move EngineTestHelper into utility method
31
1/1
✓ Branch 1 taken 1 time.
1 etbPidReset();
32
3/8
✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✓ Branch 26 taken 1 time.
✗ Branch 27 not taken.
1 ASSERT_EQ(0, ebtResetCounter);
33
1/1
✓ Branch 1 taken 1 time.
1 EtbController *etb = initEtbIntegratedTest();
34
3/8
✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✓ Branch 26 taken 1 time.
✗ Branch 27 not taken.
1 ASSERT_EQ(1, ebtResetCounter);
35
1/1
✓ Branch 1 taken 1 time.
1 doInitElectronicThrottle(/*isInit*/false);
36
3/8
✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✓ Branch 26 taken 1 time.
✗ Branch 27 not taken.
1 ASSERT_EQ(1, ebtResetCounter);
37
38
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedalPrimary, 40);
39
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedalSecondary, 40);
40
41
1/1
✓ Branch 1 taken 1 time.
1 etb->update();
42
43
3/8
✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✓ Branch 26 taken 1 time.
✗ Branch 27 not taken.
1 ASSERT_EQ(etb->m_adjustedTarget, 40);
44
45
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 10, true);
46
1/1
✓ Branch 1 taken 1 time.
1 etb->update();
47 1 }
48
49 4 TEST(etb, intermittentTps) {
50
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE); // we have a destructor so cannot move EngineTestHelper into utility method
51
1/1
✓ Branch 1 taken 1 time.
1 EtbController *etb = initEtbIntegratedTest();
52
1/1
✓ Branch 1 taken 1 time.
1 warningBuffer_t *recentWarnings = getRecentWarnings();
53 1 recentWarnings->clear();
54
55 // Tell the sensor checker that the ignition is on
56
2/2
✓ Branch 1 taken 1 time.
✓ Branch 5 taken 1 time.
1 engine->module<SensorChecker>()->onIgnitionStateChanged(true);
57
2/2
✓ Branch 1 taken 1 time.
✓ Branch 5 taken 1 time.
1 engine->module<SensorChecker>()->onSlowCallback();
58
1/1
✓ Branch 1 taken 1 time.
1 advanceTimeUs(MS2US(1000));
59
2/2
✓ Branch 1 taken 1 time.
✓ Branch 5 taken 1 time.
1 engine->module<SensorChecker>()->onSlowCallback();
60 // todo: fix me https://github.com/rusefi/rusefi/issues/5233
61 // EXPECT_EQ( 3, recentWarnings.getCount()) << "intermittentTps";
62
1/7
✗ Branch 6 not taken.
✓ Branch 7 taken 1 time.
✗ Branch 10 not taken.
✗ Branch 13 not taken.
✗ Branch 18 not taken.
✗ Branch 22 not taken.
✗ Branch 25 not taken.
1 EXPECT_TRUE( recentWarnings->getCount() > 0) << "intermittentTps";
63
64
3/9
✓ Branch 3 taken 1 time.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 time.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 23 not taken.
✗ Branch 26 not taken.
✓ Branch 35 taken 1 time.
✗ Branch 36 not taken.
1 ASSERT_TRUE(engine->module<SensorChecker>()->analogSensorsShouldWork());
65
66
3/9
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 33 taken 1 time.
✗ Branch 34 not taken.
1 ASSERT_TRUE(Sensor::get(SensorType::Tps1).Valid);
67
68
1/1
✓ Branch 1 taken 1 time.
1 etb->update();
69
70
2/6
✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
1 EXPECT_EQ(0, etb->etbTpsErrorCounter);
71
2/6
✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
1 EXPECT_EQ(0, etb->etbErrorCode);
72
73 1 int badCount = 0;
74
75 // Do some bad/good/bad/good cycles, make sure count keeps up
76
2/2
✓ Branch 0 taken 50 times.
✓ Branch 1 taken 1 time.
2/2
✓ Decision 'true' taken 50 times.
✓ Decision 'false' taken 1 time.
51 for (size_t i = 0; i < 50; i++) {
77
1/1
✓ Branch 1 taken 50 times.
50 Sensor::setInvalidMockValue(SensorType::Tps1);
78
3/9
✓ Branch 3 taken 50 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 50 times.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 33 taken 50 times.
✗ Branch 34 not taken.
50 ASSERT_FALSE(Sensor::get(SensorType::Tps1).Valid);
79
1/1
✓ Branch 1 taken 50 times.
50 etb->update();
80
81 50 badCount++;
82
2/6
✓ Branch 2 taken 50 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 50 times.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
50 EXPECT_EQ(badCount, etb->etbTpsErrorCounter);
83
2/6
✓ Branch 3 taken 50 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 50 times.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
50 EXPECT_EQ((int)EtbStatus::TpsError, etb->etbErrorCode);
84
85
1/1
✓ Branch 1 taken 50 times.
50 Sensor::setMockValue(SensorType::Tps1, 20);
86
3/9
✓ Branch 3 taken 50 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 50 times.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 33 taken 50 times.
✗ Branch 34 not taken.
50 ASSERT_TRUE(Sensor::get(SensorType::Tps1).Valid);
87
1/1
✓ Branch 1 taken 50 times.
50 etb->update();
88 }
89
90 // 51st bad TPS should set etbErrorCode
91
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setInvalidMockValue(SensorType::Tps1);
92
3/9
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 33 taken 1 time.
✗ Branch 34 not taken.
1 ASSERT_FALSE(Sensor::get(SensorType::Tps1).Valid);
93
1/1
✓ Branch 1 taken 1 time.
1 etb->update();
94
95
2/6
✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
1 EXPECT_NE(0, etb->etbErrorCode);
96
97 // todo: fix me https://github.com/rusefi/rusefi/issues/5233
98 // EXPECT_EQ( 3, recentWarnings.getCount()) << "intermittentTps";
99
1/7
✗ Branch 6 not taken.
✓ Branch 7 taken 1 time.
✗ Branch 10 not taken.
✗ Branch 13 not taken.
✗ Branch 18 not taken.
✗ Branch 22 not taken.
✗ Branch 25 not taken.
1 EXPECT_TRUE( recentWarnings->getCount() > 0) << "intermittentTps";
100 // todo: fix me https://github.com/rusefi/rusefi/issues/5233
101 // EXPECT_EQ(OBD_PPS_Correlation, recentWarnings.get(0).Code);
102 // EXPECT_EQ(OBD_TPS1_Primary_Timeout, recentWarnings.get(1).Code);
103 // EXPECT_EQ(OBD_PPS_Primary_Timeout, recentWarnings.get(2).Code);
104 1 }
105
106 4 TEST(etb, intermittentPps) {
107
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE); // we have a destructor so cannot move EngineTestHelper into utility method
108
109
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::AcceleratorPedal, 10, true);
110
1/1
✓ Branch 1 taken 1 time.
1 EtbController *etb = initEtbIntegratedTest();
111
112 // Tell the sensor checker that the ignition is on
113
2/2
✓ Branch 1 taken 1 time.
✓ Branch 5 taken 1 time.
1 engine->module<SensorChecker>()->onIgnitionStateChanged(true);
114
2/2
✓ Branch 1 taken 1 time.
✓ Branch 5 taken 1 time.
1 engine->module<SensorChecker>()->onSlowCallback();
115
1/1
✓ Branch 1 taken 1 time.
1 advanceTimeUs(10e6);
116
2/2
✓ Branch 1 taken 1 time.
✓ Branch 5 taken 1 time.
1 engine->module<SensorChecker>()->onSlowCallback();
117
118
3/9
✓ Branch 3 taken 1 time.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 time.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 23 not taken.
✗ Branch 26 not taken.
✓ Branch 35 taken 1 time.
✗ Branch 36 not taken.
1 ASSERT_TRUE(engine->module<SensorChecker>()->analogSensorsShouldWork());
119
120
3/9
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 33 taken 1 time.
✗ Branch 34 not taken.
1 ASSERT_TRUE(Sensor::get(SensorType::AcceleratorPedal).Valid);
121
122
1/1
✓ Branch 1 taken 1 time.
1 etb->update();
123
124
2/6
✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
1 EXPECT_EQ(0, etb->etbPpsErrorCounter);
125
2/6
✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
1 EXPECT_EQ(0, etb->etbErrorCode);
126
127 1 int badCount = 0;
128
129 // Do some bad/good/bad/good cycles, make sure count keeps up
130
2/2
✓ Branch 0 taken 50 times.
✓ Branch 1 taken 1 time.
2/2
✓ Decision 'true' taken 50 times.
✓ Decision 'false' taken 1 time.
51 for (size_t i = 0; i < 50; i++) {
131
1/1
✓ Branch 1 taken 50 times.
50 Sensor::setInvalidMockValue(SensorType::AcceleratorPedal);
132
3/9
✓ Branch 3 taken 50 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 50 times.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 33 taken 50 times.
✗ Branch 34 not taken.
50 ASSERT_FALSE(Sensor::get(SensorType::AcceleratorPedal).Valid);
133
1/1
✓ Branch 1 taken 50 times.
50 etb->update();
134
135 50 badCount++;
136
2/6
✓ Branch 2 taken 50 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 50 times.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
50 EXPECT_EQ(badCount, etb->etbPpsErrorCounter);
137
2/6
✓ Branch 3 taken 50 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 50 times.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
50 EXPECT_EQ(0, etb->etbErrorCode);
138
139
1/1
✓ Branch 1 taken 50 times.
50 Sensor::setMockValue(SensorType::AcceleratorPedal, 20);
140
3/9
✓ Branch 3 taken 50 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 50 times.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 33 taken 50 times.
✗ Branch 34 not taken.
50 ASSERT_TRUE(Sensor::get(SensorType::AcceleratorPedal).Valid);
141
1/1
✓ Branch 1 taken 50 times.
50 etb->update();
142 }
143
144 // 51st bad TPS should set etbErrorCode
145
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setInvalidMockValue(SensorType::AcceleratorPedal);
146
3/9
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 33 taken 1 time.
✗ Branch 34 not taken.
1 ASSERT_FALSE(Sensor::get(SensorType::AcceleratorPedal).Valid);
147
1/1
✓ Branch 1 taken 1 time.
1 etb->update();
148
2/6
✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
1 EXPECT_NE(0, etb->etbErrorCode);
149 1 }
150
151 4 TEST(etb, sentTpsIntegrated) {
152
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE); // we have a destructor so cannot move EngineTestHelper into utility method
153
154 1 engineConfiguration->sentInputPins[0] = Gpio::B3;
155 1 engineConfiguration->sentEtbType = SentEtbType::GM_TYPE_1;
156
157 1 engineConfiguration->throttlePedalPositionAdcChannel = EFI_ADC_3;
158 1 engineConfiguration->throttlePedalPositionSecondAdcChannel = EFI_ADC_3;
159
160
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Tps1, 25.0f, true);
161
162
1/1
✓ Branch 1 taken 1 time.
1 initTps();
163
1/1
✓ Branch 1 taken 1 time.
1 doInitElectronicThrottle(/*isInit*/true);
164 2 }
165
166 4 TEST(etb, sentTpsIntegratedDecode) {
167
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE); // we have a destructor so cannot move EngineTestHelper into utility method
168
169 1 engineConfiguration->sentEtbType = SentEtbType::GM_TYPE_1;
170
171
4/9
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 27 taken 1 time.
✗ Branch 28 not taken.
1 ASSERT_NEAR(20.246, decodeTpsSentValue(3000), EPS2D);
172
173 1 engineConfiguration->sentEtbType = SentEtbType::CUSTOM;
174 1 engineConfiguration->customSentTpsMin = 5000;
175 1 engineConfiguration->customSentTpsMax = 1000;
176
4/9
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 27 taken 1 time.
✗ Branch 28 not taken.
1 ASSERT_NEAR(75, decodeTpsSentValue(2000), EPS2D);
177 1 }
178