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

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: Line length. 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
« no previous file with comments | « chrome/browser/chrome_browser_main_win.cc ('k') | chrome/browser/install_module_verifier_win.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 <utility>
10 #include <vector>
11
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 AddModule(base::ListValue* list,
21 ModuleEnumerator::ModuleType type,
22 const std::string& name) {
23 scoped_ptr<base::DictionaryValue> data(new DictionaryValue());
24 data->SetInteger("type", type);
25 data->SetString("name", name);
26 list->Append(data.release());
27 }
28
29 } // namespace
30
31 TEST(InstallModuleVerifierTest, ExtractLoadedModuleNameDigests) {
32 std::set<std::string> loaded_module_name_digests;
33 scoped_ptr<base::ListValue> list(new ListValue());
34 ExtractLoadedModuleNameDigests(*list, &loaded_module_name_digests);
35 ASSERT_TRUE(loaded_module_name_digests.empty());
36 // WinSock modules are ignored.
37 AddModule(list.get(),
38 ModuleEnumerator::SHELL_EXTENSION, "winsock_module.dll");
39 // Shell Extension modules are ignored.
40 AddModule(
41 list.get(),
42 ModuleEnumerator::WINSOCK_MODULE_REGISTRATION, "shell_extension.dll");
43 AddModule(list.get(), ModuleEnumerator::LOADED_MODULE, "fancy_pants.dll");
44 AddModule(list.get(), ModuleEnumerator::LOADED_MODULE, "chrome.dll");
45 ExtractLoadedModuleNameDigests(*list, &loaded_module_name_digests);
46 ASSERT_EQ(2, loaded_module_name_digests.size());
47 ASSERT_NE(loaded_module_name_digests.end(),
48 loaded_module_name_digests.find(base::MD5String("chrome.dll")));
49 ASSERT_NE(loaded_module_name_digests.end(),
50 loaded_module_name_digests.find(
51 base::MD5String("fancy_pants.dll")));
52 }
53
54 TEST(InstallModuleVerifierTest, VerifyModules) {
55 std::set<std::string> loaded_module_name_digests;
56 std::set<size_t> reported_module_ids;
57
58 VerifyModules(loaded_module_name_digests,
59 AdditionalModules(),
60 &reported_module_ids);
61 ASSERT_TRUE(reported_module_ids.empty());
62
63 // Expected, Loaded modules are reported.
64 loaded_module_name_digests.insert(base::MD5String("chrome.dll"));
65 // Unexpected modules are ignored.
66 loaded_module_name_digests.insert(base::MD5String("fancy_pants.dll"));
67 VerifyModules(loaded_module_name_digests,
68 AdditionalModules(),
69 &reported_module_ids);
70 ASSERT_EQ(1, reported_module_ids.size());
71 // chrome.dll
72 ASSERT_NE(reported_module_ids.end(), reported_module_ids.find(1u));
73 reported_module_ids.clear();
74
75 // AdditionalModules can be used to detect other modules.
76 AdditionalModules additional_modules;
77 std::string fancy_pants_md5_digest(base::MD5String("fancy_pants.dll"));
78 additional_modules.push_back(
79 std::make_pair(123u, base::StringPiece(fancy_pants_md5_digest)));
80 VerifyModules(loaded_module_name_digests,
81 additional_modules,
82 &reported_module_ids);
83 ASSERT_EQ(2, reported_module_ids.size());
84 // chrome.dll
85 ASSERT_NE(reported_module_ids.end(), reported_module_ids.find(1u));
86 // fancy_pants.dll
87 ASSERT_NE(reported_module_ids.end(), reported_module_ids.find(123u));
88 reported_module_ids.clear();
89
90 // TODO(erikwright): Verify case-insensitive.
91 }
92
93 TEST(InstallModuleVerifierTest, ParseAdditionalModules) {
94 std::vector<std::pair<size_t, base::StringPiece> > additional_modules;
95
96 ParseAdditionalModules(base::StringPiece(), &additional_modules);
97 ASSERT_EQ(0u, additional_modules.size());
98
99 // Invalid input.
100 ParseAdditionalModules("hello", &additional_modules);
101 ASSERT_EQ(0u, additional_modules.size());
102 ParseAdditionalModules("hello world", &additional_modules);
103 ASSERT_EQ(0u, additional_modules.size());
104 ParseAdditionalModules("hello world\nfoo bar", &additional_modules);
105 ASSERT_EQ(0u, additional_modules.size());
106 ParseAdditionalModules("123 world\nfoo bar", &additional_modules);
107 ASSERT_EQ(0u, additional_modules.size());
108
109 // A single valid line followed by an invalid line.
110 ParseAdditionalModules("hello 0123456789abcdef0123456789abcdef\nfoo bar",
111 &additional_modules);
112 ASSERT_EQ(0u, additional_modules.size());
113 ParseAdditionalModules("123 0123456789abcdef0123456789abcdef\nfoo bar",
114 &additional_modules);
115 ASSERT_EQ(1u, additional_modules.size());
116 ASSERT_EQ(123u, additional_modules[0].first);
117 ASSERT_EQ("0123456789abcdef0123456789abcdef", additional_modules[0].second);
118 additional_modules.clear();
119
120 // The same, but with \r\n.
121 ParseAdditionalModules("123 0123456789abcdef0123456789abcdef\r\nfoo bar",
122 &additional_modules);
123 ASSERT_EQ(1u, additional_modules.size());
124 ASSERT_EQ(123u, additional_modules[0].first);
125 ASSERT_EQ("0123456789abcdef0123456789abcdef", additional_modules[0].second);
126 additional_modules.clear();
127
128 // Several valid and invalid lines, with varying line terminations etc.
129 ParseAdditionalModules("123 0123456789abcdef0123456789abcdef\r\n"
130 "456 DEADBEEFDEADBEEF\r"
131 "789 DEADBEEFDEADBEEFDEADBEEFDEADBEEF\n"
132 "\n"
133 "\n"
134 "321 BAADCAFEBAADCAFEBAADCAFEBAADCAFE\n",
135 &additional_modules);
136 ASSERT_EQ(3u, additional_modules.size());
137 ASSERT_EQ(123u, additional_modules[0].first);
138 ASSERT_EQ("0123456789abcdef0123456789abcdef", additional_modules[0].second);
139 ASSERT_EQ(789u, additional_modules[1].first);
140 ASSERT_EQ("DEADBEEFDEADBEEFDEADBEEFDEADBEEF", additional_modules[1].second);
141 ASSERT_EQ(321u, additional_modules[2].first);
142 ASSERT_EQ("BAADCAFEBAADCAFEBAADCAFEBAADCAFE", additional_modules[2].second);
143 additional_modules.clear();
144
145 // Leading empty lines, no termination on final line.
146 ParseAdditionalModules("\n"
147 "123 0123456789abcdef0123456789abcdef\r\n"
148 "321 BAADCAFEBAADCAFEBAADCAFEBAADCAFE",
149 &additional_modules);
150 ASSERT_EQ(2u, additional_modules.size());
151 ASSERT_EQ(123u, additional_modules[0].first);
152 ASSERT_EQ("0123456789abcdef0123456789abcdef", additional_modules[0].second);
153 ASSERT_EQ(321u, additional_modules[1].first);
154 ASSERT_EQ("BAADCAFEBAADCAFEBAADCAFEBAADCAFE", additional_modules[1].second);
155 additional_modules.clear();
156 }
OLDNEW
« no previous file with comments | « chrome/browser/chrome_browser_main_win.cc ('k') | chrome/browser/install_module_verifier_win.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698