mirror of
https://github.com/yuzu-emu/breakpad.git
synced 2024-12-23 11:45:41 +00:00
Refactor file_id_unittest
A=Mike Hommey <mh@glandium.org> R=ted at https://breakpad.appspot.com/543003/ git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@1138 4c0a9323-5329-0410-9bdc-e9ce6186880e
This commit is contained in:
parent
704c13e7ab
commit
bbaca6bc00
|
@ -34,6 +34,7 @@
|
|||
|
||||
#include <string>
|
||||
|
||||
#include "common/linux/elfutils.h"
|
||||
#include "common/linux/file_id.h"
|
||||
#include "common/linux/safe_readlink.h"
|
||||
#include "common/linux/synth_elf.h"
|
||||
|
@ -43,11 +44,14 @@
|
|||
#include "breakpad_googletest_includes.h"
|
||||
|
||||
using namespace google_breakpad;
|
||||
using google_breakpad::ElfClass32;
|
||||
using google_breakpad::ElfClass64;
|
||||
using google_breakpad::SafeReadLink;
|
||||
using google_breakpad::synth_elf::BuildIDNote;
|
||||
using google_breakpad::synth_elf::ELF;
|
||||
using google_breakpad::test_assembler::kLittleEndian;
|
||||
using google_breakpad::test_assembler::Section;
|
||||
using ::testing::Types;
|
||||
|
||||
namespace {
|
||||
|
||||
|
@ -94,6 +98,7 @@ TEST(FileIDStripTest, StripSelf) {
|
|||
EXPECT_STREQ(identifier_string1, identifier_string2);
|
||||
}
|
||||
|
||||
template<typename ElfClass>
|
||||
class FileIDTest : public testing::Test {
|
||||
public:
|
||||
void GetElfContents(ELF& elf) {
|
||||
|
@ -110,48 +115,35 @@ public:
|
|||
uint8_t* elfdata;
|
||||
};
|
||||
|
||||
TEST_F(FileIDTest, ElfClass) {
|
||||
typedef Types<ElfClass32, ElfClass64> ElfClasses;
|
||||
|
||||
TYPED_TEST_CASE(FileIDTest, ElfClasses);
|
||||
|
||||
TYPED_TEST(FileIDTest, ElfClass) {
|
||||
uint8_t identifier[sizeof(MDGUID)];
|
||||
const char expected_identifier_string[] =
|
||||
"80808080-8080-0000-0000-008080808080";
|
||||
char identifier_string[sizeof(expected_identifier_string)];
|
||||
const size_t kTextSectionSize = 128;
|
||||
|
||||
ELF elf32(EM_386, ELFCLASS32, kLittleEndian);
|
||||
Section text32(kLittleEndian);
|
||||
ELF elf(EM_386, TypeParam::kClass, kLittleEndian);
|
||||
Section text(kLittleEndian);
|
||||
for (size_t i = 0; i < kTextSectionSize; ++i) {
|
||||
text32.D8(i * 3);
|
||||
text.D8(i * 3);
|
||||
}
|
||||
elf32.AddSection(".text", text32, SHT_PROGBITS);
|
||||
elf32.Finish();
|
||||
GetElfContents(elf32);
|
||||
elf.AddSection(".text", text, SHT_PROGBITS);
|
||||
elf.Finish();
|
||||
this->GetElfContents(elf);
|
||||
|
||||
EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(elfdata, identifier));
|
||||
|
||||
FileID::ConvertIdentifierToString(identifier, identifier_string,
|
||||
sizeof(identifier_string));
|
||||
EXPECT_STREQ(expected_identifier_string, identifier_string);
|
||||
|
||||
memset(identifier, 0, sizeof(identifier));
|
||||
memset(identifier_string, 0, sizeof(identifier_string));
|
||||
|
||||
ELF elf64(EM_X86_64, ELFCLASS64, kLittleEndian);
|
||||
Section text64(kLittleEndian);
|
||||
for (size_t i = 0; i < kTextSectionSize; ++i) {
|
||||
text64.D8(i * 3);
|
||||
}
|
||||
elf64.AddSection(".text", text64, SHT_PROGBITS);
|
||||
elf64.Finish();
|
||||
GetElfContents(elf64);
|
||||
|
||||
EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(elfdata, identifier));
|
||||
EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(this->elfdata,
|
||||
identifier));
|
||||
|
||||
FileID::ConvertIdentifierToString(identifier, identifier_string,
|
||||
sizeof(identifier_string));
|
||||
EXPECT_STREQ(expected_identifier_string, identifier_string);
|
||||
}
|
||||
|
||||
TEST_F(FileIDTest, BuildID) {
|
||||
TYPED_TEST(FileIDTest, BuildID) {
|
||||
const uint8_t kExpectedIdentifier[sizeof(MDGUID)] =
|
||||
{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F};
|
||||
|
@ -164,35 +156,18 @@ TEST_F(FileIDTest, BuildID) {
|
|||
uint8_t identifier[sizeof(MDGUID)];
|
||||
char identifier_string[sizeof(expected_identifier_string)];
|
||||
|
||||
ELF elf32(EM_386, ELFCLASS32, kLittleEndian);
|
||||
ELF elf(EM_386, TypeParam::kClass, kLittleEndian);
|
||||
Section text(kLittleEndian);
|
||||
text.Append(4096, 0);
|
||||
elf32.AddSection(".text", text, SHT_PROGBITS);
|
||||
BuildIDNote::AppendSection(elf32,
|
||||
elf.AddSection(".text", text, SHT_PROGBITS);
|
||||
BuildIDNote::AppendSection(elf,
|
||||
kExpectedIdentifier,
|
||||
sizeof(kExpectedIdentifier));
|
||||
elf32.Finish();
|
||||
GetElfContents(elf32);
|
||||
elf.Finish();
|
||||
this->GetElfContents(elf);
|
||||
|
||||
EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(elfdata, identifier));
|
||||
|
||||
FileID::ConvertIdentifierToString(identifier, identifier_string,
|
||||
sizeof(identifier_string));
|
||||
EXPECT_STREQ(expected_identifier_string, identifier_string);
|
||||
|
||||
memset(identifier, 0, sizeof(identifier));
|
||||
memset(identifier_string, 0, sizeof(identifier_string));
|
||||
|
||||
ELF elf64(EM_X86_64, ELFCLASS64, kLittleEndian);
|
||||
// Re-use empty text section from previous test
|
||||
elf64.AddSection(".text", text, SHT_PROGBITS);
|
||||
BuildIDNote::AppendSection(elf64,
|
||||
kExpectedIdentifier,
|
||||
sizeof(kExpectedIdentifier));
|
||||
elf64.Finish();
|
||||
GetElfContents(elf64);
|
||||
|
||||
EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(elfdata, identifier));
|
||||
EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(this->elfdata,
|
||||
identifier));
|
||||
|
||||
FileID::ConvertIdentifierToString(identifier, identifier_string,
|
||||
sizeof(identifier_string));
|
||||
|
@ -201,7 +176,7 @@ TEST_F(FileIDTest, BuildID) {
|
|||
|
||||
// Test to make sure two files with different text sections produce
|
||||
// different hashes when not using a build id.
|
||||
TEST_F(FileIDTest, UniqueHashes32) {
|
||||
TYPED_TEST(FileIDTest, UniqueHashes) {
|
||||
char identifier_string_1[] =
|
||||
"00000000-0000-0000-0000-000000000000";
|
||||
char identifier_string_2[] =
|
||||
|
@ -210,7 +185,7 @@ TEST_F(FileIDTest, UniqueHashes32) {
|
|||
uint8_t identifier_2[sizeof(MDGUID)];
|
||||
|
||||
{
|
||||
ELF elf1(EM_386, ELFCLASS32, kLittleEndian);
|
||||
ELF elf1(EM_386, TypeParam::kClass, kLittleEndian);
|
||||
Section foo_1(kLittleEndian);
|
||||
PopulateSection(&foo_1, 32, 5);
|
||||
elf1.AddSection(".foo", foo_1, SHT_PROGBITS);
|
||||
|
@ -218,15 +193,16 @@ TEST_F(FileIDTest, UniqueHashes32) {
|
|||
PopulateSection(&text_1, 4096, 17);
|
||||
elf1.AddSection(".text", text_1, SHT_PROGBITS);
|
||||
elf1.Finish();
|
||||
GetElfContents(elf1);
|
||||
this->GetElfContents(elf1);
|
||||
}
|
||||
|
||||
EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(elfdata, identifier_1));
|
||||
EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(this->elfdata,
|
||||
identifier_1));
|
||||
FileID::ConvertIdentifierToString(identifier_1, identifier_string_1,
|
||||
sizeof(identifier_string_1));
|
||||
|
||||
{
|
||||
ELF elf2(EM_386, ELFCLASS32, kLittleEndian);
|
||||
ELF elf2(EM_386, TypeParam::kClass, kLittleEndian);
|
||||
Section text_2(kLittleEndian);
|
||||
Section foo_2(kLittleEndian);
|
||||
PopulateSection(&foo_2, 32, 5);
|
||||
|
@ -234,54 +210,11 @@ TEST_F(FileIDTest, UniqueHashes32) {
|
|||
PopulateSection(&text_2, 4096, 31);
|
||||
elf2.AddSection(".text", text_2, SHT_PROGBITS);
|
||||
elf2.Finish();
|
||||
GetElfContents(elf2);
|
||||
this->GetElfContents(elf2);
|
||||
}
|
||||
|
||||
EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(elfdata, identifier_2));
|
||||
FileID::ConvertIdentifierToString(identifier_2, identifier_string_2,
|
||||
sizeof(identifier_string_2));
|
||||
|
||||
EXPECT_STRNE(identifier_string_1, identifier_string_2);
|
||||
}
|
||||
|
||||
// Same as UniqueHashes32, for x86-64.
|
||||
TEST_F(FileIDTest, UniqueHashes64) {
|
||||
char identifier_string_1[] =
|
||||
"00000000-0000-0000-0000-000000000000";
|
||||
char identifier_string_2[] =
|
||||
"00000000-0000-0000-0000-000000000000";
|
||||
uint8_t identifier_1[sizeof(MDGUID)];
|
||||
uint8_t identifier_2[sizeof(MDGUID)];
|
||||
|
||||
{
|
||||
ELF elf1(EM_X86_64, ELFCLASS64, kLittleEndian);
|
||||
Section foo_1(kLittleEndian);
|
||||
PopulateSection(&foo_1, 32, 5);
|
||||
elf1.AddSection(".foo", foo_1, SHT_PROGBITS);
|
||||
Section text_1(kLittleEndian);
|
||||
PopulateSection(&text_1, 4096, 17);
|
||||
elf1.AddSection(".text", text_1, SHT_PROGBITS);
|
||||
elf1.Finish();
|
||||
GetElfContents(elf1);
|
||||
}
|
||||
|
||||
EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(elfdata, identifier_1));
|
||||
FileID::ConvertIdentifierToString(identifier_1, identifier_string_1,
|
||||
sizeof(identifier_string_1));
|
||||
|
||||
{
|
||||
ELF elf2(EM_X86_64, ELFCLASS64, kLittleEndian);
|
||||
Section text_2(kLittleEndian);
|
||||
Section foo_2(kLittleEndian);
|
||||
PopulateSection(&foo_2, 32, 5);
|
||||
elf2.AddSection(".foo", foo_2, SHT_PROGBITS);
|
||||
PopulateSection(&text_2, 4096, 31);
|
||||
elf2.AddSection(".text", text_2, SHT_PROGBITS);
|
||||
elf2.Finish();
|
||||
GetElfContents(elf2);
|
||||
}
|
||||
|
||||
EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(elfdata, identifier_2));
|
||||
EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(this->elfdata,
|
||||
identifier_2));
|
||||
FileID::ConvertIdentifierToString(identifier_2, identifier_string_2,
|
||||
sizeof(identifier_string_2));
|
||||
|
||||
|
|
Loading…
Reference in a new issue