GCC Code Coverage Report


Directory: ./
File: firmware/libfirmware/util/test/test_fragments.cpp
Date: 2025-10-03 00:57:22
Coverage Exec Excl Total
Lines: 100.0% 107 0 107
Functions: 100.0% 6 0 6
Branches: 27.0% 72 0 267
Decisions: 100.0% 2 - 2

Line Branch Decision Exec Source
1 #include <rusefi/fragments.h>
2 #include <rusefi/arrays.h>
3
4 #include <gtest/gtest.h>
5
6 #include <cstring>
7
8 struct obj1 {
9 const uint8_t x[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
10 };
11
12 static_assert(sizeof(obj1) == 10);
13
14 struct obj2 {
15 const uint8_t x[5] = { 11, 12, 13, 14, 15 };
16 };
17
18 static_assert(sizeof(obj2) == 5);
19
20 obj1 buffer10;
21 obj2 buffer5;
22
23 template<>
24 20 const obj1* getLiveData(size_t) {
25 20 return &buffer10;
26 }
27
28 template<>
29 23 const obj2* getLiveData(size_t idx) {
30
2/2
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 16 times.
2/2
✓ Decision 'true' taken 7 times.
✓ Decision 'false' taken 16 times.
23 if (idx == 1) {
31 7 return nullptr;
32 }
33
34 16 return &buffer5;
35 }
36
37 static FragmentEntry fragmentBuffer[] = {
38 decl_frag<obj1>{},
39 decl_frag<obj2, 0>{},
40 decl_frag<obj2, 1>{}, // this one will be null
41 decl_frag<obj1>{},
42 };
43
44 static uint8_t buffer[120];
45 7 static void resetBuffer() {
46 7 memset(buffer, 0xFF, sizeof(buffer));
47 7 }
48
49 4 TEST(Util_Fragments, fragments) {
50 static_assert(4 == efi::size(fragmentBuffer));
51
52 1 FragmentList fragments{ fragmentBuffer, efi::size(fragmentBuffer) };
53
54 1 resetBuffer();
55
56 {
57 // Exactly copy both buffers
58 1 uint8_t expected[] = {
59 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, // buffer10
60 11, 12, 13, 14, 15, // buffer5
61 0, 0, 0, 0, 0, // null obj2
62 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 // buffer10 again
63 };
64
1/1
✓ Branch 1 taken 1 time.
1 copyRange(buffer, fragments, 0, 10 + 5 + 5 + 10);
65
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_TRUE( 0 == std::memcmp(buffer, expected, sizeof(expected)));
66
67 1 uint8_t *ptr;
68 1 size_t offset = 0;
69 size_t ret;
70 /* pointer to first fragment */
71
1/1
✓ Branch 1 taken 1 time.
1 ret = getRangePtr(&ptr, fragments, offset, 10 + 5 + 5 + 10);
72
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_TRUE( 10 == ret);
73
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_TRUE( 0 == std::memcmp(ptr, expected, ret));
74
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( fragmentBuffer[0].get() == ptr);
75
76 1 offset += ret;
77 /* pointer to second fragment */
78
1/1
✓ Branch 1 taken 1 time.
1 ret = getRangePtr(&ptr, fragments, offset, 5 + 5 + 10);
79
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_TRUE( 5 == ret);
80
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_TRUE( 0 == std::memcmp(ptr, expected + 10, ret));
81
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( fragmentBuffer[1].get() == ptr);
82
83 1 offset += ret;
84 /* pointer to null */
85
1/1
✓ Branch 1 taken 1 time.
1 ret = getRangePtr(&ptr, fragments, offset, 5 + 10);
86
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_TRUE( 5 == ret);
87
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_TRUE( NULL == ptr);
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( fragmentBuffer[2].get() == ptr);
89
90 1 offset += ret;
91 /* pointer to fourth fragment */
92
1/1
✓ Branch 1 taken 1 time.
1 ret = getRangePtr(&ptr, fragments, offset, 10);
93
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_TRUE( 10 == ret);
94
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_TRUE( 0 == std::memcmp(ptr, expected + 10 + 5 + 5, ret));
95
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( fragmentBuffer[3].get() == ptr);
96 }
97
98 1 resetBuffer();
99
100 {
101 // Check overlap between first and second fragments
102 1 uint8_t expected[] = {9, 10, 11, 12, 13};
103
1/1
✓ Branch 1 taken 1 time.
1 copyRange(buffer, fragments, 8, 5);
104
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_TRUE( 0 == std::memcmp(buffer, expected, sizeof(expected)));
105
106 1 uint8_t *ptr;
107 1 size_t offset = 8;
108 size_t ret;
109
1/1
✓ Branch 1 taken 1 time.
1 ret = getRangePtr(&ptr, fragments, offset, 5);
110
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_TRUE( 2 == ret);
111
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( fragmentBuffer[0].get() + 8 == ptr);
112
113 1 offset += ret;
114
1/1
✓ Branch 1 taken 1 time.
1 ret = getRangePtr(&ptr, fragments, offset, 5 - 2);
115
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_TRUE( 3 == ret);
116
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( fragmentBuffer[1].get() + 0 == ptr);
117 }
118
119 1 resetBuffer();
120
121 {
122 // Check partial of only second fragment
123 1 uint8_t expected[] = {13, 14, 15};
124
1/1
✓ Branch 1 taken 1 time.
1 copyRange(buffer, fragments, 12, 3);
125
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_TRUE( 0 == std::memcmp(buffer, expected, sizeof(expected)));
126
127 1 uint8_t *ptr;
128 size_t ret;
129
1/1
✓ Branch 1 taken 1 time.
1 ret = getRangePtr(&ptr, fragments, 12, 3);
130
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_TRUE( 3 == ret);
131
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( fragmentBuffer[1].get() + 2 == ptr);
132 }
133
134 1 resetBuffer();
135
136 {
137 // Check overlap between second fragment and null fragment
138 1 uint8_t expected[] = {15, 0, 0};
139
1/1
✓ Branch 1 taken 1 time.
1 copyRange(buffer, fragments, 14, 3);
140
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_TRUE( 0 == std::memcmp(buffer, expected, sizeof(expected)));
141
142 1 uint8_t *ptr;
143 1 size_t offset = 14;
144 size_t ret;
145
1/1
✓ Branch 1 taken 1 time.
1 ret = getRangePtr(&ptr, fragments, offset, 5);
146
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_TRUE( 1 == ret);
147
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( fragmentBuffer[1].get() + 4 == ptr);
148
149 1 offset += ret;
150
1/1
✓ Branch 1 taken 1 time.
1 ret = getRangePtr(&ptr, fragments, offset, 5 - 1);
151
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_TRUE( 4 == ret);
152
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_TRUE( NULL == ptr);
153 }
154
155 1 resetBuffer();
156
157 {
158 // Check overlap between null fragment and 4th fragment
159 1 uint8_t expected[] = {0, 1, 2};
160
1/1
✓ Branch 1 taken 1 time.
1 copyRange(buffer, fragments, 19, 3);
161
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_TRUE( 0 == std::memcmp(buffer, expected, sizeof(expected)));
162
163 1 uint8_t *ptr;
164 1 size_t offset = 19;
165 size_t ret;
166
1/1
✓ Branch 1 taken 1 time.
1 ret = getRangePtr(&ptr, fragments, offset, 3);
167
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_TRUE( 1 == ret);
168
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_TRUE( NULL == ptr);
169
170 1 offset += ret;
171
1/1
✓ Branch 1 taken 1 time.
1 ret = getRangePtr(&ptr, fragments, offset, 3 - 1);
172
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_TRUE( 2 == ret);
173
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( fragmentBuffer[3].get() == ptr);
174 }
175
176 1 resetBuffer();
177
178 {
179 // Check overlap between last fragment and off-end of buffer (off-buffer should give 0s)
180 1 uint8_t expected[] = {9, 10, 0, 0};
181
1/1
✓ Branch 1 taken 1 time.
1 copyRange(buffer, fragments, 28, 4);
182
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_TRUE( 0 == std::memcmp(buffer, expected, sizeof(expected)));
183
184 1 uint8_t *ptr;
185 1 size_t offset = 28;
186 size_t ret;
187
1/1
✓ Branch 1 taken 1 time.
1 ret = getRangePtr(&ptr, fragments, offset, 4);
188
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_TRUE( 2 == ret);
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( fragmentBuffer[3].get() + 8 == ptr);
190
191 1 offset += ret;
192
1/1
✓ Branch 1 taken 1 time.
1 ret = getRangePtr(&ptr, fragments, offset, 4 - 2);
193
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_TRUE( 2 == ret);
194
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_TRUE( NULL == ptr);
195 }
196
197 1 resetBuffer();
198
199 {
200 // Check way off the end of the buffer
201 1 uint8_t expected[] = {0, 0, 0};
202
1/1
✓ Branch 1 taken 1 time.
1 copyRange(buffer, fragments, 1000, 3);
203
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_TRUE( 0 == std::memcmp(buffer, expected, sizeof(expected)));
204
205 1 uint8_t *ptr;
206 size_t ret;
207
1/1
✓ Branch 1 taken 1 time.
1 ret = getRangePtr(&ptr, fragments, 1000, 3);
208
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_TRUE( 3 == ret);
209
1/6
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
1 EXPECT_TRUE( NULL == ptr);
210 }
211 1 }
212