blob: 8b53e2285d70099f719026af77dc0c3f004cfbf2 [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"
sorin395c2ac2014-09-16 21:31:0711#include "base/bind_helpers.h"
[email protected]afa378f22013-12-02 03:37:5412#include "base/files/file_path.h"
thestig18dfb7a52014-08-26 10:44:0413#include "base/files/file_util.h"
[email protected]afa378f22013-12-02 03:37:5414#include "base/memory/ref_counted.h"
gabf64a25e2017-05-12 19:42:5615#include "base/message_loop/message_loop.h"
[email protected]afa378f22013-12-02 03:37:5416#include "base/path_service.h"
17#include "base/run_loop.h"
Sorin Jianu72d8fe0d2017-07-11 18:42:1618#include "base/test/scoped_task_environment.h"
gab7966d312016-05-11 20:35:0119#include "base/threading/thread_task_runner_handle.h"
avi5dd91f82015-12-25 22:30:4620#include "build/build_config.h"
sorin7b8650522016-11-02 18:23:4121#include "components/update_client/update_client_errors.h"
Sorin Jianubbd51392017-07-20 01:48:3122#include "components/update_client/utils.h"
[email protected]afa378f22013-12-02 03:37:5423#include "net/base/net_errors.h"
tommyclieaae5d92014-09-09 06:03:4724#include "net/url_request/test_url_request_interceptor.h"
[email protected]afa378f22013-12-02 03:37:5425#include "net/url_request/url_request_test_util.h"
26#include "testing/gtest/include/gtest/gtest.h"
27
[email protected]148dcfd32014-04-29 00:54:3028using base::ContentsEqual;
[email protected]afa378f22013-12-02 03:37:5429
sorin52ac0882015-01-24 01:15:0030namespace update_client {
[email protected]afa378f22013-12-02 03:37:5431
32namespace {
33
34// Intercepts HTTP GET requests sent to "localhost".
tommyclieaae5d92014-09-09 06:03:4735typedef net::LocalHostTestURLRequestInterceptor GetInterceptor;
[email protected]afa378f22013-12-02 03:37:5436
[email protected]148dcfd32014-04-29 00:54:3037const char kTestFileName[] = "jebgalgnebhfojomionfpkfelancnnkf.crx";
38
sorin74e70672016-02-03 03:13:1039const char hash_jebg[] =
40 "6fc4b93fd11134de1300c2c0bb88c12b644a4ec0fd7c9b12cb7cc067667bde87";
41
[email protected]148dcfd32014-04-29 00:54:3042base::FilePath MakeTestFilePath(const char* file) {
[email protected]afa378f22013-12-02 03:37:5443 base::FilePath path;
tommycli0409b4df2014-08-26 23:31:3244 PathService::Get(base::DIR_SOURCE_ROOT, &path);
sorin74e70672016-02-03 03:13:1045 return path.AppendASCII("components/test/data/update_client")
sorin52ac0882015-01-24 01:15:0046 .AppendASCII(file);
[email protected]afa378f22013-12-02 03:37:5447}
48
49} // namespace
50
51class CrxDownloaderTest : public testing::Test {
52 public:
53 CrxDownloaderTest();
dcheng30a1b1542014-10-29 21:27:5054 ~CrxDownloaderTest() override;
[email protected]afa378f22013-12-02 03:37:5455
56 // Overrides from testing::Test.
dcheng30a1b1542014-10-29 21:27:5057 void SetUp() override;
58 void TearDown() override;
[email protected]afa378f22013-12-02 03:37:5459
60 void Quit();
61 void RunThreads();
62 void RunThreadsUntilIdle();
63
[email protected]3cb2a4f2013-12-07 21:54:3464 void DownloadComplete(int crx_context, const CrxDownloader::Result& result);
[email protected]afa378f22013-12-02 03:37:5465
[email protected]8a5ebd432014-05-02 00:21:2266 void DownloadProgress(int crx_context, const CrxDownloader::Result& result);
67
[email protected]afa378f22013-12-02 03:37:5468 protected:
dchengd0fc6aa92016-04-22 18:03:1269 std::unique_ptr<CrxDownloader> crx_downloader_;
[email protected]afa378f22013-12-02 03:37:5470
dchengd0fc6aa92016-04-22 18:03:1271 std::unique_ptr<GetInterceptor> get_interceptor_;
tommyclieaae5d92014-09-09 06:03:4772
[email protected]1b6587dc52014-04-26 00:38:5573 CrxDownloader::DownloadCallback callback_;
[email protected]8a5ebd432014-05-02 00:21:2274 CrxDownloader::ProgressCallback progress_callback_;
[email protected]1b6587dc52014-04-26 00:38:5575
[email protected]afa378f22013-12-02 03:37:5476 int crx_context_;
[email protected]afa378f22013-12-02 03:37:5477
[email protected]148dcfd32014-04-29 00:54:3078 int num_download_complete_calls_;
79 CrxDownloader::Result download_complete_result_;
[email protected]afa378f22013-12-02 03:37:5480
[email protected]8a5ebd432014-05-02 00:21:2281 // These members are updated by DownloadProgress.
82 int num_progress_calls_;
83 CrxDownloader::Result download_progress_result_;
84
[email protected]afa378f22013-12-02 03:37:5485 // A magic value for the context to be used in the tests.
86 static const int kExpectedContext = 0xaabb;
87
88 private:
Sorin Jianu72d8fe0d2017-07-11 18:42:1689 base::test::ScopedTaskEnvironment scoped_task_environment_;
[email protected]afa378f22013-12-02 03:37:5490 scoped_refptr<net::TestURLRequestContextGetter> context_;
Sorin Jianua8ef73d2017-11-02 16:55:1791 base::OnceClosure quit_closure_;
[email protected]afa378f22013-12-02 03:37:5492};
93
94const int CrxDownloaderTest::kExpectedContext;
95
96CrxDownloaderTest::CrxDownloaderTest()
Sorin Jianua8ef73d2017-11-02 16:55:1797 : callback_(base::BindOnce(&CrxDownloaderTest::DownloadComplete,
98 base::Unretained(this),
99 kExpectedContext)),
[email protected]8a5ebd432014-05-02 00:21:22100 progress_callback_(base::Bind(&CrxDownloaderTest::DownloadProgress,
101 base::Unretained(this),
102 kExpectedContext)),
[email protected]1b6587dc52014-04-26 00:38:55103 crx_context_(0),
[email protected]148dcfd32014-04-29 00:54:30104 num_download_complete_calls_(0),
[email protected]8a5ebd432014-05-02 00:21:22105 num_progress_calls_(0),
Sorin Jianu72d8fe0d2017-07-11 18:42:16106 scoped_task_environment_(
107 base::test::ScopedTaskEnvironment::MainThreadType::IO),
Sorin Jianua8ef73d2017-11-02 16:55:17108 context_(base::MakeRefCounted<net::TestURLRequestContextGetter>(
Sorin Jianu72d8fe0d2017-07-11 18:42:16109 base::ThreadTaskRunnerHandle::Get())) {}
[email protected]afa378f22013-12-02 03:37:54110
111CrxDownloaderTest::~CrxDownloaderTest() {
Ivan Kotenkov75b1c3a2017-10-24 14:47:24112 context_ = nullptr;
tommyclieaae5d92014-09-09 06:03:47113
114 // The GetInterceptor requires the message loop to run to destruct correctly.
115 get_interceptor_.reset();
116 RunThreadsUntilIdle();
[email protected]afa378f22013-12-02 03:37:54117}
118
119void CrxDownloaderTest::SetUp() {
[email protected]148dcfd32014-04-29 00:54:30120 num_download_complete_calls_ = 0;
121 download_complete_result_ = CrxDownloader::Result();
[email protected]8a5ebd432014-05-02 00:21:22122 num_progress_calls_ = 0;
123 download_progress_result_ = CrxDownloader::Result();
tommyclieaae5d92014-09-09 06:03:47124
sorin9797aba2015-04-17 17:15:03125 // Do not use the background downloader in these tests.
Sorin Jianua8ef73d2017-11-02 16:55:17126 crx_downloader_ = CrxDownloader::Create(false, context_.get());
[email protected]8a5ebd432014-05-02 00:21:22127 crx_downloader_->set_progress_callback(progress_callback_);
tommyclieaae5d92014-09-09 06:03:47128
Sorin Jianua8ef73d2017-11-02 16:55:17129 get_interceptor_ = std::make_unique<GetInterceptor>(
130 base::ThreadTaskRunnerHandle::Get(), base::ThreadTaskRunnerHandle::Get());
[email protected]afa378f22013-12-02 03:37:54131}
132
133void CrxDownloaderTest::TearDown() {
[email protected]8a5ebd432014-05-02 00:21:22134 crx_downloader_.reset();
[email protected]afa378f22013-12-02 03:37:54135}
136
137void CrxDownloaderTest::Quit() {
[email protected]da37c1d2013-12-19 01:04:38138 if (!quit_closure_.is_null())
Sorin Jianua8ef73d2017-11-02 16:55:17139 std::move(quit_closure_).Run();
[email protected]afa378f22013-12-02 03:37:54140}
141
[email protected]148dcfd32014-04-29 00:54:30142void CrxDownloaderTest::DownloadComplete(int crx_context,
143 const CrxDownloader::Result& result) {
144 ++num_download_complete_calls_;
[email protected]afa378f22013-12-02 03:37:54145 crx_context_ = crx_context;
[email protected]148dcfd32014-04-29 00:54:30146 download_complete_result_ = result;
[email protected]afa378f22013-12-02 03:37:54147 Quit();
148}
149
[email protected]8a5ebd432014-05-02 00:21:22150void CrxDownloaderTest::DownloadProgress(int crx_context,
151 const CrxDownloader::Result& result) {
152 ++num_progress_calls_;
153 download_progress_result_ = result;
154}
155
[email protected]afa378f22013-12-02 03:37:54156void CrxDownloaderTest::RunThreads() {
157 base::RunLoop runloop;
158 quit_closure_ = runloop.QuitClosure();
159 runloop.Run();
160
161 // Since some tests need to drain currently enqueued tasks such as network
162 // intercepts on the IO thread, run the threads until they are
163 // idle. The component updater service won't loop again until the loop count
164 // is set and the service is started.
165 RunThreadsUntilIdle();
166}
167
168void CrxDownloaderTest::RunThreadsUntilIdle() {
Sorin Jianubbd51392017-07-20 01:48:31169 scoped_task_environment_.RunUntilIdle();
[email protected]afa378f22013-12-02 03:37:54170 base::RunLoop().RunUntilIdle();
171}
172
[email protected]da37c1d2013-12-19 01:04:38173// Tests that starting a download without a url results in an error.
174TEST_F(CrxDownloaderTest, NoUrl) {
175 std::vector<GURL> urls;
Sorin Jianua8ef73d2017-11-02 16:55:17176 crx_downloader_->StartDownload(urls, std::string("abcd"),
177 std::move(callback_));
[email protected]da37c1d2013-12-19 01:04:38178 RunThreadsUntilIdle();
[email protected]da37c1d2013-12-19 01:04:38179
[email protected]148dcfd32014-04-29 00:54:30180 EXPECT_EQ(1, num_download_complete_calls_);
181 EXPECT_EQ(kExpectedContext, crx_context_);
sorin7b8650522016-11-02 18:23:41182 EXPECT_EQ(static_cast<int>(CrxDownloaderError::NO_URL),
183 download_complete_result_.error);
sorin74e70672016-02-03 03:13:10184 EXPECT_TRUE(download_complete_result_.response.empty());
185 EXPECT_EQ(-1, download_complete_result_.downloaded_bytes);
186 EXPECT_EQ(-1, download_complete_result_.total_bytes);
187 EXPECT_EQ(0, num_progress_calls_);
188}
189
190// Tests that starting a download without providing a hash results in an error.
191TEST_F(CrxDownloaderTest, NoHash) {
192 std::vector<GURL> urls(1, GURL("http://somehost/somefile"));
193
Sorin Jianua8ef73d2017-11-02 16:55:17194 crx_downloader_->StartDownload(urls, std::string(), std::move(callback_));
sorin74e70672016-02-03 03:13:10195 RunThreadsUntilIdle();
196
197 EXPECT_EQ(1, num_download_complete_calls_);
198 EXPECT_EQ(kExpectedContext, crx_context_);
sorin7b8650522016-11-02 18:23:41199 EXPECT_EQ(static_cast<int>(CrxDownloaderError::NO_HASH),
200 download_complete_result_.error);
[email protected]148dcfd32014-04-29 00:54:30201 EXPECT_TRUE(download_complete_result_.response.empty());
[email protected]8a5ebd432014-05-02 00:21:22202 EXPECT_EQ(-1, download_complete_result_.downloaded_bytes);
203 EXPECT_EQ(-1, download_complete_result_.total_bytes);
204 EXPECT_EQ(0, num_progress_calls_);
[email protected]da37c1d2013-12-19 01:04:38205}
206
[email protected]afa378f22013-12-02 03:37:54207// Tests that downloading from one url is successful.
208TEST_F(CrxDownloaderTest, OneUrl) {
209 const GURL expected_crx_url =
[email protected]d0c8b8b42014-05-06 05:11:45210 GURL("http://localhost/download/jebgalgnebhfojomionfpkfelancnnkf.crx");
[email protected]afa378f22013-12-02 03:37:54211
[email protected]148dcfd32014-04-29 00:54:30212 const base::FilePath test_file(MakeTestFilePath(kTestFileName));
tommyclieaae5d92014-09-09 06:03:47213 get_interceptor_->SetResponse(expected_crx_url, test_file);
[email protected]afa378f22013-12-02 03:37:54214
Sorin Jianua8ef73d2017-11-02 16:55:17215 crx_downloader_->StartDownloadFromUrl(
216 expected_crx_url, std::string(hash_jebg), std::move(callback_));
[email protected]afa378f22013-12-02 03:37:54217 RunThreads();
[email protected]afa378f22013-12-02 03:37:54218
tommyclieaae5d92014-09-09 06:03:47219 EXPECT_EQ(1, get_interceptor_->GetHitCount());
[email protected]148dcfd32014-04-29 00:54:30220
221 EXPECT_EQ(1, num_download_complete_calls_);
222 EXPECT_EQ(kExpectedContext, crx_context_);
223 EXPECT_EQ(0, download_complete_result_.error);
[email protected]8a5ebd432014-05-02 00:21:22224 EXPECT_EQ(1843, download_complete_result_.downloaded_bytes);
225 EXPECT_EQ(1843, download_complete_result_.total_bytes);
[email protected]148dcfd32014-04-29 00:54:30226 EXPECT_TRUE(ContentsEqual(download_complete_result_.response, test_file));
227
Sorin Jianubbd51392017-07-20 01:48:31228 EXPECT_TRUE(
229 DeleteFileAndEmptyParentDirectory(download_complete_result_.response));
[email protected]8a5ebd432014-05-02 00:21:22230
231 EXPECT_LE(1, num_progress_calls_);
232 EXPECT_EQ(1843, download_progress_result_.downloaded_bytes);
233 EXPECT_EQ(1843, download_progress_result_.total_bytes);
[email protected]afa378f22013-12-02 03:37:54234}
235
sorin74e70672016-02-03 03:13:10236// Tests that downloading from one url fails if the actual hash of the file
237// does not match the expected hash.
238TEST_F(CrxDownloaderTest, OneUrlBadHash) {
239 const GURL expected_crx_url =
240 GURL("http://localhost/download/jebgalgnebhfojomionfpkfelancnnkf.crx");
241
242 const base::FilePath test_file(MakeTestFilePath(kTestFileName));
243 get_interceptor_->SetResponse(expected_crx_url, test_file);
244
245 crx_downloader_->StartDownloadFromUrl(
246 expected_crx_url,
247 std::string(
248 "813c59747e139a608b3b5fc49633affc6db574373f309f156ea6d27229c0b3f9"),
Sorin Jianua8ef73d2017-11-02 16:55:17249 std::move(callback_));
sorin74e70672016-02-03 03:13:10250 RunThreads();
251
252 EXPECT_EQ(1, get_interceptor_->GetHitCount());
253
254 EXPECT_EQ(1, num_download_complete_calls_);
255 EXPECT_EQ(kExpectedContext, crx_context_);
sorin7b8650522016-11-02 18:23:41256 EXPECT_EQ(static_cast<int>(CrxDownloaderError::BAD_HASH),
257 download_complete_result_.error);
sorin74e70672016-02-03 03:13:10258 EXPECT_EQ(1843, download_complete_result_.downloaded_bytes);
259 EXPECT_EQ(1843, download_complete_result_.total_bytes);
260 EXPECT_TRUE(download_complete_result_.response.empty());
261
262 EXPECT_LE(1, num_progress_calls_);
263 EXPECT_EQ(1843, download_progress_result_.downloaded_bytes);
264 EXPECT_EQ(1843, download_progress_result_.total_bytes);
265}
266
267// Tests that specifying two urls has no side effects. Expect a successful
[email protected]afa378f22013-12-02 03:37:54268// download, and only one download request be made.
Sorin Jianuc35bacf2018-01-31 18:25:28269TEST_F(CrxDownloaderTest, TwoUrls) {
[email protected]afa378f22013-12-02 03:37:54270 const GURL expected_crx_url =
[email protected]d0c8b8b42014-05-06 05:11:45271 GURL("http://localhost/download/jebgalgnebhfojomionfpkfelancnnkf.crx");
[email protected]afa378f22013-12-02 03:37:54272
[email protected]148dcfd32014-04-29 00:54:30273 const base::FilePath test_file(MakeTestFilePath(kTestFileName));
tommyclieaae5d92014-09-09 06:03:47274 get_interceptor_->SetResponse(expected_crx_url, test_file);
[email protected]afa378f22013-12-02 03:37:54275
276 std::vector<GURL> urls;
277 urls.push_back(expected_crx_url);
278 urls.push_back(expected_crx_url);
279
Sorin Jianua8ef73d2017-11-02 16:55:17280 crx_downloader_->StartDownload(urls, std::string(hash_jebg),
281 std::move(callback_));
[email protected]afa378f22013-12-02 03:37:54282 RunThreads();
[email protected]afa378f22013-12-02 03:37:54283
tommyclieaae5d92014-09-09 06:03:47284 EXPECT_EQ(1, get_interceptor_->GetHitCount());
[email protected]148dcfd32014-04-29 00:54:30285
286 EXPECT_EQ(1, num_download_complete_calls_);
287 EXPECT_EQ(kExpectedContext, crx_context_);
288 EXPECT_EQ(0, download_complete_result_.error);
[email protected]8a5ebd432014-05-02 00:21:22289 EXPECT_EQ(1843, download_complete_result_.downloaded_bytes);
290 EXPECT_EQ(1843, download_complete_result_.total_bytes);
[email protected]148dcfd32014-04-29 00:54:30291 EXPECT_TRUE(ContentsEqual(download_complete_result_.response, test_file));
292
Sorin Jianubbd51392017-07-20 01:48:31293 EXPECT_TRUE(
294 DeleteFileAndEmptyParentDirectory(download_complete_result_.response));
[email protected]8a5ebd432014-05-02 00:21:22295
296 EXPECT_LE(1, num_progress_calls_);
297 EXPECT_EQ(1843, download_progress_result_.downloaded_bytes);
298 EXPECT_EQ(1843, download_progress_result_.total_bytes);
[email protected]afa378f22013-12-02 03:37:54299}
300
[email protected]afa378f22013-12-02 03:37:54301// Tests that the fallback to a valid url is successful.
Sorin Jianuc35bacf2018-01-31 18:25:28302TEST_F(CrxDownloaderTest, TwoUrls_FirstInvalid) {
[email protected]afa378f22013-12-02 03:37:54303 const GURL expected_crx_url =
[email protected]d0c8b8b42014-05-06 05:11:45304 GURL("http://localhost/download/jebgalgnebhfojomionfpkfelancnnkf.crx");
Sorin Jianuc35bacf2018-01-31 18:25:28305 const GURL no_file_url =
306 GURL("http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc.crx");
[email protected]afa378f22013-12-02 03:37:54307
[email protected]148dcfd32014-04-29 00:54:30308 const base::FilePath test_file(MakeTestFilePath(kTestFileName));
tommyclieaae5d92014-09-09 06:03:47309 get_interceptor_->SetResponse(expected_crx_url, test_file);
Sorin Jianuc35bacf2018-01-31 18:25:28310 get_interceptor_->SetResponse(no_file_url,
311 base::FilePath(FILE_PATH_LITERAL("no-file")));
[email protected]afa378f22013-12-02 03:37:54312
313 std::vector<GURL> urls;
Sorin Jianuc35bacf2018-01-31 18:25:28314 urls.push_back(no_file_url);
[email protected]afa378f22013-12-02 03:37:54315 urls.push_back(expected_crx_url);
316
Sorin Jianua8ef73d2017-11-02 16:55:17317 crx_downloader_->StartDownload(urls, std::string(hash_jebg),
318 std::move(callback_));
[email protected]afa378f22013-12-02 03:37:54319 RunThreads();
[email protected]afa378f22013-12-02 03:37:54320
Sorin Jianuc35bacf2018-01-31 18:25:28321 EXPECT_EQ(2, get_interceptor_->GetHitCount());
[email protected]148dcfd32014-04-29 00:54:30322
323 EXPECT_EQ(1, num_download_complete_calls_);
324 EXPECT_EQ(kExpectedContext, crx_context_);
325 EXPECT_EQ(0, download_complete_result_.error);
[email protected]8a5ebd432014-05-02 00:21:22326 EXPECT_EQ(1843, download_complete_result_.downloaded_bytes);
327 EXPECT_EQ(1843, download_complete_result_.total_bytes);
[email protected]148dcfd32014-04-29 00:54:30328 EXPECT_TRUE(ContentsEqual(download_complete_result_.response, test_file));
329
Sorin Jianubbd51392017-07-20 01:48:31330 EXPECT_TRUE(
331 DeleteFileAndEmptyParentDirectory(download_complete_result_.response));
[email protected]8a5ebd432014-05-02 00:21:22332
Sorin Jianuc35bacf2018-01-31 18:25:28333 // Expect at least some progress reported by the fetcher.
[email protected]8a5ebd432014-05-02 00:21:22334 EXPECT_LE(1, num_progress_calls_);
335 EXPECT_EQ(1843, download_progress_result_.downloaded_bytes);
336 EXPECT_EQ(1843, download_progress_result_.total_bytes);
Sorin Jianuc35bacf2018-01-31 18:25:28337
338 const auto download_metrics = crx_downloader_->download_metrics();
339 ASSERT_EQ(2u, download_metrics.size());
340 EXPECT_EQ(no_file_url, download_metrics[0].url);
341 EXPECT_EQ(net::ERR_FILE_NOT_FOUND, download_metrics[0].error);
342 EXPECT_EQ(-1, download_metrics[0].downloaded_bytes);
343 EXPECT_EQ(-1, download_metrics[0].total_bytes);
344 EXPECT_EQ(expected_crx_url, download_metrics[1].url);
345 EXPECT_EQ(0, download_metrics[1].error);
346 EXPECT_EQ(1843, download_metrics[1].downloaded_bytes);
347 EXPECT_EQ(1843, download_metrics[1].total_bytes);
[email protected]afa378f22013-12-02 03:37:54348}
349
350// Tests that the download succeeds if the first url is correct and the
351// second bad url does not have a side-effect.
352TEST_F(CrxDownloaderTest, TwoUrls_SecondInvalid) {
353 const GURL expected_crx_url =
[email protected]d0c8b8b42014-05-06 05:11:45354 GURL("http://localhost/download/jebgalgnebhfojomionfpkfelancnnkf.crx");
Sorin Jianuc35bacf2018-01-31 18:25:28355 const GURL no_file_url =
356 GURL("http://localhost/download/ihfokbkgjpifnbbojhneepfflplebdkc.crx");
[email protected]afa378f22013-12-02 03:37:54357
[email protected]148dcfd32014-04-29 00:54:30358 const base::FilePath test_file(MakeTestFilePath(kTestFileName));
tommyclieaae5d92014-09-09 06:03:47359 get_interceptor_->SetResponse(expected_crx_url, test_file);
Sorin Jianuc35bacf2018-01-31 18:25:28360 get_interceptor_->SetResponse(no_file_url,
361 base::FilePath(FILE_PATH_LITERAL("no-file")));
[email protected]afa378f22013-12-02 03:37:54362
363 std::vector<GURL> urls;
364 urls.push_back(expected_crx_url);
Sorin Jianuc35bacf2018-01-31 18:25:28365 urls.push_back(no_file_url);
[email protected]afa378f22013-12-02 03:37:54366
Sorin Jianua8ef73d2017-11-02 16:55:17367 crx_downloader_->StartDownload(urls, std::string(hash_jebg),
368 std::move(callback_));
[email protected]afa378f22013-12-02 03:37:54369 RunThreads();
[email protected]afa378f22013-12-02 03:37:54370
tommyclieaae5d92014-09-09 06:03:47371 EXPECT_EQ(1, get_interceptor_->GetHitCount());
[email protected]148dcfd32014-04-29 00:54:30372
373 EXPECT_EQ(1, num_download_complete_calls_);
374 EXPECT_EQ(kExpectedContext, crx_context_);
375 EXPECT_EQ(0, download_complete_result_.error);
[email protected]8a5ebd432014-05-02 00:21:22376 EXPECT_EQ(1843, download_complete_result_.downloaded_bytes);
377 EXPECT_EQ(1843, download_complete_result_.total_bytes);
[email protected]148dcfd32014-04-29 00:54:30378 EXPECT_TRUE(ContentsEqual(download_complete_result_.response, test_file));
379
Sorin Jianubbd51392017-07-20 01:48:31380 EXPECT_TRUE(
381 DeleteFileAndEmptyParentDirectory(download_complete_result_.response));
[email protected]8a5ebd432014-05-02 00:21:22382
383 EXPECT_LE(1, num_progress_calls_);
384 EXPECT_EQ(1843, download_progress_result_.downloaded_bytes);
385 EXPECT_EQ(1843, download_progress_result_.total_bytes);
Sorin Jianuc35bacf2018-01-31 18:25:28386
387 EXPECT_EQ(1u, crx_downloader_->download_metrics().size());
[email protected]afa378f22013-12-02 03:37:54388}
389
Sorin Jianuc35bacf2018-01-31 18:25:28390// Tests that the download fails if both urls don't serve content.
[email protected]afa378f22013-12-02 03:37:54391TEST_F(CrxDownloaderTest, TwoUrls_BothInvalid) {
392 const GURL expected_crx_url =
[email protected]d0c8b8b42014-05-06 05:11:45393 GURL("http://localhost/download/jebgalgnebhfojomionfpkfelancnnkf.crx");
[email protected]afa378f22013-12-02 03:37:54394
Sorin Jianuc35bacf2018-01-31 18:25:28395 get_interceptor_->SetResponse(expected_crx_url,
396 base::FilePath(FILE_PATH_LITERAL("no-file")));
[email protected]afa378f22013-12-02 03:37:54397
398 std::vector<GURL> urls;
Sorin Jianuc35bacf2018-01-31 18:25:28399 urls.push_back(expected_crx_url);
400 urls.push_back(expected_crx_url);
[email protected]afa378f22013-12-02 03:37:54401
Sorin Jianua8ef73d2017-11-02 16:55:17402 crx_downloader_->StartDownload(urls, std::string(hash_jebg),
403 std::move(callback_));
[email protected]afa378f22013-12-02 03:37:54404 RunThreads();
[email protected]afa378f22013-12-02 03:37:54405
Sorin Jianuc35bacf2018-01-31 18:25:28406 EXPECT_EQ(2, get_interceptor_->GetHitCount());
[email protected]148dcfd32014-04-29 00:54:30407
408 EXPECT_EQ(1, num_download_complete_calls_);
409 EXPECT_EQ(kExpectedContext, crx_context_);
410 EXPECT_NE(0, download_complete_result_.error);
411 EXPECT_TRUE(download_complete_result_.response.empty());
Sorin Jianuc35bacf2018-01-31 18:25:28412
413 const auto download_metrics = crx_downloader_->download_metrics();
414 ASSERT_EQ(2u, download_metrics.size());
415 EXPECT_EQ(expected_crx_url, download_metrics[0].url);
416 EXPECT_EQ(net::ERR_FILE_NOT_FOUND, download_metrics[0].error);
417 EXPECT_EQ(-1, download_metrics[0].downloaded_bytes);
418 EXPECT_EQ(-1, download_metrics[0].total_bytes);
419 EXPECT_EQ(expected_crx_url, download_metrics[1].url);
420 EXPECT_EQ(net::ERR_FILE_NOT_FOUND, download_metrics[1].error);
421 EXPECT_EQ(-1, download_metrics[1].downloaded_bytes);
422 EXPECT_EQ(-1, download_metrics[1].total_bytes);
[email protected]afa378f22013-12-02 03:37:54423}
424
sorin52ac0882015-01-24 01:15:00425} // namespace update_client