| Index: courgette/rel32_finder_win32_x86_unittest.cc
|
| diff --git a/courgette/rel32_finder_win32_x86_unittest.cc b/courgette/rel32_finder_win32_x86_unittest.cc
|
| deleted file mode 100644
|
| index 496f0b94bb249bb837bad08f0ca3bcbc9e4a8272..0000000000000000000000000000000000000000
|
| --- a/courgette/rel32_finder_win32_x86_unittest.cc
|
| +++ /dev/null
|
| @@ -1,151 +0,0 @@
|
| -// Copyright 2015 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "courgette/rel32_finder_win32_x86.h"
|
| -
|
| -#include <stddef.h>
|
| -#include <stdint.h>
|
| -
|
| -#include <algorithm>
|
| -#include <sstream>
|
| -#include <string>
|
| -
|
| -#include "base/macros.h"
|
| -#include "courgette/base_test_unittest.h"
|
| -#include "courgette/image_utils.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -namespace courgette {
|
| -
|
| -namespace {
|
| -
|
| -// Helper class to load and execute a Rel32FinderWin32X86 test case.
|
| -class Rel32FinderWin32X86TestCase {
|
| - public:
|
| - Rel32FinderWin32X86TestCase(const std::string& test_data)
|
| - : text_start_rva_(0),
|
| - text_end_rva_(0),
|
| - relocs_start_rva_(0),
|
| - relocs_end_rva_(0),
|
| - image_end_rva_(0) {
|
| - LoadTestFromString(test_data);
|
| - }
|
| -
|
| - void RunTestBasic(std::string name) {
|
| - Rel32FinderWin32X86_Basic finder(relocs_start_rva_, relocs_end_rva_);
|
| - ASSERT_FALSE(text_data_.empty());
|
| - finder.Find(&text_data_[0], &text_data_[0] + text_data_.size(),
|
| - text_start_rva_, text_end_rva_, abs32_locations_);
|
| - std::vector<RVA> rel32_locations;
|
| - finder.SwapRel32Locations(&rel32_locations);
|
| - EXPECT_EQ(expected_rel32_locations_, rel32_locations)
|
| - << "From test case " << name << " (addresses are in hex)";
|
| - }
|
| -
|
| - private:
|
| - RVA text_start_rva_;
|
| - RVA text_end_rva_;
|
| - RVA relocs_start_rva_;
|
| - RVA relocs_end_rva_;
|
| - RVA image_end_rva_;
|
| - std::vector<uint8_t> text_data_;
|
| - std::vector<RVA> abs32_locations_;
|
| - std::vector<RVA> expected_rel32_locations_;
|
| -
|
| - // Scans |iss| for the next non-empty line, after removing "#"-style comments
|
| - // and stripping trailing spaces. On success, returns true and writes the
|
| - // result to |line_out|. Otherwise returns false.
|
| - bool ReadNonEmptyLine(std::istringstream& iss, std::string* line_out) {
|
| - std::string line;
|
| - while (std::getline(iss, line)) {
|
| - // Trim comments and trailing spaces.
|
| - size_t end_pos = std::min(line.find("#"), line.length());
|
| - while (end_pos > 0 && line[end_pos] == ' ')
|
| - --end_pos;
|
| - line.resize(end_pos);
|
| - if (!line.empty())
|
| - break;
|
| - }
|
| - if (line.empty())
|
| - return false;
|
| - line_out->swap(line);
|
| - return true;
|
| - }
|
| -
|
| - // Scans |iss| for the next non-empty line, and reads (hex) uint32_t into |v|.
|
| - // Returns true iff successful.
|
| - bool ReadHexUInt32(std::istringstream& iss, uint32_t* v) {
|
| - std::string line;
|
| - if (!ReadNonEmptyLine(iss, &line))
|
| - return false;
|
| - return sscanf(line.c_str(), "%X", v) == 1;
|
| - }
|
| -
|
| - // Initializes the test case by parsing the multi-line string |test_data|
|
| - // to extract Rel32FinderWin32X86 parameters, and read expected values.
|
| - void LoadTestFromString(const std::string& test_data) {
|
| - // The first lines (ignoring empty ones) specify RVA bounds.
|
| - std::istringstream iss(test_data);
|
| - ASSERT_TRUE(ReadHexUInt32(iss, &text_start_rva_));
|
| - ASSERT_TRUE(ReadHexUInt32(iss, &text_end_rva_));
|
| - ASSERT_TRUE(ReadHexUInt32(iss, &relocs_start_rva_));
|
| - ASSERT_TRUE(ReadHexUInt32(iss, &relocs_end_rva_));
|
| - ASSERT_TRUE(ReadHexUInt32(iss, &image_end_rva_));
|
| -
|
| - std::string line;
|
| - // The Program section specifies instruction bytes. We require lines to be
|
| - // formatted in "DUMPBIN /DISASM" style, i.e.,
|
| - // "00401003: E8 00 00 00 00 call 00401008"
|
| - // ^ ^ ^ ^ ^ ^
|
| - // We extract up to 6 bytes per line. The remaining are ignored.
|
| - const int kBytesBegin = 12;
|
| - const int kBytesEnd = 17;
|
| - ReadNonEmptyLine(iss, &line);
|
| - ASSERT_EQ("Program:", line);
|
| - while (ReadNonEmptyLine(iss, &line) && line != "Abs32:") {
|
| - std::string toks = line.substr(kBytesBegin, kBytesEnd);
|
| - uint32_t vals[6];
|
| - int num_read = sscanf(toks.c_str(), "%X %X %X %X %X %X", &vals[0],
|
| - &vals[1], &vals[2], &vals[3], &vals[4], &vals[5]);
|
| - for (int i = 0; i < num_read; ++i)
|
| - text_data_.push_back(static_cast<uint8_t>(vals[i] & 0xFF));
|
| - }
|
| - ASSERT_FALSE(text_data_.empty());
|
| -
|
| - // The Abs32 section specifies hex RVAs, one per line.
|
| - ASSERT_EQ("Abs32:", line);
|
| - while (ReadNonEmptyLine(iss, &line) && line != "Expected:") {
|
| - RVA abs32_location;
|
| - ASSERT_EQ(1, sscanf(line.c_str(), "%X", &abs32_location));
|
| - abs32_locations_.push_back(abs32_location);
|
| - }
|
| -
|
| - // The Expected section specifies hex Rel32 RVAs, one per line.
|
| - ASSERT_EQ("Expected:", line);
|
| - while (ReadNonEmptyLine(iss, &line)) {
|
| - RVA rel32_location;
|
| - ASSERT_EQ(1, sscanf(line.c_str(), "%X", &rel32_location));
|
| - expected_rel32_locations_.push_back(rel32_location);
|
| - }
|
| - }
|
| -};
|
| -
|
| -class Rel32FinderWin32X86Test : public BaseTest {
|
| - public:
|
| - void RunTest(const char* test_case_file) {
|
| - Rel32FinderWin32X86TestCase test_case(FileContents(test_case_file));
|
| - test_case.RunTestBasic(test_case_file);
|
| - }
|
| -};
|
| -
|
| -TEST_F(Rel32FinderWin32X86Test, TestBasic) {
|
| - RunTest("rel32_win32_x86_01.txt");
|
| - RunTest("rel32_win32_x86_02.txt");
|
| - RunTest("rel32_win32_x86_03.txt");
|
| - RunTest("rel32_win32_x86_04.txt");
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -} // namespace courgette
|
|
|