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:
ted.mielczarek@gmail.com 2013-03-29 15:10:50 +00:00
parent 704c13e7ab
commit bbaca6bc00

View file

@ -34,6 +34,7 @@
#include <string> #include <string>
#include "common/linux/elfutils.h"
#include "common/linux/file_id.h" #include "common/linux/file_id.h"
#include "common/linux/safe_readlink.h" #include "common/linux/safe_readlink.h"
#include "common/linux/synth_elf.h" #include "common/linux/synth_elf.h"
@ -43,11 +44,14 @@
#include "breakpad_googletest_includes.h" #include "breakpad_googletest_includes.h"
using namespace google_breakpad; using namespace google_breakpad;
using google_breakpad::ElfClass32;
using google_breakpad::ElfClass64;
using google_breakpad::SafeReadLink; using google_breakpad::SafeReadLink;
using google_breakpad::synth_elf::BuildIDNote; using google_breakpad::synth_elf::BuildIDNote;
using google_breakpad::synth_elf::ELF; using google_breakpad::synth_elf::ELF;
using google_breakpad::test_assembler::kLittleEndian; using google_breakpad::test_assembler::kLittleEndian;
using google_breakpad::test_assembler::Section; using google_breakpad::test_assembler::Section;
using ::testing::Types;
namespace { namespace {
@ -94,6 +98,7 @@ TEST(FileIDStripTest, StripSelf) {
EXPECT_STREQ(identifier_string1, identifier_string2); EXPECT_STREQ(identifier_string1, identifier_string2);
} }
template<typename ElfClass>
class FileIDTest : public testing::Test { class FileIDTest : public testing::Test {
public: public:
void GetElfContents(ELF& elf) { void GetElfContents(ELF& elf) {
@ -110,48 +115,35 @@ public:
uint8_t* elfdata; 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)]; uint8_t identifier[sizeof(MDGUID)];
const char expected_identifier_string[] = const char expected_identifier_string[] =
"80808080-8080-0000-0000-008080808080"; "80808080-8080-0000-0000-008080808080";
char identifier_string[sizeof(expected_identifier_string)]; char identifier_string[sizeof(expected_identifier_string)];
const size_t kTextSectionSize = 128; const size_t kTextSectionSize = 128;
ELF elf32(EM_386, ELFCLASS32, kLittleEndian); ELF elf(EM_386, TypeParam::kClass, kLittleEndian);
Section text32(kLittleEndian); Section text(kLittleEndian);
for (size_t i = 0; i < kTextSectionSize; ++i) { for (size_t i = 0; i < kTextSectionSize; ++i) {
text32.D8(i * 3); text.D8(i * 3);
} }
elf32.AddSection(".text", text32, SHT_PROGBITS); elf.AddSection(".text", text, SHT_PROGBITS);
elf32.Finish(); elf.Finish();
GetElfContents(elf32); this->GetElfContents(elf);
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);
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));
FileID::ConvertIdentifierToString(identifier, identifier_string, FileID::ConvertIdentifierToString(identifier, identifier_string,
sizeof(identifier_string)); sizeof(identifier_string));
EXPECT_STREQ(expected_identifier_string, identifier_string); EXPECT_STREQ(expected_identifier_string, identifier_string);
} }
TEST_F(FileIDTest, BuildID) { TYPED_TEST(FileIDTest, BuildID) {
const uint8_t kExpectedIdentifier[sizeof(MDGUID)] = const uint8_t kExpectedIdentifier[sizeof(MDGUID)] =
{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F}; 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F};
@ -164,35 +156,18 @@ TEST_F(FileIDTest, BuildID) {
uint8_t identifier[sizeof(MDGUID)]; uint8_t identifier[sizeof(MDGUID)];
char identifier_string[sizeof(expected_identifier_string)]; char identifier_string[sizeof(expected_identifier_string)];
ELF elf32(EM_386, ELFCLASS32, kLittleEndian); ELF elf(EM_386, TypeParam::kClass, kLittleEndian);
Section text(kLittleEndian); Section text(kLittleEndian);
text.Append(4096, 0); text.Append(4096, 0);
elf32.AddSection(".text", text, SHT_PROGBITS); elf.AddSection(".text", text, SHT_PROGBITS);
BuildIDNote::AppendSection(elf32, BuildIDNote::AppendSection(elf,
kExpectedIdentifier, kExpectedIdentifier,
sizeof(kExpectedIdentifier)); sizeof(kExpectedIdentifier));
elf32.Finish(); elf.Finish();
GetElfContents(elf32); this->GetElfContents(elf);
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);
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));
FileID::ConvertIdentifierToString(identifier, identifier_string, FileID::ConvertIdentifierToString(identifier, identifier_string,
sizeof(identifier_string)); sizeof(identifier_string));
@ -201,7 +176,7 @@ TEST_F(FileIDTest, BuildID) {
// Test to make sure two files with different text sections produce // Test to make sure two files with different text sections produce
// different hashes when not using a build id. // different hashes when not using a build id.
TEST_F(FileIDTest, UniqueHashes32) { TYPED_TEST(FileIDTest, UniqueHashes) {
char identifier_string_1[] = char identifier_string_1[] =
"00000000-0000-0000-0000-000000000000"; "00000000-0000-0000-0000-000000000000";
char identifier_string_2[] = char identifier_string_2[] =
@ -210,7 +185,7 @@ TEST_F(FileIDTest, UniqueHashes32) {
uint8_t identifier_2[sizeof(MDGUID)]; uint8_t identifier_2[sizeof(MDGUID)];
{ {
ELF elf1(EM_386, ELFCLASS32, kLittleEndian); ELF elf1(EM_386, TypeParam::kClass, kLittleEndian);
Section foo_1(kLittleEndian); Section foo_1(kLittleEndian);
PopulateSection(&foo_1, 32, 5); PopulateSection(&foo_1, 32, 5);
elf1.AddSection(".foo", foo_1, SHT_PROGBITS); elf1.AddSection(".foo", foo_1, SHT_PROGBITS);
@ -218,15 +193,16 @@ TEST_F(FileIDTest, UniqueHashes32) {
PopulateSection(&text_1, 4096, 17); PopulateSection(&text_1, 4096, 17);
elf1.AddSection(".text", text_1, SHT_PROGBITS); elf1.AddSection(".text", text_1, SHT_PROGBITS);
elf1.Finish(); 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, FileID::ConvertIdentifierToString(identifier_1, identifier_string_1,
sizeof(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 text_2(kLittleEndian);
Section foo_2(kLittleEndian); Section foo_2(kLittleEndian);
PopulateSection(&foo_2, 32, 5); PopulateSection(&foo_2, 32, 5);
@ -234,54 +210,11 @@ TEST_F(FileIDTest, UniqueHashes32) {
PopulateSection(&text_2, 4096, 31); PopulateSection(&text_2, 4096, 31);
elf2.AddSection(".text", text_2, SHT_PROGBITS); elf2.AddSection(".text", text_2, SHT_PROGBITS);
elf2.Finish(); elf2.Finish();
GetElfContents(elf2); this->GetElfContents(elf2);
} }
EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(elfdata, identifier_2)); EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(this->elfdata,
FileID::ConvertIdentifierToString(identifier_2, identifier_string_2, identifier_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));
FileID::ConvertIdentifierToString(identifier_2, identifier_string_2, FileID::ConvertIdentifierToString(identifier_2, identifier_string_2,
sizeof(identifier_string_2)); sizeof(identifier_string_2));