|
1 // Copyright (c) 2010, Google Inc. |
|
2 // All rights reserved. |
|
3 // |
|
4 // Redistribution and use in source and binary forms, with or without |
|
5 // modification, are permitted provided that the following conditions are |
|
6 // met: |
|
7 // |
|
8 // * Redistributions of source code must retain the above copyright |
|
9 // notice, this list of conditions and the following disclaimer. |
|
10 // * Redistributions in binary form must reproduce the above |
|
11 // copyright notice, this list of conditions and the following disclaimer |
|
12 // in the documentation and/or other materials provided with the |
|
13 // distribution. |
|
14 // * Neither the name of Google Inc. nor the names of its |
|
15 // contributors may be used to endorse or promote products derived from |
|
16 // this software without specific prior written permission. |
|
17 // |
|
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|
19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
|
20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
|
21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
|
22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|
23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
|
24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
|
25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
|
26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|
27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
|
28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
29 |
|
30 // Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com> |
|
31 |
|
32 // test_assembler_unittest.cc: Unit tests for google_breakpad::TestAssembler. |
|
33 |
|
34 #include <string> |
|
35 #include <string.h> |
|
36 |
|
37 #include "breakpad_googletest_includes.h" |
|
38 #include "common/test_assembler.h" |
|
39 #include "common/using_std_string.h" |
|
40 |
|
41 using google_breakpad::test_assembler::Label; |
|
42 using google_breakpad::test_assembler::Section; |
|
43 using google_breakpad::test_assembler::kBigEndian; |
|
44 using google_breakpad::test_assembler::kLittleEndian; |
|
45 using testing::Test; |
|
46 |
|
47 TEST(ConstructLabel, Simple) { |
|
48 Label l; |
|
49 } |
|
50 |
|
51 TEST(ConstructLabel, Undefined) { |
|
52 Label l; |
|
53 EXPECT_FALSE(l.IsKnownConstant()); |
|
54 } |
|
55 |
|
56 TEST(ConstructLabelDeathTest, Undefined) { |
|
57 Label l; |
|
58 ASSERT_DEATH(l.Value(), "IsKnownConstant\\(&v\\)"); |
|
59 } |
|
60 |
|
61 TEST(ConstructLabel, Constant) { |
|
62 Label l(0x060b9f974eaf301eULL); |
|
63 uint64_t v; |
|
64 EXPECT_TRUE(l.IsKnownConstant(&v)); |
|
65 EXPECT_EQ(v, 0x060b9f974eaf301eULL); |
|
66 EXPECT_EQ(l.Value(), 0x060b9f974eaf301eULL); |
|
67 } |
|
68 |
|
69 TEST(ConstructLabel, Copy) { |
|
70 Label l; |
|
71 Label m(l); |
|
72 uint64_t v; |
|
73 EXPECT_TRUE(l.IsKnownOffsetFrom(m, &v)); |
|
74 EXPECT_EQ(0U, v); |
|
75 } |
|
76 |
|
77 // The left-hand-side of a label assignment can be either |
|
78 // unconstrained, related, or known. The right-hand-side can be any of |
|
79 // those, or an integer. |
|
80 TEST(Assignment, UnconstrainedToUnconstrained) { |
|
81 Label l, m; |
|
82 l = m; |
|
83 EXPECT_EQ(0U, l-m); |
|
84 EXPECT_TRUE(l.IsKnownOffsetFrom(m)); |
|
85 uint64_t d; |
|
86 EXPECT_TRUE(l.IsKnownOffsetFrom(m, &d)); |
|
87 EXPECT_EQ(0U, d); |
|
88 EXPECT_FALSE(l.IsKnownConstant()); |
|
89 } |
|
90 |
|
91 TEST(Assignment, UnconstrainedToRelated) { |
|
92 Label l, m, n; |
|
93 l = n; |
|
94 l = m; |
|
95 EXPECT_EQ(0U, l-m); |
|
96 EXPECT_TRUE(l.IsKnownOffsetFrom(m)); |
|
97 uint64_t d; |
|
98 EXPECT_TRUE(l.IsKnownOffsetFrom(m, &d)); |
|
99 EXPECT_EQ(0U, d); |
|
100 EXPECT_FALSE(l.IsKnownConstant()); |
|
101 } |
|
102 |
|
103 TEST(Assignment, UnconstrainedToKnown) { |
|
104 Label l, m; |
|
105 l = 0x8fd16e55b20a39c1ULL; |
|
106 l = m; |
|
107 EXPECT_EQ(0U, l-m); |
|
108 EXPECT_TRUE(l.IsKnownOffsetFrom(m)); |
|
109 uint64_t d; |
|
110 EXPECT_TRUE(l.IsKnownOffsetFrom(m, &d)); |
|
111 EXPECT_EQ(0U, d); |
|
112 EXPECT_TRUE(m.IsKnownConstant()); |
|
113 EXPECT_EQ(0x8fd16e55b20a39c1ULL, m.Value()); |
|
114 } |
|
115 |
|
116 TEST(Assignment, RelatedToUnconstrained) { |
|
117 Label l, m, n; |
|
118 m = n; |
|
119 l = m; |
|
120 EXPECT_EQ(0U, l-n); |
|
121 EXPECT_TRUE(l.IsKnownOffsetFrom(n)); |
|
122 uint64_t d; |
|
123 EXPECT_TRUE(l.IsKnownOffsetFrom(n, &d)); |
|
124 EXPECT_EQ(0U, d); |
|
125 EXPECT_FALSE(l.IsKnownConstant()); |
|
126 } |
|
127 |
|
128 TEST(Assignment, RelatedToRelated) { |
|
129 Label l, m, n, o; |
|
130 l = n; |
|
131 m = o; |
|
132 l = m; |
|
133 EXPECT_EQ(0U, n-o); |
|
134 EXPECT_TRUE(n.IsKnownOffsetFrom(o)); |
|
135 uint64_t d; |
|
136 EXPECT_TRUE(n.IsKnownOffsetFrom(o, &d)); |
|
137 EXPECT_EQ(0U, d); |
|
138 EXPECT_FALSE(l.IsKnownConstant()); |
|
139 } |
|
140 |
|
141 TEST(Assignment, RelatedToKnown) { |
|
142 Label l, m, n; |
|
143 m = n; |
|
144 l = 0xd2011f8c82ad56f2ULL; |
|
145 l = m; |
|
146 EXPECT_TRUE(l.IsKnownConstant()); |
|
147 EXPECT_EQ(0xd2011f8c82ad56f2ULL, l.Value()); |
|
148 EXPECT_TRUE(m.IsKnownConstant()); |
|
149 EXPECT_EQ(0xd2011f8c82ad56f2ULL, m.Value()); |
|
150 EXPECT_TRUE(n.IsKnownConstant()); |
|
151 EXPECT_EQ(0xd2011f8c82ad56f2ULL, n.Value()); |
|
152 } |
|
153 |
|
154 TEST(Assignment, KnownToUnconstrained) { |
|
155 Label l, m; |
|
156 m = 0x50b024c0d6073887ULL; |
|
157 l = m; |
|
158 EXPECT_TRUE(l.IsKnownConstant()); |
|
159 EXPECT_EQ(0x50b024c0d6073887ULL, l.Value()); |
|
160 EXPECT_TRUE(m.IsKnownConstant()); |
|
161 EXPECT_EQ(0x50b024c0d6073887ULL, m.Value()); |
|
162 } |
|
163 |
|
164 TEST(Assignment, KnownToRelated) { |
|
165 Label l, m, n; |
|
166 l = n; |
|
167 m = 0x5348883655c727e5ULL; |
|
168 l = m; |
|
169 EXPECT_TRUE(l.IsKnownConstant()); |
|
170 EXPECT_EQ(0x5348883655c727e5ULL, l.Value()); |
|
171 EXPECT_TRUE(m.IsKnownConstant()); |
|
172 EXPECT_EQ(0x5348883655c727e5ULL, m.Value()); |
|
173 EXPECT_TRUE(n.IsKnownConstant()); |
|
174 EXPECT_EQ(0x5348883655c727e5ULL, n.Value()); |
|
175 } |
|
176 |
|
177 TEST(Assignment, KnownToKnown) { |
|
178 Label l, m; |
|
179 l = 0x36c209c20987564eULL; |
|
180 m = 0x36c209c20987564eULL; |
|
181 l = m; |
|
182 EXPECT_TRUE(l.IsKnownConstant()); |
|
183 EXPECT_EQ(0x36c209c20987564eULL, l.Value()); |
|
184 EXPECT_TRUE(m.IsKnownConstant()); |
|
185 EXPECT_EQ(0x36c209c20987564eULL, m.Value()); |
|
186 } |
|
187 |
|
188 TEST(Assignment, ConstantToUnconstrained) { |
|
189 Label l; |
|
190 l = 0xc02495f4d7f5a957ULL; |
|
191 EXPECT_TRUE(l.IsKnownConstant()); |
|
192 EXPECT_EQ(0xc02495f4d7f5a957ULL, l.Value()); |
|
193 } |
|
194 |
|
195 TEST(Assignment, ConstantToRelated) { |
|
196 Label l, m; |
|
197 l = m; |
|
198 l = 0x4577901cf275488dULL; |
|
199 EXPECT_TRUE(l.IsKnownConstant()); |
|
200 EXPECT_EQ(0x4577901cf275488dULL, l.Value()); |
|
201 EXPECT_TRUE(m.IsKnownConstant()); |
|
202 EXPECT_EQ(0x4577901cf275488dULL, m.Value()); |
|
203 } |
|
204 |
|
205 TEST(Assignment, ConstantToKnown) { |
|
206 Label l; |
|
207 l = 0xec0b9c369b7e8ea7ULL; |
|
208 l = 0xec0b9c369b7e8ea7ULL; |
|
209 EXPECT_TRUE(l.IsKnownConstant()); |
|
210 EXPECT_EQ(0xec0b9c369b7e8ea7ULL, l.Value()); |
|
211 } |
|
212 |
|
213 TEST(AssignmentDeathTest, Self) { |
|
214 Label l; |
|
215 ASSERT_DEATH(l = l, "binding != this"); |
|
216 } |
|
217 |
|
218 TEST(AssignmentDeathTest, IndirectCycle) { |
|
219 Label l, m, n; |
|
220 l = m; |
|
221 m = n; |
|
222 ASSERT_DEATH(n = l, "binding != this"); |
|
223 } |
|
224 |
|
225 TEST(AssignmentDeathTest, Cycle) { |
|
226 Label l, m, n, o; |
|
227 l = m; |
|
228 m = n; |
|
229 o = n; |
|
230 ASSERT_DEATH(o = l, "binding != this"); |
|
231 } |
|
232 |
|
233 TEST(Addition, LabelConstant) { |
|
234 Label l, m; |
|
235 m = l + 0x5248d93e8bbe9497ULL; |
|
236 EXPECT_TRUE(m.IsKnownOffsetFrom(l)); |
|
237 uint64_t d; |
|
238 EXPECT_TRUE(m.IsKnownOffsetFrom(l, &d)); |
|
239 EXPECT_EQ(0x5248d93e8bbe9497ULL, d); |
|
240 EXPECT_FALSE(m.IsKnownConstant()); |
|
241 } |
|
242 |
|
243 TEST(Addition, ConstantLabel) { |
|
244 Label l, m; |
|
245 m = 0xf51e94e00d6e3c84ULL + l; |
|
246 EXPECT_TRUE(m.IsKnownOffsetFrom(l)); |
|
247 uint64_t d; |
|
248 EXPECT_TRUE(m.IsKnownOffsetFrom(l, &d)); |
|
249 EXPECT_EQ(0xf51e94e00d6e3c84ULL, d); |
|
250 EXPECT_FALSE(m.IsKnownConstant()); |
|
251 } |
|
252 |
|
253 TEST(Addition, KnownLabelConstant) { |
|
254 Label l, m; |
|
255 l = 0x16286307042ce0d8ULL; |
|
256 m = l + 0x3fdddd91306719d7ULL; |
|
257 EXPECT_TRUE(m.IsKnownOffsetFrom(l)); |
|
258 uint64_t d; |
|
259 EXPECT_TRUE(m.IsKnownOffsetFrom(l, &d)); |
|
260 EXPECT_EQ(0x3fdddd91306719d7ULL, d); |
|
261 EXPECT_TRUE(m.IsKnownConstant()); |
|
262 EXPECT_EQ(0x16286307042ce0d8ULL + 0x3fdddd91306719d7ULL, m.Value()); |
|
263 } |
|
264 |
|
265 TEST(Addition, ConstantKnownLabel) { |
|
266 Label l, m; |
|
267 l = 0x50f62d0cdd1031deULL; |
|
268 m = 0x1b13462d8577c538ULL + l; |
|
269 EXPECT_TRUE(m.IsKnownOffsetFrom(l)); |
|
270 uint64_t d; |
|
271 EXPECT_TRUE(m.IsKnownOffsetFrom(l, &d)); |
|
272 EXPECT_EQ(0x1b13462d8577c538ULL, d); |
|
273 EXPECT_TRUE(m.IsKnownConstant()); |
|
274 EXPECT_EQ(0x50f62d0cdd1031deULL + 0x1b13462d8577c538ULL, m.Value()); |
|
275 } |
|
276 |
|
277 TEST(Subtraction, LabelConstant) { |
|
278 Label l, m; |
|
279 m = l - 0x0620884d21d3138eULL; |
|
280 EXPECT_TRUE(m.IsKnownOffsetFrom(l)); |
|
281 uint64_t d; |
|
282 EXPECT_TRUE(m.IsKnownOffsetFrom(l, &d)); |
|
283 EXPECT_EQ(-0x0620884d21d3138eULL, d); |
|
284 EXPECT_FALSE(m.IsKnownConstant()); |
|
285 } |
|
286 |
|
287 TEST(Subtraction, KnownLabelConstant) { |
|
288 Label l, m; |
|
289 l = 0x6237fbaf9ef7929eULL; |
|
290 m = l - 0x317730995d2ab6eeULL; |
|
291 EXPECT_TRUE(m.IsKnownOffsetFrom(l)); |
|
292 uint64_t d; |
|
293 EXPECT_TRUE(m.IsKnownOffsetFrom(l, &d)); |
|
294 EXPECT_EQ(-0x317730995d2ab6eeULL, d); |
|
295 EXPECT_TRUE(m.IsKnownConstant()); |
|
296 EXPECT_EQ(0x6237fbaf9ef7929eULL - 0x317730995d2ab6eeULL, m.Value()); |
|
297 } |
|
298 |
|
299 TEST(SubtractionDeathTest, LabelLabel) { |
|
300 Label l, m; |
|
301 ASSERT_DEATH(l - m, "IsKnownOffsetFrom\\(label, &offset\\)"); |
|
302 } |
|
303 |
|
304 TEST(Subtraction, LabelLabel) { |
|
305 Label l, m; |
|
306 l = m + 0x7fa77ec63e28a17aULL; |
|
307 EXPECT_EQ(0x7fa77ec63e28a17aULL, l - m); |
|
308 EXPECT_EQ(-0x7fa77ec63e28a17aULL, m - l); |
|
309 } |
|
310 |
|
311 TEST(IsKnownConstant, Undefined) { |
|
312 Label l; |
|
313 EXPECT_FALSE(l.IsKnownConstant()); |
|
314 } |
|
315 |
|
316 TEST(IsKnownConstant, RelatedLabel) { |
|
317 Label l, m; |
|
318 l = m; |
|
319 EXPECT_FALSE(l.IsKnownConstant()); |
|
320 EXPECT_FALSE(m.IsKnownConstant()); |
|
321 } |
|
322 |
|
323 TEST(IsKnownConstant, Constant) { |
|
324 Label l; |
|
325 l = 0xf374b1bdd6a22576ULL; |
|
326 EXPECT_TRUE(l.IsKnownConstant()); |
|
327 } |
|
328 |
|
329 TEST(IsKnownOffsetFrom, Unrelated) { |
|
330 Label l, m; |
|
331 EXPECT_FALSE(l.IsKnownOffsetFrom(m)); |
|
332 } |
|
333 |
|
334 TEST(IsKnownOffsetFrom, Related) { |
|
335 Label l, m; |
|
336 l = m; |
|
337 EXPECT_TRUE(l.IsKnownOffsetFrom(m)); |
|
338 } |
|
339 |
|
340 // Test the construction of chains of related labels, and the |
|
341 // propagation of values through them. |
|
342 // |
|
343 // Although the relations between labels are supposed to behave |
|
344 // symmetrically --- that is, 'a = b' should put a and b in |
|
345 // indistinguishable states --- there's a distinction made internally |
|
346 // between the target (a) and the source (b). |
|
347 // |
|
348 // So there are five test axes to cover: |
|
349 // |
|
350 // - Do we construct the chain with assignment ("Assign") or with constructors |
|
351 // ("Construct")? |
|
352 // |
|
353 // - Do we set the value of the label at the start of the chain |
|
354 // ("Start") or the label at the end ("End")? |
|
355 // |
|
356 // - Are we testing the propagation of a relationship between variable |
|
357 // values ("Relation"), or the propagation of a known constant value |
|
358 // ("Value")? |
|
359 // |
|
360 // - Do we set the value before building the chain ("Before") or after |
|
361 // the chain has been built ("After")? |
|
362 // |
|
363 // - Do we add new relationships to the end of the existing chain |
|
364 // ("Forward") or to the beginning ("Backward")? |
|
365 // |
|
366 // Of course, "Construct" and "Backward" can't be combined, which |
|
367 // eliminates eight combinations, and "Construct", "End", and "Before" |
|
368 // can't be combined, which eliminates two more, so there are are 22 |
|
369 // combinations, not 32. |
|
370 |
|
371 TEST(LabelChain, AssignStartRelationBeforeForward) { |
|
372 Label a, b, c, d; |
|
373 Label x; |
|
374 a = x; |
|
375 b = a + 0x1; |
|
376 c = b + 0x10; |
|
377 d = c + 0x100; |
|
378 EXPECT_EQ(0x111U, d-x); |
|
379 EXPECT_EQ(0x11U, c-x); |
|
380 EXPECT_EQ(0x1U, b-x); |
|
381 EXPECT_EQ(0U, a-x); |
|
382 } |
|
383 |
|
384 TEST(LabelChain, AssignStartRelationBeforeBackward) { |
|
385 Label a, b, c, d; |
|
386 Label x; |
|
387 a = x; |
|
388 d = c + 0x100; |
|
389 c = b + 0x10; |
|
390 b = a + 0x1; |
|
391 EXPECT_EQ(0x111U, d-x); |
|
392 EXPECT_EQ(0x11U, c-x); |
|
393 EXPECT_EQ(0x1U, b-x); |
|
394 EXPECT_EQ(0U, a-x); |
|
395 } |
|
396 |
|
397 TEST(LabelChain, AssignStartRelationAfterForward) { |
|
398 Label a, b, c, d; |
|
399 Label x; |
|
400 b = a + 0x1; |
|
401 c = b + 0x10; |
|
402 d = c + 0x100; |
|
403 a = x; |
|
404 EXPECT_EQ(0x111U, d-x); |
|
405 EXPECT_EQ(0x11U, c-x); |
|
406 EXPECT_EQ(0x1U, b-x); |
|
407 EXPECT_EQ(0U, a-x); |
|
408 } |
|
409 |
|
410 TEST(LabelChain, AssignStartRelationAfterBackward) { |
|
411 Label a, b, c, d; |
|
412 Label x; |
|
413 d = c + 0x100; |
|
414 c = b + 0x10; |
|
415 b = a + 0x1; |
|
416 a = x; |
|
417 EXPECT_EQ(0x111U, d-x); |
|
418 EXPECT_EQ(0x11U, c-x); |
|
419 EXPECT_EQ(0x1U, b-x); |
|
420 EXPECT_EQ(0U, a-x); |
|
421 } |
|
422 |
|
423 TEST(LabelChain, AssignStartValueBeforeForward) { |
|
424 Label a, b, c, d; |
|
425 a = 0xa131200190546ac2ULL; |
|
426 b = a + 0x1; |
|
427 c = b + 0x10; |
|
428 d = c + 0x100; |
|
429 EXPECT_EQ(0xa131200190546ac2ULL + 0x111U, d.Value()); |
|
430 EXPECT_EQ(0xa131200190546ac2ULL + 0x11U, c.Value()); |
|
431 EXPECT_EQ(0xa131200190546ac2ULL + 0x1U, b.Value()); |
|
432 EXPECT_EQ(0xa131200190546ac2ULL + 0U, a.Value()); |
|
433 } |
|
434 |
|
435 TEST(LabelChain, AssignStartValueBeforeBackward) { |
|
436 Label a, b, c, d; |
|
437 a = 0x8da17e1670ad4fa2ULL; |
|
438 d = c + 0x100; |
|
439 c = b + 0x10; |
|
440 b = a + 0x1; |
|
441 EXPECT_EQ(0x8da17e1670ad4fa2ULL + 0x111U, d.Value()); |
|
442 EXPECT_EQ(0x8da17e1670ad4fa2ULL + 0x11U, c.Value()); |
|
443 EXPECT_EQ(0x8da17e1670ad4fa2ULL + 0x1U, b.Value()); |
|
444 EXPECT_EQ(0x8da17e1670ad4fa2ULL + 0U, a.Value()); |
|
445 } |
|
446 |
|
447 TEST(LabelChain, AssignStartValueAfterForward) { |
|
448 Label a, b, c, d; |
|
449 b = a + 0x1; |
|
450 c = b + 0x10; |
|
451 d = c + 0x100; |
|
452 a = 0x99b8f51bafd41adaULL; |
|
453 EXPECT_EQ(0x99b8f51bafd41adaULL + 0x111U, d.Value()); |
|
454 EXPECT_EQ(0x99b8f51bafd41adaULL + 0x11U, c.Value()); |
|
455 EXPECT_EQ(0x99b8f51bafd41adaULL + 0x1U, b.Value()); |
|
456 EXPECT_EQ(0x99b8f51bafd41adaULL + 0U, a.Value()); |
|
457 } |
|
458 |
|
459 TEST(LabelChain, AssignStartValueAfterBackward) { |
|
460 Label a, b, c, d; |
|
461 d = c + 0x100; |
|
462 c = b + 0x10; |
|
463 b = a + 0x1; |
|
464 a = 0xc86ca1d97ab5df6eULL; |
|
465 EXPECT_EQ(0xc86ca1d97ab5df6eULL + 0x111U, d.Value()); |
|
466 EXPECT_EQ(0xc86ca1d97ab5df6eULL + 0x11U, c.Value()); |
|
467 EXPECT_EQ(0xc86ca1d97ab5df6eULL + 0x1U, b.Value()); |
|
468 EXPECT_EQ(0xc86ca1d97ab5df6eULL + 0U, a.Value()); |
|
469 } |
|
470 |
|
471 TEST(LabelChain, AssignEndRelationBeforeForward) { |
|
472 Label a, b, c, d; |
|
473 Label x; |
|
474 x = d; |
|
475 b = a + 0x1; |
|
476 c = b + 0x10; |
|
477 d = c + 0x100; |
|
478 EXPECT_EQ(-(uint64_t)0x111U, a-x); |
|
479 EXPECT_EQ(-(uint64_t)0x110U, b-x); |
|
480 EXPECT_EQ(-(uint64_t)0x100U, c-x); |
|
481 EXPECT_EQ(-(uint64_t)0U, d-x); |
|
482 } |
|
483 |
|
484 TEST(LabelChain, AssignEndRelationBeforeBackward) { |
|
485 Label a, b, c, d; |
|
486 Label x; |
|
487 x = d; |
|
488 d = c + 0x100; |
|
489 c = b + 0x10; |
|
490 b = a + 0x1; |
|
491 EXPECT_EQ(-(uint64_t)0x111U, a-x); |
|
492 EXPECT_EQ(-(uint64_t)0x110U, b-x); |
|
493 EXPECT_EQ(-(uint64_t)0x100U, c-x); |
|
494 EXPECT_EQ(-(uint64_t)0U, d-x); |
|
495 } |
|
496 |
|
497 TEST(LabelChain, AssignEndRelationAfterForward) { |
|
498 Label a, b, c, d; |
|
499 Label x; |
|
500 b = a + 0x1; |
|
501 c = b + 0x10; |
|
502 d = c + 0x100; |
|
503 x = d; |
|
504 EXPECT_EQ(-(uint64_t)0x111U, a-x); |
|
505 EXPECT_EQ(-(uint64_t)0x110U, b-x); |
|
506 EXPECT_EQ(-(uint64_t)0x100U, c-x); |
|
507 EXPECT_EQ(-(uint64_t)0x000U, d-x); |
|
508 } |
|
509 |
|
510 TEST(LabelChain, AssignEndRelationAfterBackward) { |
|
511 Label a, b, c, d; |
|
512 Label x; |
|
513 d = c + 0x100; |
|
514 c = b + 0x10; |
|
515 b = a + 0x1; |
|
516 x = d; |
|
517 EXPECT_EQ(-(uint64_t)0x111U, a-x); |
|
518 EXPECT_EQ(-(uint64_t)0x110U, b-x); |
|
519 EXPECT_EQ(-(uint64_t)0x100U, c-x); |
|
520 EXPECT_EQ(-(uint64_t)0x000U, d-x); |
|
521 } |
|
522 |
|
523 TEST(LabelChain, AssignEndValueBeforeForward) { |
|
524 Label a, b, c, d; |
|
525 d = 0xa131200190546ac2ULL; |
|
526 b = a + 0x1; |
|
527 c = b + 0x10; |
|
528 d = c + 0x100; |
|
529 EXPECT_EQ(0xa131200190546ac2ULL - 0x111, a.Value()); |
|
530 EXPECT_EQ(0xa131200190546ac2ULL - 0x110, b.Value()); |
|
531 EXPECT_EQ(0xa131200190546ac2ULL - 0x100, c.Value()); |
|
532 EXPECT_EQ(0xa131200190546ac2ULL - 0x000, d.Value()); |
|
533 } |
|
534 |
|
535 TEST(LabelChain, AssignEndValueBeforeBackward) { |
|
536 Label a, b, c, d; |
|
537 d = 0x8da17e1670ad4fa2ULL; |
|
538 d = c + 0x100; |
|
539 c = b + 0x10; |
|
540 b = a + 0x1; |
|
541 EXPECT_EQ(0x8da17e1670ad4fa2ULL - 0x111, a.Value()); |
|
542 EXPECT_EQ(0x8da17e1670ad4fa2ULL - 0x110, b.Value()); |
|
543 EXPECT_EQ(0x8da17e1670ad4fa2ULL - 0x100, c.Value()); |
|
544 EXPECT_EQ(0x8da17e1670ad4fa2ULL - 0x000, d.Value()); |
|
545 } |
|
546 |
|
547 TEST(LabelChain, AssignEndValueAfterForward) { |
|
548 Label a, b, c, d; |
|
549 b = a + 0x1; |
|
550 c = b + 0x10; |
|
551 d = c + 0x100; |
|
552 d = 0x99b8f51bafd41adaULL; |
|
553 EXPECT_EQ(0x99b8f51bafd41adaULL - 0x111, a.Value()); |
|
554 EXPECT_EQ(0x99b8f51bafd41adaULL - 0x110, b.Value()); |
|
555 EXPECT_EQ(0x99b8f51bafd41adaULL - 0x100, c.Value()); |
|
556 EXPECT_EQ(0x99b8f51bafd41adaULL - 0x000, d.Value()); |
|
557 } |
|
558 |
|
559 TEST(LabelChain, AssignEndValueAfterBackward) { |
|
560 Label a, b, c, d; |
|
561 d = c + 0x100; |
|
562 c = b + 0x10; |
|
563 b = a + 0x1; |
|
564 d = 0xc86ca1d97ab5df6eULL; |
|
565 EXPECT_EQ(0xc86ca1d97ab5df6eULL - 0x111, a.Value()); |
|
566 EXPECT_EQ(0xc86ca1d97ab5df6eULL - 0x110, b.Value()); |
|
567 EXPECT_EQ(0xc86ca1d97ab5df6eULL - 0x100, c.Value()); |
|
568 EXPECT_EQ(0xc86ca1d97ab5df6eULL - 0x000, d.Value()); |
|
569 } |
|
570 |
|
571 TEST(LabelChain, ConstructStartRelationBeforeForward) { |
|
572 Label x; |
|
573 Label a(x); |
|
574 Label b(a + 0x1); |
|
575 Label c(b + 0x10); |
|
576 Label d(c + 0x100); |
|
577 EXPECT_EQ(0x111U, d-x); |
|
578 EXPECT_EQ(0x11U, c-x); |
|
579 EXPECT_EQ(0x1U, b-x); |
|
580 EXPECT_EQ(0U, a-x); |
|
581 } |
|
582 |
|
583 TEST(LabelChain, ConstructStartRelationAfterForward) { |
|
584 Label x; |
|
585 Label a; |
|
586 Label b(a + 0x1); |
|
587 Label c(b + 0x10); |
|
588 Label d(c + 0x100); |
|
589 a = x; |
|
590 EXPECT_EQ(0x111U, d-x); |
|
591 EXPECT_EQ(0x11U, c-x); |
|
592 EXPECT_EQ(0x1U, b-x); |
|
593 EXPECT_EQ(0U, a-x); |
|
594 } |
|
595 |
|
596 TEST(LabelChain, ConstructStartValueBeforeForward) { |
|
597 Label a(0x5d234d177d01ccc8ULL); |
|
598 Label b(a + 0x1); |
|
599 Label c(b + 0x10); |
|
600 Label d(c + 0x100); |
|
601 EXPECT_EQ(0x5d234d177d01ccc8ULL + 0x111U, d.Value()); |
|
602 EXPECT_EQ(0x5d234d177d01ccc8ULL + 0x011U, c.Value()); |
|
603 EXPECT_EQ(0x5d234d177d01ccc8ULL + 0x001U, b.Value()); |
|
604 EXPECT_EQ(0x5d234d177d01ccc8ULL + 0x000U, a.Value()); |
|
605 } |
|
606 |
|
607 TEST(LabelChain, ConstructStartValueAfterForward) { |
|
608 Label a; |
|
609 Label b(a + 0x1); |
|
610 Label c(b + 0x10); |
|
611 Label d(c + 0x100); |
|
612 a = 0xded85d54586e84fcULL; |
|
613 EXPECT_EQ(0xded85d54586e84fcULL + 0x111U, d.Value()); |
|
614 EXPECT_EQ(0xded85d54586e84fcULL + 0x011U, c.Value()); |
|
615 EXPECT_EQ(0xded85d54586e84fcULL + 0x001U, b.Value()); |
|
616 EXPECT_EQ(0xded85d54586e84fcULL + 0x000U, a.Value()); |
|
617 } |
|
618 |
|
619 TEST(LabelChain, ConstructEndRelationAfterForward) { |
|
620 Label x; |
|
621 Label a; |
|
622 Label b(a + 0x1); |
|
623 Label c(b + 0x10); |
|
624 Label d(c + 0x100); |
|
625 x = d; |
|
626 EXPECT_EQ(-(uint64_t)0x111U, a-x); |
|
627 EXPECT_EQ(-(uint64_t)0x110U, b-x); |
|
628 EXPECT_EQ(-(uint64_t)0x100U, c-x); |
|
629 EXPECT_EQ(-(uint64_t)0x000U, d-x); |
|
630 } |
|
631 |
|
632 TEST(LabelChain, ConstructEndValueAfterForward) { |
|
633 Label a; |
|
634 Label b(a + 0x1); |
|
635 Label c(b + 0x10); |
|
636 Label d(c + 0x100); |
|
637 d = 0x99b8f51bafd41adaULL; |
|
638 EXPECT_EQ(0x99b8f51bafd41adaULL - 0x111, a.Value()); |
|
639 EXPECT_EQ(0x99b8f51bafd41adaULL - 0x110, b.Value()); |
|
640 EXPECT_EQ(0x99b8f51bafd41adaULL - 0x100, c.Value()); |
|
641 EXPECT_EQ(0x99b8f51bafd41adaULL - 0x000, d.Value()); |
|
642 } |
|
643 |
|
644 TEST(LabelTree, KnownValue) { |
|
645 Label l, m, n, o, p; |
|
646 l = m; |
|
647 m = n; |
|
648 o = p; |
|
649 p = n; |
|
650 l = 0x536b5de3d468a1b5ULL; |
|
651 EXPECT_EQ(0x536b5de3d468a1b5ULL, o.Value()); |
|
652 } |
|
653 |
|
654 TEST(LabelTree, Related) { |
|
655 Label l, m, n, o, p; |
|
656 l = m - 1; |
|
657 m = n - 10; |
|
658 o = p + 100; |
|
659 p = n + 1000; |
|
660 EXPECT_EQ(1111U, o - l); |
|
661 } |
|
662 |
|
663 TEST(EquationDeathTest, EqualConstants) { |
|
664 Label m = 0x0d3962f280f07d24ULL; |
|
665 Label n = 0x0d3962f280f07d24ULL; |
|
666 m = n; // no death expected |
|
667 } |
|
668 |
|
669 TEST(EquationDeathTest, EqualIndirectConstants) { |
|
670 Label m = 0xa347f1e5238fe6a1ULL; |
|
671 Label n; |
|
672 Label o = n; |
|
673 n = 0xa347f1e5238fe6a1ULL; |
|
674 n = m; // no death expected |
|
675 } |
|
676 |
|
677 TEST(EquationDeathTest, ConstantClash) { |
|
678 Label m = 0xd4cc0f4f630ec741ULL; |
|
679 Label n = 0x934cd2d8254fc3eaULL; |
|
680 ASSERT_DEATH(m = n, "addend_ == addend"); |
|
681 } |
|
682 |
|
683 TEST(EquationDeathTest, IndirectConstantClash) { |
|
684 Label m = 0xd4cc0f4f630ec741ULL; |
|
685 Label n, o; |
|
686 n = o; |
|
687 o = 0xcfbe3b83ac49ce86ULL; |
|
688 ASSERT_DEATH(m = n, "addend_ == addend"); |
|
689 } |
|
690 |
|
691 // Assigning to a related label may free the next Binding on its |
|
692 // chain. This test always passes; it is interesting to memory |
|
693 // checkers and coverage analysis. |
|
694 TEST(LabelReferenceCount, AssignmentFree) { |
|
695 Label l; |
|
696 { |
|
697 Label m; |
|
698 l = m; |
|
699 } |
|
700 // This should free m's Binding. |
|
701 l = 0xca8bae92f0376d4fULL; |
|
702 ASSERT_EQ(0xca8bae92f0376d4fULL, l.Value()); |
|
703 } |
|
704 |
|
705 // Finding the value of a label may free the Binding it refers to. This test |
|
706 // always passes; it is interesting to memory checkers and coverage analysis. |
|
707 TEST(LabelReferenceCount, FindValueFree) { |
|
708 Label l; |
|
709 { |
|
710 Label m, n; |
|
711 l = m; |
|
712 m = n; |
|
713 n = 0x7a0b0c576672daafULL; |
|
714 // At this point, l's Binding refers to m's Binding, which refers |
|
715 // to n's binding. |
|
716 } |
|
717 // Now, l is the only reference keeping the three Bindings alive. |
|
718 // Resolving its value should free l's and m's original bindings. |
|
719 ASSERT_EQ(0x7a0b0c576672daafULL, l.Value()); |
|
720 } |
|
721 |
|
722 TEST(ConstructSection, Simple) { |
|
723 Section s; |
|
724 } |
|
725 |
|
726 TEST(ConstructSection, WithEndian) { |
|
727 Section s(kBigEndian); |
|
728 } |
|
729 |
|
730 // A fixture class for TestAssembler::Section tests. |
|
731 class SectionFixture { |
|
732 public: |
|
733 Section section; |
|
734 string contents; |
|
735 static const uint8_t data[]; |
|
736 static const size_t data_size; |
|
737 }; |
|
738 |
|
739 const uint8_t SectionFixture::data[] = { |
|
740 0x87, 0x4f, 0x43, 0x67, 0x30, 0xd0, 0xd4, 0x0e |
|
741 }; |
|
742 |
|
743 #define I0() |
|
744 #define I1(a) { a } |
|
745 #define I2(a,b) { a,b } |
|
746 #define I3(a,b,c) { a,b,c } |
|
747 #define I4(a,b,c,d) { a,b,c,d } |
|
748 #define I5(a,b,c,d,e) { a,b,c,d,e } |
|
749 #define I6(a,b,c,d,e,f) { a,b,c,d,e,f } |
|
750 #define I7(a,b,c,d,e,f,g) { a,b,c,d,e,f,g } |
|
751 #define I8(a,b,c,d,e,f,g,h) { a,b,c,d,e,f,g,h } |
|
752 #define I9(a,b,c,d,e,f,g,h,i) { a,b,c,d,e,f,g,h,i } |
|
753 #define ASSERT_BYTES(s, b) \ |
|
754 do \ |
|
755 { \ |
|
756 static const uint8_t expected_bytes[] = b; \ |
|
757 ASSERT_EQ(sizeof(expected_bytes), s.size()); \ |
|
758 ASSERT_TRUE(memcmp(s.data(), (const char *) expected_bytes, \ |
|
759 sizeof(expected_bytes)) == 0); \ |
|
760 } \ |
|
761 while(0) |
|
762 |
|
763 class Append: public SectionFixture, public Test { }; |
|
764 |
|
765 TEST_F(Append, Bytes) { |
|
766 section.Append(data, sizeof(data)); |
|
767 ASSERT_TRUE(section.GetContents(&contents)); |
|
768 ASSERT_EQ(sizeof(data), contents.size()); |
|
769 EXPECT_TRUE(0 == memcmp(contents.data(), (const char *) data, sizeof(data))); |
|
770 } |
|
771 |
|
772 TEST_F(Append, BytesTwice) { |
|
773 section.Append(data, sizeof(data)); |
|
774 section.Append(data, sizeof(data)); |
|
775 ASSERT_TRUE(section.GetContents(&contents)); |
|
776 ASSERT_EQ(2 * sizeof(data), contents.size()); |
|
777 ASSERT_TRUE(0 == memcmp(contents.data(), (const char *) data, sizeof(data))); |
|
778 ASSERT_TRUE(0 == memcmp(contents.data() + sizeof(data), |
|
779 (const char *) data, sizeof(data))); |
|
780 } |
|
781 |
|
782 TEST_F(Append, String) { |
|
783 string s1 = "howdy "; |
|
784 string s2 = "there"; |
|
785 section.Append(s1); |
|
786 section.Append(s2); |
|
787 ASSERT_TRUE(section.GetContents(&contents)); |
|
788 ASSERT_STREQ(contents.c_str(), "howdy there"); |
|
789 } |
|
790 |
|
791 TEST_F(Append, CString) { |
|
792 section.AppendCString("howdy"); |
|
793 section.AppendCString(""); |
|
794 section.AppendCString("there"); |
|
795 ASSERT_TRUE(section.GetContents(&contents)); |
|
796 ASSERT_EQ(string("howdy\0\0there\0", 13), contents); |
|
797 } |
|
798 |
|
799 TEST_F(Append, CStringSize) { |
|
800 section.AppendCString("howdy", 3); |
|
801 section.AppendCString("there", 5); |
|
802 section.AppendCString("fred", 6); |
|
803 section.AppendCString("natalie", 0); |
|
804 section.AppendCString("", 10); |
|
805 ASSERT_TRUE(section.GetContents(&contents)); |
|
806 ASSERT_EQ(string("howtherefred\0\0\0\0\0\0\0\0\0\0\0\0", 24), contents); |
|
807 } |
|
808 |
|
809 TEST_F(Append, RepeatedBytes) { |
|
810 section.Append((size_t) 10, '*'); |
|
811 ASSERT_TRUE(section.GetContents(&contents)); |
|
812 ASSERT_STREQ(contents.c_str(), "**********"); |
|
813 } |
|
814 |
|
815 TEST_F(Append, GeneralLE1) { |
|
816 section.Append(kLittleEndian, 1, 42); |
|
817 ASSERT_TRUE(section.GetContents(&contents)); |
|
818 ASSERT_BYTES(contents, I1(42)); |
|
819 } |
|
820 |
|
821 TEST_F(Append, GeneralLE2) { |
|
822 section.Append(kLittleEndian, 2, 0x15a1); |
|
823 ASSERT_TRUE(section.GetContents(&contents)); |
|
824 ASSERT_BYTES(contents, I2(0xa1, 0x15)); |
|
825 } |
|
826 |
|
827 TEST_F(Append, GeneralLE3) { |
|
828 section.Append(kLittleEndian, 3, 0x59ae8d); |
|
829 ASSERT_TRUE(section.GetContents(&contents)); |
|
830 ASSERT_BYTES(contents, I3(0x8d, 0xae, 0x59)); |
|
831 } |
|
832 |
|
833 TEST_F(Append, GeneralLE4) { |
|
834 section.Append(kLittleEndian, 4, 0x51603c56); |
|
835 ASSERT_TRUE(section.GetContents(&contents)); |
|
836 ASSERT_BYTES(contents, I4(0x56, 0x3c, 0x60, 0x51)); |
|
837 } |
|
838 |
|
839 TEST_F(Append, GeneralLE5) { |
|
840 section.Append(kLittleEndian, 5, 0x385e2803b4ULL); |
|
841 ASSERT_TRUE(section.GetContents(&contents)); |
|
842 ASSERT_BYTES(contents, I5(0xb4, 0x03, 0x28, 0x5e, 0x38)); |
|
843 } |
|
844 |
|
845 TEST_F(Append, GeneralLE6) { |
|
846 section.Append(kLittleEndian, 6, 0xc7db9534dd1fULL); |
|
847 ASSERT_TRUE(section.GetContents(&contents)); |
|
848 ASSERT_BYTES(contents, I6(0x1f, 0xdd, 0x34, 0x95, 0xdb, 0xc7)); |
|
849 } |
|
850 |
|
851 TEST_F(Append, GeneralLE7) { |
|
852 section.Append(kLittleEndian, 7, 0x1445c9f1b843e6ULL); |
|
853 ASSERT_TRUE(section.GetContents(&contents)); |
|
854 ASSERT_BYTES(contents, I7(0xe6, 0x43, 0xb8, 0xf1, 0xc9, 0x45, 0x14)); |
|
855 } |
|
856 |
|
857 TEST_F(Append, GeneralLE8) { |
|
858 section.Append(kLittleEndian, 8, 0xaf48019dfe5c01e5ULL); |
|
859 ASSERT_TRUE(section.GetContents(&contents)); |
|
860 ASSERT_BYTES(contents, I8(0xe5, 0x01, 0x5c, 0xfe, 0x9d, 0x01, 0x48, 0xaf)); |
|
861 } |
|
862 |
|
863 TEST_F(Append, GeneralBE1) { |
|
864 section.Append(kBigEndian, 1, 0xd0ULL); |
|
865 ASSERT_TRUE(section.GetContents(&contents)); |
|
866 ASSERT_BYTES(contents, I1(0xd0)); |
|
867 } |
|
868 |
|
869 TEST_F(Append, GeneralBE2) { |
|
870 section.Append(kBigEndian, 2, 0x2e7eULL); |
|
871 ASSERT_TRUE(section.GetContents(&contents)); |
|
872 ASSERT_BYTES(contents, I2(0x2e, 0x7e)); |
|
873 } |
|
874 |
|
875 TEST_F(Append, GeneralBE3) { |
|
876 section.Append(kBigEndian, 3, 0x37dad6ULL); |
|
877 ASSERT_TRUE(section.GetContents(&contents)); |
|
878 ASSERT_BYTES(contents, I3(0x37, 0xda, 0xd6)); |
|
879 } |
|
880 |
|
881 TEST_F(Append, GeneralBE4) { |
|
882 section.Append(kBigEndian, 4, 0x715935c7ULL); |
|
883 ASSERT_TRUE(section.GetContents(&contents)); |
|
884 ASSERT_BYTES(contents, I4(0x71, 0x59, 0x35, 0xc7)); |
|
885 } |
|
886 |
|
887 TEST_F(Append, GeneralBE5) { |
|
888 section.Append(kBigEndian, 5, 0x42baeb02b7ULL); |
|
889 ASSERT_TRUE(section.GetContents(&contents)); |
|
890 ASSERT_BYTES(contents, I5(0x42, 0xba, 0xeb, 0x02, 0xb7)); |
|
891 } |
|
892 |
|
893 TEST_F(Append, GeneralBE6) { |
|
894 section.Append(kBigEndian, 6, 0xf1cdf10e7b18ULL); |
|
895 ASSERT_TRUE(section.GetContents(&contents)); |
|
896 ASSERT_BYTES(contents, I6(0xf1, 0xcd, 0xf1, 0x0e, 0x7b, 0x18)); |
|
897 } |
|
898 |
|
899 TEST_F(Append, GeneralBE7) { |
|
900 section.Append(kBigEndian, 7, 0xf50a724f0b0d20ULL); |
|
901 ASSERT_TRUE(section.GetContents(&contents)); |
|
902 ASSERT_BYTES(contents, I7(0xf5, 0x0a, 0x72, 0x4f, 0x0b, 0x0d, 0x20)); |
|
903 } |
|
904 |
|
905 TEST_F(Append, GeneralBE8) { |
|
906 section.Append(kBigEndian, 8, 0xa6b2cb5e98dc9c16ULL); |
|
907 ASSERT_TRUE(section.GetContents(&contents)); |
|
908 ASSERT_BYTES(contents, I8(0xa6, 0xb2, 0xcb, 0x5e, 0x98, 0xdc, 0x9c, 0x16)); |
|
909 } |
|
910 |
|
911 TEST_F(Append, GeneralLE1Label) { |
|
912 Label l; |
|
913 section.Append(kLittleEndian, 1, l); |
|
914 l = 42; |
|
915 ASSERT_TRUE(section.GetContents(&contents)); |
|
916 ASSERT_BYTES(contents, I1(42)); |
|
917 } |
|
918 |
|
919 TEST_F(Append, GeneralLE2Label) { |
|
920 Label l; |
|
921 section.Append(kLittleEndian, 2, l); |
|
922 l = 0x15a1; |
|
923 ASSERT_TRUE(section.GetContents(&contents)); |
|
924 ASSERT_BYTES(contents, I2(0xa1, 0x15)); |
|
925 } |
|
926 |
|
927 TEST_F(Append, GeneralLE3Label) { |
|
928 Label l; |
|
929 section.Append(kLittleEndian, 3, l); |
|
930 l = 0x59ae8d; |
|
931 ASSERT_TRUE(section.GetContents(&contents)); |
|
932 ASSERT_BYTES(contents, I3(0x8d, 0xae, 0x59)); |
|
933 } |
|
934 |
|
935 TEST_F(Append, GeneralLE4Label) { |
|
936 Label l; |
|
937 section.Append(kLittleEndian, 4, l); |
|
938 l = 0x51603c56; |
|
939 ASSERT_TRUE(section.GetContents(&contents)); |
|
940 ASSERT_BYTES(contents, I4(0x56, 0x3c, 0x60, 0x51)); |
|
941 } |
|
942 |
|
943 TEST_F(Append, GeneralLE5Label) { |
|
944 Label l; |
|
945 section.Append(kLittleEndian, 5, l); |
|
946 l = 0x385e2803b4ULL; |
|
947 ASSERT_TRUE(section.GetContents(&contents)); |
|
948 ASSERT_BYTES(contents, I5(0xb4, 0x03, 0x28, 0x5e, 0x38)); |
|
949 } |
|
950 |
|
951 TEST_F(Append, GeneralLE6Label) { |
|
952 Label l; |
|
953 section.Append(kLittleEndian, 6, l); |
|
954 l = 0xc7db9534dd1fULL; |
|
955 ASSERT_TRUE(section.GetContents(&contents)); |
|
956 ASSERT_BYTES(contents, I6(0x1f, 0xdd, 0x34, 0x95, 0xdb, 0xc7)); |
|
957 } |
|
958 |
|
959 TEST_F(Append, GeneralLE7Label) { |
|
960 Label l; |
|
961 section.Append(kLittleEndian, 7, l); |
|
962 l = 0x1445c9f1b843e6ULL; |
|
963 ASSERT_TRUE(section.GetContents(&contents)); |
|
964 ASSERT_BYTES(contents, I7(0xe6, 0x43, 0xb8, 0xf1, 0xc9, 0x45, 0x14)); |
|
965 } |
|
966 |
|
967 TEST_F(Append, GeneralLE8Label) { |
|
968 Label l; |
|
969 section.Append(kLittleEndian, 8, l); |
|
970 l = 0xaf48019dfe5c01e5ULL; |
|
971 ASSERT_TRUE(section.GetContents(&contents)); |
|
972 ASSERT_BYTES(contents, I8(0xe5, 0x01, 0x5c, 0xfe, 0x9d, 0x01, 0x48, 0xaf)); |
|
973 } |
|
974 |
|
975 TEST_F(Append, GeneralBE1Label) { |
|
976 Label l; |
|
977 section.Append(kBigEndian, 1, l); |
|
978 l = 0xd0ULL; |
|
979 ASSERT_TRUE(section.GetContents(&contents)); |
|
980 ASSERT_BYTES(contents, I1(0xd0)); |
|
981 } |
|
982 |
|
983 TEST_F(Append, GeneralBE2Label) { |
|
984 Label l; |
|
985 section.Append(kBigEndian, 2, l); |
|
986 l = 0x2e7eULL; |
|
987 ASSERT_TRUE(section.GetContents(&contents)); |
|
988 ASSERT_BYTES(contents, I2(0x2e, 0x7e)); |
|
989 } |
|
990 |
|
991 TEST_F(Append, GeneralBE3Label) { |
|
992 Label l; |
|
993 section.Append(kBigEndian, 3, l); |
|
994 l = 0x37dad6ULL; |
|
995 ASSERT_TRUE(section.GetContents(&contents)); |
|
996 ASSERT_BYTES(contents, I3(0x37, 0xda, 0xd6)); |
|
997 } |
|
998 |
|
999 TEST_F(Append, GeneralBE4Label) { |
|
1000 Label l; |
|
1001 section.Append(kBigEndian, 4, l); |
|
1002 l = 0x715935c7ULL; |
|
1003 ASSERT_TRUE(section.GetContents(&contents)); |
|
1004 ASSERT_BYTES(contents, I4(0x71, 0x59, 0x35, 0xc7)); |
|
1005 } |
|
1006 |
|
1007 TEST_F(Append, GeneralBE5Label) { |
|
1008 Label l; |
|
1009 section.Append(kBigEndian, 5, l); |
|
1010 l = 0x42baeb02b7ULL; |
|
1011 ASSERT_TRUE(section.GetContents(&contents)); |
|
1012 ASSERT_BYTES(contents, I5(0x42, 0xba, 0xeb, 0x02, 0xb7)); |
|
1013 } |
|
1014 |
|
1015 TEST_F(Append, GeneralBE6Label) { |
|
1016 Label l; |
|
1017 section.Append(kBigEndian, 6, l); |
|
1018 l = 0xf1cdf10e7b18ULL; |
|
1019 ASSERT_TRUE(section.GetContents(&contents)); |
|
1020 ASSERT_BYTES(contents, I6(0xf1, 0xcd, 0xf1, 0x0e, 0x7b, 0x18)); |
|
1021 } |
|
1022 |
|
1023 TEST_F(Append, GeneralBE7Label) { |
|
1024 Label l; |
|
1025 section.Append(kBigEndian, 7, l); |
|
1026 l = 0xf50a724f0b0d20ULL; |
|
1027 ASSERT_TRUE(section.GetContents(&contents)); |
|
1028 ASSERT_BYTES(contents, I7(0xf5, 0x0a, 0x72, 0x4f, 0x0b, 0x0d, 0x20)); |
|
1029 } |
|
1030 |
|
1031 TEST_F(Append, GeneralBE8Label) { |
|
1032 Label l; |
|
1033 section.Append(kBigEndian, 8, l); |
|
1034 l = 0xa6b2cb5e98dc9c16ULL; |
|
1035 ASSERT_TRUE(section.GetContents(&contents)); |
|
1036 ASSERT_BYTES(contents, I8(0xa6, 0xb2, 0xcb, 0x5e, 0x98, 0xdc, 0x9c, 0x16)); |
|
1037 } |
|
1038 |
|
1039 TEST_F(Append, B8) { |
|
1040 section.Append(1, 0x2a); |
|
1041 section.B8(0xd3U); |
|
1042 ASSERT_TRUE(section.GetContents(&contents)); |
|
1043 ASSERT_BYTES(contents, I2(0x2a, 0xd3)); |
|
1044 } |
|
1045 |
|
1046 TEST_F(Append, B8Label) { |
|
1047 Label l; |
|
1048 section.Append(1, 0x2a); |
|
1049 section.B8(l); |
|
1050 l = 0x4bU; |
|
1051 ASSERT_TRUE(section.GetContents(&contents)); |
|
1052 ASSERT_BYTES(contents, I2(0x2a, 0x4b)); |
|
1053 } |
|
1054 |
|
1055 TEST_F(Append, B16) { |
|
1056 section.Append(1, 0x2a); |
|
1057 section.B16(0x472aU); |
|
1058 ASSERT_TRUE(section.GetContents(&contents)); |
|
1059 ASSERT_BYTES(contents, I3(0x2a, 0x47, 0x2a)); |
|
1060 } |
|
1061 |
|
1062 TEST_F(Append, B16Label) { |
|
1063 Label l; |
|
1064 section.Append(1, 0x2a); |
|
1065 section.B16(l); |
|
1066 l = 0x55e8U; |
|
1067 ASSERT_TRUE(section.GetContents(&contents)); |
|
1068 ASSERT_BYTES(contents, I3(0x2a, 0x55, 0xe8)); |
|
1069 } |
|
1070 |
|
1071 TEST_F(Append, B32) { |
|
1072 section.Append(1, 0x2a); |
|
1073 section.B32(0xbd412cbcU); |
|
1074 ASSERT_TRUE(section.GetContents(&contents)); |
|
1075 ASSERT_BYTES(contents, I5(0x2a, 0xbd, 0x41, 0x2c, 0xbc)); |
|
1076 } |
|
1077 |
|
1078 TEST_F(Append, B32Label) { |
|
1079 Label l; |
|
1080 section.Append(1, 0x2a); |
|
1081 section.B32(l); |
|
1082 l = 0x208e37d5U; |
|
1083 ASSERT_TRUE(section.GetContents(&contents)); |
|
1084 ASSERT_BYTES(contents, I5(0x2a, 0x20, 0x8e, 0x37, 0xd5)); |
|
1085 } |
|
1086 |
|
1087 TEST_F(Append, B64) { |
|
1088 section.Append(1, 0x2a); |
|
1089 section.B64(0x3402a013111e68adULL); |
|
1090 ASSERT_TRUE(section.GetContents(&contents)); |
|
1091 ASSERT_BYTES(contents, |
|
1092 I9(0x2a, 0x34, 0x02, 0xa0, 0x13, 0x11, 0x1e, 0x68, 0xad)); |
|
1093 } |
|
1094 |
|
1095 TEST_F(Append, B64Label) { |
|
1096 Label l; |
|
1097 section.Append(1, 0x2a); |
|
1098 section.B64(l); |
|
1099 l = 0x355dbfbb4ac6d57fULL; |
|
1100 ASSERT_TRUE(section.GetContents(&contents)); |
|
1101 ASSERT_BYTES(contents, |
|
1102 I9(0x2a, 0x35, 0x5d, 0xbf, 0xbb, 0x4a, 0xc6, 0xd5, 0x7f)); |
|
1103 } |
|
1104 |
|
1105 TEST_F(Append, L8) { |
|
1106 section.Append(1, 0x2a); |
|
1107 section.L8(0x26U); |
|
1108 ASSERT_TRUE(section.GetContents(&contents)); |
|
1109 ASSERT_BYTES(contents, I2(0x2a, 0x26)); |
|
1110 } |
|
1111 |
|
1112 TEST_F(Append, L8Label) { |
|
1113 Label l; |
|
1114 section.Append(1, 0x2a); |
|
1115 section.L8(l); |
|
1116 l = 0xa8U; |
|
1117 ASSERT_TRUE(section.GetContents(&contents)); |
|
1118 ASSERT_BYTES(contents, I2(0x2a, 0xa8)); |
|
1119 } |
|
1120 |
|
1121 TEST_F(Append, L16) { |
|
1122 section.Append(1, 0x2a); |
|
1123 section.L16(0xca6dU); |
|
1124 ASSERT_TRUE(section.GetContents(&contents)); |
|
1125 ASSERT_BYTES(contents, I3(0x2a, 0x6d, 0xca)); |
|
1126 } |
|
1127 |
|
1128 TEST_F(Append, L16Label) { |
|
1129 Label l; |
|
1130 section.Append(1, 0x2a); |
|
1131 section.L16(l); |
|
1132 l = 0xd21fU; |
|
1133 ASSERT_TRUE(section.GetContents(&contents)); |
|
1134 ASSERT_BYTES(contents, I3(0x2a, 0x1f, 0xd2)); |
|
1135 } |
|
1136 |
|
1137 TEST_F(Append, L32) { |
|
1138 section.Append(1, 0x2a); |
|
1139 section.L32(0x558f6181U); |
|
1140 ASSERT_TRUE(section.GetContents(&contents)); |
|
1141 ASSERT_BYTES(contents, I5(0x2a, 0x81, 0x61, 0x8f, 0x55)); |
|
1142 } |
|
1143 |
|
1144 TEST_F(Append, L32Label) { |
|
1145 Label l; |
|
1146 section.Append(1, 0x2a); |
|
1147 section.L32(l); |
|
1148 l = 0x4b810f82U; |
|
1149 ASSERT_TRUE(section.GetContents(&contents)); |
|
1150 ASSERT_BYTES(contents, I5(0x2a, 0x82, 0x0f, 0x81, 0x4b)); |
|
1151 } |
|
1152 |
|
1153 TEST_F(Append, L64) { |
|
1154 section.Append(1, 0x2a); |
|
1155 section.L64(0x564384f7579515bfULL); |
|
1156 ASSERT_TRUE(section.GetContents(&contents)); |
|
1157 ASSERT_BYTES(contents, |
|
1158 I9(0x2a, 0xbf, 0x15, 0x95, 0x57, 0xf7, 0x84, 0x43, 0x56)); |
|
1159 } |
|
1160 |
|
1161 TEST_F(Append, L64Label) { |
|
1162 Label l; |
|
1163 section.Append(1, 0x2a); |
|
1164 section.L64(l); |
|
1165 l = 0x424b1d020667c8dbULL; |
|
1166 ASSERT_TRUE(section.GetContents(&contents)); |
|
1167 ASSERT_BYTES(contents, |
|
1168 I9(0x2a, 0xdb, 0xc8, 0x67, 0x06, 0x02, 0x1d, 0x4b, 0x42)); |
|
1169 } |
|
1170 |
|
1171 TEST_F(Append, D8Big) { |
|
1172 section.set_endianness(kBigEndian); |
|
1173 section.Append(1, 0x2a); |
|
1174 section.D8(0xe6U); |
|
1175 ASSERT_TRUE(section.GetContents(&contents)); |
|
1176 ASSERT_BYTES(contents, I2(0x2a, 0xe6)); |
|
1177 } |
|
1178 |
|
1179 TEST_F(Append, D8BigLabel) { |
|
1180 Label l; |
|
1181 section.set_endianness(kBigEndian); |
|
1182 section.Append(1, 0x2a); |
|
1183 section.D8(l); |
|
1184 l = 0xeeU; |
|
1185 ASSERT_TRUE(section.GetContents(&contents)); |
|
1186 ASSERT_BYTES(contents, I2(0x2a, 0xee)); |
|
1187 } |
|
1188 |
|
1189 TEST_F(Append, D16Big) { |
|
1190 section.set_endianness(kBigEndian); |
|
1191 section.Append(1, 0x2a); |
|
1192 section.D16(0x83b1U); |
|
1193 ASSERT_TRUE(section.GetContents(&contents)); |
|
1194 ASSERT_BYTES(contents, I3(0x2a, 0x83, 0xb1)); |
|
1195 } |
|
1196 |
|
1197 TEST_F(Append, D16BigLabel) { |
|
1198 Label l; |
|
1199 section.set_endianness(kBigEndian); |
|
1200 section.Append(1, 0x2a); |
|
1201 section.D16(l); |
|
1202 l = 0x5b55U; |
|
1203 ASSERT_TRUE(section.GetContents(&contents)); |
|
1204 ASSERT_BYTES(contents, I3(0x2a, 0x5b, 0x55)); |
|
1205 } |
|
1206 |
|
1207 TEST_F(Append, D32Big) { |
|
1208 section.set_endianness(kBigEndian); |
|
1209 section.Append(1, 0x2a); |
|
1210 section.D32(0xd0b0e431U); |
|
1211 ASSERT_TRUE(section.GetContents(&contents)); |
|
1212 ASSERT_BYTES(contents, I5(0x2a, 0xd0, 0xb0, 0xe4, 0x31)); |
|
1213 } |
|
1214 |
|
1215 TEST_F(Append, D32BigLabel) { |
|
1216 Label l; |
|
1217 section.set_endianness(kBigEndian); |
|
1218 section.Append(1, 0x2a); |
|
1219 section.D32(l); |
|
1220 l = 0x312fb340U; |
|
1221 ASSERT_TRUE(section.GetContents(&contents)); |
|
1222 ASSERT_BYTES(contents, I5(0x2a, 0x31, 0x2f, 0xb3, 0x40)); |
|
1223 } |
|
1224 |
|
1225 TEST_F(Append, D64Big) { |
|
1226 section.set_endianness(kBigEndian); |
|
1227 section.Append(1, 0x2a); |
|
1228 section.D64(0xb109843500dbcb16ULL); |
|
1229 ASSERT_TRUE(section.GetContents(&contents)); |
|
1230 ASSERT_BYTES(contents, |
|
1231 I9(0x2a, 0xb1, 0x09, 0x84, 0x35, 0x00, 0xdb, 0xcb, 0x16)); |
|
1232 } |
|
1233 |
|
1234 TEST_F(Append, D64BigLabel) { |
|
1235 Label l; |
|
1236 section.set_endianness(kBigEndian); |
|
1237 section.Append(1, 0x2a); |
|
1238 section.D64(l); |
|
1239 l = 0x9a0d61b70f671fd7ULL; |
|
1240 ASSERT_TRUE(section.GetContents(&contents)); |
|
1241 ASSERT_BYTES(contents, |
|
1242 I9(0x2a, 0x9a, 0x0d, 0x61, 0xb7, 0x0f, 0x67, 0x1f, 0xd7)); |
|
1243 } |
|
1244 |
|
1245 TEST_F(Append, D8Little) { |
|
1246 section.set_endianness(kLittleEndian); |
|
1247 section.Append(1, 0x2a); |
|
1248 section.D8(0x42U); |
|
1249 ASSERT_TRUE(section.GetContents(&contents)); |
|
1250 ASSERT_BYTES(contents, I2(0x2a, 0x42)); |
|
1251 } |
|
1252 |
|
1253 TEST_F(Append, D8LittleLabel) { |
|
1254 Label l; |
|
1255 section.set_endianness(kLittleEndian); |
|
1256 section.Append(1, 0x2a); |
|
1257 section.D8(l); |
|
1258 l = 0x05U; |
|
1259 ASSERT_TRUE(section.GetContents(&contents)); |
|
1260 ASSERT_BYTES(contents, I2(0x2a, 0x05)); |
|
1261 } |
|
1262 |
|
1263 TEST_F(Append, D16Little) { |
|
1264 section.set_endianness(kLittleEndian); |
|
1265 section.Append(1, 0x2a); |
|
1266 section.D16(0xc5c5U); |
|
1267 ASSERT_TRUE(section.GetContents(&contents)); |
|
1268 ASSERT_BYTES(contents, I3(0x2a, 0xc5, 0xc5)); |
|
1269 } |
|
1270 |
|
1271 TEST_F(Append, D16LittleLabel) { |
|
1272 Label l; |
|
1273 section.set_endianness(kLittleEndian); |
|
1274 section.Append(1, 0x2a); |
|
1275 section.D16(l); |
|
1276 l = 0xb620U; |
|
1277 ASSERT_TRUE(section.GetContents(&contents)); |
|
1278 ASSERT_BYTES(contents, I3(0x2a, 0x20, 0xb6)); |
|
1279 } |
|
1280 |
|
1281 TEST_F(Append, D32Little) { |
|
1282 section.set_endianness(kLittleEndian); |
|
1283 section.Append(1, 0x2a); |
|
1284 section.D32(0x1a87d0feU); |
|
1285 ASSERT_TRUE(section.GetContents(&contents)); |
|
1286 ASSERT_BYTES(contents, I5(0x2a, 0xfe, 0xd0, 0x87, 0x1a)); |
|
1287 } |
|
1288 |
|
1289 TEST_F(Append, D32LittleLabel) { |
|
1290 Label l; |
|
1291 section.set_endianness(kLittleEndian); |
|
1292 section.Append(1, 0x2a); |
|
1293 section.D32(l); |
|
1294 l = 0xb8012d6bU; |
|
1295 ASSERT_TRUE(section.GetContents(&contents)); |
|
1296 ASSERT_BYTES(contents, I5(0x2a, 0x6b, 0x2d, 0x01, 0xb8)); |
|
1297 } |
|
1298 |
|
1299 TEST_F(Append, D64Little) { |
|
1300 section.set_endianness(kLittleEndian); |
|
1301 section.Append(1, 0x2a); |
|
1302 section.D64(0x42de75c61375a1deULL); |
|
1303 ASSERT_TRUE(section.GetContents(&contents)); |
|
1304 ASSERT_BYTES(contents, |
|
1305 I9(0x2a, 0xde, 0xa1, 0x75, 0x13, 0xc6, 0x75, 0xde, 0x42)); |
|
1306 } |
|
1307 |
|
1308 TEST_F(Append, D64LittleLabel) { |
|
1309 Label l; |
|
1310 section.set_endianness(kLittleEndian); |
|
1311 section.Append(1, 0x2a); |
|
1312 section.D64(l); |
|
1313 l = 0x8b3bececf3fb5312ULL; |
|
1314 ASSERT_TRUE(section.GetContents(&contents)); |
|
1315 ASSERT_BYTES(contents, |
|
1316 I9(0x2a, 0x12, 0x53, 0xfb, 0xf3, 0xec, 0xec, 0x3b, 0x8b)); |
|
1317 } |
|
1318 |
|
1319 TEST_F(Append, Variety) { |
|
1320 Label a, b, c, d, e, f, g, h; |
|
1321 section.Append(kBigEndian, 1, a) |
|
1322 .Append(kLittleEndian, 8, h) |
|
1323 .Append(kBigEndian, 1, 0x8bULL) |
|
1324 .Append(kLittleEndian, 8, 0x0ea56540448f4439ULL) |
|
1325 .Append(kBigEndian, 2, b) |
|
1326 .Append(kLittleEndian, 7, g) |
|
1327 .Append(kBigEndian, 2, 0xcf15ULL) |
|
1328 .Append(kLittleEndian, 7, 0x29694f04c5724aULL) |
|
1329 .Append(kBigEndian, 3, c) |
|
1330 .Append(kLittleEndian, 6, f) |
|
1331 .Append(kBigEndian, 3, 0x8c3ffdULL) |
|
1332 .Append(kLittleEndian, 6, 0x6f11ba80187aULL) |
|
1333 .Append(kBigEndian, 4, d) |
|
1334 .Append(kLittleEndian, 5, e) |
|
1335 .Append(kBigEndian, 4, 0x2fda2472ULL) |
|
1336 .Append(kLittleEndian, 5, 0x0aa02d423fULL) |
|
1337 .Append(kBigEndian, 5, e) |
|
1338 .Append(kLittleEndian, 4, d) |
|
1339 .Append(kBigEndian, 5, 0x53ba432138ULL) |
|
1340 .Append(kLittleEndian, 4, 0xf139ae60ULL) |
|
1341 .Append(kBigEndian, 6, f) |
|
1342 .Append(kLittleEndian, 3, c) |
|
1343 .Append(kBigEndian, 6, 0x168e436af716ULL) |
|
1344 .Append(kLittleEndian, 3, 0x3ef189ULL) |
|
1345 .Append(kBigEndian, 7, g) |
|
1346 .Append(kLittleEndian, 2, b) |
|
1347 .Append(kBigEndian, 7, 0xacd4ef233e47d9ULL) |
|
1348 .Append(kLittleEndian, 2, 0x5311ULL) |
|
1349 .Append(kBigEndian, 8, h) |
|
1350 .Append(kLittleEndian, 1, a) |
|
1351 .Append(kBigEndian, 8, 0x4668d5f1c93637a1ULL) |
|
1352 .Append(kLittleEndian, 1, 0x65ULL); |
|
1353 a = 0x79ac9bd8aa256b35ULL; |
|
1354 b = 0x22d13097ef86c91cULL; |
|
1355 c = 0xf204968b0a05862fULL; |
|
1356 d = 0x163177f15a0eb4ecULL; |
|
1357 e = 0xbd1b0f1d977f2246ULL; |
|
1358 f = 0x2b0842eee83c6461ULL; |
|
1359 g = 0x92f4b928a4bf875eULL; |
|
1360 h = 0x61a199a8f7286ba6ULL; |
|
1361 ASSERT_EQ(8 * 18U, section.Size()); |
|
1362 ASSERT_TRUE(section.GetContents(&contents)); |
|
1363 |
|
1364 static const uint8_t expected[] = { |
|
1365 0x35, 0xa6, 0x6b, 0x28, 0xf7, 0xa8, 0x99, 0xa1, 0x61, |
|
1366 0x8b, 0x39, 0x44, 0x8f, 0x44, 0x40, 0x65, 0xa5, 0x0e, |
|
1367 0xc9, 0x1c, 0x5e, 0x87, 0xbf, 0xa4, 0x28, 0xb9, 0xf4, |
|
1368 0xcf, 0x15, 0x4a, 0x72, 0xc5, 0x04, 0x4f, 0x69, 0x29, |
|
1369 0x05, 0x86, 0x2f, 0x61, 0x64, 0x3c, 0xe8, 0xee, 0x42, |
|
1370 0x8c, 0x3f, 0xfd, 0x7a, 0x18, 0x80, 0xba, 0x11, 0x6f, |
|
1371 0x5a, 0x0e, 0xb4, 0xec, 0x46, 0x22, 0x7f, 0x97, 0x1d, |
|
1372 0x2f, 0xda, 0x24, 0x72, 0x3f, 0x42, 0x2d, 0xa0, 0x0a, |
|
1373 0x1d, 0x97, 0x7f, 0x22, 0x46, 0xec, 0xb4, 0x0e, 0x5a, |
|
1374 0x53, 0xba, 0x43, 0x21, 0x38, 0x60, 0xae, 0x39, 0xf1, |
|
1375 0x42, 0xee, 0xe8, 0x3c, 0x64, 0x61, 0x2f, 0x86, 0x05, |
|
1376 0x16, 0x8e, 0x43, 0x6a, 0xf7, 0x16, 0x89, 0xf1, 0x3e, |
|
1377 0xf4, 0xb9, 0x28, 0xa4, 0xbf, 0x87, 0x5e, 0x1c, 0xc9, |
|
1378 0xac, 0xd4, 0xef, 0x23, 0x3e, 0x47, 0xd9, 0x11, 0x53, |
|
1379 0x61, 0xa1, 0x99, 0xa8, 0xf7, 0x28, 0x6b, 0xa6, 0x35, |
|
1380 0x46, 0x68, 0xd5, 0xf1, 0xc9, 0x36, 0x37, 0xa1, 0x65, |
|
1381 }; |
|
1382 |
|
1383 ASSERT_TRUE(0 == memcmp(contents.data(), expected, sizeof(expected))); |
|
1384 } |
|
1385 |
|
1386 TEST_F(Append, Section) { |
|
1387 section.Append("murder"); |
|
1388 { |
|
1389 Section middle; |
|
1390 middle.Append(" she"); |
|
1391 section.Append(middle); |
|
1392 } |
|
1393 section.Append(" wrote"); |
|
1394 EXPECT_EQ(16U, section.Size()); |
|
1395 EXPECT_TRUE(section.GetContents(&contents)); |
|
1396 EXPECT_STREQ(contents.c_str(), "murder she wrote"); |
|
1397 } |
|
1398 |
|
1399 TEST_F(Append, SectionRefs) { |
|
1400 section.Append("sugar "); |
|
1401 Label l; |
|
1402 { |
|
1403 Section middle; |
|
1404 Label m; |
|
1405 middle.B32(m); |
|
1406 section.Append(middle); |
|
1407 m = 0x66726565; |
|
1408 } |
|
1409 section.Append(" jazz"); |
|
1410 EXPECT_EQ(15U, section.Size()); |
|
1411 EXPECT_TRUE(section.GetContents(&contents)); |
|
1412 EXPECT_STREQ(contents.c_str(), "sugar free jazz"); |
|
1413 } |
|
1414 |
|
1415 TEST_F(Append, LEB128_0) { |
|
1416 section.LEB128(0); |
|
1417 EXPECT_TRUE(section.GetContents(&contents)); |
|
1418 EXPECT_EQ(string("\0", 1), contents); |
|
1419 } |
|
1420 |
|
1421 TEST_F(Append, LEB128_0x3f) { |
|
1422 section.LEB128(0x3f); |
|
1423 EXPECT_TRUE(section.GetContents(&contents)); |
|
1424 EXPECT_EQ(string("\x3f", 1), contents); |
|
1425 } |
|
1426 |
|
1427 TEST_F(Append, LEB128_0x40) { |
|
1428 section.LEB128(0x40); |
|
1429 EXPECT_TRUE(section.GetContents(&contents)); |
|
1430 EXPECT_EQ(string("\xc0\x00", 2), contents); |
|
1431 } |
|
1432 |
|
1433 TEST_F(Append, LEB128_0x7f) { |
|
1434 section.LEB128(0x7f); |
|
1435 EXPECT_TRUE(section.GetContents(&contents)); |
|
1436 EXPECT_EQ(string("\xff\x00", 2), contents); |
|
1437 } |
|
1438 |
|
1439 TEST_F(Append, LEB128_0x80) { |
|
1440 section.LEB128(0x80); |
|
1441 EXPECT_TRUE(section.GetContents(&contents)); |
|
1442 EXPECT_EQ(string("\x80\x01", 2), contents); |
|
1443 } |
|
1444 |
|
1445 TEST_F(Append, LEB128_0xff) { |
|
1446 section.LEB128(0xff); |
|
1447 EXPECT_TRUE(section.GetContents(&contents)); |
|
1448 EXPECT_EQ(string("\xff\x01", 2), contents); |
|
1449 } |
|
1450 |
|
1451 TEST_F(Append, LEB128_0x1fff) { |
|
1452 section.LEB128(0x1fff); |
|
1453 EXPECT_TRUE(section.GetContents(&contents)); |
|
1454 EXPECT_EQ(string("\xff\x3f", 2), contents); |
|
1455 } |
|
1456 |
|
1457 TEST_F(Append, LEB128_0x2000) { |
|
1458 section.LEB128(0x2000); |
|
1459 EXPECT_TRUE(section.GetContents(&contents)); |
|
1460 EXPECT_EQ(string("\x80\xc0\x00", 3), contents); |
|
1461 } |
|
1462 |
|
1463 TEST_F(Append, LEB128_n1) { |
|
1464 section.LEB128(-1); |
|
1465 EXPECT_TRUE(section.GetContents(&contents)); |
|
1466 EXPECT_EQ(string("\x7f", 1), contents); |
|
1467 } |
|
1468 |
|
1469 TEST_F(Append, LEB128_n0x40) { |
|
1470 section.LEB128(-0x40); |
|
1471 EXPECT_TRUE(section.GetContents(&contents)); |
|
1472 EXPECT_EQ(string("\x40", 1), contents); |
|
1473 } |
|
1474 |
|
1475 TEST_F(Append, LEB128_n0x41) { |
|
1476 section.LEB128(-0x41); |
|
1477 EXPECT_TRUE(section.GetContents(&contents)); |
|
1478 EXPECT_EQ(string("\xbf\x7f", 2), contents); |
|
1479 } |
|
1480 |
|
1481 TEST_F(Append, LEB128_n0x7f) { |
|
1482 section.LEB128(-0x7f); |
|
1483 EXPECT_TRUE(section.GetContents(&contents)); |
|
1484 EXPECT_EQ(string("\x81\x7f", 2), contents); |
|
1485 } |
|
1486 |
|
1487 TEST_F(Append, LEB128_n0x80) { |
|
1488 section.LEB128(-0x80); |
|
1489 EXPECT_TRUE(section.GetContents(&contents)); |
|
1490 EXPECT_EQ(string("\x80\x7f", 2), contents); |
|
1491 } |
|
1492 |
|
1493 TEST_F(Append, LEB128_n0x2000) { |
|
1494 section.LEB128(-0x2000); |
|
1495 EXPECT_TRUE(section.GetContents(&contents)); |
|
1496 EXPECT_EQ(string("\x80\x40", 2), contents); |
|
1497 } |
|
1498 |
|
1499 TEST_F(Append, LEB128_n0x2001) { |
|
1500 section.LEB128(-0x2001); |
|
1501 EXPECT_TRUE(section.GetContents(&contents)); |
|
1502 EXPECT_EQ(string("\xff\xbf\x7f", 3), contents); |
|
1503 } |
|
1504 |
|
1505 TEST_F(Append,ULEB128_0) { |
|
1506 section.ULEB128(0); |
|
1507 EXPECT_TRUE(section.GetContents(&contents)); |
|
1508 EXPECT_EQ(string("\0", 1), contents); |
|
1509 } |
|
1510 |
|
1511 TEST_F(Append,ULEB128_1) { |
|
1512 section.ULEB128(1); |
|
1513 EXPECT_TRUE(section.GetContents(&contents)); |
|
1514 EXPECT_EQ(string("\x01", 1), contents); |
|
1515 } |
|
1516 |
|
1517 TEST_F(Append,ULEB128_0x3f) { |
|
1518 section.ULEB128(0x3f); |
|
1519 EXPECT_TRUE(section.GetContents(&contents)); |
|
1520 EXPECT_EQ(string("\x3f", 1), contents); |
|
1521 } |
|
1522 |
|
1523 TEST_F(Append,ULEB128_0x40) { |
|
1524 section.ULEB128(0x40); |
|
1525 EXPECT_TRUE(section.GetContents(&contents)); |
|
1526 EXPECT_EQ(string("\x40", 1), contents); |
|
1527 } |
|
1528 |
|
1529 TEST_F(Append,ULEB128_0x7f) { |
|
1530 section.ULEB128(0x7f); |
|
1531 EXPECT_TRUE(section.GetContents(&contents)); |
|
1532 EXPECT_EQ(string("\x7f", 1), contents); |
|
1533 } |
|
1534 |
|
1535 TEST_F(Append,ULEB128_0x80) { |
|
1536 section.ULEB128(0x80); |
|
1537 EXPECT_TRUE(section.GetContents(&contents)); |
|
1538 EXPECT_EQ(string("\x80\x01", 2), contents); |
|
1539 } |
|
1540 |
|
1541 TEST_F(Append,ULEB128_0xff) { |
|
1542 section.ULEB128(0xff); |
|
1543 EXPECT_TRUE(section.GetContents(&contents)); |
|
1544 EXPECT_EQ(string("\xff\x01", 2), contents); |
|
1545 } |
|
1546 |
|
1547 TEST_F(Append,ULEB128_0x100) { |
|
1548 section.ULEB128(0x100); |
|
1549 EXPECT_TRUE(section.GetContents(&contents)); |
|
1550 EXPECT_EQ(string("\x80\x02", 2), contents); |
|
1551 } |
|
1552 |
|
1553 TEST_F(Append,ULEB128_0x1fff) { |
|
1554 section.ULEB128(0x1fff); |
|
1555 EXPECT_TRUE(section.GetContents(&contents)); |
|
1556 EXPECT_EQ(string("\xff\x3f", 2), contents); |
|
1557 } |
|
1558 |
|
1559 TEST_F(Append,ULEB128_0x2000) { |
|
1560 section.ULEB128(0x2000); |
|
1561 EXPECT_TRUE(section.GetContents(&contents)); |
|
1562 EXPECT_EQ(string("\x80\x40", 2), contents); |
|
1563 } |
|
1564 |
|
1565 TEST_F(Append,ULEB128_0x3fff) { |
|
1566 section.ULEB128(0x3fff); |
|
1567 EXPECT_TRUE(section.GetContents(&contents)); |
|
1568 EXPECT_EQ(string("\xff\x7f", 2), contents); |
|
1569 } |
|
1570 |
|
1571 TEST_F(Append,ULEB128_0x4000) { |
|
1572 section.ULEB128(0x4000); |
|
1573 EXPECT_TRUE(section.GetContents(&contents)); |
|
1574 EXPECT_EQ(string("\x80\x80\x01", 3), contents); |
|
1575 } |
|
1576 |
|
1577 TEST_F(Append,ULEB128_12857) { |
|
1578 section.ULEB128(12857); |
|
1579 EXPECT_TRUE(section.GetContents(&contents)); |
|
1580 EXPECT_EQ(string("\xb9\x64", 2), contents); |
|
1581 } |
|
1582 |
|
1583 TEST_F(Append, LEBChain) { |
|
1584 section.LEB128(-0x80).ULEB128(12857).Append("*"); |
|
1585 EXPECT_TRUE(section.GetContents(&contents)); |
|
1586 EXPECT_EQ(string("\x80\x7f\xb9\x64*", 5), contents); |
|
1587 } |
|
1588 |
|
1589 |
|
1590 class GetContents: public SectionFixture, public Test { }; |
|
1591 |
|
1592 TEST_F(GetContents, Undefined) { |
|
1593 Label l; |
|
1594 section.Append(kLittleEndian, 8, l); |
|
1595 ASSERT_FALSE(section.GetContents(&contents)); |
|
1596 } |
|
1597 |
|
1598 TEST_F(GetContents, ClearsContents) { |
|
1599 section.Append((size_t) 10, '*'); |
|
1600 EXPECT_EQ(10U, section.Size()); |
|
1601 EXPECT_TRUE(section.GetContents(&contents)); |
|
1602 EXPECT_EQ(0U, section.Size()); |
|
1603 } |
|
1604 |
|
1605 TEST_F(GetContents, ClearsReferences) { |
|
1606 Label l; |
|
1607 section.Append(kBigEndian, 1, l); |
|
1608 l = 42; |
|
1609 ASSERT_TRUE(section.GetContents(&contents)); |
|
1610 ASSERT_BYTES(contents, I1(42)); |
|
1611 ASSERT_TRUE(section.GetContents(&contents)); // should not die |
|
1612 } |
|
1613 |
|
1614 class Miscellanea: public SectionFixture, public Test { }; |
|
1615 |
|
1616 TEST_F(Miscellanea, Clear) { |
|
1617 section.Append("howdy"); |
|
1618 Label l; |
|
1619 section.L32(l); |
|
1620 EXPECT_EQ(9U, section.Size()); |
|
1621 section.Clear(); |
|
1622 EXPECT_EQ(0U, section.Size()); |
|
1623 l = 0x8d231bf0U; |
|
1624 ASSERT_TRUE(section.GetContents(&contents)); // should not die |
|
1625 } |
|
1626 |
|
1627 TEST_F(Miscellanea, Align) { |
|
1628 section.Append("*"); |
|
1629 EXPECT_EQ(1U, section.Size()); |
|
1630 section.Align(4).Append("*"); |
|
1631 EXPECT_EQ(5U, section.Size()); |
|
1632 section.Append("*").Align(2); |
|
1633 EXPECT_EQ(6U, section.Size()); |
|
1634 } |
|
1635 |
|
1636 TEST_F(Miscellanea, AlignPad) { |
|
1637 section.Append("*"); |
|
1638 EXPECT_EQ(1U, section.Size()); |
|
1639 section.Align(4, ' ').Append("*"); |
|
1640 EXPECT_EQ(5U, section.Size()); |
|
1641 section.Append("*").Align(2, ' '); |
|
1642 EXPECT_EQ(6U, section.Size()); |
|
1643 ASSERT_TRUE(section.GetContents(&contents)); |
|
1644 ASSERT_EQ(string("* **"), contents); |
|
1645 } |
|
1646 |
|
1647 TEST_F(Miscellanea, StartHereMark) { |
|
1648 Label m; |
|
1649 section.Append(42, ' ').Mark(&m).Append(13, '+'); |
|
1650 EXPECT_EQ(42U, m - section.start()); |
|
1651 EXPECT_EQ(42U + 13U, section.Here() - section.start()); |
|
1652 EXPECT_FALSE(section.start().IsKnownConstant()); |
|
1653 EXPECT_FALSE(m.IsKnownConstant()); |
|
1654 EXPECT_FALSE(section.Here().IsKnownConstant()); |
|
1655 } |
|
1656 |
|
1657 TEST_F(Miscellanea, Endianness) { |
|
1658 section.set_endianness(kBigEndian); |
|
1659 EXPECT_EQ(kBigEndian, section.endianness()); |
|
1660 section.set_endianness(kLittleEndian); |
|
1661 EXPECT_EQ(kLittleEndian, section.endianness()); |
|
1662 } |