blob: 6bb14da01246eafc3a0b5609d3a1712d3c2fb096 [file] [log] [blame]
// Copyright (c) 2011 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/image_info.h"
#include <string>
#include "base/path_service.h"
#include "base/file_util.h"
#include "base/memory/scoped_ptr.h"
#include "base/string_util.h"
#include "testing/gtest/include/gtest/gtest.h"
class ImageInfoTest : public testing::Test {
public:
void TestExe() const;
void TestResourceDll() const;
private:
void SetUp() {
PathService::Get(base::DIR_SOURCE_ROOT, &test_dir_);
test_dir_ = test_dir_.AppendASCII("courgette");
test_dir_ = test_dir_.AppendASCII("testdata");
}
void TearDown() {
}
void ExpectExecutable(courgette::PEInfo* info) const;
std::string FileContents(const char* file_name) const;
FilePath test_dir_;
};
// Reads a test file into a string.
std::string ImageInfoTest::FileContents(const char* file_name) const {
FilePath file_path = test_dir_;
file_path = file_path.AppendASCII(file_name);
std::string file_bytes;
if (!file_util::ReadFileToString(file_path, &file_bytes)) {
EXPECT_TRUE(!"Could not read test data");
}
return file_bytes;
}
void ImageInfoTest::ExpectExecutable(courgette::PEInfo* info) const {
EXPECT_TRUE(info->ok());
EXPECT_TRUE(info->has_text_section());
}
void ImageInfoTest::TestExe() const {
std::string file1 = FileContents("setup1.exe");
scoped_ptr<courgette::PEInfo> info(new courgette::PEInfo());
info->Init(reinterpret_cast<const uint8*>(file1.c_str()), file1.length());
bool can_parse_header = info->ParseHeader();
EXPECT_TRUE(can_parse_header);
// The executable is the whole file, not 'embedded' with the file
EXPECT_EQ(file1.length(), info->length());
ExpectExecutable(info.get());
EXPECT_EQ(449536U, info->size_of_code());
EXPECT_EQ(SectionName(info->RVAToSection(0x00401234 - 0x00400000)),
std::string(".text"));
EXPECT_EQ(0, info->RVAToFileOffset(0));
EXPECT_EQ(1024, info->RVAToFileOffset(4096));
EXPECT_EQ(46928, info->RVAToFileOffset(50000));
std::vector<courgette::RVA> relocs;
bool can_parse_relocs = info->ParseRelocs(&relocs);
EXPECT_TRUE(can_parse_relocs);
const uint8* p = info->RVAToPointer(0);
EXPECT_EQ(reinterpret_cast<const void*>(file1.c_str()),
reinterpret_cast<const void*>(p));
EXPECT_EQ('M', p[0]);
EXPECT_EQ('Z', p[1]);
}
void ImageInfoTest::TestResourceDll() const {
std::string file1 = FileContents("en-US.dll");
scoped_ptr<courgette::PEInfo> info(new courgette::PEInfo());
info->Init(reinterpret_cast<const uint8*>(file1.c_str()), file1.length());
bool can_parse_header = info->ParseHeader();
EXPECT_TRUE(can_parse_header);
// The executable is the whole file, not 'embedded' with the file
EXPECT_EQ(file1.length(), info->length());
EXPECT_TRUE(info->ok());
EXPECT_FALSE(info->has_text_section());
EXPECT_EQ(0U, info->size_of_code());
}
TEST_F(ImageInfoTest, All) {
TestExe();
TestResourceDll();
}