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 |