blob: 7439db167ee29cc5319021807888c7c8391d5c66 [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"
[email protected]afa378f22013-12-02 03:37:546#include "base/files/file_path.h"
thestig18dfb7a52014-08-26 10:44:047#include "base/files/file_util.h"
[email protected]afa378f22013-12-02 03:37:548#include "base/memory/ref_counted.h"
9#include "base/memory/scoped_ptr.h"
10#include "base/path_service.h"
11#include "base/run_loop.h"
12#include "base/threading/sequenced_worker_pool.h"
[email protected]de0fdca22014-08-19 05:26:0913#include "components/component_updater/crx_downloader.h"
[email protected]afa378f22013-12-02 03:37:5414#include "content/public/browser/browser_thread.h"
15#include "content/public/test/test_browser_thread_bundle.h"
16#include "content/test/net/url_request_prepackaged_interceptor.h"
17#include "net/base/net_errors.h"
18#include "net/url_request/url_request_test_util.h"
19#include "testing/gtest/include/gtest/gtest.h"
20
21using content::BrowserThread;
[email protected]148dcfd32014-04-29 00:54:3022using base::ContentsEqual;
[email protected]afa378f22013-12-02 03:37:5423
24namespace component_updater {
25
26namespace {
27
28// Intercepts HTTP GET requests sent to "localhost".
29typedef content::URLLocalHostRequestPrepackagedInterceptor GetInterceptor;
30
[email protected]148dcfd32014-04-29 00:54:3031const char kTestFileName[] = "jebgalgnebhfojomionfpkfelancnnkf.crx";
32
33base::FilePath MakeTestFilePath(const char* file) {
[email protected]afa378f22013-12-02 03:37:5434 base::FilePath path;
tommycli0409b4df2014-08-26 23:31:3235 PathService::Get(base::DIR_SOURCE_ROOT, &path);
36 return path.AppendASCII("components").AppendASCII("test").AppendASCII("data")
37 .AppendASCII("component_updater").AppendASCII(file);
[email protected]afa378f22013-12-02 03:37:5438}
39
40} // namespace
41
42class CrxDownloaderTest : public testing::Test {
43 public:
44 CrxDownloaderTest();
45 virtual ~CrxDownloaderTest();
46
47 // Overrides from testing::Test.
48 virtual void SetUp() OVERRIDE;
49 virtual void TearDown() OVERRIDE;
50
51 void Quit();
52 void RunThreads();
53 void RunThreadsUntilIdle();
54
[email protected]3cb2a4f2013-12-07 21:54:3455 void DownloadComplete(int crx_context, const CrxDownloader::Result& result);
[email protected]afa378f22013-12-02 03:37:5456
[email protected]8a5ebd432014-05-02 00:21:2257 void DownloadProgress(int crx_context, const CrxDownloader::Result& result);
58
[email protected]afa378f22013-12-02 03:37:5459 protected:
60 scoped_ptr<CrxDownloader> crx_downloader_;
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:
78 scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_;
79 scoped_refptr<net::TestURLRequestContextGetter> context_;
80 content::TestBrowserThreadBundle thread_bundle_;
81 base::Closure quit_closure_;
82};
83
84const int CrxDownloaderTest::kExpectedContext;
85
86CrxDownloaderTest::CrxDownloaderTest()
[email protected]1b6587dc52014-04-26 00:38:5587 : callback_(base::Bind(&CrxDownloaderTest::DownloadComplete,
88 base::Unretained(this),
89 kExpectedContext)),
[email protected]8a5ebd432014-05-02 00:21:2290 progress_callback_(base::Bind(&CrxDownloaderTest::DownloadProgress,
91 base::Unretained(this),
92 kExpectedContext)),
[email protected]1b6587dc52014-04-26 00:38:5593 crx_context_(0),
[email protected]148dcfd32014-04-29 00:54:3094 num_download_complete_calls_(0),
[email protected]8a5ebd432014-05-02 00:21:2295 num_progress_calls_(0),
[email protected]afa378f22013-12-02 03:37:5496 blocking_task_runner_(BrowserThread::GetBlockingPool()->
97 GetSequencedTaskRunnerWithShutdownBehavior(
98 BrowserThread::GetBlockingPool()->GetSequenceToken(),
99 base::SequencedWorkerPool::SKIP_ON_SHUTDOWN)),
100 context_(new net::TestURLRequestContextGetter(
101 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO))),
102 thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP) {
103}
104
105CrxDownloaderTest::~CrxDownloaderTest() {
[email protected]3a0092d2013-12-18 03:04:35106 context_ = NULL;
[email protected]afa378f22013-12-02 03:37:54107}
108
109void CrxDownloaderTest::SetUp() {
[email protected]148dcfd32014-04-29 00:54:30110 num_download_complete_calls_ = 0;
111 download_complete_result_ = CrxDownloader::Result();
[email protected]8a5ebd432014-05-02 00:21:22112 num_progress_calls_ = 0;
113 download_progress_result_ = CrxDownloader::Result();
[email protected]afa378f22013-12-02 03:37:54114 crx_downloader_.reset(CrxDownloader::Create(
[email protected]d0c8b8b42014-05-06 05:11:45115 false, // Do not use the background downloader in these tests.
[email protected]afa378f22013-12-02 03:37:54116 context_.get(),
[email protected]ed6fb982014-07-23 16:56:52117 blocking_task_runner_,
118 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE)));
[email protected]8a5ebd432014-05-02 00:21:22119 crx_downloader_->set_progress_callback(progress_callback_);
[email protected]afa378f22013-12-02 03:37:54120}
121
122void CrxDownloaderTest::TearDown() {
[email protected]8a5ebd432014-05-02 00:21:22123 crx_downloader_.reset();
[email protected]afa378f22013-12-02 03:37:54124}
125
126void CrxDownloaderTest::Quit() {
[email protected]da37c1d2013-12-19 01:04:38127 if (!quit_closure_.is_null())
128 quit_closure_.Run();
[email protected]afa378f22013-12-02 03:37:54129}
130
[email protected]148dcfd32014-04-29 00:54:30131void CrxDownloaderTest::DownloadComplete(int crx_context,
132 const CrxDownloader::Result& result) {
133 ++num_download_complete_calls_;
[email protected]afa378f22013-12-02 03:37:54134 crx_context_ = crx_context;
[email protected]148dcfd32014-04-29 00:54:30135 download_complete_result_ = result;
[email protected]afa378f22013-12-02 03:37:54136 Quit();
137}
138
[email protected]8a5ebd432014-05-02 00:21:22139void CrxDownloaderTest::DownloadProgress(int crx_context,
140 const CrxDownloader::Result& result) {
141 ++num_progress_calls_;
142 download_progress_result_ = result;
143}
144
[email protected]afa378f22013-12-02 03:37:54145void CrxDownloaderTest::RunThreads() {
146 base::RunLoop runloop;
147 quit_closure_ = runloop.QuitClosure();
148 runloop.Run();
149
150 // Since some tests need to drain currently enqueued tasks such as network
151 // intercepts on the IO thread, run the threads until they are
152 // idle. The component updater service won't loop again until the loop count
153 // is set and the service is started.
154 RunThreadsUntilIdle();
155}
156
157void CrxDownloaderTest::RunThreadsUntilIdle() {
158 base::RunLoop().RunUntilIdle();
159}
160
[email protected]da37c1d2013-12-19 01:04:38161// Tests that starting a download without a url results in an error.
162TEST_F(CrxDownloaderTest, NoUrl) {
163 std::vector<GURL> urls;
[email protected]1b6587dc52014-04-26 00:38:55164 crx_downloader_->StartDownload(urls, callback_);
[email protected]da37c1d2013-12-19 01:04:38165 RunThreadsUntilIdle();
[email protected]da37c1d2013-12-19 01:04:38166
[email protected]148dcfd32014-04-29 00:54:30167 EXPECT_EQ(1, num_download_complete_calls_);
168 EXPECT_EQ(kExpectedContext, crx_context_);
169 EXPECT_EQ(-1, download_complete_result_.error);
170 EXPECT_TRUE(download_complete_result_.response.empty());
[email protected]8a5ebd432014-05-02 00:21:22171 EXPECT_EQ(-1, download_complete_result_.downloaded_bytes);
172 EXPECT_EQ(-1, download_complete_result_.total_bytes);
173 EXPECT_EQ(0, num_progress_calls_);
[email protected]da37c1d2013-12-19 01:04:38174}
175
[email protected]afa378f22013-12-02 03:37:54176// Tests that downloading from one url is successful.
177TEST_F(CrxDownloaderTest, OneUrl) {
178 const GURL expected_crx_url =
[email protected]d0c8b8b42014-05-06 05:11:45179 GURL("http://localhost/download/jebgalgnebhfojomionfpkfelancnnkf.crx");
[email protected]afa378f22013-12-02 03:37:54180
[email protected]148dcfd32014-04-29 00:54:30181 const base::FilePath test_file(MakeTestFilePath(kTestFileName));
[email protected]afa378f22013-12-02 03:37:54182 GetInterceptor interceptor;
[email protected]148dcfd32014-04-29 00:54:30183 interceptor.SetResponse(expected_crx_url, test_file);
[email protected]afa378f22013-12-02 03:37:54184
[email protected]1b6587dc52014-04-26 00:38:55185 crx_downloader_->StartDownloadFromUrl(expected_crx_url, callback_);
[email protected]afa378f22013-12-02 03:37:54186 RunThreads();
[email protected]afa378f22013-12-02 03:37:54187
[email protected]148dcfd32014-04-29 00:54:30188 EXPECT_EQ(1, interceptor.GetHitCount());
189
190 EXPECT_EQ(1, num_download_complete_calls_);
191 EXPECT_EQ(kExpectedContext, crx_context_);
192 EXPECT_EQ(0, download_complete_result_.error);
[email protected]8a5ebd432014-05-02 00:21:22193 EXPECT_EQ(1843, download_complete_result_.downloaded_bytes);
194 EXPECT_EQ(1843, download_complete_result_.total_bytes);
[email protected]148dcfd32014-04-29 00:54:30195 EXPECT_TRUE(ContentsEqual(download_complete_result_.response, test_file));
196
197 EXPECT_TRUE(base::DeleteFile(download_complete_result_.response, false));
[email protected]8a5ebd432014-05-02 00:21:22198
199 EXPECT_LE(1, num_progress_calls_);
200 EXPECT_EQ(1843, download_progress_result_.downloaded_bytes);
201 EXPECT_EQ(1843, download_progress_result_.total_bytes);
[email protected]afa378f22013-12-02 03:37:54202}
203
204// Tests that specifying from two urls has no side effects. Expect a successful
205// download, and only one download request be made.
[email protected]5bff685d32014-04-23 00:43:03206// This test is flaky on Android. crbug.com/329883
207#if defined(OS_ANDROID)
208#define MAYBE_TwoUrls DISABLED_TwoUrls
209#else
210#define MAYBE_TwoUrls TwoUrls
211#endif
212TEST_F(CrxDownloaderTest, MAYBE_TwoUrls) {
[email protected]afa378f22013-12-02 03:37:54213 const GURL expected_crx_url =
[email protected]d0c8b8b42014-05-06 05:11:45214 GURL("http://localhost/download/jebgalgnebhfojomionfpkfelancnnkf.crx");
[email protected]afa378f22013-12-02 03:37:54215
[email protected]148dcfd32014-04-29 00:54:30216 const base::FilePath test_file(MakeTestFilePath(kTestFileName));
[email protected]afa378f22013-12-02 03:37:54217 GetInterceptor interceptor;
[email protected]148dcfd32014-04-29 00:54:30218 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
[email protected]148dcfd32014-04-29 00:54:30227 EXPECT_EQ(1, interceptor.GetHitCount());
228
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));
[email protected]afa378f22013-12-02 03:37:54249 GetInterceptor interceptor;
[email protected]148dcfd32014-04-29 00:54:30250 interceptor.SetResponse(expected_crx_url, test_file);
[email protected]afa378f22013-12-02 03:37:54251
252 crx_downloader_->StartDownloadFromUrl(
253 GURL("http://no.such.host"
[email protected]1b6587dc52014-04-26 00:38:55254 "/download/jebgalgnebhfojomionfpkfelancnnkf.crx"),
255 callback_);
[email protected]afa378f22013-12-02 03:37:54256 RunThreads();
[email protected]afa378f22013-12-02 03:37:54257
[email protected]148dcfd32014-04-29 00:54:30258 EXPECT_EQ(0, interceptor.GetHitCount());
259
260 EXPECT_EQ(1, num_download_complete_calls_);
261 EXPECT_EQ(kExpectedContext, crx_context_);
262 EXPECT_NE(0, download_complete_result_.error);
263 EXPECT_TRUE(download_complete_result_.response.empty());
[email protected]afa378f22013-12-02 03:37:54264}
265
266// Tests that an invalid path results in a download error.
267TEST_F(CrxDownloaderTest, OneUrl_InvalidPath) {
268 const GURL expected_crx_url =
[email protected]d0c8b8b42014-05-06 05:11:45269 GURL("http://localhost/download/jebgalgnebhfojomionfpkfelancnnkf.crx");
[email protected]afa378f22013-12-02 03:37:54270
[email protected]148dcfd32014-04-29 00:54:30271 const base::FilePath test_file(MakeTestFilePath(kTestFileName));
[email protected]afa378f22013-12-02 03:37:54272 GetInterceptor interceptor;
[email protected]148dcfd32014-04-29 00:54:30273 interceptor.SetResponse(expected_crx_url, test_file);
[email protected]afa378f22013-12-02 03:37:54274
[email protected]d0c8b8b42014-05-06 05:11:45275 crx_downloader_->StartDownloadFromUrl(GURL("http://localhost/no/such/file"),
276 callback_);
[email protected]afa378f22013-12-02 03:37:54277 RunThreads();
[email protected]afa378f22013-12-02 03:37:54278
[email protected]148dcfd32014-04-29 00:54:30279 EXPECT_EQ(0, interceptor.GetHitCount());
280
281 EXPECT_EQ(1, num_download_complete_calls_);
282 EXPECT_EQ(kExpectedContext, crx_context_);
283 EXPECT_NE(0, download_complete_result_.error);
284 EXPECT_TRUE(download_complete_result_.response.empty());
[email protected]afa378f22013-12-02 03:37:54285}
286
287// Tests that the fallback to a valid url is successful.
[email protected]5bff685d32014-04-23 00:43:03288// This test is flaky on Android. crbug.com/329883
289#if defined(OS_ANDROID)
290#define MAYBE_TwoUrls_FirstInvalid DISABLED_TwoUrls_FirstInvalid
291#else
292#define MAYBE_TwoUrls_FirstInvalid TwoUrls_FirstInvalid
293#endif
294TEST_F(CrxDownloaderTest, MAYBE_TwoUrls_FirstInvalid) {
[email protected]afa378f22013-12-02 03:37:54295 const GURL expected_crx_url =
[email protected]d0c8b8b42014-05-06 05:11:45296 GURL("http://localhost/download/jebgalgnebhfojomionfpkfelancnnkf.crx");
[email protected]afa378f22013-12-02 03:37:54297
[email protected]148dcfd32014-04-29 00:54:30298 const base::FilePath test_file(MakeTestFilePath(kTestFileName));
[email protected]afa378f22013-12-02 03:37:54299 GetInterceptor interceptor;
[email protected]148dcfd32014-04-29 00:54:30300 interceptor.SetResponse(expected_crx_url, test_file);
[email protected]afa378f22013-12-02 03:37:54301
302 std::vector<GURL> urls;
303 urls.push_back(GURL("http://localhost/no/such/file"));
304 urls.push_back(expected_crx_url);
305
[email protected]1b6587dc52014-04-26 00:38:55306 crx_downloader_->StartDownload(urls, callback_);
[email protected]afa378f22013-12-02 03:37:54307 RunThreads();
[email protected]afa378f22013-12-02 03:37:54308
[email protected]148dcfd32014-04-29 00:54:30309 EXPECT_EQ(1, interceptor.GetHitCount());
310
311 EXPECT_EQ(1, num_download_complete_calls_);
312 EXPECT_EQ(kExpectedContext, crx_context_);
313 EXPECT_EQ(0, download_complete_result_.error);
[email protected]8a5ebd432014-05-02 00:21:22314 EXPECT_EQ(1843, download_complete_result_.downloaded_bytes);
315 EXPECT_EQ(1843, download_complete_result_.total_bytes);
[email protected]148dcfd32014-04-29 00:54:30316 EXPECT_TRUE(ContentsEqual(download_complete_result_.response, test_file));
317
318 EXPECT_TRUE(base::DeleteFile(download_complete_result_.response, false));
[email protected]8a5ebd432014-05-02 00:21:22319
320 EXPECT_LE(1, num_progress_calls_);
321 EXPECT_EQ(1843, download_progress_result_.downloaded_bytes);
322 EXPECT_EQ(1843, download_progress_result_.total_bytes);
[email protected]afa378f22013-12-02 03:37:54323}
324
325// Tests that the download succeeds if the first url is correct and the
326// second bad url does not have a side-effect.
327TEST_F(CrxDownloaderTest, TwoUrls_SecondInvalid) {
328 const GURL expected_crx_url =
[email protected]d0c8b8b42014-05-06 05:11:45329 GURL("http://localhost/download/jebgalgnebhfojomionfpkfelancnnkf.crx");
[email protected]afa378f22013-12-02 03:37:54330
[email protected]148dcfd32014-04-29 00:54:30331 const base::FilePath test_file(MakeTestFilePath(kTestFileName));
[email protected]afa378f22013-12-02 03:37:54332 GetInterceptor interceptor;
[email protected]148dcfd32014-04-29 00:54:30333 interceptor.SetResponse(expected_crx_url, test_file);
[email protected]afa378f22013-12-02 03:37:54334
335 std::vector<GURL> urls;
336 urls.push_back(expected_crx_url);
337 urls.push_back(GURL("http://localhost/no/such/file"));
338
[email protected]1b6587dc52014-04-26 00:38:55339 crx_downloader_->StartDownload(urls, callback_);
[email protected]afa378f22013-12-02 03:37:54340 RunThreads();
[email protected]afa378f22013-12-02 03:37:54341
[email protected]148dcfd32014-04-29 00:54:30342 EXPECT_EQ(1, interceptor.GetHitCount());
343
344 EXPECT_EQ(1, num_download_complete_calls_);
345 EXPECT_EQ(kExpectedContext, crx_context_);
346 EXPECT_EQ(0, download_complete_result_.error);
[email protected]8a5ebd432014-05-02 00:21:22347 EXPECT_EQ(1843, download_complete_result_.downloaded_bytes);
348 EXPECT_EQ(1843, download_complete_result_.total_bytes);
[email protected]148dcfd32014-04-29 00:54:30349 EXPECT_TRUE(ContentsEqual(download_complete_result_.response, test_file));
350
351 EXPECT_TRUE(base::DeleteFile(download_complete_result_.response, false));
[email protected]8a5ebd432014-05-02 00:21:22352
353 EXPECT_LE(1, num_progress_calls_);
354 EXPECT_EQ(1843, download_progress_result_.downloaded_bytes);
355 EXPECT_EQ(1843, download_progress_result_.total_bytes);
[email protected]afa378f22013-12-02 03:37:54356}
357
358// Tests that the download fails if both urls are bad.
359TEST_F(CrxDownloaderTest, TwoUrls_BothInvalid) {
360 const GURL expected_crx_url =
[email protected]d0c8b8b42014-05-06 05:11:45361 GURL("http://localhost/download/jebgalgnebhfojomionfpkfelancnnkf.crx");
[email protected]afa378f22013-12-02 03:37:54362
[email protected]148dcfd32014-04-29 00:54:30363 const base::FilePath test_file(MakeTestFilePath(kTestFileName));
[email protected]afa378f22013-12-02 03:37:54364 GetInterceptor interceptor;
[email protected]148dcfd32014-04-29 00:54:30365 interceptor.SetResponse(expected_crx_url, test_file);
[email protected]afa378f22013-12-02 03:37:54366
367 std::vector<GURL> urls;
368 urls.push_back(GURL("http://localhost/no/such/file"));
369 urls.push_back(GURL("http://no.such.host/"
370 "/download/jebgalgnebhfojomionfpkfelancnnkf.crx"));
371
[email protected]1b6587dc52014-04-26 00:38:55372 crx_downloader_->StartDownload(urls, callback_);
[email protected]afa378f22013-12-02 03:37:54373 RunThreads();
[email protected]afa378f22013-12-02 03:37:54374
[email protected]148dcfd32014-04-29 00:54:30375 EXPECT_EQ(0, interceptor.GetHitCount());
376
377 EXPECT_EQ(1, num_download_complete_calls_);
378 EXPECT_EQ(kExpectedContext, crx_context_);
379 EXPECT_NE(0, download_complete_result_.error);
380 EXPECT_TRUE(download_complete_result_.response.empty());
[email protected]afa378f22013-12-02 03:37:54381}
382
383} // namespace component_updater