GCC Code Coverage Report


Directory: ./
File: unit_tests/tests/test_limp.cpp
Date: 2025-10-03 00:57:22
Coverage Exec Excl Total
Lines: 100.0% 278 0 278
Functions: 100.0% 36 0 36
Branches: 44.6% 313 0 702
Decisions: -% 0 - 0

Line Branch Decision Exec Source
1 #include "pch.h"
2
3 #include "fuel_math.h"
4 #include "limp_manager.h"
5
6 4 TEST(limp, testFatalError) {
7
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
8 1 LimpManager dut;
9
10 // Everything should work by default
11
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(dut.allowElectronicThrottle());
12
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(dut.allowIgnition());
13
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(dut.allowInjection());
14
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(dut.allowTriggerInput());
15
16
1/1
✓ Branch 1 taken 1 time.
1 dut.fatalError();
17
18 // Fatal error should kill everything
19
2/7
✓ 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.
1 EXPECT_FALSE(dut.allowElectronicThrottle());
20
2/7
✓ Branch 4 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
1 EXPECT_FALSE(dut.allowIgnition());
21
2/7
✓ Branch 4 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
1 EXPECT_FALSE(dut.allowInjection());
22
2/7
✓ 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.
1 EXPECT_FALSE(dut.allowTriggerInput());
23 1 }
24
25 4 TEST(limp, revLimit) {
26
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
27
28 1 engineConfiguration->rpmHardLimit = 2500;
29 1 engineConfiguration->cutFuelOnHardLimit = true;
30 1 engineConfiguration->cutSparkOnHardLimit = true;
31
32 1 LimpManager dut;
33
34 // Under rev limit, inj/ign allowed
35
1/1
✓ Branch 1 taken 1 time.
1 dut.updateState(2000, 0);
36
2/7
✓ 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.
1 EXPECT_TRUE(dut.allowIgnition());
37
2/7
✓ 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.
1 EXPECT_TRUE(dut.allowInjection());
38
39 // Over rev limit, no injection
40
1/1
✓ Branch 1 taken 1 time.
1 dut.updateState(3000, 0);
41
2/7
✓ Branch 4 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
1 EXPECT_FALSE(dut.allowIgnition());
42
2/7
✓ Branch 4 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
1 EXPECT_FALSE(dut.allowInjection());
43
44 // Now recover back to under limit
45
1/1
✓ Branch 1 taken 1 time.
1 dut.updateState(2000, 0);
46
2/7
✓ 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.
1 EXPECT_TRUE(dut.allowIgnition());
47
2/7
✓ 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.
1 EXPECT_TRUE(dut.allowInjection());
48 2 }
49
50 4 TEST(limp, revLimitCltBased) {
51
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
52
53 1 engineConfiguration->rpmHardLimit = 2500;
54 1 engineConfiguration->cutFuelOnHardLimit = true;
55 1 engineConfiguration->cutSparkOnHardLimit = true;
56
57 // Configure CLT-based rev limit curve
58 1 engineConfiguration->useCltBasedRpmLimit = true;
59
1/1
✓ Branch 2 taken 1 time.
1 copyArray(config->cltRevLimitRpmBins, { 10, 20, 30, 40 });
60 1 copyArray(config->cltRevLimitRpm, { 1000, 2000, 3000, 4000 });
61
62 1 LimpManager dut;
63
64 // Check low temperature first
65
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Clt, 10);
66
67 // Under rev limit, inj/ign allowed
68
1/1
✓ Branch 1 taken 1 time.
1 dut.updateState(900, 0);
69
2/7
✓ 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.
1 EXPECT_TRUE(dut.allowIgnition());
70
2/7
✓ 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.
1 EXPECT_TRUE(dut.allowInjection());
71
72 // Over rev limit, no injection
73
1/1
✓ Branch 1 taken 1 time.
1 dut.updateState(1100, 0);
74
2/7
✓ Branch 4 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
1 EXPECT_FALSE(dut.allowIgnition());
75
2/7
✓ Branch 4 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
1 EXPECT_FALSE(dut.allowInjection());
76
77 // Now recover back to under limit
78
1/1
✓ Branch 1 taken 1 time.
1 dut.updateState(900, 0);
79
2/7
✓ 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.
1 EXPECT_TRUE(dut.allowIgnition());
80
2/7
✓ 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.
1 EXPECT_TRUE(dut.allowInjection());
81
82
83 // Check middle temperature
84
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Clt, 35);
85
86 // Under rev limit, inj/ign allowed
87
1/1
✓ Branch 1 taken 1 time.
1 dut.updateState(3400, 0);
88
2/7
✓ 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.
1 EXPECT_TRUE(dut.allowIgnition());
89
2/7
✓ 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.
1 EXPECT_TRUE(dut.allowInjection());
90
91 // Over rev limit, no injection
92
1/1
✓ Branch 1 taken 1 time.
1 dut.updateState(3600, 0);
93
2/7
✓ Branch 4 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
1 EXPECT_FALSE(dut.allowIgnition());
94
2/7
✓ Branch 4 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
1 EXPECT_FALSE(dut.allowInjection());
95
96 // Now recover back to under limit
97
1/1
✓ Branch 1 taken 1 time.
1 dut.updateState(3400, 0);
98
2/7
✓ 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.
1 EXPECT_TRUE(dut.allowIgnition());
99
2/7
✓ 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.
1 EXPECT_TRUE(dut.allowInjection());
100 2 }
101
102 4 TEST(limp, revHardLimitHyst) {
103
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
104
105 1 engineConfiguration->rpmHardLimit = 2500;
106 1 engineConfiguration->rpmHardLimitHyst = 200;
107 1 engineConfiguration->cutSparkOnHardLimit = true;
108
109 1 LimpManager dut;
110
111 // Under rev limit, inj/ign allowed
112
1/1
✓ Branch 1 taken 1 time.
1 dut.updateState(2500, 0);
113
2/7
✓ 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.
1 EXPECT_TRUE(dut.allowIgnition());
114
2/7
✓ 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.
1 EXPECT_TRUE(dut.allowInjection());
115
116 // Over rev limit, no injection or ignition
117
1/1
✓ Branch 1 taken 1 time.
1 dut.updateState(2501, 0);
118
2/7
✓ Branch 4 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
1 EXPECT_FALSE(dut.allowIgnition());
119
2/7
✓ Branch 4 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
1 EXPECT_FALSE(dut.allowInjection());
120
121 // Now set back inside the limit window - still not allowed
122
1/1
✓ Branch 1 taken 1 time.
1 dut.updateState(2300, 0);
123
2/7
✓ Branch 4 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
1 EXPECT_FALSE(dut.allowIgnition());
124
2/7
✓ Branch 4 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
1 EXPECT_FALSE(dut.allowInjection());
125
126 // Now recover back to under lower limit
127
1/1
✓ Branch 1 taken 1 time.
1 dut.updateState(2299, 0);
128
2/7
✓ 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.
1 EXPECT_TRUE(dut.allowIgnition());
129
2/7
✓ 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.
1 EXPECT_TRUE(dut.allowInjection());
130 2 }
131
132 4 TEST(limp, revSoftLimit) {
133
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
134
135 1 engineConfiguration->rpmHardLimit = 2500;
136 1 engineConfiguration->rpmHardLimitHyst = 200;
137 1 engineConfiguration->rpmSoftLimitTimingRetard = 10; // 10 deg
138 1 engineConfiguration->rpmSoftLimitFuelAdded = 20; // 20%
139 1 engineConfiguration->cutSparkOnHardLimit = true;
140
141
1/1
✓ Branch 1 taken 1 time.
1 eth.engine.updateSlowSensors();
142
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Clt, 36.605f);
143
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Iat, 30.0f);
144
145 // this is 5ms base fuel with some default CLT/IAT corrections
146 static const float baseFuel = 5.0f;
147 static const float normalRunningFuel = 5.3679f;
148
149 // Under rev limit, no inj/ign corrections
150
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Rpm, 2300);
151
1/1
✓ Branch 1 taken 1 time.
1 eth.engine.periodicFastCallback();
152
153
4/8
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
1 EXPECT_FLOAT_EQ(0, getLimpManager()->getLimitingTimingRetard());
154
2/6
✓ Branch 4 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_FLOAT_EQ((float)eth.engine.ignitionState.correctedIgnitionAdvance - (float)eth.engine.ignitionState.baseIgnitionAdvance, 0);
155
4/8
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
1 EXPECT_FLOAT_EQ(1, getLimpManager()->getLimitingFuelCorrection());
156 // this is normal injection mode, no limiting fuel corrections
157
4/10
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✓ Branch 30 taken 1 time.
✗ Branch 31 not taken.
1 ASSERT_NEAR(normalRunningFuel, getRunningFuel(baseFuel), EPS4D) << "base fuel";
158
159 // For upper rev limit, we expect maximum inj/ign corrections
160
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Rpm, 2500);
161
1/1
✓ Branch 1 taken 1 time.
1 eth.engine.periodicFastCallback();
162
163
4/8
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
1 EXPECT_FLOAT_EQ(10, getLimpManager()->getLimitingTimingRetard()); // 10 deg
164
2/6
✓ Branch 4 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_FLOAT_EQ((float)eth.engine.ignitionState.correctedIgnitionAdvance - (float)eth.engine.ignitionState.baseIgnitionAdvance, -10.0f);
165
4/8
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
1 EXPECT_FLOAT_EQ(1.2f, getLimpManager()->getLimitingFuelCorrection()); // 20%
166
4/10
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✓ Branch 30 taken 1 time.
✗ Branch 31 not taken.
1 ASSERT_NEAR(normalRunningFuel * 1.2f, getRunningFuel(baseFuel), EPS4D) << "base fuel"; // 20%
167
168 // In the middle of the limit window, we expect 50% interpolated inj/ign corrections
169
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Rpm, 2400);
170
1/1
✓ Branch 1 taken 1 time.
1 eth.engine.periodicFastCallback();
171
4/8
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
1 EXPECT_FLOAT_EQ(5, getLimpManager()->getLimitingTimingRetard()); // 5 deg
172
2/6
✓ Branch 4 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_FLOAT_EQ((float)eth.engine.ignitionState.correctedIgnitionAdvance - (float)eth.engine.ignitionState.baseIgnitionAdvance, -5.0f);
173
4/8
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
1 EXPECT_FLOAT_EQ(1.1f, getLimpManager()->getLimitingFuelCorrection()); // 10%
174
4/10
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✓ Branch 30 taken 1 time.
✗ Branch 31 not taken.
1 ASSERT_NEAR(normalRunningFuel * 1.1f, getRunningFuel(baseFuel), EPS4D) << "base fuel"; // 10%
175 1 }
176
177 4 TEST(limp, boostCut) {
178
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
179
180 // Cut above 100kPa
181 1 engineConfiguration->boostCutPressure = 100;
182 1 engineConfiguration->boostCutPressureHyst = 20;
183
184 1 LimpManager dut;
185
186 // Below threshold, injection allowed
187
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Map, 80);
188
1/1
✓ Branch 1 taken 1 time.
1 dut.updateState(1000, 0);
189
2/7
✓ 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.
1 EXPECT_TRUE(dut.allowInjection());
190
191 // Above rising threshold, injection cut
192
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Map, 105);
193
1/1
✓ Branch 1 taken 1 time.
1 dut.updateState(1000, 0);
194
2/7
✓ Branch 4 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
1 EXPECT_FALSE(dut.allowInjection());
195
196 // Below rising threshold, but should have hysteresis, so not cut yet
197
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Map, 95);
198
1/1
✓ Branch 1 taken 1 time.
1 dut.updateState(1000, 0);
199
2/7
✓ Branch 4 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
1 EXPECT_FALSE(dut.allowInjection());
200
201 // Below falling threshold, fuel restored
202
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Map, 79);
203
1/1
✓ Branch 1 taken 1 time.
1 dut.updateState(1000, 0);
204
2/7
✓ 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.
1 EXPECT_TRUE(dut.allowInjection());
205
206 // SPECIAL CASE: threshold of 0 means never boost cut
207 1 engineConfiguration->boostCutPressure = 0;
208
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Map, 500);
209
1/1
✓ Branch 1 taken 1 time.
1 dut.updateState(1000, 0);
210
2/7
✓ 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.
1 EXPECT_TRUE(dut.allowInjection());
211 2 }
212
213 4 TEST(limp, boostCutUint8Overflow) {
214
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
215
216 // Cut above 1500kPa
217 1 engineConfiguration->boostCutPressure = 1500;
218 1 engineConfiguration->boostCutPressureHyst = 20;
219
220 1 LimpManager dut;
221
222 // Below threshold, injection allowed
223
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Map, 80);
224
1/1
✓ Branch 1 taken 1 time.
1 dut.updateState(1000, 0);
225
2/7
✓ 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.
1 EXPECT_TRUE(dut.allowInjection());
226
227 // Above rising threshold, injection cut
228
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Map, 1600);
229
1/1
✓ Branch 1 taken 1 time.
1 dut.updateState(1000, 0);
230
2/7
✓ Branch 4 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
1 EXPECT_FALSE(dut.allowInjection());
231
232 // Below rising threshold, but should have hysteresis, so not cut yet
233
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Map, 1495);
234
1/1
✓ Branch 1 taken 1 time.
1 dut.updateState(1000, 0);
235
2/7
✓ Branch 4 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
1 EXPECT_FALSE(dut.allowInjection());
236
237 // Below falling threshold, fuel restored
238
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Map, 79);
239
1/1
✓ Branch 1 taken 1 time.
1 dut.updateState(1000, 0);
240
2/7
✓ 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.
1 EXPECT_TRUE(dut.allowInjection());
241 2 }
242
243
244 4 TEST(limp, oilPressureStartupFailureCase) {
245
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
246 1 engineConfiguration->minOilPressureAfterStart = 200;
247
248 1 LimpManager dut;
249
250 // Low oil pressure!
251
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::OilPressure, 50);
252
253 // Start the engine
254
1/1
✓ Branch 1 taken 1 time.
1 engine->rpmCalculator.setRpmValue(1000);
255
256 // update & check: injection should be allowed
257
2/2
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
1 dut.updateState(1000, getTimeNowNt());
258
2/7
✓ 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.
1 EXPECT_TRUE(dut.allowInjection());
259
260 // 4.5 seconds later, should still be allowed (even though pressure is low)
261
1/1
✓ Branch 1 taken 1 time.
1 advanceTimeUs(4.5e6);
262
2/2
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
1 dut.updateState(1000, getTimeNowNt());
263
2/7
✓ 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.
1 EXPECT_TRUE(dut.allowInjection());
264
265 // 1 second later (5.5 since start), injection should cut
266
1/1
✓ Branch 1 taken 1 time.
1 advanceTimeUs(1.0e6);
267
2/2
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
1 dut.updateState(1000, getTimeNowNt());
268
3/9
✓ Branch 4 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 36 taken 1 time.
✗ Branch 37 not taken.
1 ASSERT_FALSE(dut.allowInjection());
269
270 // But then oil pressure arrives!
271 // Injection still isn't allowed, since now we're late.
272
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::OilPressure, 250);
273
2/2
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
1 dut.updateState(1000, getTimeNowNt());
274
3/9
✓ Branch 4 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 36 taken 1 time.
✗ Branch 37 not taken.
1 ASSERT_FALSE(dut.allowInjection());
275 1 }
276
277 4 TEST(limp, oilPressureStartupSuccessCase) {
278
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
279 1 engineConfiguration->minOilPressureAfterStart = 200;
280
281 1 LimpManager dut;
282
283 // Low oil pressure!
284
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::OilPressure, 50);
285
286 // Start the engine
287
1/1
✓ Branch 1 taken 1 time.
1 engine->rpmCalculator.setRpmValue(1000);
288
289 // update & check: injection should be allowed
290
2/2
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
1 dut.updateState(1000, getTimeNowNt());
291
2/7
✓ 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.
1 EXPECT_TRUE(dut.allowInjection());
292
293 // 4.5 seconds later, should still be allowed (even though pressure is low)
294
1/1
✓ Branch 1 taken 1 time.
1 advanceTimeUs(4.5e6);
295
2/2
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
1 dut.updateState(1000, getTimeNowNt());
296
2/7
✓ 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.
1 EXPECT_TRUE(dut.allowInjection());
297
298 // But then oil pressure arrives!
299
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::OilPressure, 250);
300
2/2
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
1 dut.updateState(1000, getTimeNowNt());
301
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(dut.allowInjection());
302
303 // 1 second later (5.5 since start), injection should be allowed since we saw pressure before the timeout
304
1/1
✓ Branch 1 taken 1 time.
1 advanceTimeUs(1.0e6);
305
2/2
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
1 dut.updateState(1000, getTimeNowNt());
306
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(dut.allowInjection());
307
308 // Later, we lose oil pressure, but engine should stay running
309
1/1
✓ Branch 1 taken 1 time.
1 advanceTimeUs(10e6);
310
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::OilPressure, 10);
311
2/2
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
1 dut.updateState(1000, getTimeNowNt());
312
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(dut.allowInjection());
313 1 }
314
315 4 TEST(limp, oilPressureRunning) {
316
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
317 1 engineConfiguration->enableOilPressureProtect = true;
318 1 engineConfiguration->minimumOilPressureTimeout = 1.0f;
319 1 setArrayValues(config->minimumOilPressureValues, 100);
320
321 1 LimpManager dut;
322
323 // Oil pressure starts OK
324
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::OilPressure, 110);
325
326 // Start the engine
327
1/1
✓ Branch 1 taken 1 time.
1 engine->rpmCalculator.setRpmValue(1000);
328
329 // update & check: injection should be allowed
330
2/2
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
1 dut.updateState(1000, getTimeNowNt());
331
2/7
✓ 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.
1 EXPECT_TRUE(dut.allowInjection());
332
333 // A long time later, everything should still be OK
334
1/1
✓ Branch 1 taken 1 time.
1 advanceTimeUs(60e6);
335
2/2
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
1 dut.updateState(1000, getTimeNowNt());
336
2/7
✓ 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.
1 EXPECT_TRUE(dut.allowInjection());
337
338 // Now oil pressure drops below threshold
339
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::OilPressure, 90);
340
341 // 0.9 second later, injection should continue as timeout isn't hit yet
342
1/1
✓ Branch 1 taken 1 time.
1 advanceTimeUs(0.9e6);
343
2/2
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
1 dut.updateState(1000, getTimeNowNt());
344
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(dut.allowInjection());
345
346 // 0.2 second later (1.1s since low pressure starts), injection should cut
347
1/1
✓ Branch 1 taken 1 time.
1 advanceTimeUs(1.0e6);
348
2/2
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
1 dut.updateState(1000, getTimeNowNt());
349
3/9
✓ Branch 4 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 36 taken 1 time.
✗ Branch 37 not taken.
1 ASSERT_FALSE(dut.allowInjection());
350
351 // Oil pressure is restored, and fuel should be restored too
352
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::OilPressure, 110);
353
2/2
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
1 dut.updateState(1000, getTimeNowNt());
354
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(dut.allowInjection());
355 1 }
356
357 4 TEST(limp, oilPressureMaxLimit) {
358
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
359
360 1 config->maximumOilPressureValues[0] = 200; // kPa
361 1 config->maximumOilPressureValues[1] = 200;
362 1 config->maximumOilPressureValues[2] = 800;
363 1 config->maximumOilPressureValues[3] = 800;
364
1/1
✓ Branch 1 taken 1 time.
1 setRpmTableBin(config->maximumOilPressureBins); // 700 800 3800 7000
365
366 1 engineConfiguration->maxOilPressureTimeout = 1.0f; // sec
367
368 1 LimpManager dut;
369
370 // Oil pressure starts OK
371
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::OilPressure, 300);
372
373 // Start the engine
374 1 float rpm = 4000;
375
1/1
✓ Branch 1 taken 1 time.
1 engine->rpmCalculator.setRpmValue(rpm);
376
377 // update & check: injection should be allowed
378
2/2
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
1 dut.updateState(rpm, getTimeNowNt());
379
2/7
✓ 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.
1 EXPECT_TRUE(dut.allowInjection());
380
381 // after 5 sec - still allowed
382
1/1
✓ Branch 1 taken 1 time.
1 advanceTimeUs(5.0e6);
383
2/2
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
1 dut.updateState(rpm, getTimeNowNt());
384
2/7
✓ 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.
1 EXPECT_TRUE(dut.allowInjection());
385
386 // On lower RPMs oil pressure goes above threshold
387 1 rpm = 800;
388
1/1
✓ Branch 1 taken 1 time.
1 engine->rpmCalculator.setRpmValue(rpm);
389
390 // 0.9 second later, injection should continue as timeout isn't hit yet
391
1/1
✓ Branch 1 taken 1 time.
1 advanceTimeUs(0.9e6);
392
2/2
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
1 dut.updateState(rpm, getTimeNowNt());
393
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(dut.allowInjection());
394
395 // 0.2 second later (1.1s since non-valid pressure), injection should cut
396
1/1
✓ Branch 1 taken 1 time.
1 advanceTimeUs(1.0e6);
397
2/2
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
1 dut.updateState(rpm, getTimeNowNt());
398
3/9
✓ Branch 4 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 36 taken 1 time.
✗ Branch 37 not taken.
1 ASSERT_FALSE(dut.allowInjection());
399
400 // Oil pressure is restored, and fuel should be restored too
401
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::OilPressure, 110);
402
2/2
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
1 dut.updateState(rpm, getTimeNowNt());
403
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(dut.allowInjection());
404 1 }
405
406
407 4 TEST(limp, gdiFuelCut) {
408
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
409
410 // configure GDI engine for tests:
411 1 engineConfiguration->hpfpCam = HPFP_CAM_NONE;
412 1 engineConfiguration->hpfpCamLobes = 4;
413 1 engineConfiguration->mc33_t_hold_tot = 3.0f;
414
1/1
✓ Branch 1 taken 1 time.
1 engine->rpmCalculator.setRpmValue(1000);
415
416 // below limits:
417 1 engine->engineState.injectionDuration = 1.8;
418
419 1 LimpManager dut;
420
421 // update & check: injection should be allowed
422
2/2
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
1 dut.updateState(1000, getTimeNowNt());
423
2/7
✓ 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.
1 EXPECT_TRUE(dut.allowInjection());
424
425 1 engine->engineState.injectionDuration = 3.1f;
426 // update & check: injection should cut
427
2/2
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
1 dut.updateState(1000, getTimeNowNt());
428
4/9
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
1 ASSERT_EQ(ClearReason::GdiLimits, dut.allowInjection().reason);
429 1 }
430
431 struct Mockhpfp : public MockHpfpController {
432 bool isHpfpActive;
433 angle_t m_deadangle;
434 };
435