download_feedback_unittest.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
17d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
27d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
37d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// found in the LICENSE file.
47d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
57d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/safe_browsing/download_feedback.h"
67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
77d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/command_line.h"
87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/file_util.h"
97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/files/scoped_temp_dir.h"
109ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/run_loop.h"
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/single_thread_task_runner.h"
137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/safe_browsing/two_phase_uploader.h"
147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/common/safe_browsing/csd.pb.h"
167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/test/test_browser_thread_bundle.h"
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "net/url_request/url_request_test_util.h"
197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace safe_browsing {
227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace {
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class FakeUploader : public TwoPhaseUploader {
267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public:
277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  FakeUploader(net::URLRequestContextGetter* url_request_context_getter,
287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)               base::TaskRunner* file_task_runner,
297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)               const GURL& base_url,
307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)               const std::string& metadata,
317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)               const base::FilePath& file_path,
327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)               const ProgressCallback& progress_callback,
337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)               const FinishCallback& finish_callback);
347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual ~FakeUploader() {}
357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void Start() OVERRIDE {
377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    start_called_ = true;
387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_;
417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_refptr<base::TaskRunner> file_task_runner_;
427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  GURL base_url_;
437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string metadata_;
447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::FilePath file_path_;
457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ProgressCallback progress_callback_;
467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  FinishCallback finish_callback_;
477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool start_called_;
497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)FakeUploader::FakeUploader(
527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    net::URLRequestContextGetter* url_request_context_getter,
537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    base::TaskRunner* file_task_runner,
547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const GURL& base_url,
557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const std::string& metadata,
567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const base::FilePath& file_path,
577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const ProgressCallback& progress_callback,
587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const FinishCallback& finish_callback)
597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    : url_request_context_getter_(url_request_context_getter),
607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      file_task_runner_(file_task_runner),
617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base_url_(base_url),
627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      metadata_(metadata),
637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      file_path_(file_path),
647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      progress_callback_(progress_callback),
657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      finish_callback_(finish_callback),
667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      start_called_(false) {
677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class FakeUploaderFactory : public TwoPhaseUploaderFactory {
707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public:
717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  FakeUploaderFactory() : uploader_(NULL) {}
727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual ~FakeUploaderFactory() {}
737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual TwoPhaseUploader* CreateTwoPhaseUploader(
757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      net::URLRequestContextGetter* url_request_context_getter,
767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base::TaskRunner* file_task_runner,
777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const GURL& base_url,
787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const std::string& metadata,
797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const base::FilePath& file_path,
807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const TwoPhaseUploader::ProgressCallback& progress_callback,
817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const TwoPhaseUploader::FinishCallback& finish_callback) OVERRIDE;
827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  FakeUploader* uploader_;
847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TwoPhaseUploader* FakeUploaderFactory::CreateTwoPhaseUploader(
877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    net::URLRequestContextGetter* url_request_context_getter,
887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    base::TaskRunner* file_task_runner,
897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const GURL& base_url,
907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const std::string& metadata,
917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const base::FilePath& file_path,
927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const TwoPhaseUploader::ProgressCallback& progress_callback,
937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const TwoPhaseUploader::FinishCallback& finish_callback) {
947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(uploader_);
957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  uploader_ = new FakeUploader(url_request_context_getter, file_task_runner,
977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                               base_url, metadata, file_path, progress_callback,
987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                               finish_callback);
997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return uploader_;
1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}  // namespace
1037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class DownloadFeedbackTest : public testing::Test {
1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public:
1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DownloadFeedbackTest()
1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      : file_task_runner_(content::BrowserThread::GetMessageLoopProxyForThread(
1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            content::BrowserThread::FILE)),
1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        io_task_runner_(content::BrowserThread::GetMessageLoopProxyForThread(
1107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            content::BrowserThread::IO)),
1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        url_request_context_getter_(
1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            new net::TestURLRequestContextGetter(io_task_runner_)),
1137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        feedback_finish_called_(false) {
1147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_NE(io_task_runner_, file_task_runner_);
1157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
1187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    upload_file_path_ = temp_dir_.path().AppendASCII("test file");
1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    upload_file_data_ = "data";
1217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    ASSERT_EQ(static_cast<int>(upload_file_data_.size()),
122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)              base::WriteFile(upload_file_path_, upload_file_data_.data(),
123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                              upload_file_data_.size()));
1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    TwoPhaseUploader::RegisterFactory(&two_phase_uploader_factory_);
1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
1287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    TwoPhaseUploader::RegisterFactory(NULL);
1297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  FakeUploader* uploader() const {
1327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return two_phase_uploader_factory_.uploader_;
1337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void FinishCallback(DownloadFeedback* feedback) {
1367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_FALSE(feedback_finish_called_);
1377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    feedback_finish_called_ = true;
1387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    delete feedback;
1397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) protected:
1427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::ScopedTempDir temp_dir_;
1437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::FilePath upload_file_path_;
1447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string upload_file_data_;
1457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  content::TestBrowserThreadBundle thread_bundle_;
1467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_refptr<base::SingleThreadTaskRunner> file_task_runner_;
1477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
1487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  FakeUploaderFactory two_phase_uploader_factory_;
1497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_refptr<net::TestURLRequestContextGetter> url_request_context_getter_;
1507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool feedback_finish_called_;
1527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
1537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DownloadFeedbackTest, CompleteUpload) {
1557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ClientDownloadReport expected_report_metadata;
1567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  expected_report_metadata.mutable_download_request()->set_url("http://test");
1577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  expected_report_metadata.mutable_download_request()->set_length(
1587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      upload_file_data_.size());
1597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  expected_report_metadata.mutable_download_request()->mutable_digests(
1607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      )->set_sha1("hi");
1617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  expected_report_metadata.mutable_download_response()->set_verdict(
1627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      ClientDownloadResponse::DANGEROUS_HOST);
1637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string ping_request(
1647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      expected_report_metadata.download_request().SerializeAsString());
1657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string ping_response(
1667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      expected_report_metadata.download_response().SerializeAsString());
1677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const char kTestFeedbackURL[] = "https://example.com/test/upload";
1697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  CommandLine::ForCurrentProcess()->AppendSwitchASCII(
1707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      switches::kSbDownloadFeedbackURL, kTestFeedbackURL);
1717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DownloadFeedback* feedback =
173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      DownloadFeedback::Create(url_request_context_getter_.get(),
174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                               file_task_runner_.get(),
175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                               upload_file_path_,
176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                               ping_request,
177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                               ping_response);
1787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(uploader());
1797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  feedback->Start(base::Bind(&DownloadFeedbackTest::FinishCallback,
1817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                             base::Unretained(this),
1827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                             feedback));
1837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(uploader());
1847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(feedback_finish_called_);
1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(uploader()->start_called_);
1867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(url_request_context_getter_,
1887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            uploader()->url_request_context_getter_);
1897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(file_task_runner_, uploader()->file_task_runner_);
1907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(upload_file_path_, uploader()->file_path_);
1917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(expected_report_metadata.SerializeAsString(),
1927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            uploader()->metadata_);
1937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(kTestFeedbackURL, uploader()->base_url_.spec());
1947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(upload_file_path_));
1967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(feedback_finish_called_);
1987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  uploader()->finish_callback_.Run(
1997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      TwoPhaseUploader::STATE_SUCCESS, net::OK, 0, "");
2007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(feedback_finish_called_);
2017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
2027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(base::PathExists(upload_file_path_));
2037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DownloadFeedbackTest, CancelUpload) {
2067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ClientDownloadReport expected_report_metadata;
2077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  expected_report_metadata.mutable_download_request()->set_url("http://test");
2087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  expected_report_metadata.mutable_download_request()->set_length(
2097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      upload_file_data_.size());
2107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  expected_report_metadata.mutable_download_request()->mutable_digests(
2117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      )->set_sha1("hi");
2127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  expected_report_metadata.mutable_download_response()->set_verdict(
2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      ClientDownloadResponse::DANGEROUS_HOST);
2147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string ping_request(
2157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      expected_report_metadata.download_request().SerializeAsString());
2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string ping_response(
2177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      expected_report_metadata.download_response().SerializeAsString());
2187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DownloadFeedback* feedback =
220eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      DownloadFeedback::Create(url_request_context_getter_.get(),
221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                               file_task_runner_.get(),
222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                               upload_file_path_,
223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                               ping_request,
224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                               ping_response);
2257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(uploader());
2267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  feedback->Start(base::Bind(&DownloadFeedbackTest::FinishCallback,
2287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                             base::Unretained(this),
2297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                             feedback));
2307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(uploader());
2317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(feedback_finish_called_);
2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(uploader()->start_called_);
2337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(upload_file_path_));
2347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  delete feedback;
2367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(feedback_finish_called_);
2377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
2397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(base::PathExists(upload_file_path_));
2407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}  // namespace safe_browsing
243