29 #include <gmock/gmock.h>
30 #include <gtest/gtest-spi.h>
31 #include <gtest/gtest.h>
34 #include <initializer_list>
56 ss <<
" symbols' bindings do not match: seen `" <<
57 (int)symbol.
binding <<
"`, expected `" <<
62 ss <<
" symbols' names do not match: seen `" << symbol.
name <<
63 "`, expected `" <<
expected.name <<
"`.\n";
67 ss <<
" symbols' addresses do not match: seen `" <<
84 ::testing::AssertionResult
90 return ::testing::AssertionFailure() <<
"Symbols do not match (" <<
91 m_symbol <<
" != " << m_expected <<
")\n" <<
error;
93 return ::testing::AssertionSuccess();
103 ::testing::AssertionResult
105 const std::initializer_list<loader::Symbol>&
expected)
108 return ::testing::AssertionFailure() <<
"the number of symbols in "
109 "the table does not match expectation (seen " <<
110 (symtab.
end() - symtab.
begin()) <<
", expected " <<
115 auto it = symtab.
begin();
116 for (
const auto& symbol :
expected) {
118 if (!
error.empty()) {
119 return ::testing::AssertionFailure() <<
error;
123 return ::testing::AssertionSuccess();
127 TEST(LoaderSymtabTest, EmptyConstruction)
130 ASSERT_TRUE(symtab.
empty());
135 TEST(LoaderSymtabTest, InsertSymbolNoName)
140 ASSERT_FALSE(symtab.
insert(symbol));
145 TEST(LoaderSymtabTest, InsertOneSymbol)
150 ASSERT_TRUE(symtab.
insert(symbol));
152 ASSERT_FALSE(symtab.
empty());
157 TEST(LoaderSymtabTest, InsertSymbolExistingName)
161 const std::string
name =
"symbol";
166 ASSERT_TRUE(symtab.
insert(symbols[0]));
167 ASSERT_FALSE(symtab.
insert(symbols[1]));
170 ASSERT_TRUE(
checkTable(symtab, {symbols[0]}));
174 TEST(LoaderSymtabTest, InsertSymbolExistingAddress)
183 ASSERT_TRUE(symtab.
insert(symbols[0]));
184 ASSERT_TRUE(symtab.
insert(symbols[1]));
187 ASSERT_TRUE(
checkTable(symtab, {symbols[0], symbols[1]}));
191 TEST(LoaderSymtabTest, InsertMultipleSymbols)
200 EXPECT_TRUE(symtab.
insert(symbols[0]));
201 EXPECT_TRUE(symtab.
insert(symbols[1]));
202 EXPECT_TRUE(symtab.
insert(symbols[2]));
204 ASSERT_TRUE(
checkTable(symtab, {symbols[0], symbols[1], symbols[2]}));
210 TEST(LoaderSymtabTest, ClearMultiple)
219 EXPECT_TRUE(symtab.
insert(symbols[0]));
220 EXPECT_TRUE(symtab.
insert(symbols[1]));
221 EXPECT_TRUE(symtab.
insert(symbols[2]));
224 ASSERT_TRUE(symtab.
empty());
241 EXPECT_TRUE(symtab.
insert(symbols[0]));
242 EXPECT_TRUE(symtab.
insert(symbols[1]));
243 EXPECT_TRUE(symtab.
insert(symbols[2]));
249 ASSERT_TRUE(
checkTable(symtab, {symbols[0], symbols[1], symbols[2]}));
257 ASSERT_TRUE(
checkTable(*symtab_new, {expected_symbols[0],
258 expected_symbols[1], expected_symbols[2]}));
275 EXPECT_TRUE(symtab.
insert(symbols[0]));
276 EXPECT_TRUE(symtab.
insert(symbols[1]));
277 EXPECT_TRUE(symtab.
insert(symbols[2]));
278 EXPECT_TRUE(symtab.
insert(symbols[3]));
281 const auto symtab_new = symtab.
mask(
mask);
284 ASSERT_TRUE(
checkTable(symtab, {symbols[0], symbols[1], symbols[2],
294 ASSERT_TRUE(
checkTable(*symtab_new, {expected_symbols[0],
295 expected_symbols[1], expected_symbols[2], expected_symbols[3]}));
312 EXPECT_TRUE(symtab.
insert(symbols[0]));
313 EXPECT_TRUE(symtab.
insert(symbols[1]));
314 EXPECT_TRUE(symtab.
insert(symbols[2]));
315 EXPECT_TRUE(symtab.
insert(symbols[3]));
317 const auto symtab_new =
321 ASSERT_TRUE(
checkTable(symtab, {symbols[0], symbols[1], symbols[2],
331 ASSERT_TRUE(
checkTable(*symtab_new, {expected_symbols[0],
332 expected_symbols[1], expected_symbols[2], expected_symbols[3]}));
339 TEST(LoaderSymtabTest, RenameNonUnique)
349 EXPECT_TRUE(symtab.
insert(symbols[0]));
350 EXPECT_TRUE(symtab.
insert(symbols[1]));
351 EXPECT_TRUE(symtab.
insert(symbols[2]));
352 EXPECT_TRUE(symtab.
insert(symbols[3]));
355 const auto symtab_new = symtab.
rename([&
i](std::string &
name)
357 if ((
i++ % 2) == 0) {
358 name =
"NonUniqueName";
363 ASSERT_TRUE(
checkTable(symtab, {symbols[0], symbols[1], symbols[2],
373 ASSERT_TRUE(
checkTable(*symtab_new, {expected_symbols[0],
374 expected_symbols[1], expected_symbols[2]}));
392 EXPECT_TRUE(symtab.
insert(symbols[0]));
393 EXPECT_TRUE(symtab.
insert(symbols[1]));
394 EXPECT_TRUE(symtab.
insert(symbols[2]));
395 EXPECT_TRUE(symtab.
insert(symbols[3]));
396 EXPECT_TRUE(symtab.
insert(symbols[4]));
398 const auto symtab_new = symtab.
globals();
401 ASSERT_TRUE(
checkTable(symtab, {symbols[0], symbols[1], symbols[2],
402 symbols[3], symbols[4]}));
405 ASSERT_TRUE(
checkTable(*symtab_new, {symbols[1]}));
423 EXPECT_TRUE(symtab.
insert(symbols[0]));
424 EXPECT_TRUE(symtab.
insert(symbols[1]));
425 EXPECT_TRUE(symtab.
insert(symbols[2]));
426 EXPECT_TRUE(symtab.
insert(symbols[3]));
427 EXPECT_TRUE(symtab.
insert(symbols[4]));
429 const auto symtab_new = symtab.
locals();
432 ASSERT_TRUE(
checkTable(symtab, {symbols[0], symbols[1], symbols[2],
433 symbols[3], symbols[4]}));
436 ASSERT_TRUE(
checkTable(*symtab_new, {symbols[0], symbols[2]}));
454 EXPECT_TRUE(symtab.
insert(symbols[0]));
455 EXPECT_TRUE(symtab.
insert(symbols[1]));
456 EXPECT_TRUE(symtab.
insert(symbols[2]));
457 EXPECT_TRUE(symtab.
insert(symbols[3]));
458 EXPECT_TRUE(symtab.
insert(symbols[4]));
460 const auto symtab_new = symtab.
weaks();
463 ASSERT_TRUE(
checkTable(symtab, {symbols[0], symbols[1], symbols[2],
464 symbols[3], symbols[4]}));
467 ASSERT_TRUE(
checkTable(*symtab_new, {symbols[3], symbols[4]}));
471 TEST(LoaderSymtabTest, FindNonExistentAddress)
476 EXPECT_TRUE(symtab.
insert(symbol));
478 ASSERT_EQ(symtab.
find(0x0), symtab.
end());
482 TEST(LoaderSymtabTest, FindUniqueAddress)
491 EXPECT_TRUE(symtab.
insert(symbols[0]));
492 EXPECT_TRUE(symtab.
insert(symbols[1]));
493 EXPECT_TRUE(symtab.
insert(symbols[2]));
495 const auto it = symtab.
find(symbols[2].address);
496 ASSERT_NE(it, symtab.
end());
503 TEST(LoaderSymtabTest, FindNonUniqueAddress)
513 EXPECT_TRUE(symtab.
insert(symbols[0]));
514 EXPECT_TRUE(symtab.
insert(symbols[1]));
515 EXPECT_TRUE(symtab.
insert(symbols[2]));
517 const auto it = symtab.
find(symbols[1].address);
518 ASSERT_NE(it, symtab.
end());
523 TEST(LoaderSymtabTest, FindNonExistentName)
528 EXPECT_TRUE(symtab.
insert(symbol));
530 const auto it = symtab.
find(
"symbol2");
531 ASSERT_EQ(it, symtab.
end());
535 TEST(LoaderSymtabTest, FindExistingName)
544 EXPECT_TRUE(symtab.
insert(symbols[0]));
545 EXPECT_TRUE(symtab.
insert(symbols[1]));
546 EXPECT_TRUE(symtab.
insert(symbols[2]));
548 const auto it = symtab.
find(symbols[1].
name);
549 ASSERT_NE(it, symtab.
end());
554 TEST(LoaderSymtabTest, FindNearestExact)
562 EXPECT_TRUE(symtab.
insert(symbols[0]));
563 EXPECT_TRUE(symtab.
insert(symbols[1]));
565 const auto it = symtab.
findNearest(symbols[1].address);
566 ASSERT_NE(it, symtab.
end());
574 TEST(LoaderSymtabTest, FindNearestRound)
579 EXPECT_TRUE(symtab.
insert(symbol));
582 ASSERT_NE(it, symtab.
end());
591 TEST(LoaderSymtabTest, FindNearestRoundWithNext)
599 EXPECT_TRUE(symtab.
insert(symbols[0]));
600 EXPECT_TRUE(symtab.
insert(symbols[1]));
603 const auto it = symtab.
findNearest(symbols[0].address + 0x1, next_addr);
604 ASSERT_NE(it, symtab.
end());
606 ASSERT_EQ(next_addr, symbols[1].address);
614 TEST(LoaderSymtabTest, FindNearestRoundWithNextNonExistent)
619 EXPECT_TRUE(symtab.
insert(symbol));
623 ASSERT_NE(it, symtab.
end());
625 ASSERT_EQ(next_addr, 0);
632 TEST(LoaderSymtabTest, FindNearestNonExistent)
637 EXPECT_TRUE(symtab.
insert(symbol));
640 ASSERT_EQ(it, symtab.
end());
647 TEST(LoaderSymtabTest, InsertTableConflicting)
649 const std::string
name =
"symbol";
661 EXPECT_TRUE(symtab.
insert(symbols[0]));
662 EXPECT_TRUE(symtab.
insert(symbols[1]));
663 EXPECT_TRUE(symtab.
insert(symbols[2]));
667 EXPECT_TRUE(symtab2.
insert(symbols[3]));
668 EXPECT_TRUE(symtab2.
insert(symbols[4]));
671 ASSERT_FALSE(symtab.
insert(symtab2));
674 ASSERT_TRUE(
checkTable(symtab2, {symbols[3], symbols[4]}));
675 ASSERT_TRUE(
checkTable(symtab, {symbols[0], symbols[1], symbols[2]}));
682 TEST(LoaderSymtabTest, InsertTable)
694 EXPECT_TRUE(symtab.
insert(symbols[0]));
695 EXPECT_TRUE(symtab.
insert(symbols[1]));
696 EXPECT_TRUE(symtab.
insert(symbols[2]));
700 EXPECT_TRUE(symtab2.
insert(symbols[3]));
701 EXPECT_TRUE(symtab2.
insert(symbols[4]));
707 ASSERT_TRUE(
checkTable(symtab2, {symbols[3], symbols[4]}));
710 ASSERT_TRUE(
checkTable(symtab, {symbols[0], symbols[1], symbols[2],
711 symbols[3], symbols[4]}));
726 EXPECT_TRUE(symtab.
insert(symbols[0]));
727 EXPECT_TRUE(symtab.
insert(symbols[1]));
728 EXPECT_TRUE(symtab.
insert(symbols[2]));
731 std::ostringstream cp;
736 ASSERT_THAT(cp.str(), ::testing::StrEq(
"\n[Section1]\ntest.size=3\n"
737 "test.addr_0=16\ntest.symbol_0=symbol\ntest.binding_0=1\n"
738 "test.addr_1=32\ntest.symbol_1=symbol2\ntest.binding_1=1\n"
739 "test.addr_2=48\ntest.symbol_2=symbol3\ntest.binding_2=1\n"));
750 simulateSerialization(
"\n[Section1]\ntest.size=3\n"
751 "test.addr_0=16\ntest.symbol_0=symbol\ntest.binding_0=1\n"
752 "test.addr_1=32\ntest.symbol_1=symbol2\ntest.binding_1=1\n"
753 "test.addr_2=48\ntest.symbol_2=symbol3\ntest.binding_2=1\n");
762 ASSERT_TRUE(
checkTable(unserialized_symtab, {symbols[0], symbols[1],
778 simulateSerialization(
"\n[Section1]\ntest.size=3\n"
779 "test.addr_0=16\ntest.symbol_0=symbol\ntest.binding_0=1\n"
780 "test.addr_1=32\ntest.symbol_1=symbol2\n"
781 "test.addr_2=48\ntest.symbol_2=symbol3\ntest.binding_2=1\n");
791 ASSERT_TRUE(
checkTable(unserialized_symtab, {symbols[0], symbols[1],
801 UnserializationMissingBindingChangeDefault)
808 simulateSerialization(
"\n[Section1]\ntest.size=3\n"
809 "test.addr_0=16\ntest.symbol_0=symbol\ntest.binding_0=1\n"
810 "test.addr_1=32\ntest.symbol_1=symbol2\n"
811 "test.addr_2=48\ntest.symbol_2=symbol3\ntest.binding_2=1\n");
822 ASSERT_TRUE(
checkTable(unserialized_symtab, {symbols[0], symbols[1],