Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(358)

Side by Side Diff: chrome/browser/safe_browsing/download_feedback_unittest.cc

Issue 15881012: Implement safebrowsing download feedback service, enabled for dev & canary only. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/safe_browsing/download_feedback.h"
6
7 #include "base/command_line.h"
8 #include "base/file_util.h"
9 #include "base/files/scoped_temp_dir.h"
10 #include "base/message_loop.h"
11 #include "base/single_thread_task_runner.h"
12 #include "chrome/browser/safe_browsing/two_phase_uploader.h"
13 #include "chrome/common/chrome_switches.h"
14 #include "chrome/common/safe_browsing/csd.pb.h"
15 #include "content/public/test/test_browser_thread.h"
16 #include "content/public/test/test_utils.h"
17 #include "net/url_request/url_request_test_util.h"
18 #include "testing/gtest/include/gtest/gtest.h"
19
20 namespace safe_browsing {
21
22 namespace {
23
24 class FakeUploader : public TwoPhaseUploader {
25 public:
26 FakeUploader(net::URLRequestContextGetter* url_request_context_getter,
27 base::TaskRunner* file_task_runner,
28 const GURL& base_url,
29 const std::string& metadata,
30 const base::FilePath& file_path,
31 const ProgressCallback& progress_callback,
32 const FinishCallback& finish_callback);
33 virtual ~FakeUploader() {}
34
35 virtual void Start() OVERRIDE {
36 start_called_ = true;
37 }
38
39 scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_;
40 scoped_refptr<base::TaskRunner> file_task_runner_;
41 GURL base_url_;
42 std::string metadata_;
43 base::FilePath file_path_;
44 ProgressCallback progress_callback_;
45 FinishCallback finish_callback_;
46
47 bool start_called_;
48 };
49
50 FakeUploader::FakeUploader(
51 net::URLRequestContextGetter* url_request_context_getter,
52 base::TaskRunner* file_task_runner,
53 const GURL& base_url,
54 const std::string& metadata,
55 const base::FilePath& file_path,
56 const ProgressCallback& progress_callback,
57 const FinishCallback& finish_callback)
58 : url_request_context_getter_(url_request_context_getter),
59 file_task_runner_(file_task_runner),
60 base_url_(base_url),
61 metadata_(metadata),
62 file_path_(file_path),
63 progress_callback_(progress_callback),
64 finish_callback_(finish_callback),
65 start_called_(false) {
66 }
67
68 class FakeUploaderFactory : public TwoPhaseUploaderFactory {
69 public:
70 FakeUploaderFactory() : uploader_(NULL) {}
71 virtual ~FakeUploaderFactory() {}
72
73 virtual TwoPhaseUploader* CreateTwoPhaseUploader(
74 net::URLRequestContextGetter* url_request_context_getter,
75 base::TaskRunner* file_task_runner,
76 const GURL& base_url,
77 const std::string& metadata,
78 const base::FilePath& file_path,
79 const TwoPhaseUploader::ProgressCallback& progress_callback,
80 const TwoPhaseUploader::FinishCallback& finish_callback) OVERRIDE;
81
82 FakeUploader* uploader_;
83 };
84
85 TwoPhaseUploader* FakeUploaderFactory::CreateTwoPhaseUploader(
86 net::URLRequestContextGetter* url_request_context_getter,
87 base::TaskRunner* file_task_runner,
88 const GURL& base_url,
89 const std::string& metadata,
90 const base::FilePath& file_path,
91 const TwoPhaseUploader::ProgressCallback& progress_callback,
92 const TwoPhaseUploader::FinishCallback& finish_callback) {
93 EXPECT_FALSE(uploader_);
94
95 uploader_ = new FakeUploader(url_request_context_getter, file_task_runner,
96 base_url, metadata, file_path, progress_callback,
97 finish_callback);
98 return uploader_;
99 }
100
101 } // namespace
102
103 class DownloadFeedbackTest : public testing::Test {
104 public:
105 DownloadFeedbackTest()
106 : file_thread_(content::BrowserThread::FILE, &message_loop_),
107 file_task_runner_(content::BrowserThread::GetMessageLoopProxyForThread(
108 content::BrowserThread::FILE)),
109 io_thread_(content::BrowserThread::IO, &message_loop_),
110 io_task_runner_(content::BrowserThread::GetMessageLoopProxyForThread(
111 content::BrowserThread::IO)),
112 url_request_context_getter_(
113 new net::TestURLRequestContextGetter(io_task_runner_)),
114 feedback_finish_called_(false) {
115 EXPECT_NE(io_task_runner_, file_task_runner_);
116 }
117
118 virtual void SetUp() OVERRIDE {
119 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
120 upload_file_path_ = temp_dir_.path().AppendASCII("test file");
121 upload_file_data_ = "data";
122 ASSERT_EQ(static_cast<int>(upload_file_data_.size()),
123 file_util::WriteFile(upload_file_path_, upload_file_data_.data(),
124 upload_file_data_.size()));
125 TwoPhaseUploader::RegisterFactory(&two_phase_uploader_factory_);
126 }
127
128 virtual void TearDown() OVERRIDE {
129 TwoPhaseUploader::RegisterFactory(NULL);
130 }
131
132 FakeUploader* uploader() const {
133 return two_phase_uploader_factory_.uploader_;
134 }
135
136 void FinishCallback(DownloadFeedback* feedback) {
137 EXPECT_FALSE(feedback_finish_called_);
138 feedback_finish_called_ = true;
139 delete feedback;
140 }
141
142 protected:
143 base::ScopedTempDir temp_dir_;
144 base::FilePath upload_file_path_;
145 std::string upload_file_data_;
146 MessageLoop message_loop_;
147 content::TestBrowserThread file_thread_;
148 scoped_refptr<base::SingleThreadTaskRunner> file_task_runner_;
149 content::TestBrowserThread io_thread_;
150 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
151 FakeUploaderFactory two_phase_uploader_factory_;
152 scoped_refptr<net::TestURLRequestContextGetter> url_request_context_getter_;
153
154 bool feedback_finish_called_;
155 };
156
157 TEST_F(DownloadFeedbackTest, CompleteUpload) {
158 ClientDownloadReport expected_report_metadata;
159 expected_report_metadata.mutable_download_request()->set_url("http://test");
160 expected_report_metadata.mutable_download_request()->set_length(
161 upload_file_data_.size());
162 expected_report_metadata.mutable_download_request()->mutable_digests(
163 )->set_sha1("hi");
164 expected_report_metadata.mutable_download_response()->set_verdict(
165 ClientDownloadResponse::DANGEROUS_HOST);
166 std::string ping_request(
167 expected_report_metadata.download_request().SerializeAsString());
168 std::string ping_response(
169 expected_report_metadata.download_response().SerializeAsString());
170
171 const char kTestFeedbackURL[] = "https://example.com/test/upload";
172 CommandLine::ForCurrentProcess()->AppendSwitchASCII(
173 switches::kSbDownloadFeedbackURL, kTestFeedbackURL);
174
175 DownloadFeedback* feedback = DownloadFeedback::Create(
176 url_request_context_getter_,
177 file_task_runner_,
178 upload_file_path_,
179 ping_request,
180 ping_response);
181 EXPECT_FALSE(uploader());
182
183 feedback->Start(base::Bind(&DownloadFeedbackTest::FinishCallback,
184 base::Unretained(this),
185 feedback));
186 ASSERT_TRUE(uploader());
187 EXPECT_FALSE(feedback_finish_called_);
188 EXPECT_TRUE(uploader()->start_called_);
189
190 EXPECT_EQ(url_request_context_getter_,
191 uploader()->url_request_context_getter_);
192 EXPECT_EQ(file_task_runner_, uploader()->file_task_runner_);
193 EXPECT_EQ(upload_file_path_, uploader()->file_path_);
194 EXPECT_EQ(expected_report_metadata.SerializeAsString(),
195 uploader()->metadata_);
196 EXPECT_EQ(kTestFeedbackURL, uploader()->base_url_.spec());
197
198 EXPECT_TRUE(file_util::PathExists(upload_file_path_));
199
200 EXPECT_FALSE(feedback_finish_called_);
201 uploader()->finish_callback_.Run(
202 TwoPhaseUploader::STATE_SUCCESS, net::OK, 0, "");
203 EXPECT_TRUE(feedback_finish_called_);
204 content::RunAllPendingInMessageLoop();
205 EXPECT_FALSE(file_util::PathExists(upload_file_path_));
206 }
207
208 TEST_F(DownloadFeedbackTest, CancelUpload) {
209 ClientDownloadReport expected_report_metadata;
210 expected_report_metadata.mutable_download_request()->set_url("http://test");
211 expected_report_metadata.mutable_download_request()->set_length(
212 upload_file_data_.size());
213 expected_report_metadata.mutable_download_request()->mutable_digests(
214 )->set_sha1("hi");
215 expected_report_metadata.mutable_download_response()->set_verdict(
216 ClientDownloadResponse::DANGEROUS_HOST);
217 std::string ping_request(
218 expected_report_metadata.download_request().SerializeAsString());
219 std::string ping_response(
220 expected_report_metadata.download_response().SerializeAsString());
221
222 DownloadFeedback* feedback = DownloadFeedback::Create(
223 url_request_context_getter_,
224 file_task_runner_,
225 upload_file_path_,
226 ping_request,
227 ping_response);
228 EXPECT_FALSE(uploader());
229
230 feedback->Start(base::Bind(&DownloadFeedbackTest::FinishCallback,
231 base::Unretained(this),
232 feedback));
233 ASSERT_TRUE(uploader());
234 EXPECT_FALSE(feedback_finish_called_);
235 EXPECT_TRUE(uploader()->start_called_);
236 EXPECT_TRUE(file_util::PathExists(upload_file_path_));
237
238 delete feedback;
239 EXPECT_FALSE(feedback_finish_called_);
240
241 content::RunAllPendingInMessageLoop();
242 EXPECT_FALSE(file_util::PathExists(upload_file_path_));
243 }
244
245 } // namespace safe_browsing
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698