blob: ebc8d6011b66b3f26111fe2770a244139c5e7c14 [file] [log] [blame]
[email protected]afa378f22013-12-02 03:37:541// 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 "base/bind.h"
sorin395c2ac2014-09-16 21:31:076#include "base/bind_helpers.h"
[email protected]afa378f22013-12-02 03:37:547#include "base/files/file_path.h"
thestig18dfb7a52014-08-26 10:44:048#include "base/files/file_util.h"
[email protected]afa378f22013-12-02 03:37:549#include "base/memory/ref_counted.h"
10#include "base/memory/scoped_ptr.h"
tommyclieaae5d92014-09-09 06:03:4711#include "base/message_loop/message_loop.h"
[email protected]afa378f22013-12-02 03:37:5412#include "base/path_service.h"
13#include "base/run_loop.h"
[email protected]de0fdca22014-08-19 05:26:0914#include "components/component_updater/crx_downloader.h"
[email protected]afa378f22013-12-02 03:37:5415#include "net/base/net_errors.h"
tommyclieaae5d92014-09-09 06:03:4716#include "net/url_request/test_url_request_interceptor.h"
[email protected]afa378f22013-12-02 03:37:5417#include "net/url_request/url_request_test_util.h"
18#include "testing/gtest/include/gtest/gtest.h"
19
[email protected]148dcfd32014-04-29 00:54:3020using base::ContentsEqual;
[email protected]afa378f22013-12-02 03:37:5421
22namespace component_updater {
23
24namespace {
25
26// Intercepts HTTP GET requests sent to "localhost".
tommyclieaae5d92014-09-09 06:03:4727typedef net::LocalHostTestURLRequestInterceptor GetInterceptor;
[email protected]afa378f22013-12-02 03:37:5428
[email protected]148dcfd32014-04-29 00:54:3029const char kTestFileName[] = "jebgalgnebhfojomionfpkfelancnnkf.crx";
30
31base::FilePath MakeTestFilePath(const char* file) {
[email protected]afa378f22013-12-02 03:37:5432 base::FilePath path;
tommycli0409b4df2014-08-26 23:31:3233 PathService::Get(base::DIR_SOURCE_ROOT, &path);
34 return path.AppendASCII("components").AppendASCII("test").AppendASCII("data")
35 .AppendASCII("component_updater").AppendASCII(file);
[email protected]afa378f22013-12-02 03:37:5436}
37
38} // namespace
39
40class CrxDownloaderTest : public testing::Test {
41 public:
42 CrxDownloaderTest();
dcheng30a1b1542014-10-29 21:27:5043 ~CrxDownloaderTest() override;
[email protected]afa378f22013-12-02 03:37:5444
45 // Overrides from testing::Test.
dcheng30a1b1542014-10-29 21:27:5046 void SetUp() override;
47 void TearDown() override;
[email protected]afa378f22013-12-02 03:37:5448
49 void Quit();
50 void RunThreads();
51 void RunThreadsUntilIdle();
52
[email protected]3cb2a4f2013-12-07 21:54:3453 void DownloadComplete(int crx_context, const CrxDownloader::Result& result);
[email protected]afa378f22013-12-02 03:37:5454
[email protected]8a5ebd432014-05-02 00:21:2255 void DownloadProgress(int crx_context, const CrxDownloader::Result& result);
56
[email protected]afa378f22013-12-02 03:37:5457 protected:
58 scoped_ptr<CrxDownloader> crx_downloader_;
59
tommyclieaae5d92014-09-09 06:03:4760 scoped_ptr<GetInterceptor> get_interceptor_;
61
[email protected]1b6587dc52014-04-26 00:38:5562 CrxDownloader::DownloadCallback callback_;
[email protected]8a5ebd432014-05-02 00:21:2263 CrxDownloader::ProgressCallback progress_callback_;
[email protected]1b6587dc52014-04-26 00:38:5564
[email protected]afa378f22013-12-02 03:37:5465 int crx_context_;
[email protected]afa378f22013-12-02 03:37:5466
[email protected]148dcfd32014-04-29 00:54:3067 int num_download_complete_calls_;
68 CrxDownloader::Result download_complete_result_;
[email protected]afa378f22013-12-02 03:37:5469
[email protected]8a5ebd432014-05-02 00:21:2270 // These members are updated by DownloadProgress.
71 int num_progress_calls_;
72 CrxDownloader::Result download_progress_result_;
73
[email protected]afa378f22013-12-02 03:37:5474 // A magic value for the context to be used in the tests.
75 static const int kExpectedContext = 0xaabb;
76
77 private:
tommyclieaae5d92014-09-09 06:03:4778 base::MessageLoopForIO loop_;
[email protected]afa378f22013-12-02 03:37:5479 scoped_refptr<net::TestURLRequestContextGetter> context_;
[email protected]afa378f22013-12-02 03:37:5480 base::Closure quit_closure_;
81};
82
83const int CrxDownloaderTest::kExpectedContext;
84
85CrxDownloaderTest::CrxDownloaderTest()
[email protected]1b6587dc52014-04-26 00:38:5586 : callback_(base::Bind(&CrxDownloaderTest::DownloadComplete,
87 base::Unretained(this),
88 kExpectedContext)),
[email protected]8a5ebd432014-05-02 00:21:2289 progress_callback_(base::Bind(&CrxDownloaderTest::DownloadProgress,
90 base::Unretained(this),
91 kExpectedContext)),
[email protected]1b6587dc52014-04-26 00:38:5592 crx_context_(0),
[email protected]148dcfd32014-04-29 00:54:3093 num_download_complete_calls_(0),
[email protected]8a5ebd432014-05-02 00:21:2294 num_progress_calls_(0),
[email protected]afa378f22013-12-02 03:37:5495 context_(new net::TestURLRequestContextGetter(
tommyclieaae5d92014-09-09 06:03:4796 base::MessageLoopProxy::current())) {
[email protected]afa378f22013-12-02 03:37:5497}
98
99CrxDownloaderTest::~CrxDownloaderTest() {
[email protected]3a0092d2013-12-18 03:04:35100 context_ = NULL;
tommyclieaae5d92014-09-09 06:03:47101
102 // The GetInterceptor requires the message loop to run to destruct correctly.
103 get_interceptor_.reset();
104 RunThreadsUntilIdle();
[email protected]afa378f22013-12-02 03:37:54105}
106
107void CrxDownloaderTest::SetUp() {
[email protected]148dcfd32014-04-29 00:54:30108 num_download_complete_calls_ = 0;
109 download_complete_result_ = CrxDownloader::Result();
[email protected]8a5ebd432014-05-02 00:21:22110 num_progress_calls_ = 0;
111 download_progress_result_ = CrxDownloader::Result();
tommyclieaae5d92014-09-09 06:03:47112
[email protected]afa378f22013-12-02 03:37:54113 crx_downloader_.reset(CrxDownloader::Create(
[email protected]d0c8b8b42014-05-06 05:11:45114 false, // Do not use the background downloader in these tests.
[email protected]afa378f22013-12-02 03:37:54115 context_.get(),
tommyclieaae5d92014-09-09 06:03:47116 base::MessageLoopProxy::current(),
117 NULL)); // No |background_task_runner| because no background downloader.
[email protected]8a5ebd432014-05-02 00:21:22118 crx_downloader_->set_progress_callback(progress_callback_);
tommyclieaae5d92014-09-09 06:03:47119
120 get_interceptor_.reset(new GetInterceptor(base::MessageLoopProxy::current(),
121 base::MessageLoopProxy::current()));
[email protected]afa378f22013-12-02 03:37:54122}
123
124void CrxDownloaderTest::TearDown() {
[email protected]8a5ebd432014-05-02 00:21:22125 crx_downloader_.reset();
[email protected]afa378f22013-12-02 03:37:54126}
127
128void CrxDownloaderTest::Quit() {
[email protected]da37c1d2013-12-19 01:04:38129 if (!quit_closure_.is_null())
130 quit_closure_.Run();
[email protected]afa378f22013-12-02 03:37:54131}
132
[email protected]148dcfd32014-04-29 00:54:30133void CrxDownloaderTest::DownloadComplete(int crx_context,
134 const CrxDownloader::Result& result) {
135 ++num_download_complete_calls_;
[email protected]afa378f22013-12-02 03:37:54136 crx_context_ = crx_context;
[email protected]148dcfd32014-04-29 00:54:30137 download_complete_result_ = result;
[email protected]afa378f22013-12-02 03:37:54138 Quit();
139}
140
[email protected]8a5ebd432014-05-02 00:21:22141void CrxDownloaderTest::DownloadProgress(int crx_context,
142 const CrxDownloader::Result& result) {
143 ++num_progress_calls_;
144 download_progress_result_ = result;
145}
146
[email protected]afa378f22013-12-02 03:37:54147void CrxDownloaderTest::RunThreads() {
148 base::RunLoop runloop;
149 quit_closure_ = runloop.QuitClosure();
150 runloop.Run();
151
152 // Since some tests need to drain currently enqueued tasks such as network
153 // intercepts on the IO thread, run the threads until they are
154 // idle. The component updater service won't loop again until the loop count
155 // is set and the service is started.
156 RunThreadsUntilIdle();
157}
158
159void CrxDownloaderTest::RunThreadsUntilIdle() {
160 base::RunLoop().RunUntilIdle();
161}
162
[email protected]da37c1d2013-12-19 01:04:38163// Tests that starting a download without a url results in an error.
164TEST_F(CrxDownloaderTest, NoUrl) {
165 std::vector<GURL> urls;
[email protected]1b6587dc52014-04-26 00:38:55166 crx_downloader_->StartDownload(urls, callback_);
[email protected]da37c1d2013-12-19 01:04:38167 RunThreadsUntilIdle();
[email protected]da37c1d2013-12-19 01:04:38168
[email protected]148dcfd32014-04-29 00:54:30169 EXPECT_EQ(1, num_download_complete_calls_);
170 EXPECT_EQ(kExpectedContext, crx_context_);
171 EXPECT_EQ(-1, download_complete_result_.error);
172 EXPECT_TRUE(download_complete_result_.response.empty());
[email protected]8a5ebd432014-05-02 00:21:22173 EXPECT_EQ(-1, download_complete_result_.downloaded_bytes);
174 EXPECT_EQ(-1, download_complete_result_.total_bytes);
175 EXPECT_EQ(0, num_progress_calls_);
[email protected]da37c1d2013-12-19 01:04:38176}
177
[email protected]afa378f22013-12-02 03:37:54178// Tests that downloading from one url is successful.
179TEST_F(CrxDownloaderTest, OneUrl) {
180 const GURL expected_crx_url =
[email protected]d0c8b8b42014-05-06 05:11:45181 GURL("http://localhost/download/jebgalgnebhfojomionfpkfelancnnkf.crx");
[email protected]afa378f22013-12-02 03:37:54182
[email protected]148dcfd32014-04-29 00:54:30183 const base::FilePath test_file(MakeTestFilePath(kTestFileName));
tommyclieaae5d92014-09-09 06:03:47184 get_interceptor_->SetResponse(expected_crx_url, test_file);
[email protected]afa378f22013-12-02 03:37:54185
[email protected]1b6587dc52014-04-26 00:38:55186 crx_downloader_->StartDownloadFromUrl(expected_crx_url, callback_);
[email protected]afa378f22013-12-02 03:37:54187 RunThreads();
[email protected]afa378f22013-12-02 03:37:54188
tommyclieaae5d92014-09-09 06:03:47189 EXPECT_EQ(1, get_interceptor_->GetHitCount());
[email protected]148dcfd32014-04-29 00:54:30190
191 EXPECT_EQ(1, num_download_complete_calls_);
192 EXPECT_EQ(kExpectedContext, crx_context_);
193 EXPECT_EQ(0, download_complete_result_.error);
[email protected]8a5ebd432014-05-02 00:21:22194 EXPECT_EQ(1843, download_complete_result_.downloaded_bytes);
195 EXPECT_EQ(1843, download_complete_result_.total_bytes);
[email protected]148dcfd32014-04-29 00:54:30196 EXPECT_TRUE(ContentsEqual(download_complete_result_.response, test_file));
197
198 EXPECT_TRUE(base::DeleteFile(download_complete_result_.response, false));
[email protected]8a5ebd432014-05-02 00:21:22199
200 EXPECT_LE(1, num_progress_calls_);
201 EXPECT_EQ(1843, download_progress_result_.downloaded_bytes);
202 EXPECT_EQ(1843, download_progress_result_.total_bytes);
[email protected]afa378f22013-12-02 03:37:54203}
204
205// Tests that specifying from two urls has no side effects. Expect a successful
206// download, and only one download request be made.
[email protected]5bff685d32014-04-23 00:43:03207// This test is flaky on Android. crbug.com/329883
208#if defined(OS_ANDROID)
209#define MAYBE_TwoUrls DISABLED_TwoUrls
210#else
211#define MAYBE_TwoUrls TwoUrls
212#endif
213TEST_F(CrxDownloaderTest, MAYBE_TwoUrls) {
[email protected]afa378f22013-12-02 03:37:54214 const GURL expected_crx_url =
[email protected]d0c8b8b42014-05-06 05:11:45215 GURL("http://localhost/download/jebgalgnebhfojomionfpkfelancnnkf.crx");
[email protected]afa378f22013-12-02 03:37:54216
[email protected]148dcfd32014-04-29 00:54:30217 const base::FilePath test_file(MakeTestFilePath(kTestFileName));
tommyclieaae5d92014-09-09 06:03:47218 get_interceptor_->SetResponse(expected_crx_url, test_file);
[email protected]afa378f22013-12-02 03:37:54219
220 std::vector<GURL> urls;
221 urls.push_back(expected_crx_url);
222 urls.push_back(expected_crx_url);
223
[email protected]1b6587dc52014-04-26 00:38:55224 crx_downloader_->StartDownload(urls, callback_);
[email protected]afa378f22013-12-02 03:37:54225 RunThreads();
[email protected]afa378f22013-12-02 03:37:54226
tommyclieaae5d92014-09-09 06:03:47227 EXPECT_EQ(1, get_interceptor_->GetHitCount());
[email protected]148dcfd32014-04-29 00:54:30228
229 EXPECT_EQ(1, num_download_complete_calls_);
230 EXPECT_EQ(kExpectedContext, crx_context_);
231 EXPECT_EQ(0, download_complete_result_.error);
[email protected]8a5ebd432014-05-02 00:21:22232 EXPECT_EQ(1843, download_complete_result_.downloaded_bytes);
233 EXPECT_EQ(1843, download_complete_result_.total_bytes);
[email protected]148dcfd32014-04-29 00:54:30234 EXPECT_TRUE(ContentsEqual(download_complete_result_.response, test_file));
235
236 EXPECT_TRUE(base::DeleteFile(download_complete_result_.response, false));
[email protected]8a5ebd432014-05-02 00:21:22237
238 EXPECT_LE(1, num_progress_calls_);
239 EXPECT_EQ(1843, download_progress_result_.downloaded_bytes);
240 EXPECT_EQ(1843, download_progress_result_.total_bytes);
[email protected]afa378f22013-12-02 03:37:54241}
242
243// Tests that an invalid host results in a download error.
244TEST_F(CrxDownloaderTest, OneUrl_InvalidHost) {
245 const GURL expected_crx_url =
[email protected]d0c8b8b42014-05-06 05:11:45246 GURL("http://localhost/download/jebgalgnebhfojomionfpkfelancnnkf.crx");
[email protected]afa378f22013-12-02 03:37:54247
[email protected]148dcfd32014-04-29 00:54:30248 const base::FilePath test_file(MakeTestFilePath(kTestFileName));
tommyclieaae5d92014-09-09 06:03:47249 get_interceptor_->SetResponse(expected_crx_url, test_file);
[email protected]afa378f22013-12-02 03:37:54250
251 crx_downloader_->StartDownloadFromUrl(
252 GURL("http://no.such.host"
[email protected]1b6587dc52014-04-26 00:38:55253 "/download/jebgalgnebhfojomionfpkfelancnnkf.crx"),
254 callback_);
[email protected]afa378f22013-12-02 03:37:54255 RunThreads();
[email protected]afa378f22013-12-02 03:37:54256
tommyclieaae5d92014-09-09 06:03:47257 EXPECT_EQ(0, get_interceptor_->GetHitCount());
[email protected]148dcfd32014-04-29 00:54:30258
259 EXPECT_EQ(1, num_download_complete_calls_);
260 EXPECT_EQ(kExpectedContext, crx_context_);
261 EXPECT_NE(0, download_complete_result_.error);
262 EXPECT_TRUE(download_complete_result_.response.empty());
[email protected]afa378f22013-12-02 03:37:54263}
264
265// Tests that an invalid path results in a download error.
266TEST_F(CrxDownloaderTest, OneUrl_InvalidPath) {
267 const GURL expected_crx_url =
[email protected]d0c8b8b42014-05-06 05:11:45268 GURL("http://localhost/download/jebgalgnebhfojomionfpkfelancnnkf.crx");
[email protected]afa378f22013-12-02 03:37:54269
[email protected]148dcfd32014-04-29 00:54:30270 const base::FilePath test_file(MakeTestFilePath(kTestFileName));
tommyclieaae5d92014-09-09 06:03:47271 get_interceptor_->SetResponse(expected_crx_url, test_file);
[email protected]afa378f22013-12-02 03:37:54272
[email protected]d0c8b8b42014-05-06 05:11:45273 crx_downloader_->StartDownloadFromUrl(GURL("http://localhost/no/such/file"),
274 callback_);
[email protected]afa378f22013-12-02 03:37:54275 RunThreads();
[email protected]afa378f22013-12-02 03:37:54276
tommyclieaae5d92014-09-09 06:03:47277 EXPECT_EQ(0, get_interceptor_->GetHitCount());
[email protected]148dcfd32014-04-29 00:54:30278
279 EXPECT_EQ(1, num_download_complete_calls_);
280 EXPECT_EQ(kExpectedContext, crx_context_);
281 EXPECT_NE(0, download_complete_result_.error);
282 EXPECT_TRUE(download_complete_result_.response.empty());
[email protected]afa378f22013-12-02 03:37:54283}
284
285// Tests that the fallback to a valid url is successful.
[email protected]5bff685d32014-04-23 00:43:03286// This test is flaky on Android. crbug.com/329883
287#if defined(OS_ANDROID)
288#define MAYBE_TwoUrls_FirstInvalid DISABLED_TwoUrls_FirstInvalid
289#else
290#define MAYBE_TwoUrls_FirstInvalid TwoUrls_FirstInvalid
291#endif
292TEST_F(CrxDownloaderTest, MAYBE_TwoUrls_FirstInvalid) {
[email protected]afa378f22013-12-02 03:37:54293 const GURL expected_crx_url =
[email protected]d0c8b8b42014-05-06 05:11:45294 GURL("http://localhost/download/jebgalgnebhfojomionfpkfelancnnkf.crx");
[email protected]afa378f22013-12-02 03:37:54295
[email protected]148dcfd32014-04-29 00:54:30296 const base::FilePath test_file(MakeTestFilePath(kTestFileName));
tommyclieaae5d92014-09-09 06:03:47297 get_interceptor_->SetResponse(expected_crx_url, test_file);
[email protected]afa378f22013-12-02 03:37:54298
299 std::vector<GURL> urls;
300 urls.push_back(GURL("http://localhost/no/such/file"));
301 urls.push_back(expected_crx_url);
302
[email protected]1b6587dc52014-04-26 00:38:55303 crx_downloader_->StartDownload(urls, callback_);
[email protected]afa378f22013-12-02 03:37:54304 RunThreads();
[email protected]afa378f22013-12-02 03:37:54305
tommyclieaae5d92014-09-09 06:03:47306 EXPECT_EQ(1, get_interceptor_->GetHitCount());
[email protected]148dcfd32014-04-29 00:54:30307
308 EXPECT_EQ(1, num_download_complete_calls_);
309 EXPECT_EQ(kExpectedContext, crx_context_);
310 EXPECT_EQ(0, download_complete_result_.error);
[email protected]8a5ebd432014-05-02 00:21:22311 EXPECT_EQ(1843, download_complete_result_.downloaded_bytes);
312 EXPECT_EQ(1843, download_complete_result_.total_bytes);
[email protected]148dcfd32014-04-29 00:54:30313 EXPECT_TRUE(ContentsEqual(download_complete_result_.response, test_file));
314
315 EXPECT_TRUE(base::DeleteFile(download_complete_result_.response, false));
[email protected]8a5ebd432014-05-02 00:21:22316
317 EXPECT_LE(1, num_progress_calls_);
318 EXPECT_EQ(1843, download_progress_result_.downloaded_bytes);
319 EXPECT_EQ(1843, download_progress_result_.total_bytes);
[email protected]afa378f22013-12-02 03:37:54320}
321
322// Tests that the download succeeds if the first url is correct and the
323// second bad url does not have a side-effect.
324TEST_F(CrxDownloaderTest, TwoUrls_SecondInvalid) {
325 const GURL expected_crx_url =
[email protected]d0c8b8b42014-05-06 05:11:45326 GURL("http://localhost/download/jebgalgnebhfojomionfpkfelancnnkf.crx");
[email protected]afa378f22013-12-02 03:37:54327
[email protected]148dcfd32014-04-29 00:54:30328 const base::FilePath test_file(MakeTestFilePath(kTestFileName));
tommyclieaae5d92014-09-09 06:03:47329 get_interceptor_->SetResponse(expected_crx_url, test_file);
[email protected]afa378f22013-12-02 03:37:54330
331 std::vector<GURL> urls;
332 urls.push_back(expected_crx_url);
333 urls.push_back(GURL("http://localhost/no/such/file"));
334
[email protected]1b6587dc52014-04-26 00:38:55335 crx_downloader_->StartDownload(urls, callback_);
[email protected]afa378f22013-12-02 03:37:54336 RunThreads();
[email protected]afa378f22013-12-02 03:37:54337
tommyclieaae5d92014-09-09 06:03:47338 EXPECT_EQ(1, get_interceptor_->GetHitCount());
[email protected]148dcfd32014-04-29 00:54:30339
340 EXPECT_EQ(1, num_download_complete_calls_);
341 EXPECT_EQ(kExpectedContext, crx_context_);
342 EXPECT_EQ(0, download_complete_result_.error);
[email protected]8a5ebd432014-05-02 00:21:22343 EXPECT_EQ(1843, download_complete_result_.downloaded_bytes);
344 EXPECT_EQ(1843, download_complete_result_.total_bytes);
[email protected]148dcfd32014-04-29 00:54:30345 EXPECT_TRUE(ContentsEqual(download_complete_result_.response, test_file));
346
347 EXPECT_TRUE(base::DeleteFile(download_complete_result_.response, false));
[email protected]8a5ebd432014-05-02 00:21:22348
349 EXPECT_LE(1, num_progress_calls_);
350 EXPECT_EQ(1843, download_progress_result_.downloaded_bytes);
351 EXPECT_EQ(1843, download_progress_result_.total_bytes);
[email protected]afa378f22013-12-02 03:37:54352}
353
354// Tests that the download fails if both urls are bad.
355TEST_F(CrxDownloaderTest, TwoUrls_BothInvalid) {
356 const GURL expected_crx_url =
[email protected]d0c8b8b42014-05-06 05:11:45357 GURL("http://localhost/download/jebgalgnebhfojomionfpkfelancnnkf.crx");
[email protected]afa378f22013-12-02 03:37:54358
[email protected]148dcfd32014-04-29 00:54:30359 const base::FilePath test_file(MakeTestFilePath(kTestFileName));
tommyclieaae5d92014-09-09 06:03:47360 get_interceptor_->SetResponse(expected_crx_url, test_file);
[email protected]afa378f22013-12-02 03:37:54361
362 std::vector<GURL> urls;
363 urls.push_back(GURL("http://localhost/no/such/file"));
364 urls.push_back(GURL("http://no.such.host/"
365 "/download/jebgalgnebhfojomionfpkfelancnnkf.crx"));
366
[email protected]1b6587dc52014-04-26 00:38:55367 crx_downloader_->StartDownload(urls, callback_);
[email protected]afa378f22013-12-02 03:37:54368 RunThreads();
[email protected]afa378f22013-12-02 03:37:54369
tommyclieaae5d92014-09-09 06:03:47370 EXPECT_EQ(0, get_interceptor_->GetHitCount());
[email protected]148dcfd32014-04-29 00:54:30371
372 EXPECT_EQ(1, num_download_complete_calls_);
373 EXPECT_EQ(kExpectedContext, crx_context_);
374 EXPECT_NE(0, download_complete_result_.error);
375 EXPECT_TRUE(download_complete_result_.response.empty());
[email protected]afa378f22013-12-02 03:37:54376}
377
378} // namespace component_updater