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/file_util.h"
87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/files/scoped_temp_dir.h"
99ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/run_loop.h"
117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/single_thread_task_runner.h"
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/safe_browsing/two_phase_uploader.h"
137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/common/safe_browsing/csd.pb.h"
147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/test/test_browser_thread_bundle.h"
167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "net/url_request/url_request_test_util.h"
177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace safe_browsing {
207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace {
227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class FakeUploader : public TwoPhaseUploader {
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public:
257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  FakeUploader(net::URLRequestContextGetter* url_request_context_getter,
267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)               base::TaskRunner* file_task_runner,
277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)               const GURL& base_url,
287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)               const std::string& metadata,
297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)               const base::FilePath& file_path,
307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)               const ProgressCallback& progress_callback,
317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)               const FinishCallback& finish_callback);
327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual ~FakeUploader() {}
337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void Start() OVERRIDE {
357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    start_called_ = true;
367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_;
397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_refptr<base::TaskRunner> file_task_runner_;
407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  GURL base_url_;
417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string metadata_;
427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::FilePath file_path_;
437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ProgressCallback progress_callback_;
447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  FinishCallback finish_callback_;
457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool start_called_;
477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)FakeUploader::FakeUploader(
507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    net::URLRequestContextGetter* url_request_context_getter,
517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    base::TaskRunner* file_task_runner,
527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const GURL& base_url,
537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const std::string& metadata,
547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const base::FilePath& file_path,
557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const ProgressCallback& progress_callback,
567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const FinishCallback& finish_callback)
577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    : url_request_context_getter_(url_request_context_getter),
587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      file_task_runner_(file_task_runner),
597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base_url_(base_url),
607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      metadata_(metadata),
617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      file_path_(file_path),
627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      progress_callback_(progress_callback),
637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      finish_callback_(finish_callback),
647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      start_called_(false) {
657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class FakeUploaderFactory : public TwoPhaseUploaderFactory {
687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public:
697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  FakeUploaderFactory() : uploader_(NULL) {}
707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual ~FakeUploaderFactory() {}
717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual TwoPhaseUploader* CreateTwoPhaseUploader(
737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      net::URLRequestContextGetter* url_request_context_getter,
747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base::TaskRunner* file_task_runner,
757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const GURL& base_url,
767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const std::string& metadata,
777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const base::FilePath& file_path,
787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const TwoPhaseUploader::ProgressCallback& progress_callback,
797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const TwoPhaseUploader::FinishCallback& finish_callback) OVERRIDE;
807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  FakeUploader* uploader_;
827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TwoPhaseUploader* FakeUploaderFactory::CreateTwoPhaseUploader(
857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    net::URLRequestContextGetter* url_request_context_getter,
867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    base::TaskRunner* file_task_runner,
877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const GURL& base_url,
887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const std::string& metadata,
897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const base::FilePath& file_path,
907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const TwoPhaseUploader::ProgressCallback& progress_callback,
917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const TwoPhaseUploader::FinishCallback& finish_callback) {
927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(uploader_);
937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  uploader_ = new FakeUploader(url_request_context_getter, file_task_runner,
957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                               base_url, metadata, file_path, progress_callback,
967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                               finish_callback);
977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return uploader_;
987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}  // namespace
1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class DownloadFeedbackTest : public testing::Test {
1037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public:
1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DownloadFeedbackTest()
1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      : file_task_runner_(content::BrowserThread::GetMessageLoopProxyForThread(
1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            content::BrowserThread::FILE)),
1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        io_task_runner_(content::BrowserThread::GetMessageLoopProxyForThread(
1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            content::BrowserThread::IO)),
1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        url_request_context_getter_(
1107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            new net::TestURLRequestContextGetter(io_task_runner_)),
1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        feedback_finish_called_(false) {
1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_NE(io_task_runner_, file_task_runner_);
1137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    upload_file_path_ = temp_dir_.path().AppendASCII("test file");
1187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    upload_file_data_ = "data";
1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    ASSERT_EQ(static_cast<int>(upload_file_data_.size()),
120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)              base::WriteFile(upload_file_path_, upload_file_data_.data(),
121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                              upload_file_data_.size()));
1227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    TwoPhaseUploader::RegisterFactory(&two_phase_uploader_factory_);
1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
1267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    TwoPhaseUploader::RegisterFactory(NULL);
1277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  FakeUploader* uploader() const {
1307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return two_phase_uploader_factory_.uploader_;
1317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void FinishCallback(DownloadFeedback* feedback) {
1347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_FALSE(feedback_finish_called_);
1357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    feedback_finish_called_ = true;
1367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    delete feedback;
1377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) protected:
1407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::ScopedTempDir temp_dir_;
1417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::FilePath upload_file_path_;
1427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string upload_file_data_;
1437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  content::TestBrowserThreadBundle thread_bundle_;
1447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_refptr<base::SingleThreadTaskRunner> file_task_runner_;
1457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
1467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  FakeUploaderFactory two_phase_uploader_factory_;
1477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_refptr<net::TestURLRequestContextGetter> url_request_context_getter_;
1487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool feedback_finish_called_;
1507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
1517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DownloadFeedbackTest, CompleteUpload) {
1537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ClientDownloadReport expected_report_metadata;
1547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  expected_report_metadata.mutable_download_request()->set_url("http://test");
1557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  expected_report_metadata.mutable_download_request()->set_length(
1567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      upload_file_data_.size());
1577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  expected_report_metadata.mutable_download_request()->mutable_digests(
1587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      )->set_sha1("hi");
1597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  expected_report_metadata.mutable_download_response()->set_verdict(
1607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      ClientDownloadResponse::DANGEROUS_HOST);
1617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string ping_request(
1627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      expected_report_metadata.download_request().SerializeAsString());
1637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string ping_response(
1647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      expected_report_metadata.download_response().SerializeAsString());
1657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DownloadFeedback* feedback =
167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      DownloadFeedback::Create(url_request_context_getter_.get(),
168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                               file_task_runner_.get(),
169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                               upload_file_path_,
170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                               ping_request,
171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                               ping_response);
1727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(uploader());
1737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  feedback->Start(base::Bind(&DownloadFeedbackTest::FinishCallback,
1757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                             base::Unretained(this),
1767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                             feedback));
1777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(uploader());
1787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(feedback_finish_called_);
1797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(uploader()->start_called_);
1807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(url_request_context_getter_,
1827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            uploader()->url_request_context_getter_);
1837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(file_task_runner_, uploader()->file_task_runner_);
1847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(upload_file_path_, uploader()->file_path_);
1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(expected_report_metadata.SerializeAsString(),
1867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            uploader()->metadata_);
1870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(DownloadFeedback::kSbFeedbackURL, uploader()->base_url_.spec());
1887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(upload_file_path_));
1907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(feedback_finish_called_);
1927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  uploader()->finish_callback_.Run(
1937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      TwoPhaseUploader::STATE_SUCCESS, net::OK, 0, "");
1947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(feedback_finish_called_);
1957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
1967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(base::PathExists(upload_file_path_));
1977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(DownloadFeedbackTest, CancelUpload) {
2007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ClientDownloadReport expected_report_metadata;
2017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  expected_report_metadata.mutable_download_request()->set_url("http://test");
2027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  expected_report_metadata.mutable_download_request()->set_length(
2037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      upload_file_data_.size());
2047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  expected_report_metadata.mutable_download_request()->mutable_digests(
2057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      )->set_sha1("hi");
2067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  expected_report_metadata.mutable_download_response()->set_verdict(
2077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      ClientDownloadResponse::DANGEROUS_HOST);
2087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string ping_request(
2097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      expected_report_metadata.download_request().SerializeAsString());
2107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string ping_response(
2117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      expected_report_metadata.download_response().SerializeAsString());
2127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DownloadFeedback* feedback =
214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      DownloadFeedback::Create(url_request_context_getter_.get(),
215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                               file_task_runner_.get(),
216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                               upload_file_path_,
217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                               ping_request,
218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                               ping_response);
2197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(uploader());
2207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  feedback->Start(base::Bind(&DownloadFeedbackTest::FinishCallback,
2227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                             base::Unretained(this),
2237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                             feedback));
2247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(uploader());
2257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(feedback_finish_called_);
2267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(uploader()->start_called_);
2277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(upload_file_path_));
2287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  delete feedback;
2307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(feedback_finish_called_);
2317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
2337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(base::PathExists(upload_file_path_));
2347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}  // namespace safe_browsing
237