Chromium Code Reviews| Index: courgette/rel32_finder_unittest.cc |
| diff --git a/courgette/rel32_finder_win32_x86_unittest.cc b/courgette/rel32_finder_unittest.cc |
| similarity index 75% |
| rename from courgette/rel32_finder_win32_x86_unittest.cc |
| rename to courgette/rel32_finder_unittest.cc |
| index 496f0b94bb249bb837bad08f0ca3bcbc9e4a8272..a6b3fb6faa958f1e8f88898c3e916821d6162387 100644 |
| --- a/courgette/rel32_finder_win32_x86_unittest.cc |
| +++ b/courgette/rel32_finder_unittest.cc |
| @@ -2,8 +2,6 @@ |
| // 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> |
| @@ -14,16 +12,18 @@ |
| #include "base/macros.h" |
| #include "courgette/base_test_unittest.h" |
| #include "courgette/image_utils.h" |
| +#include "courgette/rel32_finder_x64.h" |
| +#include "courgette/rel32_finder_x86.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| namespace courgette { |
| namespace { |
| -// Helper class to load and execute a Rel32FinderWin32X86 test case. |
| -class Rel32FinderWin32X86TestCase { |
| +// Helper class to load and execute a Rel32Finder test case. |
| +class Rel32FinderTestCase { |
| public: |
| - Rel32FinderWin32X86TestCase(const std::string& test_data) |
| + Rel32FinderTestCase(const std::string& test_data) |
| : text_start_rva_(0), |
| text_end_rva_(0), |
| relocs_start_rva_(0), |
| @@ -32,17 +32,30 @@ class Rel32FinderWin32X86TestCase { |
| LoadTestFromString(test_data); |
| } |
| + template <class Finder> |
|
huangs
2016/05/30 05:48:34
Pretty cool use of template. :) In this instance
etiennep
2016/05/30 17:07:30
Done.
|
| void RunTestBasic(std::string name) { |
| - Rel32FinderWin32X86_Basic finder(relocs_start_rva_, relocs_end_rva_); |
| + Finder finder = CreateFinder<Finder>(); |
| ASSERT_FALSE(text_data_.empty()); |
| finder.Find(&text_data_[0], &text_data_[0] + text_data_.size(), |
| - text_start_rva_, text_end_rva_, abs32_locations_); |
| + 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)"; |
| } |
| + template <class Finder> |
| + Finder CreateFinder(); |
| + |
| + template <> |
| + Rel32FinderX86 CreateFinder<Rel32FinderX86>() { |
| + return Rel32FinderX86(relocs_start_rva_, relocs_end_rva_); |
| + } |
| + template <> |
| + Rel32FinderX64 CreateFinder<Rel32FinderX64>() { |
| + return Rel32FinderX64(relocs_start_rva_, relocs_end_rva_, image_end_rva_); |
| + } |
| + |
| private: |
| RVA text_start_rva_; |
| RVA text_end_rva_; |
| @@ -83,7 +96,7 @@ class Rel32FinderWin32X86TestCase { |
| } |
| // Initializes the test case by parsing the multi-line string |test_data| |
| - // to extract Rel32FinderWin32X86 parameters, and read expected values. |
| + // to extract Rel32Finder 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); |
| @@ -107,7 +120,7 @@ class Rel32FinderWin32X86TestCase { |
| 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]); |
| + &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)); |
| } |
| @@ -131,19 +144,24 @@ class Rel32FinderWin32X86TestCase { |
| } |
| }; |
| -class Rel32FinderWin32X86Test : public BaseTest { |
| +class Rel32FinderTest : public BaseTest { |
| public: |
| + template <class Finder> |
| void RunTest(const char* test_case_file) { |
| - Rel32FinderWin32X86TestCase test_case(FileContents(test_case_file)); |
| - test_case.RunTestBasic(test_case_file); |
| + Rel32FinderTestCase test_case(FileContents(test_case_file)); |
| + test_case.RunTestBasic<Finder>(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"); |
| +TEST_F(Rel32FinderTest, TestBasic) { |
| + RunTest<Rel32FinderX86>("rel32_x86_01.txt"); |
| + RunTest<Rel32FinderX86>("rel32_x86_02.txt"); |
| + RunTest<Rel32FinderX86>("rel32_x86_03.txt"); |
| + RunTest<Rel32FinderX86>("rel32_x86_04.txt"); |
| + |
| + RunTest<Rel32FinderX64>("rel32_x64_01.txt"); |
| + RunTest<Rel32FinderX64>("rel32_x64_02.txt"); |
| + RunTest<Rel32FinderX64>("rel32_x64_03.txt"); |
| } |
|
huangs
2016/05/30 05:48:34
Curious why there's no rel32_x64_04.txt?
etiennep
2016/05/30 17:07:30
I don't think testing false positive is relevant.
|
| } // namespace |