| OLD | NEW | 
|---|
|  | (Empty) | 
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. |  | 
| 2 // Use of this source code is governed by a BSD-style license that can be |  | 
| 3 // found in the LICENSE file. |  | 
| 4 |  | 
| 5 #include "base/files/file_path.h" |  | 
| 6 #include "base/files/memory_mapped_file.h" |  | 
| 7 #include "base/path_service.h" |  | 
| 8 #include "chrome/browser/safe_browsing/pe_image_reader_win.h" |  | 
| 9 #include "chrome/common/chrome_paths.h" |  | 
| 10 #include "testing/gtest/include/gtest/gtest.h" |  | 
| 11 |  | 
| 12 struct TestData { |  | 
| 13   const char* filename; |  | 
| 14   safe_browsing::PeImageReader::WordSize word_size; |  | 
| 15   WORD machine_identifier; |  | 
| 16   WORD optional_header_size; |  | 
| 17   size_t number_of_sections; |  | 
| 18   size_t number_of_debug_entries; |  | 
| 19 }; |  | 
| 20 |  | 
| 21 // A test fixture parameterized on test data containing the name of a PE image |  | 
| 22 // to parse and the expected values to be read from it. The file is read from |  | 
| 23 // the src/chrome/test/data/safe_browsing directory. |  | 
| 24 class PeImageReaderTest : public testing::TestWithParam<const TestData*> { |  | 
| 25  protected: |  | 
| 26   PeImageReaderTest() : expected_data_(GetParam()) {} |  | 
| 27 |  | 
| 28   virtual void SetUp() override { |  | 
| 29     ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &data_file_path_)); |  | 
| 30     data_file_path_ = data_file_path_.AppendASCII("safe_browsing"); |  | 
| 31     data_file_path_ = data_file_path_.AppendASCII(expected_data_->filename); |  | 
| 32 |  | 
| 33     ASSERT_TRUE(data_file_.Initialize(data_file_path_)); |  | 
| 34 |  | 
| 35     ASSERT_TRUE(image_reader_.Initialize(data_file_.data(), |  | 
| 36                                          data_file_.length())); |  | 
| 37   } |  | 
| 38 |  | 
| 39   const TestData* expected_data_; |  | 
| 40   base::FilePath data_file_path_; |  | 
| 41   base::MemoryMappedFile data_file_; |  | 
| 42   safe_browsing::PeImageReader image_reader_; |  | 
| 43 }; |  | 
| 44 |  | 
| 45 TEST_P(PeImageReaderTest, GetWordSize) { |  | 
| 46   EXPECT_EQ(expected_data_->word_size, image_reader_.GetWordSize()); |  | 
| 47 } |  | 
| 48 |  | 
| 49 TEST_P(PeImageReaderTest, GetDosHeader) { |  | 
| 50   const IMAGE_DOS_HEADER* dos_header = image_reader_.GetDosHeader(); |  | 
| 51   ASSERT_NE(reinterpret_cast<const IMAGE_DOS_HEADER*>(NULL), dos_header); |  | 
| 52   EXPECT_EQ(IMAGE_DOS_SIGNATURE, dos_header->e_magic); |  | 
| 53 } |  | 
| 54 |  | 
| 55 TEST_P(PeImageReaderTest, GetCoffFileHeader) { |  | 
| 56   const IMAGE_FILE_HEADER* file_header = image_reader_.GetCoffFileHeader(); |  | 
| 57   ASSERT_NE(reinterpret_cast<const IMAGE_FILE_HEADER*>(NULL), file_header); |  | 
| 58   EXPECT_EQ(expected_data_->machine_identifier, file_header->Machine); |  | 
| 59   EXPECT_EQ(expected_data_->optional_header_size, |  | 
| 60             file_header->SizeOfOptionalHeader); |  | 
| 61 } |  | 
| 62 |  | 
| 63 TEST_P(PeImageReaderTest, GetOptionalHeaderData) { |  | 
| 64   size_t optional_header_size = 0; |  | 
| 65   const uint8_t* optional_header_data = |  | 
| 66       image_reader_.GetOptionalHeaderData(&optional_header_size); |  | 
| 67   ASSERT_NE(reinterpret_cast<const uint8_t*>(NULL), optional_header_data); |  | 
| 68   EXPECT_EQ(expected_data_->optional_header_size, optional_header_size); |  | 
| 69 } |  | 
| 70 |  | 
| 71 TEST_P(PeImageReaderTest, GetNumberOfSections) { |  | 
| 72   EXPECT_EQ(expected_data_->number_of_sections, |  | 
| 73             image_reader_.GetNumberOfSections()); |  | 
| 74 } |  | 
| 75 |  | 
| 76 TEST_P(PeImageReaderTest, GetSectionHeaderAt) { |  | 
| 77   size_t number_of_sections = image_reader_.GetNumberOfSections(); |  | 
| 78   for (size_t i = 0; i < number_of_sections; ++i) { |  | 
| 79     const IMAGE_SECTION_HEADER* section_header = |  | 
| 80         image_reader_.GetSectionHeaderAt(i); |  | 
| 81     ASSERT_NE(reinterpret_cast<const IMAGE_SECTION_HEADER*>(NULL), |  | 
| 82               section_header); |  | 
| 83   } |  | 
| 84 } |  | 
| 85 |  | 
| 86 TEST_P(PeImageReaderTest, InitializeFailTruncatedFile) { |  | 
| 87   // Compute the size of all headers through the section headers. |  | 
| 88   const IMAGE_SECTION_HEADER* last_section_header = |  | 
| 89       image_reader_.GetSectionHeaderAt(image_reader_.GetNumberOfSections() - 1); |  | 
| 90   const uint8_t* headers_end = |  | 
| 91       reinterpret_cast<const uint8_t*>(last_section_header) + |  | 
| 92       sizeof(*last_section_header); |  | 
| 93   size_t header_size = headers_end - data_file_.data(); |  | 
| 94   safe_browsing::PeImageReader short_reader; |  | 
| 95 |  | 
| 96   // Initialize should succeed when all headers are present. |  | 
| 97   EXPECT_TRUE(short_reader.Initialize(data_file_.data(), header_size)); |  | 
| 98 |  | 
| 99   // But fail if anything is missing. |  | 
| 100   for (size_t i = 0; i < header_size; ++i) { |  | 
| 101     EXPECT_FALSE(short_reader.Initialize(data_file_.data(), i)); |  | 
| 102   } |  | 
| 103 } |  | 
| 104 |  | 
| 105 TEST_P(PeImageReaderTest, GetExportSection) { |  | 
| 106   size_t section_size = 0; |  | 
| 107   const uint8_t* export_section = image_reader_.GetExportSection(§ion_size); |  | 
| 108   ASSERT_NE(reinterpret_cast<const uint8_t*>(NULL), export_section); |  | 
| 109   EXPECT_NE(0U, section_size); |  | 
| 110 } |  | 
| 111 |  | 
| 112 TEST_P(PeImageReaderTest, GetNumberOfDebugEntries) { |  | 
| 113   EXPECT_EQ(expected_data_->number_of_debug_entries, |  | 
| 114             image_reader_.GetNumberOfDebugEntries()); |  | 
| 115 } |  | 
| 116 |  | 
| 117 TEST_P(PeImageReaderTest, GetDebugEntry) { |  | 
| 118   size_t number_of_debug_entries = image_reader_.GetNumberOfDebugEntries(); |  | 
| 119   for (size_t i = 0; i < number_of_debug_entries; ++i) { |  | 
| 120     const uint8_t* raw_data = NULL; |  | 
| 121     size_t raw_data_size = 0; |  | 
| 122     const IMAGE_DEBUG_DIRECTORY* entry = |  | 
| 123         image_reader_.GetDebugEntry(i, &raw_data, &raw_data_size); |  | 
| 124     EXPECT_NE(reinterpret_cast<const IMAGE_DEBUG_DIRECTORY*>(NULL), entry); |  | 
| 125     EXPECT_NE(reinterpret_cast<const uint8_t*>(NULL), raw_data); |  | 
| 126     EXPECT_NE(0U, raw_data_size); |  | 
| 127   } |  | 
| 128 } |  | 
| 129 |  | 
| 130 namespace { |  | 
| 131 |  | 
| 132 const TestData kTestData[] = { |  | 
| 133   { |  | 
| 134     "module_with_exports_x86.dll", |  | 
| 135     safe_browsing::PeImageReader::WORD_SIZE_32, |  | 
| 136     IMAGE_FILE_MACHINE_I386, |  | 
| 137     sizeof(IMAGE_OPTIONAL_HEADER32), |  | 
| 138     4, |  | 
| 139     1, |  | 
| 140   }, { |  | 
| 141     "module_with_exports_x64.dll", |  | 
| 142     safe_browsing::PeImageReader::WORD_SIZE_64, |  | 
| 143     IMAGE_FILE_MACHINE_AMD64, |  | 
| 144     sizeof(IMAGE_OPTIONAL_HEADER64), |  | 
| 145     5, |  | 
| 146     1, |  | 
| 147   }, |  | 
| 148 }; |  | 
| 149 |  | 
| 150 }  // namespace |  | 
| 151 |  | 
| 152 INSTANTIATE_TEST_CASE_P(WordSize32, |  | 
| 153                         PeImageReaderTest, |  | 
| 154                         testing::Values(&kTestData[0])); |  | 
| 155 INSTANTIATE_TEST_CASE_P(WordSize64, |  | 
| 156                         PeImageReaderTest, |  | 
| 157                         testing::Values(&kTestData[1])); |  | 
| OLD | NEW | 
|---|