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

Side by Side Diff: chrome/browser/install_module_verifier_unittest_win.cc

Issue 23513049: Implement install module verification metric. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Additional tests. Created 7 years, 2 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2013 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 "chrome/browser/install_module_verifier_win.h"
6
7 #include <set>
8 #include <string>
9 #include <vector>
10
11 #include "base/bind.h"
12 #include "base/md5.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "base/values.h"
15 #include "chrome/browser/enumerate_modules_model_win.h"
16 #include "testing/gtest/include/gtest/gtest.h"
17
18 namespace {
19
20 void MockCallback(std::vector<unsigned int>* reported_indexes,
21 size_t module_index) {
22 reported_indexes->push_back(module_index);
23 }
24
25 void AddModule(base::ListValue* list,
26 ModuleEnumerator::ModuleType type,
27 const std::string& name) {
28 scoped_ptr<base::DictionaryValue> data(new DictionaryValue());
29 data->SetInteger("type", type);
30 data->SetString("name", name);
31 list->Append(data.release());
32 }
33
34 } // namespace
35
36 TEST(InstallModuleVerifierTest, ExtractLoadedModuleNameDigests) {
37 std::set<std::string> loaded_module_name_digests;
38 scoped_ptr<base::ListValue> list(new ListValue());
39 ExtractLoadedModuleNameDigests(*list, &loaded_module_name_digests);
40 ASSERT_TRUE(loaded_module_name_digests.empty());
41 // WinSock modules are ignored.
42 AddModule(list.get(),
43 ModuleEnumerator::SHELL_EXTENSION, "winsock_module.dll");
44 // Shell Extension modules are ignored.
45 AddModule(
46 list.get(),
47 ModuleEnumerator::WINSOCK_MODULE_REGISTRATION, "shell_extension.dll");
48 AddModule(list.get(), ModuleEnumerator::LOADED_MODULE, "fancy_pants.dll");
49 AddModule(list.get(), ModuleEnumerator::LOADED_MODULE, "chrome.dll");
50 ExtractLoadedModuleNameDigests(*list, &loaded_module_name_digests);
51 ASSERT_EQ(2, loaded_module_name_digests.size());
52 ASSERT_NE(loaded_module_name_digests.end(),
53 loaded_module_name_digests.find(base::MD5String("chrome.dll")));
54 ASSERT_NE(loaded_module_name_digests.end(),
55 loaded_module_name_digests.find(
56 base::MD5String("fancy_pants.dll")));
57 }
58
59 TEST(InstallModuleVerifierTest, VerifyModules) {
60 std::set<std::string> loaded_module_name_digests;
61 std::vector<size_t> reported_indexes;
62
63 VerifyModules(loaded_module_name_digests,
64 AdditionalModules(),
65 base::Bind(&MockCallback, base::Unretained(&reported_indexes)));
66 ASSERT_TRUE(reported_indexes.empty());
67
68 // Expected, Loaded modules are reported.
69 loaded_module_name_digests.insert(base::MD5String("chrome.dll"));
70 // Unexpected modules are ignored.
71 loaded_module_name_digests.insert(base::MD5String("fancy_pants.dll"));
72 VerifyModules(loaded_module_name_digests,
73 AdditionalModules(),
74 base::Bind(&MockCallback, base::Unretained(&reported_indexes)));
75 ASSERT_EQ(1, reported_indexes.size());
76 ASSERT_EQ(1u, reported_indexes[0]); // Well-known ID for chrome.dll.
77 reported_indexes.clear();
78
79 // AdditionalModules can be used to detect other modules.
80 AdditionalModules additional_modules;
81 std::string fancy_pants_md5_digest(base::MD5String("fancy_pants.dll"));
82 additional_modules.push_back(
83 std::make_pair(123u, base::StringPiece(fancy_pants_md5_digest)));
84 VerifyModules(loaded_module_name_digests,
85 additional_modules,
86 base::Bind(&MockCallback, base::Unretained(&reported_indexes)));
87 ASSERT_EQ(2, reported_indexes.size());
88 ASSERT_EQ(1u, reported_indexes[0]); // Well-known ID for chrome.dll.
89 ASSERT_EQ(123u, reported_indexes[1]);
90 reported_indexes.clear();
91
92 // TODO(erikwright): Verify case-insensitive.
93 }
94
95 TEST(InstallModuleVerifierTest, ParseAdditionalModules) {
96 std::vector<std::pair<size_t, base::StringPiece> > additional_modules;
97
98 ParseAdditionalModules(base::StringPiece(), &additional_modules);
99 ASSERT_EQ(0u, additional_modules.size());
100
101 ParseAdditionalModules("hello", &additional_modules);
102 ASSERT_EQ(0u, additional_modules.size());
103 ParseAdditionalModules("hello world", &additional_modules);
104 ASSERT_EQ(0u, additional_modules.size());
105 ParseAdditionalModules("hello world\nfoo bar", &additional_modules);
106 ASSERT_EQ(0u, additional_modules.size());
107 ParseAdditionalModules("123 world\nfoo bar", &additional_modules);
108 ASSERT_EQ(0u, additional_modules.size());
109 ParseAdditionalModules("hello 0123456789abcdef0123456789abcdef\nfoo bar",
110 &additional_modules);
111 ASSERT_EQ(0u, additional_modules.size());
112 ParseAdditionalModules("123 0123456789abcdef0123456789abcdef\nfoo bar",
113 &additional_modules);
114 ASSERT_EQ(1u, additional_modules.size());
115 ASSERT_EQ(123u, additional_modules[0].first);
116 ASSERT_EQ("0123456789abcdef0123456789abcdef", additional_modules[0].second);
117 additional_modules.clear();
118
119 ParseAdditionalModules("123 0123456789abcdef0123456789abcdef\n"
120 "456 DEADBEEFDEADBEEF\n"
121 "789 DEADBEEFDEADBEEFDEADBEEFDEADBEEF\n"
122 "\n"
123 "\n"
124 "321 BAADCAFEBAADCAFEBAADCAFEBAADCAFE\n",
125 &additional_modules);
126 ASSERT_EQ(3u, additional_modules.size());
127 ASSERT_EQ(123u, additional_modules[0].first);
128 ASSERT_EQ("0123456789abcdef0123456789abcdef", additional_modules[0].second);
129 ASSERT_EQ(789u, additional_modules[1].first);
130 ASSERT_EQ("DEADBEEFDEADBEEFDEADBEEFDEADBEEF", additional_modules[1].second);
131 ASSERT_EQ(321u, additional_modules[2].first);
132 ASSERT_EQ("BAADCAFEBAADCAFEBAADCAFEBAADCAFE", additional_modules[2].second);
133 additional_modules.clear();
134
135 ParseAdditionalModules("\n"
136 "123 0123456789abcdef0123456789abcdef\n"
137 "321 BAADCAFEBAADCAFEBAADCAFEBAADCAFE",
138 &additional_modules);
139 ASSERT_EQ(2u, additional_modules.size());
140 ASSERT_EQ(123u, additional_modules[0].first);
141 ASSERT_EQ("0123456789abcdef0123456789abcdef", additional_modules[0].second);
142 ASSERT_EQ(321u, additional_modules[1].first);
143 ASSERT_EQ("BAADCAFEBAADCAFEBAADCAFEBAADCAFE", additional_modules[1].second);
144 additional_modules.clear();
145 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698