Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(978)

Unified Diff: chrome/common/safe_browsing/pe_image_reader_win_unittest.cc

Issue 1047693002: Give PeImageReader the power to read certificate entries. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: sync to position 323578 Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/common/safe_browsing/pe_image_reader_win.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/common/safe_browsing/pe_image_reader_win_unittest.cc
diff --git a/chrome/common/safe_browsing/pe_image_reader_win_unittest.cc b/chrome/common/safe_browsing/pe_image_reader_win_unittest.cc
index 781f96dd85ad4326e741ecb297e05bc427e4f303..d0a208be095a496ebf55910e9948cb5707277a4b 100644
--- a/chrome/common/safe_browsing/pe_image_reader_win_unittest.cc
+++ b/chrome/common/safe_browsing/pe_image_reader_win_unittest.cc
@@ -2,13 +2,23 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include <windows.h>
+#include <wintrust.h>
+
#include "base/files/file_path.h"
#include "base/files/memory_mapped_file.h"
#include "base/path_service.h"
#include "chrome/common/chrome_paths.h"
#include "chrome/common/safe_browsing/pe_image_reader_win.h"
+#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
+using ::testing::_;
+using ::testing::Gt;
+using ::testing::NotNull;
+using ::testing::Return;
+using ::testing::StrictMock;
+
struct TestData {
const char* filename;
safe_browsing::PeImageReader::WordSize word_size;
@@ -155,3 +165,125 @@ INSTANTIATE_TEST_CASE_P(WordSize32,
INSTANTIATE_TEST_CASE_P(WordSize64,
PeImageReaderTest,
testing::Values(&kTestData[1]));
+
+// An object exposing a PeImageReader::EnumCertificatesCallback that invokes a
+// virtual OnCertificate() method. This method is suitable for mocking in tests.
+class CertificateReceiver {
+ public:
+ void* AsContext() { return this; }
+ static bool OnCertificateCallback(uint16_t revision,
+ uint16_t certificate_type,
+ const uint8_t* certificate_data,
+ size_t certificate_data_size,
+ void* context) {
+ return reinterpret_cast<CertificateReceiver*>(context)->OnCertificate(
+ revision, certificate_type, certificate_data, certificate_data_size);
+ }
+
+ protected:
+ CertificateReceiver() {}
+ virtual ~CertificateReceiver() {}
+ virtual bool OnCertificate(uint16_t revision,
+ uint16_t certificate_type,
+ const uint8_t* certificate_data,
+ size_t certificate_data_size) = 0;
+};
+
+class MockCertificateReceiver : public CertificateReceiver {
+ public:
+ MockCertificateReceiver() {}
+ MOCK_METHOD4(OnCertificate, bool(uint16_t, uint16_t, const uint8_t*, size_t));
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(MockCertificateReceiver);
+};
+
+struct CertificateTestData {
+ const char* filename;
+ int num_signers;
+};
+
+// A test fixture parameterized on test data containing the name of a PE image
+// to parse and the expected values to be read from it. The file is read from
+// the src/chrome/test/data/safe_browsing/download_protection directory.
+class PeImageReaderCertificateTest
+ : public testing::TestWithParam<const CertificateTestData*> {
+ protected:
+ PeImageReaderCertificateTest() : expected_data_(GetParam()) {}
+
+ void SetUp() override {
+ ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &data_file_path_));
+ data_file_path_ = data_file_path_.AppendASCII("safe_browsing");
+ data_file_path_ = data_file_path_.AppendASCII("download_protection");
+ data_file_path_ = data_file_path_.AppendASCII(expected_data_->filename);
+ ASSERT_TRUE(data_file_.Initialize(data_file_path_));
+ ASSERT_TRUE(image_reader_.Initialize(data_file_.data(),
+ data_file_.length()));
+ }
+
+ const CertificateTestData* expected_data_;
+ base::FilePath data_file_path_;
+ base::MemoryMappedFile data_file_;
+ safe_browsing::PeImageReader image_reader_;
+};
+
+TEST_P(PeImageReaderCertificateTest, EnumCertificates) {
+ StrictMock<MockCertificateReceiver> receiver;
+ if (expected_data_->num_signers) {
+ EXPECT_CALL(receiver, OnCertificate(WIN_CERT_REVISION_2_0,
+ WIN_CERT_TYPE_PKCS_SIGNED_DATA,
+ NotNull(),
+ Gt(0U)))
+ .Times(expected_data_->num_signers)
+ .WillRepeatedly(Return(true));
+ }
+ EXPECT_TRUE(image_reader_.EnumCertificates(
+ &CertificateReceiver::OnCertificateCallback, receiver.AsContext()));
+}
+
+TEST_P(PeImageReaderCertificateTest, AbortEnum) {
+ StrictMock<MockCertificateReceiver> receiver;
+ if (expected_data_->num_signers) {
+ // Return false for the first cert, thereby stopping the enumeration.
+ EXPECT_CALL(receiver, OnCertificate(_, _, _, _)).WillOnce(Return(false));
+ EXPECT_FALSE(image_reader_.EnumCertificates(
+ &CertificateReceiver::OnCertificateCallback, receiver.AsContext()));
+ } else {
+ // An unsigned file always reports true with no invocations of the callback.
+ EXPECT_TRUE(image_reader_.EnumCertificates(
+ &CertificateReceiver::OnCertificateCallback, receiver.AsContext()));
+ }
+}
+
+namespace {
+
+const CertificateTestData kCertificateTestData[] = {
+ {
+ "signed.exe",
+ 1,
+ }, {
+ "unsigned.exe",
+ 0,
+ }, {
+ "wow_helper.exe",
+ 1,
+ }, {
+ "signed_twice.exe",
+ 2,
+ },
+};
+
+} // namespace
+
+INSTANTIATE_TEST_CASE_P(SignedExe,
+ PeImageReaderCertificateTest,
+ testing::Values(&kCertificateTestData[0]));
+INSTANTIATE_TEST_CASE_P(UnsignedExe,
+ PeImageReaderCertificateTest,
+ testing::Values(&kCertificateTestData[1]));
+INSTANTIATE_TEST_CASE_P(WowHelperExe,
+ PeImageReaderCertificateTest,
+ testing::Values(&kCertificateTestData[2]));
+INSTANTIATE_TEST_CASE_P(SignedTwiceExe,
+ PeImageReaderCertificateTest,
+ testing::Values(&kCertificateTestData[3]));
« no previous file with comments | « chrome/common/safe_browsing/pe_image_reader_win.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698