15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/pickle.h" 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/run_loop.h" 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_backend.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/history_service.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_service_factory.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/safe_browsing/malware_details.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/safe_browsing/malware_details_history.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/safe_browsing/report.pb.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/safe_browsing/safe_browsing_service.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/safe_browsing/ui_manager.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/render_messages.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/safe_browsing/safebrowsing_messages.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/chrome_render_view_host_test_harness.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/io_buffer.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/test_completion_callback.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/disk_cache/disk_cache.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_cache.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_response_headers.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_response_info.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_util.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char* kOriginalLandingURL = "http://www.originallandingpage.com/"; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char* kHttpsURL = "https://www.url.com/"; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char* kDOMChildURL = "http://www.domparent.com/"; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char* kDOMParentURL = "http://www.domchild.com/"; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char* kFirstRedirectURL = "http://redirectone.com/"; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char* kSecondRedirectURL = "http://redirecttwo.com/"; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char* kMalwareURL = "http://www.malware.com/"; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char* kMalwareHeaders = 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "HTTP/1.1 200 OK\n" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Content-Type: image/jpeg\n"; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char* kMalwareData = "exploit();"; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char* kLandingURL = "http://www.landingpage.com/"; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char* kLandingHeaders = 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "HTTP/1.1 200 OK\n" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Content-Type: text/html\n" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Content-Length: 1024\n" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Set-Cookie: tastycookie\n"; // This header is stripped. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char* kLandingData = "<iframe src='http://www.malware.com'>"; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using safe_browsing::ClientMalwareReportRequest; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 643240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochvoid WriteHeaders(disk_cache::Entry* entry, const std::string& headers) { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpResponseInfo responseinfo; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string raw_headers = net::HttpUtil::AssembleRawHeaders( 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers.c_str(), headers.size()); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) responseinfo.socket_address = net::HostPortPair("1.2.3.4", 80); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) responseinfo.headers = new net::HttpResponseHeaders(raw_headers); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Pickle pickle; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) responseinfo.Persist(&pickle, false, false); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::WrappedIOBuffer> buf(new net::WrappedIOBuffer( 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<const char*>(pickle.data()))); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int len = static_cast<int>(pickle.size()); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::TestCompletionCallback cb; 79868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int rv = entry->WriteData(0, 0, buf.get(), len, cb.callback(), true); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(len, cb.GetResult(rv)); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 833240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochvoid WriteData(disk_cache::Entry* entry, const std::string& data) { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (data.empty()) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int len = data.length(); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(len)); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(buf->data(), data.data(), data.length()); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::TestCompletionCallback cb; 92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int rv = entry->WriteData(1, 0, buf.get(), len, cb.callback(), true); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(len, cb.GetResult(rv)); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 963240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochvoid WriteToEntry(disk_cache::Backend* cache, const std::string& key, 973240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch const std::string& headers, const std::string& data) { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::TestCompletionCallback cb; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* entry; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rv = cache->CreateEntry(key, &entry, cb.callback()); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = cb.GetResult(rv); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rv != net::OK) { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = cache->OpenEntry(key, &entry, cb.callback()); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, cb.GetResult(rv)); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WriteHeaders(entry, headers); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WriteData(entry, data); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry->Close(); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FillCache(net::URLRequestContextGetter* context_getter) { 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::TestCompletionCallback cb; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Backend* cache; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rv = 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_getter->GetURLRequestContext()->http_transaction_factory()-> 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCache()->GetBackend(&cache, cb.callback()); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(net::OK, cb.GetResult(rv)); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WriteToEntry(cache, kMalwareURL, kMalwareHeaders, kMalwareData); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WriteToEntry(cache, kLandingURL, kLandingHeaders, kLandingData); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Lets us provide a MockURLRequestContext with an HTTP Cache we pre-populate. 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Also exposes the constructor. 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MalwareDetailsWrap : public MalwareDetails { 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MalwareDetailsWrap( 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SafeBrowsingUIManager* ui_manager, 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents, 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SafeBrowsingUIManager::UnsafeResource& unsafe_resource, 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::URLRequestContextGetter* request_context_getter) 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : MalwareDetails(ui_manager, web_contents, unsafe_resource) { 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_context_getter_ = request_context_getter; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MalwareDetailsWrap() {} 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockSafeBrowsingUIManager : public SafeBrowsingUIManager { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::RunLoop* run_loop_; 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The safe browsing UI manager does not need a service for this test. 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockSafeBrowsingUIManager() 147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) : SafeBrowsingUIManager(NULL), run_loop_(NULL) {} 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the MalwareDetails is done, this is called. 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SendSerializedMalwareDetails( 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& serialized) OVERRIDE { 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "SendSerializedMalwareDetails"; 153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) run_loop_->Quit(); 154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) run_loop_ = NULL; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) serialized_ = serialized; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 158868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Used to synchronize SendSerializedMalwareDetails() with 159868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // WaitForSerializedReport(). RunLoop::RunUntilIdle() is not sufficient 160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // because the MessageLoop task queue completely drains at some point 161868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // between the send and the wait. 162868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void SetRunLoopToQuit(base::RunLoop* run_loop) { 163868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(run_loop_ == NULL); 164868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) run_loop_ = run_loop; 165868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 166868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& GetSerialized() { 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return serialized_; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~MockSafeBrowsingUIManager() {} 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string serialized_; 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MockSafeBrowsingUIManager); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace. 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MalwareDetailsTest : public ChromeRenderViewHostTestHarness { 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef SafeBrowsingUIManager::UnsafeResource UnsafeResource; 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MalwareDetailsTest() 185868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) : ui_manager_(new MockSafeBrowsingUIManager()) { 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 188868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void SetUp() OVERRIDE { 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeRenderViewHostTestHarness::SetUp(); 190bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch ASSERT_TRUE(profile()->CreateHistoryService( 191bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch true /* delete_file */, false /* no_db */)); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 194868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void TearDown() OVERRIDE { 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile()->DestroyHistoryService(); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeRenderViewHostTestHarness::TearDown(); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool ResourceLessThan( 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ClientMalwareReportRequest::Resource* lhs, 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ClientMalwareReportRequest::Resource* rhs) { 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return lhs->id() < rhs->id(); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string WaitForSerializedReport(MalwareDetails* report) { 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::IO, 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&MalwareDetails::FinishCollection, report)); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for the callback (SendSerializedMalwareDetails). 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Waiting for SendSerializedMalwareDetails"; 212868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::RunLoop run_loop; 213868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ui_manager_->SetRunLoopToQuit(&run_loop); 214868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) run_loop.Run(); 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ui_manager_->GetSerialized(); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryService* history_service() { 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HistoryServiceFactory::GetForProfile(profile(), 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile::EXPLICIT_ACCESS); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void InitResource(UnsafeResource* resource, 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_subresource, 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url) { 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resource->url = url; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resource->is_subresource = is_subresource; 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resource->threat_type = SB_THREAT_TYPE_URL_MALWARE; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resource->render_process_host_id = 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents()->GetRenderProcessHost()->GetID(); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resource->render_view_id = 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents()->GetRenderViewHost()->GetRoutingID(); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void VerifyResults(const ClientMalwareReportRequest& report_pb, 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ClientMalwareReportRequest& expected_pb) { 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_pb.malware_url(), report_pb.malware_url()); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_pb.page_url(), report_pb.page_url()); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_pb.referrer_url(), report_pb.referrer_url()); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(expected_pb.resources_size(), report_pb.resources_size()); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sort the resources, to make the test deterministic 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<const ClientMalwareReportRequest::Resource*> resources; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < report_pb.resources_size(); ++i) { 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ClientMalwareReportRequest::Resource& resource = 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) report_pb.resources(i); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resources.push_back(&resource); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::sort(resources.begin(), resources.end(), 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &MalwareDetailsTest::ResourceLessThan); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<const ClientMalwareReportRequest::Resource*> expected; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < report_pb.resources_size(); ++i) { 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ClientMalwareReportRequest::Resource& resource = 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_pb.resources(i); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.push_back(&resource); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::sort(expected.begin(), expected.end(), 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &MalwareDetailsTest::ResourceLessThan); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (uint32 i = 0; i < expected.size(); ++i) { 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VerifyResource(resources[i], expected[i]); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_pb.complete(), report_pb.complete()); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void VerifyResource(const ClientMalwareReportRequest::Resource* resource, 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ClientMalwareReportRequest::Resource* expected) { 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected->id(), resource->id()); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected->url(), resource->url()); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected->parent_id(), resource->parent_id()); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(expected->child_ids_size(), resource->child_ids_size()); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < expected->child_ids_size(); i++) { 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected->child_ids(i), resource->child_ids(i)); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify HTTP Responses 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (expected->has_response()) { 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(resource->has_response()); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected->response().firstline().code(), 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resource->response().firstline().code()); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(expected->response().headers_size(), 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resource->response().headers_size()); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < expected->response().headers_size(); ++i) { 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected->response().headers(i).name(), 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resource->response().headers(i).name()); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected->response().headers(i).value(), 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resource->response().headers(i).value()); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected->response().body(), resource->response().body()); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected->response().bodylength(), 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resource->response().bodylength()); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected->response().bodydigest(), 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resource->response().bodydigest()); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify IP:port pair 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected->response().remote_ip(), 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resource->response().remote_ip()); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds a page to history. 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The redirects is the redirect url chain leading to the url. 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddPageToHistory(const GURL& url, 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::RedirectList* redirects) { 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The last item of the redirect chain has to be the final url when adding 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to history backend. 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirects->push_back(url); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_service()->AddPage( 314116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch url, base::Time::Now(), reinterpret_cast<history::ContextID>(1), 0, 3151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GURL(), *redirects, ui::PAGE_TRANSITION_TYPED, 316116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch history::SOURCE_BROWSED, false); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<MockSafeBrowsingUIManager> ui_manager_; 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests creating a simple malware report. 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MalwareDetailsTest, MalwareSubResource) { 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start a load. 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller().LoadURL(GURL(kLandingURL), content::Referrer(), 3261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PAGE_TRANSITION_TYPED, std::string()); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UnsafeResource resource; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitResource(&resource, true, GURL(kMalwareURL)); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 331868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_refptr<MalwareDetailsWrap> report = 332868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) new MalwareDetailsWrap(ui_manager_.get(), web_contents(), resource, NULL); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 334868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string serialized = WaitForSerializedReport(report.get()); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientMalwareReportRequest actual; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actual.ParseFromString(serialized); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientMalwareReportRequest expected; 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_malware_url(kMalwareURL); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_page_url(kLandingURL); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_referrer_url(""); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientMalwareReportRequest::Resource* pb_resource = expected.add_resources(); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_id(0); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_url(kLandingURL); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource = expected.add_resources(); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_id(1); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_url(kMalwareURL); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VerifyResults(actual, expected); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests creating a simple malware report where the subresource has a 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// different original_url. 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MalwareDetailsTest, MalwareSubResourceWithOriginalUrl) { 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller().LoadURL(GURL(kLandingURL), content::Referrer(), 3581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PAGE_TRANSITION_TYPED, std::string()); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UnsafeResource resource; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitResource(&resource, true, GURL(kMalwareURL)); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resource.original_url = GURL(kOriginalLandingURL); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MalwareDetailsWrap> report = new MalwareDetailsWrap( 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_manager_.get(), web_contents(), resource, NULL); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 367868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string serialized = WaitForSerializedReport(report.get()); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientMalwareReportRequest actual; 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actual.ParseFromString(serialized); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientMalwareReportRequest expected; 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_malware_url(kMalwareURL); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_page_url(kLandingURL); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_referrer_url(""); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientMalwareReportRequest::Resource* pb_resource = expected.add_resources(); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_id(0); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_url(kLandingURL); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource = expected.add_resources(); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_id(1); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_url(kOriginalLandingURL); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource = expected.add_resources(); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_id(2); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_url(kMalwareURL); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The Resource for kMmalwareUrl should have the Resource for 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // kOriginalLandingURL (with id 1) as parent. 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_parent_id(1); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VerifyResults(actual, expected); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests creating a malware report with data from the renderer. 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MalwareDetailsTest, MalwareDOMDetails) { 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller().LoadURL(GURL(kLandingURL), content::Referrer(), 3981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PAGE_TRANSITION_TYPED, std::string()); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UnsafeResource resource; 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitResource(&resource, true, GURL(kMalwareURL)); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MalwareDetailsWrap> report = new MalwareDetailsWrap( 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_manager_.get(), web_contents(), resource, NULL); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send a message from the DOM, with 2 nodes, a parent and a child. 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<SafeBrowsingHostMsg_MalwareDOMDetails_Node> params; 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SafeBrowsingHostMsg_MalwareDOMDetails_Node child_node; 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_node.url = GURL(kDOMChildURL); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_node.tag_name = "iframe"; 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_node.parent = GURL(kDOMParentURL); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.push_back(child_node); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SafeBrowsingHostMsg_MalwareDOMDetails_Node parent_node; 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent_node.url = GURL(kDOMParentURL); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent_node.children.push_back(GURL(kDOMChildURL)); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.push_back(parent_node); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) report->OnReceivedMalwareDOMDetails(params); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 419868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string serialized = WaitForSerializedReport(report.get()); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientMalwareReportRequest actual; 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actual.ParseFromString(serialized); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientMalwareReportRequest expected; 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_malware_url(kMalwareURL); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_page_url(kLandingURL); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_referrer_url(""); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientMalwareReportRequest::Resource* pb_resource = expected.add_resources(); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_id(0); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_url(kLandingURL); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource = expected.add_resources(); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_id(1); 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_url(kMalwareURL); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource = expected.add_resources(); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_id(2); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_url(kDOMChildURL); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_parent_id(3); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource = expected.add_resources(); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_id(3); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_url(kDOMParentURL); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->add_child_ids(2); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_complete(false); // Since the cache was missing. 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VerifyResults(actual, expected); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that https:// urls are dropped. 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MalwareDetailsTest, NotPublicUrl) { 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller().LoadURL(GURL(kHttpsURL), content::Referrer(), 4531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PAGE_TRANSITION_TYPED, std::string()); 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UnsafeResource resource; 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitResource(&resource, true, GURL(kMalwareURL)); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MalwareDetailsWrap> report = new MalwareDetailsWrap( 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_manager_.get(), web_contents(), resource, NULL); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 459868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string serialized = WaitForSerializedReport(report.get()); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientMalwareReportRequest actual; 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actual.ParseFromString(serialized); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientMalwareReportRequest expected; 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_malware_url(kMalwareURL); // No page_url 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_referrer_url(""); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientMalwareReportRequest::Resource* pb_resource = expected.add_resources(); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_url(kMalwareURL); // Only one resource 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VerifyResults(actual, expected); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests creating a malware report where there are redirect urls to an unsafe 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// resource url 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MalwareDetailsTest, MalwareWithRedirectUrl) { 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller().LoadURL(GURL(kLandingURL), content::Referrer(), 4771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PAGE_TRANSITION_TYPED, std::string()); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UnsafeResource resource; 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitResource(&resource, true, GURL(kMalwareURL)); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resource.original_url = GURL(kOriginalLandingURL); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // add some redirect urls 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resource.redirect_urls.push_back(GURL(kFirstRedirectURL)); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resource.redirect_urls.push_back(GURL(kSecondRedirectURL)); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resource.redirect_urls.push_back(GURL(kMalwareURL)); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MalwareDetailsWrap> report = new MalwareDetailsWrap( 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_manager_.get(), web_contents(), resource, NULL); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 491868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string serialized = WaitForSerializedReport(report.get()); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientMalwareReportRequest actual; 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actual.ParseFromString(serialized); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientMalwareReportRequest expected; 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_malware_url(kMalwareURL); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_page_url(kLandingURL); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_referrer_url(""); 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientMalwareReportRequest::Resource* pb_resource = expected.add_resources(); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_id(0); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_url(kLandingURL); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource = expected.add_resources(); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_id(1); 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_url(kOriginalLandingURL); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource = expected.add_resources(); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_id(2); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_url(kMalwareURL); 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_parent_id(4); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource = expected.add_resources(); 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_id(3); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_url(kFirstRedirectURL); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_parent_id(1); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource = expected.add_resources(); 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_id(4); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_url(kSecondRedirectURL); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_parent_id(3); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VerifyResults(actual, expected); 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests the interaction with the HTTP cache. 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MalwareDetailsTest, HTTPCache) { 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller().LoadURL(GURL(kLandingURL), content::Referrer(), 5291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PAGE_TRANSITION_TYPED, std::string()); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UnsafeResource resource; 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitResource(&resource, true, GURL(kMalwareURL)); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MalwareDetailsWrap> report = new MalwareDetailsWrap( 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_manager_.get(), web_contents(), resource, 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile()->GetRequestContext()); 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::IO, FROM_HERE, 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&FillCache, 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) make_scoped_refptr(profile()->GetRequestContext()))); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The cache collection starts after the IPC from the DOM is fired. 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<SafeBrowsingHostMsg_MalwareDOMDetails_Node> params; 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) report->OnReceivedMalwareDOMDetails(params); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 547868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Let the cache callbacks complete. 548868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Getting serialized report"; 551868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string serialized = WaitForSerializedReport(report.get()); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientMalwareReportRequest actual; 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actual.ParseFromString(serialized); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientMalwareReportRequest expected; 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_malware_url(kMalwareURL); 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_page_url(kLandingURL); 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_referrer_url(""); 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientMalwareReportRequest::Resource* pb_resource = expected.add_resources(); 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_id(0); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_url(kLandingURL); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) safe_browsing::ClientMalwareReportRequest::HTTPResponse* pb_response = 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->mutable_response(); 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_response->mutable_firstline()->set_code(200); 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) safe_browsing::ClientMalwareReportRequest::HTTPHeader* pb_header = 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_response->add_headers(); 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_header->set_name("Content-Type"); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_header->set_value("text/html"); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_header = pb_response->add_headers(); 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_header->set_name("Content-Length"); 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_header->set_value("1024"); 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_header = pb_response->add_headers(); 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_header->set_name("Set-Cookie"); 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_header->set_value(""); // The cookie is dropped. 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_response->set_body(kLandingData); 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_response->set_bodylength(37); 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_response->set_bodydigest("9ca97475598a79bc1e8fc9bd6c72cd35"); 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_response->set_remote_ip("1.2.3.4:80"); 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource = expected.add_resources(); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_id(1); 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_url(kMalwareURL); 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_response = pb_resource->mutable_response(); 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_response->mutable_firstline()->set_code(200); 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_header = pb_response->add_headers(); 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_header->set_name("Content-Type"); 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_header->set_value("image/jpeg"); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_response->set_body(kMalwareData); 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_response->set_bodylength(10); 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_response->set_bodydigest("581373551c43d4cf33bfb3b26838ff95"); 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_response->set_remote_ip("1.2.3.4:80"); 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_complete(true); 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VerifyResults(actual, expected); 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests the interaction with the HTTP cache (where the cache is empty). 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MalwareDetailsTest, HTTPCacheNoEntries) { 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller().LoadURL(GURL(kLandingURL), content::Referrer(), 6011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PAGE_TRANSITION_TYPED, std::string()); 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UnsafeResource resource; 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitResource(&resource, true, GURL(kMalwareURL)); 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MalwareDetailsWrap> report = new MalwareDetailsWrap( 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_manager_.get(), web_contents(), resource, 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile()->GetRequestContext()); 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No call to FillCache 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The cache collection starts after the IPC from the DOM is fired. 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<SafeBrowsingHostMsg_MalwareDOMDetails_Node> params; 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) report->OnReceivedMalwareDOMDetails(params); 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 616868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Let the cache callbacks complete. 617868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Getting serialized report"; 620868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string serialized = WaitForSerializedReport(report.get()); 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientMalwareReportRequest actual; 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actual.ParseFromString(serialized); 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientMalwareReportRequest expected; 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_malware_url(kMalwareURL); 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_page_url(kLandingURL); 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_referrer_url(""); 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientMalwareReportRequest::Resource* pb_resource = expected.add_resources(); 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_id(0); 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_url(kLandingURL); 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource = expected.add_resources(); 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_id(1); 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_url(kMalwareURL); 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_complete(true); 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VerifyResults(actual, expected); 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test getting redirects from history service. 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MalwareDetailsTest, HistoryServiceUrls) { 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add content to history service. 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There are two redirect urls before reacing malware url: 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // kFirstRedirectURL -> kSecondRedirectURL -> kMalwareURL 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL baseurl(kMalwareURL); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::RedirectList redirects; 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirects.push_back(GURL(kFirstRedirectURL)); 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirects.push_back(GURL(kSecondRedirectURL)); 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddPageToHistory(baseurl, &redirects); 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for history service operation finished. 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile()->BlockUntilHistoryProcessesPendingRequests(); 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller().LoadURL(GURL(kLandingURL), content::Referrer(), 6541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PAGE_TRANSITION_TYPED, std::string()); 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UnsafeResource resource; 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitResource(&resource, true, GURL(kMalwareURL)); 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MalwareDetailsWrap> report = new MalwareDetailsWrap( 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_manager_.get(), web_contents(), resource, NULL); 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The redirects collection starts after the IPC from the DOM is fired. 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<SafeBrowsingHostMsg_MalwareDOMDetails_Node> params; 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) report->OnReceivedMalwareDOMDetails(params); 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Let the redirects callbacks complete. 666868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 668868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string serialized = WaitForSerializedReport(report.get()); 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientMalwareReportRequest actual; 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actual.ParseFromString(serialized); 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientMalwareReportRequest expected; 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_malware_url(kMalwareURL); 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_page_url(kLandingURL); 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.set_referrer_url(""); 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientMalwareReportRequest::Resource* pb_resource = expected.add_resources(); 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_id(0); 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_url(kLandingURL); 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource = expected.add_resources(); 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_id(1); 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_parent_id(2); 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_url(kMalwareURL); 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource = expected.add_resources(); 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_id(2); 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_parent_id(3); 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_url(kSecondRedirectURL); 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource = expected.add_resources(); 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_id(3); 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb_resource->set_url(kFirstRedirectURL); 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VerifyResults(actual, expected); 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 694