From bbaca6bc0030c71bc24033df3cdf58f8b0e84d10 Mon Sep 17 00:00:00 2001
From: "ted.mielczarek@gmail.com"
 <ted.mielczarek@gmail.com@4c0a9323-5329-0410-9bdc-e9ce6186880e>
Date: Fri, 29 Mar 2013 15:10:50 +0000
Subject: [PATCH] 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
---
 src/common/linux/file_id_unittest.cc | 137 +++++++--------------------
 1 file changed, 35 insertions(+), 102 deletions(-)

diff --git a/src/common/linux/file_id_unittest.cc b/src/common/linux/file_id_unittest.cc
index fa3af802..7c6550b1 100644
--- a/src/common/linux/file_id_unittest.cc
+++ b/src/common/linux/file_id_unittest.cc
@@ -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));