OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <algorithm> | 5 #include <algorithm> |
6 #include "chrome/browser/renderer_host/test/test_render_view_host.h" | 6 #include "chrome/browser/renderer_host/test/test_render_view_host.h" |
7 | 7 |
8 #include "chrome/browser/browser_thread.h" | 8 #include "chrome/browser/browser_thread.h" |
9 #include "chrome/browser/safe_browsing/malware_details.h" | 9 #include "chrome/browser/safe_browsing/malware_details.h" |
10 #include "chrome/browser/safe_browsing/report.pb.h" | 10 #include "chrome/browser/safe_browsing/report.pb.h" |
11 #include "chrome/browser/tab_contents/navigation_entry.h" | 11 #include "chrome/browser/tab_contents/navigation_entry.h" |
12 #include "chrome/browser/tab_contents/test_tab_contents.h" | 12 #include "chrome/browser/tab_contents/test_tab_contents.h" |
13 #include "chrome/common/render_messages.h" | 13 #include "chrome/common/render_messages.h" |
14 #include "chrome/common/render_messages_params.h" | 14 #include "chrome/common/render_messages_params.h" |
15 | 15 |
16 static const char* kOriginalLandingURL = "http://www.originallandingpage.com/"; | 16 static const char* kOriginalLandingURL = "http://www.originallandingpage.com/"; |
17 static const char* kLandingURL = "http://www.landingpage.com/"; | 17 static const char* kLandingURL = "http://www.landingpage.com/"; |
18 static const char* kMalwareURL = "http://www.malware.com/"; | 18 static const char* kMalwareURL = "http://www.malware.com/"; |
19 static const char* kHttpsURL = "https://www.url.com/"; | 19 static const char* kHttpsURL = "https://www.url.com/"; |
20 | 20 |
| 21 using safe_browsing::ClientMalwareReportRequest; |
| 22 |
21 class MalwareDetailsTest : public RenderViewHostTestHarness { | 23 class MalwareDetailsTest : public RenderViewHostTestHarness { |
22 public: | 24 public: |
23 MalwareDetailsTest() | 25 MalwareDetailsTest() |
24 : ui_thread_(BrowserThread::UI, MessageLoop::current()), | 26 : ui_thread_(BrowserThread::UI, MessageLoop::current()), |
25 io_thread_(BrowserThread::IO, MessageLoop::current()) { | 27 io_thread_(BrowserThread::IO, MessageLoop::current()) { |
26 } | 28 } |
27 | 29 |
28 virtual void SetUp() { | 30 virtual void SetUp() { |
29 RenderViewHostTestHarness::SetUp(); | 31 RenderViewHostTestHarness::SetUp(); |
30 } | 32 } |
31 | 33 |
32 static bool ResourceLessThan( | 34 static bool ResourceLessThan( |
33 const safe_browsing::ClientMalwareReportRequest::Resource* lhs, | 35 const ClientMalwareReportRequest::Resource* lhs, |
34 const safe_browsing::ClientMalwareReportRequest::Resource* rhs) { | 36 const ClientMalwareReportRequest::Resource* rhs) { |
35 return lhs->url() < rhs->url(); | 37 return lhs->id() < rhs->id(); |
| 38 } |
| 39 |
| 40 static bool NodeLessThan( |
| 41 const ClientMalwareReportRequest::Node* lhs, |
| 42 const ClientMalwareReportRequest::Node* rhs) { |
| 43 return lhs->id() < rhs->id(); |
36 } | 44 } |
37 | 45 |
38 protected: | 46 protected: |
39 void InitResource(SafeBrowsingService::UnsafeResource* resource, | 47 void InitResource(SafeBrowsingService::UnsafeResource* resource, |
40 ResourceType::Type resource_type, | 48 ResourceType::Type resource_type, |
41 const GURL& url) { | 49 const GURL& url) { |
42 resource->client = NULL; | 50 resource->client = NULL; |
43 resource->url = url; | 51 resource->url = url; |
44 resource->resource_type = resource_type; | 52 resource->resource_type = resource_type; |
45 resource->threat_type = SafeBrowsingService::URL_MALWARE; | 53 resource->threat_type = SafeBrowsingService::URL_MALWARE; |
46 resource->render_process_host_id = contents_->GetRenderProcessHost()->id(); | 54 resource->render_process_host_id = contents_->GetRenderProcessHost()->id(); |
47 resource->render_view_id = contents_->render_view_host()->routing_id(); | 55 resource->render_view_id = contents_->render_view_host()->routing_id(); |
48 } | 56 } |
49 | 57 |
50 void VerifyResults( | 58 void VerifyResults(const ClientMalwareReportRequest& report_pb, |
51 const safe_browsing::ClientMalwareReportRequest& report_pb, | 59 const ClientMalwareReportRequest& expected_pb) { |
52 const safe_browsing::ClientMalwareReportRequest& expected_pb) { | |
53 EXPECT_EQ(expected_pb.malware_url(), report_pb.malware_url()); | 60 EXPECT_EQ(expected_pb.malware_url(), report_pb.malware_url()); |
54 EXPECT_EQ(expected_pb.page_url(), report_pb.page_url()); | 61 EXPECT_EQ(expected_pb.page_url(), report_pb.page_url()); |
55 EXPECT_EQ(expected_pb.referrer_url(), report_pb.referrer_url()); | 62 EXPECT_EQ(expected_pb.referrer_url(), report_pb.referrer_url()); |
56 | 63 |
57 ASSERT_EQ(expected_pb.nodes_size(), report_pb.nodes_size()); | 64 ASSERT_EQ(expected_pb.resources_size(), report_pb.resources_size()); |
58 // Sort the nodes, to make the test deterministic | 65 // Sort the resources and nodes, to make the test deterministic |
59 std::vector<const safe_browsing::ClientMalwareReportRequest::Resource*> | 66 std::vector<const ClientMalwareReportRequest::Resource*> resources; |
60 nodes; | 67 for (int i = 0; i < report_pb.resources_size(); ++i) { |
61 for (int i = 0; i < report_pb.nodes_size(); ++i) { | 68 const ClientMalwareReportRequest::Resource& resource = |
62 const safe_browsing::ClientMalwareReportRequest::Resource& resource = | 69 report_pb.resources(i); |
63 report_pb.nodes(i); | 70 resources.push_back(&resource); |
64 nodes.push_back(&resource); | |
65 } | 71 } |
66 std::sort(nodes.begin(), nodes.end(), | 72 std::sort(resources.begin(), resources.end(), |
67 &MalwareDetailsTest::ResourceLessThan); | 73 &MalwareDetailsTest::ResourceLessThan); |
68 | 74 |
69 std::vector<const safe_browsing::ClientMalwareReportRequest::Resource*> | 75 std::vector<const ClientMalwareReportRequest::Resource*> expected; |
70 expected; | 76 for (int i = 0; i < report_pb.resources_size(); ++i) { |
71 for (int i = 0; i < report_pb.nodes_size(); ++i) { | 77 const ClientMalwareReportRequest::Resource& resource = |
72 const safe_browsing::ClientMalwareReportRequest::Resource& resource = | 78 expected_pb.resources(i); |
73 expected_pb.nodes(i); | |
74 expected.push_back(&resource); | 79 expected.push_back(&resource); |
75 } | 80 } |
76 std::sort(expected.begin(), expected.end(), | 81 std::sort(expected.begin(), expected.end(), |
77 &MalwareDetailsTest::ResourceLessThan); | 82 &MalwareDetailsTest::ResourceLessThan); |
78 | 83 |
79 for (uint32 i = 0; i < expected.size(); ++i) { | 84 for (uint32 i = 0; i < expected.size(); ++i) { |
80 EXPECT_EQ(expected[i]->url(), nodes[i]->url()); | 85 EXPECT_EQ(expected[i]->id(), resources[i]->id()); |
81 EXPECT_EQ(expected[i]->parent(), nodes[i]->parent()); | 86 EXPECT_EQ(expected[i]->url(), resources[i]->url()); |
| 87 } |
| 88 |
| 89 ASSERT_EQ(expected_pb.nodes_size(), report_pb.nodes_size()); |
| 90 // Sort the nodes, to make the test deterministic |
| 91 std::vector<const ClientMalwareReportRequest::Node*> nodes; |
| 92 for (int i = 0; i < report_pb.nodes_size(); ++i) { |
| 93 const ClientMalwareReportRequest::Node& node = report_pb.nodes(i); |
| 94 nodes.push_back(&node); |
| 95 } |
| 96 std::sort(nodes.begin(), nodes.end(), &MalwareDetailsTest::NodeLessThan); |
| 97 |
| 98 std::vector<const ClientMalwareReportRequest::Node*> expected_nodes; |
| 99 for (int i = 0; i < report_pb.nodes_size(); ++i) { |
| 100 const ClientMalwareReportRequest::Node& node = expected_pb.nodes(i); |
| 101 expected_nodes.push_back(&node); |
| 102 } |
| 103 std::sort(expected_nodes.begin(), expected_nodes.end(), |
| 104 &MalwareDetailsTest::NodeLessThan); |
| 105 |
| 106 for (uint32 i = 0; i < expected_nodes.size(); ++i) { |
| 107 EXPECT_EQ(expected_nodes[i]->id(), nodes[i]->id()); |
| 108 EXPECT_EQ(expected_nodes[i]->parent_id(), nodes[i]->parent_id()); |
82 } | 109 } |
83 } | 110 } |
84 | 111 |
85 BrowserThread ui_thread_; | 112 BrowserThread ui_thread_; |
86 BrowserThread io_thread_; | 113 BrowserThread io_thread_; |
87 }; | 114 }; |
88 | 115 |
89 // Tests creating a simple malware report. | 116 // Tests creating a simple malware report. |
90 TEST_F(MalwareDetailsTest, MalwareSubResource) { | 117 TEST_F(MalwareDetailsTest, MalwareSubResource) { |
91 // Start a load. | 118 // Start a load. |
92 controller().LoadURL(GURL(kLandingURL), GURL(), PageTransition::TYPED); | 119 controller().LoadURL(GURL(kLandingURL), GURL(), PageTransition::TYPED); |
93 | 120 |
94 SafeBrowsingService::UnsafeResource resource; | 121 SafeBrowsingService::UnsafeResource resource; |
95 InitResource(&resource, ResourceType::SUB_RESOURCE, GURL(kMalwareURL)); | 122 InitResource(&resource, ResourceType::SUB_RESOURCE, GURL(kMalwareURL)); |
96 | 123 |
97 scoped_refptr<MalwareDetails> report = new MalwareDetails( | 124 scoped_refptr<MalwareDetails> report = new MalwareDetails( |
98 contents(), resource); | 125 contents(), resource); |
99 | 126 |
100 scoped_ptr<const std::string> serialized(report->GetSerializedReport()); | 127 scoped_ptr<const std::string> serialized(report->GetSerializedReport()); |
101 safe_browsing::ClientMalwareReportRequest actual; | 128 ClientMalwareReportRequest actual; |
102 actual.ParseFromString(*serialized); | 129 actual.ParseFromString(*serialized); |
103 | 130 |
104 safe_browsing::ClientMalwareReportRequest expected; | 131 ClientMalwareReportRequest expected; |
105 expected.set_malware_url(kMalwareURL); | 132 expected.set_malware_url(kMalwareURL); |
106 expected.set_page_url(kLandingURL); | 133 expected.set_page_url(kLandingURL); |
107 expected.set_referrer_url(""); | 134 expected.set_referrer_url(""); |
108 | 135 |
109 safe_browsing::ClientMalwareReportRequest::Resource* node = | 136 ClientMalwareReportRequest::Resource* pb_resource = expected.add_resources(); |
110 expected.add_nodes(); | 137 pb_resource->set_id(0); |
111 node->set_url(kLandingURL); | 138 pb_resource->set_url(kLandingURL); |
| 139 pb_resource = expected.add_resources(); |
| 140 pb_resource->set_id(1); |
| 141 pb_resource->set_url(kMalwareURL); |
| 142 |
| 143 ClientMalwareReportRequest::Node* node = expected.add_nodes(); |
| 144 node->set_id(0); |
112 node = expected.add_nodes(); | 145 node = expected.add_nodes(); |
113 node->set_url(kMalwareURL); | 146 node->set_id(1); |
114 | 147 |
115 VerifyResults(actual, expected); | 148 VerifyResults(actual, expected); |
116 } | 149 } |
117 | 150 |
118 // Tests creating a simple malware report where the subresource has a | 151 // Tests creating a simple malware report where the subresource has a |
119 // different original_url. | 152 // different original_url. |
120 TEST_F(MalwareDetailsTest, MalwareSubResourceWithOriginalUrl) { | 153 TEST_F(MalwareDetailsTest, MalwareSubResourceWithOriginalUrl) { |
121 controller().LoadURL(GURL(kLandingURL), GURL(), PageTransition::TYPED); | 154 controller().LoadURL(GURL(kLandingURL), GURL(), PageTransition::TYPED); |
122 | 155 |
123 SafeBrowsingService::UnsafeResource resource; | 156 SafeBrowsingService::UnsafeResource resource; |
124 InitResource(&resource, ResourceType::SUB_RESOURCE, GURL(kMalwareURL)); | 157 InitResource(&resource, ResourceType::SUB_RESOURCE, GURL(kMalwareURL)); |
125 resource.original_url = GURL(kOriginalLandingURL); | 158 resource.original_url = GURL(kOriginalLandingURL); |
126 | 159 |
127 scoped_refptr<MalwareDetails> report = new MalwareDetails( | 160 scoped_refptr<MalwareDetails> report = new MalwareDetails( |
128 contents(), resource); | 161 contents(), resource); |
129 | 162 |
130 scoped_ptr<const std::string> serialized(report->GetSerializedReport()); | 163 scoped_ptr<const std::string> serialized(report->GetSerializedReport()); |
131 safe_browsing::ClientMalwareReportRequest actual; | 164 ClientMalwareReportRequest actual; |
132 actual.ParseFromString(*serialized); | 165 actual.ParseFromString(*serialized); |
133 | 166 |
134 safe_browsing::ClientMalwareReportRequest expected; | 167 ClientMalwareReportRequest expected; |
135 expected.set_malware_url(kMalwareURL); | 168 expected.set_malware_url(kMalwareURL); |
136 expected.set_page_url(kLandingURL); | 169 expected.set_page_url(kLandingURL); |
137 expected.set_referrer_url(""); | 170 expected.set_referrer_url(""); |
138 | 171 |
139 safe_browsing::ClientMalwareReportRequest::Resource* node = | 172 ClientMalwareReportRequest::Resource* pb_resource = expected.add_resources(); |
140 expected.add_nodes(); | 173 pb_resource->set_id(0); |
141 node->set_url(kLandingURL); | 174 pb_resource->set_url(kLandingURL); |
142 | 175 |
143 // Malware url should have originalurl as parent. | 176 pb_resource = expected.add_resources(); |
| 177 pb_resource->set_id(1); |
| 178 pb_resource->set_url(kOriginalLandingURL); |
| 179 |
| 180 pb_resource = expected.add_resources(); |
| 181 pb_resource->set_id(2); |
| 182 pb_resource->set_url(kMalwareURL); |
| 183 |
| 184 ClientMalwareReportRequest::Node* node = expected.add_nodes(); |
| 185 node->set_id(0); |
144 node = expected.add_nodes(); | 186 node = expected.add_nodes(); |
145 node->set_url(kMalwareURL); | 187 node->set_id(1); |
146 node->set_parent(kOriginalLandingURL); | 188 // The Node for kMmalwareUrl (with id 2) should have the Node for |
147 | 189 // kOriginalLandingURL (with id 1) as parent. |
148 node = expected.add_nodes(); | 190 node = expected.add_nodes(); |
149 node->set_url(kOriginalLandingURL); | 191 node->set_id(2); |
| 192 node->set_parent_id(1); |
150 | 193 |
151 VerifyResults(actual, expected); | 194 VerifyResults(actual, expected); |
152 } | 195 } |
153 | 196 |
154 // Verify that https:// urls are dropped. | 197 // Verify that https:// urls are dropped. |
155 TEST_F(MalwareDetailsTest, NotPublicUrl) { | 198 TEST_F(MalwareDetailsTest, NotPublicUrl) { |
156 controller().LoadURL(GURL(kHttpsURL), GURL(), PageTransition::TYPED); | 199 controller().LoadURL(GURL(kHttpsURL), GURL(), PageTransition::TYPED); |
157 SafeBrowsingService::UnsafeResource resource; | 200 SafeBrowsingService::UnsafeResource resource; |
158 InitResource(&resource, ResourceType::SUB_RESOURCE, GURL(kMalwareURL)); | 201 InitResource(&resource, ResourceType::SUB_RESOURCE, GURL(kMalwareURL)); |
159 scoped_refptr<MalwareDetails> report = new MalwareDetails( | 202 scoped_refptr<MalwareDetails> report = new MalwareDetails( |
160 contents(), resource); | 203 contents(), resource); |
161 | 204 |
162 scoped_ptr<const std::string> serialized(report->GetSerializedReport()); | 205 scoped_ptr<const std::string> serialized(report->GetSerializedReport()); |
163 safe_browsing::ClientMalwareReportRequest actual; | 206 ClientMalwareReportRequest actual; |
164 actual.ParseFromString(*serialized); | 207 actual.ParseFromString(*serialized); |
165 | 208 |
166 safe_browsing::ClientMalwareReportRequest expected; | 209 ClientMalwareReportRequest expected; |
167 expected.set_malware_url(kMalwareURL); // No page_url | 210 expected.set_malware_url(kMalwareURL); // No page_url |
168 expected.set_referrer_url(""); | 211 expected.set_referrer_url(""); |
169 | 212 |
170 safe_browsing::ClientMalwareReportRequest::Resource* node = | 213 ClientMalwareReportRequest::Resource* pb_resource = expected.add_resources(); |
171 expected.add_nodes(); | 214 pb_resource->set_url(kMalwareURL); // Only one resource |
172 node->set_url(kMalwareURL); // Only one node | 215 |
| 216 ClientMalwareReportRequest::Node* node = expected.add_nodes(); |
| 217 node->set_id(0); |
173 | 218 |
174 VerifyResults(actual, expected); | 219 VerifyResults(actual, expected); |
175 } | 220 } |
OLD | NEW |