blob: cb5c80842f91c53ded90bcfb805c6e0642a3a383 [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
dchengd0fc6aa92016-04-22 18:03:125#include "components/update_client/crx_downloader.h"
6
7#include <memory>
Sorin Jianua8ef73d2017-11-02 16:55:178#include <utility>
dchengd0fc6aa92016-04-22 18:03:129
[email protected]afa378f22013-12-02 03:37:5410#include "base/bind.h"
[email protected]afa378f22013-12-02 03:37:5411#include "base/files/file_path.h"
thestig18dfb7a52014-08-26 10:44:0412#include "base/files/file_util.h"
[email protected]afa378f22013-12-02 03:37:5413#include "base/memory/ref_counted.h"
[email protected]afa378f22013-12-02 03:37:5414#include "base/path_service.h"
15#include "base/run_loop.h"
Sorin Jianu72d8fe0d2017-07-11 18:42:1616#include "base/test/scoped_task_environment.h"
gab7966d312016-05-11 20:35:0117#include "base/threading/thread_task_runner_handle.h"
avi5dd91f82015-12-25 22:30:4618#include "build/build_config.h"
sorin7b8650522016-11-02 18:23:4119#include "components/update_client/update_client_errors.h"
Sorin Jianubbd51392017-07-20 01:48:3120#include "components/update_client/utils.h"
[email protected]afa378f22013-12-02 03:37:5421#include "net/base/net_errors.h"
tommyclieaae5d92014-09-09 06:03:4722#include "net/url_request/test_url_request_interceptor.h"
[email protected]afa378f22013-12-02 03:37:5423#include "net/url_request/url_request_test_util.h"
24#include "testing/gtest/include/gtest/gtest.h"
25
[email protected]148dcfd32014-04-29 00:54:3026using base::ContentsEqual;
[email protected]afa378f22013-12-02 03:37:5427
sorin52ac0882015-01-24 01:15:0028namespace update_client {
[email protected]afa378f22013-12-02 03:37:5429
30namespace {
31
32// Intercepts HTTP GET requests sent to "localhost".
tommyclieaae5d92014-09-09 06:03:4733typedef net::LocalHostTestURLRequestInterceptor GetInterceptor;
[email protected]afa378f22013-12-02 03:37:5434
[email protected]148dcfd32014-04-29 00:54:3035const char kTestFileName[] = "jebgalgnebhfojomionfpkfelancnnkf.crx";
36
sorin74e70672016-02-03 03:13:1037const char hash_jebg[] =
38 "6fc4b93fd11134de1300c2c0bb88c12b644a4ec0fd7c9b12cb7cc067667bde87";
39
[email protected]148dcfd32014-04-29 00:54:3040base::FilePath MakeTestFilePath(const char* file) {
[email protected]afa378f22013-12-02 03:37:5441 base::FilePath path;
Avi Drissmanf617d012018-05-02 18:48:5342 base::PathService::Get(base::DIR_SOURCE_ROOT, &path);
sorin74e70672016-02-03 03:13:1043 return path.AppendASCII("components/test/data/update_client")
sorin52ac0882015-01-24 01:15:0044 .AppendASCII(file);
[email protected]afa378f22013-12-02 03:37:5445}
46
47} // namespace
48
49class CrxDownloaderTest : public testing::Test {
50 public:
51 CrxDownloaderTest();
dcheng30a1b1542014-10-29 21:27:5052 ~CrxDownloaderTest() override;
[email protected]afa378f22013-12-02 03:37:5453
54 // Overrides from testing::Test.
dcheng30a1b1542014-10-29 21:27:5055 void SetUp() override;
56 void TearDown() override;
[email protected]afa378f22013-12-02 03:37:5457
58 void Quit();
59 void RunThreads();
60 void RunThreadsUntilIdle();
61
[email protected]3cb2a4f2013-12-07 21:54:3462 void DownloadComplete(int crx_context, const CrxDownloader::Result& result);
[email protected]afa378f22013-12-02 03:37:5463
[email protected]8a5ebd432014-05-02 00:21:2264 void DownloadProgress(int crx_context, const CrxDownloader::Result& result);
65
[email protected]afa378f22013-12-02 03:37:5466 protected:
dchengd0fc6aa92016-04-22 18:03:1267 std::unique_ptr<CrxDownloader> crx_downloader_;
[email protected]afa378f22013-12-02 03:37:5468
dchengd0fc6aa92016-04-22 18:03:1269 std::unique_ptr<GetInterceptor> get_interceptor_;
tommyclieaae5d92014-09-09 06:03:4770
[email protected]1b6587dc52014-04-26 00:38:5571 CrxDownloader::DownloadCallback callback_;
[email protected]8a5ebd432014-05-02 00:21:2272 CrxDownloader::ProgressCallback progress_callback_;
[email protected]1b6587dc52014-04-26 00:38:5573
[email protected]afa378f22013-12-02 03:37:5474 int crx_context_;
[email protected]afa378f22013-12-02 03:37:5475
[email protected]148dcfd32014-04-29 00:54:3076 int num_download_complete_calls_;
77 CrxDownloader::Result download_complete_result_;
[email protected]afa378f22013-12-02 03:37:5478
[email protected]8a5ebd432014-05-02 00:21:2279 // These members are updated by DownloadProgress.
80 int num_progress_calls_;
81 CrxDownloader::Result download_progress_result_;
82
[email protected]afa378f22013-12-02 03:37:5483 // A magic value for the context to be used in the tests.
84 static const int kExpectedContext = 0xaabb;
85
86 private:
Sorin Jianu72d8fe0d2017-07-11 18:42:1687 base::test::ScopedTaskEnvironment scoped_task_environment_;
[email protected]afa378f22013-12-02 03:37:5488 scoped_refptr<net::TestURLRequestContextGetter> context_;
Sorin Jianua8ef73d2017-11-02 16:55:1789 base::OnceClosure quit_closure_;
[email protected]afa378f22013-12-02 03:37:5490};
91
92const int CrxDownloaderTest::kExpectedContext;
93
94CrxDownloaderTest::CrxDownloaderTest()
Sorin Jianua8ef73d2017-11-02 16:55:1795 : callback_(base::BindOnce(&CrxDownloaderTest::DownloadComplete,
96 base::Unretained(this),
97 kExpectedContext)),
[email protected]8a5ebd432014-05-02 00:21:2298 progress_callback_(base::Bind(&CrxDownloaderTest::DownloadProgress,
99 base::Unretained(this),
100 kExpectedContext)),
[email protected]1b6587dc52014-04-26 00:38:55101 crx_context_(0),
[email protected]148dcfd32014-04-29 00:54:30102 num_download_complete_calls_(0),
[email protected]8a5ebd432014-05-02 00:21:22103 num_progress_calls_(0),
Sorin Jianu72d8fe0d2017-07-11 18:42:16104 scoped_task_environment_(
105 base::test::ScopedTaskEnvironment::MainThreadType::IO),
Sorin Jianua8ef73d2017-11-02 16:55:17106 context_(base::MakeRefCounted<net::TestURLRequestContextGetter>(
Sorin Jianu72d8fe0d2017-07-11 18:42:16107 base::ThreadTaskRunnerHandle::Get())) {}
[email protected]afa378f22013-12-02 03:37:54108
109CrxDownloaderTest::~CrxDownloaderTest() {
Ivan Kotenkov75b1c3a2017-10-24 14:47:24110 context_ = nullptr;
tommyclieaae5d92014-09-09 06:03:47111
112 // The GetInterceptor requires the message loop to run to destruct correctly.
113 get_interceptor_.reset();
114 RunThreadsUntilIdle();
[email protected]afa378f22013-12-02 03:37:54115}
116
117void CrxDownloaderTest::SetUp() {
[email protected]148dcfd32014-04-29 00:54:30118 num_download_complete_calls_ = 0;
119 download_complete_result_ = CrxDownloader::Result();
[email protected]8a5ebd432014-05-02 00:21:22120 num_progress_calls_ = 0;
121 download_progress_result_ = CrxDownloader::Result();
tommyclieaae5d92014-09-09 06:03:47122
sorin9797aba2015-04-17 17:15:03123 // Do not use the background downloader in these tests.
Sorin Jianua8ef73d2017-11-02 16:55:17124 crx_downloader_ = CrxDownloader::Create(false, context_.get());
[email protected]8a5ebd432014-05-02 00:21:22125 crx_downloader_->set_progress_callback(progress_callback_);
tommyclieaae5d92014-09-09 06:03:47126
Sorin Jianua8ef73d2017-11-02 16:55:17127 get_interceptor_ = std::make_unique<GetInterceptor>(
128 base::ThreadTaskRunnerHandle::Get(), base::ThreadTaskRunnerHandle::Get());
[email protected]afa378f22013-12-02 03:37:54129}
130
131void CrxDownloaderTest::TearDown() {
[email protected]8a5ebd432014-05-02 00:21:22132 crx_downloader_.reset();
[email protected]afa378f22013-12-02 03:37:54133}
134
135void CrxDownloaderTest::Quit() {
[email protected]da37c1d2013-12-19 01:04:38136 if (!quit_closure_.is_null())
Sorin Jianua8ef73d2017-11-02 16:55:17137 std::move(quit_closure_).Run();
[email protected]afa378f22013-12-02 03:37:54138}
139
[email protected]148dcfd32014-04-29 00:54:30140void CrxDownloaderTest::DownloadComplete(int crx_context,
141 const CrxDownloader::Result& result) {
142 ++num_download_complete_calls_;
[email protected]afa378f22013-12-02 03:37:54143 crx_context_ = crx_context;
[email protected]148dcfd32014-04-29 00:54:30144 download_complete_result_ = result;
[email protected]afa378f22013-12-02 03:37:54145 Quit();
146}
147
[email protected]8a5ebd432014-05-02 00:21:22148void CrxDownloaderTest::DownloadProgress(int crx_context,
149 const CrxDownloader::Result& result) {
150 ++num_progress_calls_;
151 download_progress_result_ = result;
152}
153
[email protected]afa378f22013-12-02 03:37:54154void CrxDownloaderTest::RunThreads() {
155 base::RunLoop runloop;
156 quit_closure_ = runloop.QuitClosure();
157 runloop.Run();
158
159 // Since some tests need to drain currently enqueued tasks such as network
160 // intercepts on the IO thread, run the threads until they are
161 // idle. The component updater service won't loop again until the loop count
162 // is set and the service is started.
163 RunThreadsUntilIdle();
164}
165
166void CrxDownloaderTest::RunThreadsUntilIdle() {
Sorin Jianubbd51392017-07-20 01:48:31167 scoped_task_environment_.RunUntilIdle();
[email protected]afa378f22013-12-02 03:37:54168 base::RunLoop().RunUntilIdle();
169}
170
[email protected]da37c1d2013-12-19 01:04:38171// Tests that starting a download without a url results in an error.
172TEST_F(CrxDownloaderTest, NoUrl) {
173 std::vector<GURL> urls;
Sorin Jianua8ef73d2017-11-02 16:55:17174 crx_downloader_->StartDownload(urls, std::string("abcd"),
175 std::move(callback_));
[email protected]da37c1d2013-12-19 01:04:38176 RunThreadsUntilIdle();
[email protected]da37c1d2013-12-19 01:04:38177
[email protected]148dcfd32014-04-29 00:54:30178 EXPECT_EQ(1, num_download_complete_calls_);
179 EXPECT_EQ(kExpectedContext, crx_context_);
sorin7b8650522016-11-02 18:23:41180 EXPECT_EQ(static_cast<int>(CrxDownloaderError::NO_URL),
181 download_complete_result_.error);
sorin74e70672016-02-03 03:13:10182 EXPECT_TRUE(download_complete_result_.response.empty());
183 EXPECT_EQ(-1, download_complete_result_.downloaded_bytes);
184 EXPECT_EQ(-1, download_complete_result_.total_bytes);
185 EXPECT_EQ(0, num_progress_calls_);
186}
187
188// Tests that starting a download without providing a hash results in an error.
189TEST_F(CrxDownloaderTest, NoHash) {
190 std::vector<GURL> urls(1, GURL("http://somehost/somefile"));
191
Sorin Jianua8ef73d2017-11-02 16:55:17192 crx_downloader_->StartDownload(urls, std::string(), std::move(callback_));
sorin74e70672016-02-03 03:13:10193 RunThreadsUntilIdle();
194
195 EXPECT_EQ(1, num_download_complete_calls_);
196 EXPECT_EQ(kExpectedContext, crx_context_);
sorin7b8650522016-11-02 18:23:41197 EXPECT_EQ(static_cast<int>(CrxDownloaderError::NO_HASH),
198 download_complete_result_.error);
[email protected]148dcfd32014-04-29 00:54:30199 EXPECT_TRUE(download_complete_result_.response.empty());
[email protected]8a5ebd432014-05-02 00:21:22200 EXPECT_EQ(-1, download_complete_result_.downloaded_bytes);
201 EXPECT_EQ(-1, download_complete_result_.total_bytes);
202 EXPECT_EQ(0, num_progress_calls_);
[email protected]da37c1d2013-12-19 01:04:38203}
204
[email protected]afa378f22013-12-02 03:37:54205// Tests that downloading from one url is successful.
206TEST_F(CrxDownloaderTest, OneUrl) {
207 const GURL expected_crx_url =
[email protected]d0c8b8b42014-05-06 05:11:45208 GURL("http://localhost/download/jebgalgnebhfojomionfpkfelancnnkf.crx");
[email protected]afa378f22013-12-02 03:37:54209
[email protected]148dcfd32014-04-29 00:54:30210 const base::FilePath test_file(MakeTestFilePath(kTestFileName));
tommyclieaae5d92014-09-09 06:03:47211 get_interceptor_->SetResponse(expected_crx_url, test_file);
[email protected]afa378f22013-12-02 03:37:54212
Sorin Jianua8ef73d2017-11-02 16:55:17213 crx_downloader_->StartDownloadFromUrl(
214 expected_crx_url, std::string(hash_jebg), std::move(callback_));
[email protected]afa378f22013-12-02 03:37:54215 RunThreads();
[email protected]afa378f22013-12-02 03:37:54216
tommyclieaae5d92014-09-09 06:03:47217 EXPECT_EQ(1, get_interceptor_->GetHitCount());
[email protected]148dcfd32014-04-29 00:54:30218
219 EXPECT_EQ(1, num_download_complete_calls_);
220 EXPECT_EQ(kExpectedContext, crx_context_);
221 EXPECT_EQ(0, download_complete_result_.error);
[email protected]8a5ebd432014-05-02 00:21:22222 EXPECT_EQ(1843, download_complete_result_.downloaded_bytes);
223 EXPECT_EQ(1843, download_complete_result_.total_bytes);
[email protected]148dcfd32014-04-29 00:54:30224 EXPECT_TRUE(ContentsEqual(download_complete_result_.response, test_file));
225
Sorin Jianubbd51392017-07-20 01:48:31226 EXPECT_TRUE(
227 DeleteFileAndEmptyParentDirectory(download_complete_result_.response));
[email protected]8a5ebd432014-05-02 00:21:22228
229 EXPECT_LE(1, num_progress_calls_);
230 EXPECT_EQ(1843, download_progress_result_.downloaded_bytes);
231 EXPECT_EQ(1843, download_progress_result_.total_bytes);
[email protected]afa378f22013-12-02 03:37:54232}
233
sorin74e70672016-02-03 03:13:10234// Tests that downloading from one url fails if the actual hash of the file
235// does not match the expected hash.
236TEST_F(CrxDownloaderTest, OneUrlBadHash) {
237 const GURL expected_crx_url =
238 GURL("http://localhost/download/jebgalgnebhfojomionfpkfelancnnkf.crx");
239
240 const base::FilePath test_file(MakeTestFilePath(kTestFileName));
241 get_interceptor_->SetResponse(expected_crx_url, test_file);
242
243 crx_downloader_->StartDownloadFromUrl(
244 expected_crx_url,
245 std::string(
246 "813c59747e139a608b3b5fc49633affc6db574373f309f156ea6d27229c0b3f9"),
Sorin Jianua8ef73d2017-11-02 16:55:17247 std::move(callback_));
sorin74e70672016-02-03 03:13:10248 RunThreads();
249
250 EXPECT_EQ(1, get_interceptor_->GetHitCount());
251
252 EXPECT_EQ(1, num_download_complete_calls_);
253 EXPECT_EQ(kExpectedContext, crx_context_);
sorin7b8650522016-11-02 18:23:41254 EXPECT_EQ(static_cast<int>(CrxDownloaderError::BAD_HASH),
255 download_complete_result_.error);
sorin74e70672016-02-03 03:13:10256 EXPECT_EQ(1843, download_complete_result_.downloaded_bytes);
257 EXPECT_EQ(1843, download_complete_result_.total_bytes);
258 EXPECT_TRUE(download_complete_result_.response.empty());
259
260 EXPECT_LE(1, num_progress_calls_);
261 EXPECT_EQ(1843, download_progress_result_.downloaded_bytes);
262 EXPECT_EQ(1843, download_progress_result_.total_bytes);
263}
264
265// Tests that specifying two urls has no side effects. Expect a successful
[email protected]afa378f22013-12-02 03:37:54266// download, and only one download request be made.
Sorin Jianuc35bacf2018-01-31 18:25:28267TEST_F(CrxDownloaderTest, TwoUrls) {
[email protected]afa378f22013-12-02 03:37:54268 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));
tommyclieaae5d92014-09-09 06:03:47272 get_interceptor_->SetResponse(expected_crx_url, test_file);
[email protected]afa378f22013-12-02 03:37:54273
274 std::vector<GURL> urls;
275 urls.push_back(expected_crx_url);
276 urls.push_back(expected_crx_url);
277
Sorin Jianua8ef73d2017-11-02 16:55:17278 crx_downloader_->StartDownload(urls, std::string(hash_jebg),
279 std::move(callback_));
[email protected]afa378f22013-12-02 03:37:54280 RunThreads();
[email protected]afa378f22013-12-02 03:37:54281
tommyclieaae5d92014-09-09 06:03:47282 EXPECT_EQ(1, get_interceptor_->GetHitCount());
[email protected]148dcfd32014-04-29 00:54:30283
284 EXPECT_EQ(1, num_download_complete_calls_);
285 EXPECT_EQ(kExpectedContext, crx_context_);
286 EXPECT_EQ(0, download_complete_result_.error);
[email protected]8a5ebd432014-05-02 00:21:22287 EXPECT_EQ(1843, download_complete_result_.downloaded_bytes);
288 EXPECT_EQ(1843, download_complete_result_.total_bytes);
[email protected]148dcfd32014-04-29 00:54:30289 EXPECT_TRUE(ContentsEqual(download_complete_result_.response, test_file));
290
Sorin Jianubbd51392017-07-20 01:48:31291 EXPECT_TRUE(
292 DeleteFileAndEmptyParentDirectory(download_complete_result_.response));
[email protected]8a5ebd432014-05-02 00:21:22293
294 EXPECT_LE(1, num_progress_calls_);
295 EXPECT_EQ(1843, download_progress_result_.downloaded_bytes);
296 EXPECT_EQ(1843, download_progress_result_.total_bytes);
[email protected]afa378f22013-12-02 03:37:54297}
298
[email protected]afa378f22013-12-02 03:37:54299// Tests that the fallback to a valid url is successful.
Sorin Jianuc35bacf2018-01-31 18:25:28300TEST_F(CrxDownloaderTest, TwoUrls_FirstInvalid) {
[email protected]afa378f22013-12-02 03:37:54301 const GURL expected_crx_url =
[email protected]d0c8b8b42014-05-06 05:11:45302 GURL("http://localhost/download/jebgalgnebhfojomionfpkfelancnnkf.crx");
Sorin Jianuc35bacf2018-01-31 18:25:28303 const GURL no_file_url =
304 GURL("http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc.crx");
[email protected]afa378f22013-12-02 03:37:54305
[email protected]148dcfd32014-04-29 00:54:30306 const base::FilePath test_file(MakeTestFilePath(kTestFileName));
tommyclieaae5d92014-09-09 06:03:47307 get_interceptor_->SetResponse(expected_crx_url, test_file);
Sorin Jianuc35bacf2018-01-31 18:25:28308 get_interceptor_->SetResponse(no_file_url,
309 base::FilePath(FILE_PATH_LITERAL("no-file")));
[email protected]afa378f22013-12-02 03:37:54310
311 std::vector<GURL> urls;
Sorin Jianuc35bacf2018-01-31 18:25:28312 urls.push_back(no_file_url);
[email protected]afa378f22013-12-02 03:37:54313 urls.push_back(expected_crx_url);
314
Sorin Jianua8ef73d2017-11-02 16:55:17315 crx_downloader_->StartDownload(urls, std::string(hash_jebg),
316 std::move(callback_));
[email protected]afa378f22013-12-02 03:37:54317 RunThreads();
[email protected]afa378f22013-12-02 03:37:54318
Sorin Jianuc35bacf2018-01-31 18:25:28319 EXPECT_EQ(2, get_interceptor_->GetHitCount());
[email protected]148dcfd32014-04-29 00:54:30320
321 EXPECT_EQ(1, num_download_complete_calls_);
322 EXPECT_EQ(kExpectedContext, crx_context_);
323 EXPECT_EQ(0, download_complete_result_.error);
[email protected]8a5ebd432014-05-02 00:21:22324 EXPECT_EQ(1843, download_complete_result_.downloaded_bytes);
325 EXPECT_EQ(1843, download_complete_result_.total_bytes);
[email protected]148dcfd32014-04-29 00:54:30326 EXPECT_TRUE(ContentsEqual(download_complete_result_.response, test_file));
327
Sorin Jianubbd51392017-07-20 01:48:31328 EXPECT_TRUE(
329 DeleteFileAndEmptyParentDirectory(download_complete_result_.response));
[email protected]8a5ebd432014-05-02 00:21:22330
Sorin Jianuc35bacf2018-01-31 18:25:28331 // Expect at least some progress reported by the fetcher.
[email protected]8a5ebd432014-05-02 00:21:22332 EXPECT_LE(1, num_progress_calls_);
333 EXPECT_EQ(1843, download_progress_result_.downloaded_bytes);
334 EXPECT_EQ(1843, download_progress_result_.total_bytes);
Sorin Jianuc35bacf2018-01-31 18:25:28335
336 const auto download_metrics = crx_downloader_->download_metrics();
337 ASSERT_EQ(2u, download_metrics.size());
338 EXPECT_EQ(no_file_url, download_metrics[0].url);
339 EXPECT_EQ(net::ERR_FILE_NOT_FOUND, download_metrics[0].error);
340 EXPECT_EQ(-1, download_metrics[0].downloaded_bytes);
341 EXPECT_EQ(-1, download_metrics[0].total_bytes);
342 EXPECT_EQ(expected_crx_url, download_metrics[1].url);
343 EXPECT_EQ(0, download_metrics[1].error);
344 EXPECT_EQ(1843, download_metrics[1].downloaded_bytes);
345 EXPECT_EQ(1843, download_metrics[1].total_bytes);
[email protected]afa378f22013-12-02 03:37:54346}
347
348// Tests that the download succeeds if the first url is correct and the
349// second bad url does not have a side-effect.
350TEST_F(CrxDownloaderTest, TwoUrls_SecondInvalid) {
351 const GURL expected_crx_url =
[email protected]d0c8b8b42014-05-06 05:11:45352 GURL("http://localhost/download/jebgalgnebhfojomionfpkfelancnnkf.crx");
Sorin Jianuc35bacf2018-01-31 18:25:28353 const GURL no_file_url =
354 GURL("http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc.crx");
[email protected]afa378f22013-12-02 03:37:54355
[email protected]148dcfd32014-04-29 00:54:30356 const base::FilePath test_file(MakeTestFilePath(kTestFileName));
tommyclieaae5d92014-09-09 06:03:47357 get_interceptor_->SetResponse(expected_crx_url, test_file);
Sorin Jianuc35bacf2018-01-31 18:25:28358 get_interceptor_->SetResponse(no_file_url,
359 base::FilePath(FILE_PATH_LITERAL("no-file")));
[email protected]afa378f22013-12-02 03:37:54360
361 std::vector<GURL> urls;
362 urls.push_back(expected_crx_url);
Sorin Jianuc35bacf2018-01-31 18:25:28363 urls.push_back(no_file_url);
[email protected]afa378f22013-12-02 03:37:54364
Sorin Jianua8ef73d2017-11-02 16:55:17365 crx_downloader_->StartDownload(urls, std::string(hash_jebg),
366 std::move(callback_));
[email protected]afa378f22013-12-02 03:37:54367 RunThreads();
[email protected]afa378f22013-12-02 03:37:54368
tommyclieaae5d92014-09-09 06:03:47369 EXPECT_EQ(1, get_interceptor_->GetHitCount());
[email protected]148dcfd32014-04-29 00:54:30370
371 EXPECT_EQ(1, num_download_complete_calls_);
372 EXPECT_EQ(kExpectedContext, crx_context_);
373 EXPECT_EQ(0, download_complete_result_.error);
[email protected]8a5ebd432014-05-02 00:21:22374 EXPECT_EQ(1843, download_complete_result_.downloaded_bytes);
375 EXPECT_EQ(1843, download_complete_result_.total_bytes);
[email protected]148dcfd32014-04-29 00:54:30376 EXPECT_TRUE(ContentsEqual(download_complete_result_.response, test_file));
377
Sorin Jianubbd51392017-07-20 01:48:31378 EXPECT_TRUE(
379 DeleteFileAndEmptyParentDirectory(download_complete_result_.response));
[email protected]8a5ebd432014-05-02 00:21:22380
381 EXPECT_LE(1, num_progress_calls_);
382 EXPECT_EQ(1843, download_progress_result_.downloaded_bytes);
383 EXPECT_EQ(1843, download_progress_result_.total_bytes);
Sorin Jianuc35bacf2018-01-31 18:25:28384
385 EXPECT_EQ(1u, crx_downloader_->download_metrics().size());
[email protected]afa378f22013-12-02 03:37:54386}
387
Sorin Jianuc35bacf2018-01-31 18:25:28388// Tests that the download fails if both urls don't serve content.
[email protected]afa378f22013-12-02 03:37:54389TEST_F(CrxDownloaderTest, TwoUrls_BothInvalid) {
390 const GURL expected_crx_url =
[email protected]d0c8b8b42014-05-06 05:11:45391 GURL("http://localhost/download/jebgalgnebhfojomionfpkfelancnnkf.crx");
[email protected]afa378f22013-12-02 03:37:54392
Sorin Jianuc35bacf2018-01-31 18:25:28393 get_interceptor_->SetResponse(expected_crx_url,
394 base::FilePath(FILE_PATH_LITERAL("no-file")));
[email protected]afa378f22013-12-02 03:37:54395
396 std::vector<GURL> urls;
Sorin Jianuc35bacf2018-01-31 18:25:28397 urls.push_back(expected_crx_url);
398 urls.push_back(expected_crx_url);
[email protected]afa378f22013-12-02 03:37:54399
Sorin Jianua8ef73d2017-11-02 16:55:17400 crx_downloader_->StartDownload(urls, std::string(hash_jebg),
401 std::move(callback_));
[email protected]afa378f22013-12-02 03:37:54402 RunThreads();
[email protected]afa378f22013-12-02 03:37:54403
Sorin Jianuc35bacf2018-01-31 18:25:28404 EXPECT_EQ(2, get_interceptor_->GetHitCount());
[email protected]148dcfd32014-04-29 00:54:30405
406 EXPECT_EQ(1, num_download_complete_calls_);
407 EXPECT_EQ(kExpectedContext, crx_context_);
408 EXPECT_NE(0, download_complete_result_.error);
409 EXPECT_TRUE(download_complete_result_.response.empty());
Sorin Jianuc35bacf2018-01-31 18:25:28410
411 const auto download_metrics = crx_downloader_->download_metrics();
412 ASSERT_EQ(2u, download_metrics.size());
413 EXPECT_EQ(expected_crx_url, download_metrics[0].url);
414 EXPECT_EQ(net::ERR_FILE_NOT_FOUND, download_metrics[0].error);
415 EXPECT_EQ(-1, download_metrics[0].downloaded_bytes);
416 EXPECT_EQ(-1, download_metrics[0].total_bytes);
417 EXPECT_EQ(expected_crx_url, download_metrics[1].url);
418 EXPECT_EQ(net::ERR_FILE_NOT_FOUND, download_metrics[1].error);
419 EXPECT_EQ(-1, download_metrics[1].downloaded_bytes);
420 EXPECT_EQ(-1, download_metrics[1].total_bytes);
[email protected]afa378f22013-12-02 03:37:54421}
422
sorin52ac0882015-01-24 01:15:00423} // namespace update_client