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