OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/update_client/update_checker.h" | 5 #include "components/update_client/update_checker.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
11 #include "base/bind_helpers.h" | 11 #include "base/bind_helpers.h" |
12 #include "base/files/file_util.h" | 12 #include "base/files/file_util.h" |
13 #include "base/macros.h" | 13 #include "base/macros.h" |
14 #include "base/memory/ptr_util.h" | 14 #include "base/memory/ptr_util.h" |
15 #include "base/memory/ref_counted.h" | 15 #include "base/memory/ref_counted.h" |
16 #include "base/path_service.h" | 16 #include "base/path_service.h" |
17 #include "base/run_loop.h" | 17 #include "base/run_loop.h" |
18 #include "base/test/scoped_task_scheduler.h" | 18 #include "base/test/scoped_task_scheduler.h" |
19 #include "base/threading/thread_task_runner_handle.h" | 19 #include "base/threading/thread_task_runner_handle.h" |
20 #include "base/version.h" | 20 #include "base/version.h" |
21 #include "build/build_config.h" | 21 #include "build/build_config.h" |
22 #include "components/prefs/testing_pref_service.h" | 22 #include "components/prefs/testing_pref_service.h" |
23 #include "components/update_client/crx_update_item.h" | 23 #include "components/update_client/component.h" |
24 #include "components/update_client/persisted_data.h" | 24 #include "components/update_client/persisted_data.h" |
25 #include "components/update_client/test_configurator.h" | 25 #include "components/update_client/test_configurator.h" |
| 26 #include "components/update_client/update_engine.h" |
26 #include "components/update_client/url_request_post_interceptor.h" | 27 #include "components/update_client/url_request_post_interceptor.h" |
27 #include "net/url_request/url_request_test_util.h" | 28 #include "net/url_request/url_request_test_util.h" |
28 #include "testing/gtest/include/gtest/gtest.h" | 29 #include "testing/gtest/include/gtest/gtest.h" |
29 #include "url/gurl.h" | 30 #include "url/gurl.h" |
30 | 31 |
31 using std::string; | 32 using std::string; |
32 | 33 |
33 namespace update_client { | 34 namespace update_client { |
34 | 35 |
35 namespace { | 36 namespace { |
(...skipping 14 matching lines...) Expand all Loading... |
50 | 51 |
51 class UpdateCheckerTest : public testing::Test { | 52 class UpdateCheckerTest : public testing::Test { |
52 public: | 53 public: |
53 UpdateCheckerTest(); | 54 UpdateCheckerTest(); |
54 ~UpdateCheckerTest() override; | 55 ~UpdateCheckerTest() override; |
55 | 56 |
56 // Overrides from testing::Test. | 57 // Overrides from testing::Test. |
57 void SetUp() override; | 58 void SetUp() override; |
58 void TearDown() override; | 59 void TearDown() override; |
59 | 60 |
60 void UpdateCheckComplete(int error, | 61 void UpdateCheckComplete(int error, int retry_after_sec); |
61 const UpdateResponse::Results& results, | |
62 int retry_after_sec); | |
63 | 62 |
64 protected: | 63 protected: |
65 void Quit(); | 64 void Quit(); |
66 void RunThreads(); | 65 void RunThreads(); |
67 void RunThreadsUntilIdle(); | 66 void RunThreadsUntilIdle(); |
68 | 67 |
69 std::unique_ptr<CrxUpdateItem> BuildCrxUpdateItem(); | 68 std::unique_ptr<Component> MakeComponent() const; |
70 | 69 |
71 scoped_refptr<TestConfigurator> config_; | 70 scoped_refptr<TestConfigurator> config_; |
72 std::unique_ptr<TestingPrefServiceSimple> pref_; | 71 std::unique_ptr<TestingPrefServiceSimple> pref_; |
73 std::unique_ptr<PersistedData> metadata_; | 72 std::unique_ptr<PersistedData> metadata_; |
74 | 73 |
75 std::unique_ptr<UpdateChecker> update_checker_; | 74 std::unique_ptr<UpdateChecker> update_checker_; |
76 | 75 |
77 std::unique_ptr<InterceptorFactory> interceptor_factory_; | 76 std::unique_ptr<InterceptorFactory> interceptor_factory_; |
78 URLRequestPostInterceptor* post_interceptor_; // Owned by the factory. | 77 URLRequestPostInterceptor* post_interceptor_ = |
| 78 nullptr; // Owned by the factory. |
79 | 79 |
80 int error_; | 80 int error_ = 0; |
81 UpdateResponse::Results results_; | 81 int retry_after_sec_ = 0; |
| 82 |
| 83 std::unique_ptr<UpdateContext> update_context_; |
82 | 84 |
83 private: | 85 private: |
| 86 std::unique_ptr<UpdateContext> MakeFakeUpdateContext() const; |
| 87 |
84 base::MessageLoopForIO loop_; | 88 base::MessageLoopForIO loop_; |
85 base::test::ScopedTaskScheduler scoped_task_scheduler_; | 89 base::test::ScopedTaskScheduler scoped_task_scheduler_; |
86 base::Closure quit_closure_; | 90 base::Closure quit_closure_; |
87 | 91 |
88 DISALLOW_COPY_AND_ASSIGN(UpdateCheckerTest); | 92 DISALLOW_COPY_AND_ASSIGN(UpdateCheckerTest); |
89 }; | 93 }; |
90 | 94 |
91 UpdateCheckerTest::UpdateCheckerTest() | 95 UpdateCheckerTest::UpdateCheckerTest() : scoped_task_scheduler_(&loop_) {} |
92 : post_interceptor_(NULL), error_(0), scoped_task_scheduler_(&loop_) {} | |
93 | 96 |
94 UpdateCheckerTest::~UpdateCheckerTest() { | 97 UpdateCheckerTest::~UpdateCheckerTest() { |
95 } | 98 } |
96 | 99 |
97 void UpdateCheckerTest::SetUp() { | 100 void UpdateCheckerTest::SetUp() { |
98 config_ = new TestConfigurator(base::ThreadTaskRunnerHandle::Get(), | 101 config_ = base::MakeShared<TestConfigurator>( |
99 base::ThreadTaskRunnerHandle::Get()); | 102 base::ThreadTaskRunnerHandle::Get(), base::ThreadTaskRunnerHandle::Get()); |
100 pref_.reset(new TestingPrefServiceSimple()); | 103 pref_ = base::MakeUnique<TestingPrefServiceSimple>(); |
101 PersistedData::RegisterPrefs(pref_->registry()); | 104 PersistedData::RegisterPrefs(pref_->registry()); |
102 metadata_.reset(new PersistedData(pref_.get())); | 105 metadata_ = base::MakeUnique<PersistedData>(pref_.get()); |
103 interceptor_factory_.reset( | 106 interceptor_factory_ = |
104 new InterceptorFactory(base::ThreadTaskRunnerHandle::Get())); | 107 base::MakeUnique<InterceptorFactory>(base::ThreadTaskRunnerHandle::Get()); |
105 post_interceptor_ = interceptor_factory_->CreateInterceptor(); | 108 post_interceptor_ = interceptor_factory_->CreateInterceptor(); |
106 EXPECT_TRUE(post_interceptor_); | 109 EXPECT_TRUE(post_interceptor_); |
107 | 110 |
108 update_checker_.reset(); | 111 update_checker_ = nullptr; |
109 | 112 |
110 error_ = 0; | 113 error_ = 0; |
111 results_ = UpdateResponse::Results(); | 114 retry_after_sec_ = 0; |
| 115 update_context_ = MakeFakeUpdateContext(); |
112 } | 116 } |
113 | 117 |
114 void UpdateCheckerTest::TearDown() { | 118 void UpdateCheckerTest::TearDown() { |
115 update_checker_.reset(); | 119 update_checker_ = nullptr; |
116 | 120 |
117 post_interceptor_ = NULL; | 121 post_interceptor_ = nullptr; |
118 interceptor_factory_.reset(); | 122 interceptor_factory_ = nullptr; |
119 | 123 |
120 config_ = nullptr; | 124 config_ = nullptr; |
121 | 125 |
122 // The PostInterceptor requires the message loop to run to destruct correctly. | 126 // The PostInterceptor requires the message loop to run to destruct correctly. |
123 // TODO(sorin): This is fragile and should be fixed. | 127 // TODO(sorin): This is fragile and should be fixed. |
124 RunThreadsUntilIdle(); | 128 RunThreadsUntilIdle(); |
125 } | 129 } |
126 | 130 |
127 void UpdateCheckerTest::RunThreads() { | 131 void UpdateCheckerTest::RunThreads() { |
128 base::RunLoop runloop; | 132 base::RunLoop runloop; |
129 quit_closure_ = runloop.QuitClosure(); | 133 quit_closure_ = runloop.QuitClosure(); |
130 runloop.Run(); | 134 runloop.Run(); |
131 | 135 |
132 // Since some tests need to drain currently enqueued tasks such as network | 136 // Since some tests need to drain currently enqueued tasks such as network |
133 // intercepts on the IO thread, run the threads until they are | 137 // intercepts on the IO thread, run the threads until they are |
134 // idle. The component updater service won't loop again until the loop count | 138 // idle. The component updater service won't loop again until the loop count |
135 // is set and the service is started. | 139 // is set and the service is started. |
136 RunThreadsUntilIdle(); | 140 RunThreadsUntilIdle(); |
137 } | 141 } |
138 | 142 |
139 void UpdateCheckerTest::RunThreadsUntilIdle() { | 143 void UpdateCheckerTest::RunThreadsUntilIdle() { |
140 base::RunLoop().RunUntilIdle(); | 144 base::RunLoop().RunUntilIdle(); |
141 } | 145 } |
142 | 146 |
143 void UpdateCheckerTest::Quit() { | 147 void UpdateCheckerTest::Quit() { |
144 if (!quit_closure_.is_null()) | 148 if (!quit_closure_.is_null()) |
145 quit_closure_.Run(); | 149 quit_closure_.Run(); |
146 } | 150 } |
147 | 151 |
148 void UpdateCheckerTest::UpdateCheckComplete( | 152 void UpdateCheckerTest::UpdateCheckComplete(int error, int retry_after_sec) { |
149 int error, | |
150 const UpdateResponse::Results& results, | |
151 int retry_after_sec) { | |
152 error_ = error; | 153 error_ = error; |
153 results_ = results; | 154 retry_after_sec_ = retry_after_sec; |
154 Quit(); | 155 Quit(); |
155 } | 156 } |
156 | 157 |
157 std::unique_ptr<CrxUpdateItem> UpdateCheckerTest::BuildCrxUpdateItem() { | 158 std::unique_ptr<UpdateContext> UpdateCheckerTest::MakeFakeUpdateContext() |
| 159 const { |
| 160 return base::MakeUnique<UpdateContext>( |
| 161 config_, false, std::vector<std::string>(), |
| 162 UpdateClient::CrxDataCallback(), UpdateEngine::NotifyObserversCallback(), |
| 163 UpdateEngine::Callback(), nullptr); |
| 164 } |
| 165 |
| 166 std::unique_ptr<Component> UpdateCheckerTest::MakeComponent() const { |
158 CrxComponent crx_component; | 167 CrxComponent crx_component; |
159 crx_component.name = "test_jebg"; | 168 crx_component.name = "test_jebg"; |
160 crx_component.pk_hash.assign(jebg_hash, jebg_hash + arraysize(jebg_hash)); | 169 crx_component.pk_hash.assign(jebg_hash, jebg_hash + arraysize(jebg_hash)); |
161 crx_component.installer = NULL; | 170 crx_component.installer = NULL; |
162 crx_component.version = base::Version("0.9"); | 171 crx_component.version = base::Version("0.9"); |
163 crx_component.fingerprint = "fp1"; | 172 crx_component.fingerprint = "fp1"; |
164 | 173 |
165 std::unique_ptr<CrxUpdateItem> crx_update_item = | 174 auto component = base::MakeUnique<Component>(*update_context_, kUpdateItemId); |
166 base::MakeUnique<CrxUpdateItem>(); | 175 component->state_ = base::MakeUnique<Component::StateNew>(component.get()); |
167 crx_update_item->state = CrxUpdateItem::State::kNew; | 176 component->crx_component_ = crx_component; |
168 crx_update_item->id = kUpdateItemId; | |
169 crx_update_item->component = crx_component; | |
170 | 177 |
171 return crx_update_item; | 178 return component; |
172 } | 179 } |
173 | 180 |
174 TEST_F(UpdateCheckerTest, UpdateCheckSuccess) { | 181 TEST_F(UpdateCheckerTest, UpdateCheckSuccess) { |
175 EXPECT_TRUE(post_interceptor_->ExpectRequest( | 182 EXPECT_TRUE(post_interceptor_->ExpectRequest( |
176 new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml"))); | 183 new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml"))); |
177 | 184 |
178 update_checker_ = UpdateChecker::Create(config_, metadata_.get()); | 185 update_checker_ = UpdateChecker::Create(config_, metadata_.get()); |
179 | 186 |
180 std::unique_ptr<CrxUpdateItem> item = BuildCrxUpdateItem(); | 187 IdToComponentPtrMap components; |
181 item->component.installer_attributes["ap"] = "some_ap"; | 188 components[kUpdateItemId] = MakeComponent(); |
182 IdToCrxUpdateItemMap items_to_check; | 189 |
183 items_to_check[kUpdateItemId] = std::move(item); | 190 auto& component = components[kUpdateItemId]; |
| 191 component->crx_component_.installer_attributes["ap"] = "some_ap"; |
184 | 192 |
185 update_checker_->CheckForUpdates( | 193 update_checker_->CheckForUpdates( |
186 items_to_check, "extra=\"params\"", true, | 194 std::vector<std::string>{kUpdateItemId}, components, "extra=\"params\"", |
| 195 true, |
187 base::Bind(&UpdateCheckerTest::UpdateCheckComplete, | 196 base::Bind(&UpdateCheckerTest::UpdateCheckComplete, |
188 base::Unretained(this))); | 197 base::Unretained(this))); |
189 | |
190 RunThreads(); | 198 RunThreads(); |
191 | 199 |
192 EXPECT_EQ(1, post_interceptor_->GetHitCount()) | 200 EXPECT_EQ(1, post_interceptor_->GetHitCount()) |
193 << post_interceptor_->GetRequestsAsString(); | 201 << post_interceptor_->GetRequestsAsString(); |
194 ASSERT_EQ(1, post_interceptor_->GetCount()) | 202 ASSERT_EQ(1, post_interceptor_->GetCount()) |
195 << post_interceptor_->GetRequestsAsString(); | 203 << post_interceptor_->GetRequestsAsString(); |
196 | 204 |
197 // Sanity check the request. | 205 // Sanity check the request. |
198 const auto request = post_interceptor_->GetRequests()[0]; | 206 const auto request = post_interceptor_->GetRequests()[0]; |
199 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find( | 207 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find( |
(...skipping 11 matching lines...) Expand all Loading... |
211 | 219 |
212 EXPECT_NE(string::npos, request.find("<hw physmemory=")); | 220 EXPECT_NE(string::npos, request.find("<hw physmemory=")); |
213 | 221 |
214 // Tests that the progid is injected correctly from the configurator. | 222 // Tests that the progid is injected correctly from the configurator. |
215 EXPECT_NE( | 223 EXPECT_NE( |
216 string::npos, | 224 string::npos, |
217 request.find(" version=\"fake_prodid-30.0\" prodversion=\"30.0\" ")); | 225 request.find(" version=\"fake_prodid-30.0\" prodversion=\"30.0\" ")); |
218 | 226 |
219 // Sanity check the arguments of the callback after parsing. | 227 // Sanity check the arguments of the callback after parsing. |
220 EXPECT_EQ(0, error_); | 228 EXPECT_EQ(0, error_); |
221 EXPECT_EQ(1ul, results_.list.size()); | 229 |
222 EXPECT_STREQ(kUpdateItemId, results_.list[0].extension_id.c_str()); | 230 EXPECT_EQ(base::Version("1.0"), component->next_version_); |
223 EXPECT_STREQ("1.0", results_.list[0].manifest.version.c_str()); | 231 EXPECT_EQ(1u, component->crx_urls_.size()); |
| 232 EXPECT_EQ( |
| 233 GURL("http://localhost/download/jebgalgnebhfojomionfpkfelancnnkf.crx"), |
| 234 component->crx_urls_.front()); |
224 | 235 |
225 #if (OS_WIN) | 236 #if (OS_WIN) |
226 EXPECT_NE(string::npos, request.find(" domainjoined=")); | 237 EXPECT_NE(string::npos, request.find(" domainjoined=")); |
227 #if defined(GOOGLE_CHROME_BUILD) | 238 #if defined(GOOGLE_CHROME_BUILD) |
228 // Check the Omaha updater state data in the request. | 239 // Check the Omaha updater state data in the request. |
229 EXPECT_NE(string::npos, request.find("<updater ")); | 240 EXPECT_NE(string::npos, request.find("<updater ")); |
230 EXPECT_NE(string::npos, request.find(" name=\"Omaha\" ")); | 241 EXPECT_NE(string::npos, request.find(" name=\"Omaha\" ")); |
231 #endif // GOOGLE_CHROME_BUILD | 242 #endif // GOOGLE_CHROME_BUILD |
232 #endif // OS_WINDOWS | 243 #endif // OS_WINDOWS |
233 } | 244 } |
234 | 245 |
235 // Tests that an invalid "ap" is not serialized. | 246 // Tests that an invalid "ap" is not serialized. |
236 TEST_F(UpdateCheckerTest, UpdateCheckInvalidAp) { | 247 TEST_F(UpdateCheckerTest, UpdateCheckInvalidAp) { |
237 EXPECT_TRUE(post_interceptor_->ExpectRequest( | 248 EXPECT_TRUE(post_interceptor_->ExpectRequest( |
238 new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml"))); | 249 new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml"))); |
239 | 250 |
240 update_checker_ = UpdateChecker::Create(config_, metadata_.get()); | 251 update_checker_ = UpdateChecker::Create(config_, metadata_.get()); |
241 | 252 |
242 std::unique_ptr<CrxUpdateItem> item = BuildCrxUpdateItem(); | 253 IdToComponentPtrMap components; |
| 254 components[kUpdateItemId] = MakeComponent(); |
| 255 |
243 // Make "ap" too long. | 256 // Make "ap" too long. |
244 item->component.installer_attributes["ap"] = std::string(257, 'a'); | 257 auto& component = components[kUpdateItemId]; |
245 IdToCrxUpdateItemMap items_to_check; | 258 component->crx_component_.installer_attributes["ap"] = std::string(257, 'a'); |
246 items_to_check[kUpdateItemId] = std::move(item); | |
247 | 259 |
248 update_checker_->CheckForUpdates( | 260 update_checker_->CheckForUpdates( |
249 items_to_check, "", true, | 261 std::vector<std::string>{kUpdateItemId}, components, "", true, |
250 base::Bind(&UpdateCheckerTest::UpdateCheckComplete, | 262 base::Bind(&UpdateCheckerTest::UpdateCheckComplete, |
251 base::Unretained(this))); | 263 base::Unretained(this))); |
252 | 264 |
253 RunThreads(); | 265 RunThreads(); |
254 | 266 |
255 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find( | 267 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find( |
256 std::string("app appid=\"") + kUpdateItemId + | 268 std::string("app appid=\"") + kUpdateItemId + |
257 "\" version=\"0.9\" " | 269 "\" version=\"0.9\" " |
258 "brand=\"TEST\"><updatecheck/><ping rd=\"-2\" ")); | 270 "brand=\"TEST\"><updatecheck/><ping rd=\"-2\" ")); |
259 EXPECT_NE(string::npos, | 271 EXPECT_NE(string::npos, |
260 post_interceptor_->GetRequests()[0].find( | 272 post_interceptor_->GetRequests()[0].find( |
261 "<packages><package fp=\"fp1\"/></packages></app>")); | 273 "<packages><package fp=\"fp1\"/></packages></app>")); |
262 } | 274 } |
263 | 275 |
264 TEST_F(UpdateCheckerTest, UpdateCheckSuccessNoBrand) { | 276 TEST_F(UpdateCheckerTest, UpdateCheckSuccessNoBrand) { |
265 EXPECT_TRUE(post_interceptor_->ExpectRequest( | 277 EXPECT_TRUE(post_interceptor_->ExpectRequest( |
266 new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml"))); | 278 new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml"))); |
267 | 279 |
268 config_->SetBrand("TOOLONG"); // Sets an invalid brand code. | 280 config_->SetBrand("TOOLONG"); // Sets an invalid brand code. |
269 update_checker_ = UpdateChecker::Create(config_, metadata_.get()); | 281 update_checker_ = UpdateChecker::Create(config_, metadata_.get()); |
270 | 282 |
271 std::unique_ptr<CrxUpdateItem> item = BuildCrxUpdateItem(); | 283 IdToComponentPtrMap components; |
272 IdToCrxUpdateItemMap items_to_check; | 284 components[kUpdateItemId] = MakeComponent(); |
273 items_to_check[kUpdateItemId] = std::move(item); | |
274 | 285 |
275 update_checker_->CheckForUpdates( | 286 update_checker_->CheckForUpdates( |
276 items_to_check, "", true, | 287 std::vector<std::string>{kUpdateItemId}, components, "", true, |
277 base::Bind(&UpdateCheckerTest::UpdateCheckComplete, | 288 base::Bind(&UpdateCheckerTest::UpdateCheckComplete, |
278 base::Unretained(this))); | 289 base::Unretained(this))); |
279 | 290 |
280 RunThreads(); | 291 RunThreads(); |
281 | 292 |
282 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find( | 293 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find( |
283 std::string("<app appid=\"") + kUpdateItemId + | 294 std::string("<app appid=\"") + kUpdateItemId + |
284 "\" version=\"0.9\">" | 295 "\" version=\"0.9\">" |
285 "<updatecheck/><ping rd=\"-2\" ")); | 296 "<updatecheck/><ping rd=\"-2\" ")); |
286 EXPECT_NE(string::npos, | 297 EXPECT_NE(string::npos, |
287 post_interceptor_->GetRequests()[0].find( | 298 post_interceptor_->GetRequests()[0].find( |
288 "<packages><package fp=\"fp1\"/></packages></app>")); | 299 "<packages><package fp=\"fp1\"/></packages></app>")); |
289 } | 300 } |
290 | 301 |
291 // Simulates a 403 server response error. | 302 // Simulates a 403 server response error. |
292 TEST_F(UpdateCheckerTest, UpdateCheckError) { | 303 TEST_F(UpdateCheckerTest, UpdateCheckError) { |
293 EXPECT_TRUE( | 304 EXPECT_TRUE( |
294 post_interceptor_->ExpectRequest(new PartialMatch("updatecheck"), 403)); | 305 post_interceptor_->ExpectRequest(new PartialMatch("updatecheck"), 403)); |
295 | 306 |
296 update_checker_ = UpdateChecker::Create(config_, metadata_.get()); | 307 update_checker_ = UpdateChecker::Create(config_, metadata_.get()); |
297 | 308 |
298 std::unique_ptr<CrxUpdateItem> item = BuildCrxUpdateItem(); | 309 IdToComponentPtrMap components; |
299 IdToCrxUpdateItemMap items_to_check; | 310 components[kUpdateItemId] = MakeComponent(); |
300 items_to_check[kUpdateItemId] = std::move(item); | 311 |
| 312 auto& component = components[kUpdateItemId]; |
301 | 313 |
302 update_checker_->CheckForUpdates( | 314 update_checker_->CheckForUpdates( |
303 items_to_check, "", true, | 315 std::vector<std::string>{kUpdateItemId}, components, "", true, |
304 base::Bind(&UpdateCheckerTest::UpdateCheckComplete, | 316 base::Bind(&UpdateCheckerTest::UpdateCheckComplete, |
305 base::Unretained(this))); | 317 base::Unretained(this))); |
306 RunThreads(); | 318 RunThreads(); |
307 | 319 |
308 EXPECT_EQ(1, post_interceptor_->GetHitCount()) | 320 EXPECT_EQ(1, post_interceptor_->GetHitCount()) |
309 << post_interceptor_->GetRequestsAsString(); | 321 << post_interceptor_->GetRequestsAsString(); |
310 EXPECT_EQ(1, post_interceptor_->GetCount()) | 322 EXPECT_EQ(1, post_interceptor_->GetCount()) |
311 << post_interceptor_->GetRequestsAsString(); | 323 << post_interceptor_->GetRequestsAsString(); |
312 | 324 |
313 EXPECT_EQ(403, error_); | 325 EXPECT_EQ(403, error_); |
314 EXPECT_EQ(0ul, results_.list.size()); | 326 EXPECT_FALSE(component->next_version_.IsValid()); |
315 } | 327 } |
316 | 328 |
317 TEST_F(UpdateCheckerTest, UpdateCheckDownloadPreference) { | 329 TEST_F(UpdateCheckerTest, UpdateCheckDownloadPreference) { |
318 EXPECT_TRUE(post_interceptor_->ExpectRequest( | 330 EXPECT_TRUE(post_interceptor_->ExpectRequest( |
319 new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml"))); | 331 new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml"))); |
320 | 332 |
321 config_->SetDownloadPreference(string("cacheable")); | 333 config_->SetDownloadPreference(string("cacheable")); |
322 | 334 |
323 update_checker_ = UpdateChecker::Create(config_, metadata_.get()); | 335 update_checker_ = UpdateChecker::Create(config_, metadata_.get()); |
324 | 336 |
325 std::unique_ptr<CrxUpdateItem> item = BuildCrxUpdateItem(); | 337 IdToComponentPtrMap components; |
326 IdToCrxUpdateItemMap items_to_check; | 338 components[kUpdateItemId] = MakeComponent(); |
327 items_to_check[kUpdateItemId] = std::move(item); | |
328 | 339 |
329 update_checker_->CheckForUpdates( | 340 update_checker_->CheckForUpdates( |
330 items_to_check, "extra=\"params\"", true, | 341 std::vector<std::string>{kUpdateItemId}, components, "extra=\"params\"", |
| 342 true, |
331 base::Bind(&UpdateCheckerTest::UpdateCheckComplete, | 343 base::Bind(&UpdateCheckerTest::UpdateCheckComplete, |
332 base::Unretained(this))); | 344 base::Unretained(this))); |
333 | 345 |
334 RunThreads(); | 346 RunThreads(); |
335 | 347 |
336 // The request must contain dlpref="cacheable". | 348 // The request must contain dlpref="cacheable". |
337 EXPECT_NE(string::npos, | 349 EXPECT_NE(string::npos, |
338 post_interceptor_->GetRequests()[0].find(" dlpref=\"cacheable\"")); | 350 post_interceptor_->GetRequests()[0].find(" dlpref=\"cacheable\"")); |
339 } | 351 } |
340 | 352 |
341 // This test is checking that an update check signed with CUP fails, since there | 353 // This test is checking that an update check signed with CUP fails, since there |
342 // is currently no entity that can respond with a valid signed response. | 354 // is currently no entity that can respond with a valid signed response. |
343 // A proper CUP test requires network mocks, which are not available now. | 355 // A proper CUP test requires network mocks, which are not available now. |
344 TEST_F(UpdateCheckerTest, UpdateCheckCupError) { | 356 TEST_F(UpdateCheckerTest, UpdateCheckCupError) { |
345 EXPECT_TRUE(post_interceptor_->ExpectRequest( | 357 EXPECT_TRUE(post_interceptor_->ExpectRequest( |
346 new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml"))); | 358 new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml"))); |
347 | 359 |
348 config_->SetEnabledCupSigning(true); | 360 config_->SetEnabledCupSigning(true); |
349 update_checker_ = UpdateChecker::Create(config_, metadata_.get()); | 361 update_checker_ = UpdateChecker::Create(config_, metadata_.get()); |
350 | 362 |
351 std::unique_ptr<CrxUpdateItem> item = BuildCrxUpdateItem(); | 363 IdToComponentPtrMap components; |
352 IdToCrxUpdateItemMap items_to_check; | 364 components[kUpdateItemId] = MakeComponent(); |
353 items_to_check[kUpdateItemId] = std::move(item); | 365 |
| 366 const auto& component = components[kUpdateItemId]; |
354 | 367 |
355 update_checker_->CheckForUpdates( | 368 update_checker_->CheckForUpdates( |
356 items_to_check, "", true, | 369 std::vector<std::string>{kUpdateItemId}, components, "", true, |
357 base::Bind(&UpdateCheckerTest::UpdateCheckComplete, | 370 base::Bind(&UpdateCheckerTest::UpdateCheckComplete, |
358 base::Unretained(this))); | 371 base::Unretained(this))); |
359 | 372 |
360 RunThreads(); | 373 RunThreads(); |
361 | 374 |
362 EXPECT_EQ(1, post_interceptor_->GetHitCount()) | 375 EXPECT_EQ(1, post_interceptor_->GetHitCount()) |
363 << post_interceptor_->GetRequestsAsString(); | 376 << post_interceptor_->GetRequestsAsString(); |
364 ASSERT_EQ(1, post_interceptor_->GetCount()) | 377 ASSERT_EQ(1, post_interceptor_->GetCount()) |
365 << post_interceptor_->GetRequestsAsString(); | 378 << post_interceptor_->GetRequestsAsString(); |
366 | 379 |
367 // Sanity check the request. | 380 // Sanity check the request. |
368 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find( | 381 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find( |
369 std::string("<app appid=\"") + kUpdateItemId + | 382 std::string("<app appid=\"") + kUpdateItemId + |
370 "\" version=\"0.9\" " | 383 "\" version=\"0.9\" " |
371 "brand=\"TEST\"><updatecheck/><ping rd=\"-2\" ")); | 384 "brand=\"TEST\"><updatecheck/><ping rd=\"-2\" ")); |
372 EXPECT_NE(string::npos, | 385 EXPECT_NE(string::npos, |
373 post_interceptor_->GetRequests()[0].find( | 386 post_interceptor_->GetRequests()[0].find( |
374 "<packages><package fp=\"fp1\"/></packages></app>")); | 387 "<packages><package fp=\"fp1\"/></packages></app>")); |
375 | 388 |
376 // Expect an error since the response is not trusted. | 389 // Expect an error since the response is not trusted. |
377 EXPECT_EQ(-10000, error_); | 390 EXPECT_EQ(-10000, error_); |
378 EXPECT_EQ(0ul, results_.list.size()); | 391 EXPECT_FALSE(component->next_version_.IsValid()); |
379 } | 392 } |
380 | 393 |
381 // Tests that the UpdateCheckers will not make an update check for a | 394 // Tests that the UpdateCheckers will not make an update check for a |
382 // component that requires encryption when the update check URL is unsecure. | 395 // component that requires encryption when the update check URL is unsecure. |
383 TEST_F(UpdateCheckerTest, UpdateCheckRequiresEncryptionError) { | 396 TEST_F(UpdateCheckerTest, UpdateCheckRequiresEncryptionError) { |
384 config_->SetUpdateCheckUrl(GURL("http:\\foo\bar")); | 397 config_->SetUpdateCheckUrl(GURL("http:\\foo\bar")); |
385 | 398 |
386 update_checker_ = UpdateChecker::Create(config_, metadata_.get()); | 399 update_checker_ = UpdateChecker::Create(config_, metadata_.get()); |
387 | 400 |
388 std::unique_ptr<CrxUpdateItem> item = BuildCrxUpdateItem(); | 401 IdToComponentPtrMap components; |
389 item->component.requires_network_encryption = true; | 402 components[kUpdateItemId] = MakeComponent(); |
390 IdToCrxUpdateItemMap items_to_check; | 403 |
391 items_to_check[kUpdateItemId] = std::move(item); | 404 auto& component = components[kUpdateItemId]; |
| 405 component->crx_component_.requires_network_encryption = true; |
392 | 406 |
393 update_checker_->CheckForUpdates( | 407 update_checker_->CheckForUpdates( |
394 items_to_check, "", true, | 408 std::vector<std::string>{kUpdateItemId}, components, "", true, |
395 base::Bind(&UpdateCheckerTest::UpdateCheckComplete, | 409 base::Bind(&UpdateCheckerTest::UpdateCheckComplete, |
396 base::Unretained(this))); | 410 base::Unretained(this))); |
397 RunThreads(); | 411 RunThreads(); |
398 | 412 |
399 EXPECT_EQ(-1, error_); | 413 EXPECT_EQ(-1, error_); |
400 EXPECT_EQ(0u, results_.list.size()); | 414 EXPECT_FALSE(component->next_version_.IsValid()); |
401 } | 415 } |
402 | 416 |
403 // Tests that the PersistedData will get correctly update and reserialize | 417 // Tests that the PersistedData will get correctly update and reserialize |
404 // the elapsed_days value. | 418 // the elapsed_days value. |
405 TEST_F(UpdateCheckerTest, UpdateCheckDateLastRollCall) { | 419 TEST_F(UpdateCheckerTest, UpdateCheckDateLastRollCall) { |
406 EXPECT_TRUE(post_interceptor_->ExpectRequest( | 420 EXPECT_TRUE(post_interceptor_->ExpectRequest( |
407 new PartialMatch("updatecheck"), test_file("updatecheck_reply_4.xml"))); | 421 new PartialMatch("updatecheck"), test_file("updatecheck_reply_4.xml"))); |
408 EXPECT_TRUE(post_interceptor_->ExpectRequest( | 422 EXPECT_TRUE(post_interceptor_->ExpectRequest( |
409 new PartialMatch("updatecheck"), test_file("updatecheck_reply_4.xml"))); | 423 new PartialMatch("updatecheck"), test_file("updatecheck_reply_4.xml"))); |
410 | 424 |
411 update_checker_ = UpdateChecker::Create(config_, metadata_.get()); | 425 update_checker_ = UpdateChecker::Create(config_, metadata_.get()); |
412 | 426 |
413 std::unique_ptr<CrxUpdateItem> item = BuildCrxUpdateItem(); | 427 IdToComponentPtrMap components; |
414 IdToCrxUpdateItemMap items_to_check; | 428 components[kUpdateItemId] = MakeComponent(); |
415 items_to_check[kUpdateItemId] = std::move(item); | |
416 | 429 |
417 // Do two update-checks. | 430 // Do two update-checks. |
418 update_checker_->CheckForUpdates( | 431 update_checker_->CheckForUpdates( |
419 items_to_check, "extra=\"params\"", true, | 432 std::vector<std::string>{kUpdateItemId}, components, "extra=\"params\"", |
| 433 true, |
420 base::Bind(&UpdateCheckerTest::UpdateCheckComplete, | 434 base::Bind(&UpdateCheckerTest::UpdateCheckComplete, |
421 base::Unretained(this))); | 435 base::Unretained(this))); |
422 RunThreads(); | 436 RunThreads(); |
| 437 |
423 update_checker_ = UpdateChecker::Create(config_, metadata_.get()); | 438 update_checker_ = UpdateChecker::Create(config_, metadata_.get()); |
424 update_checker_->CheckForUpdates( | 439 update_checker_->CheckForUpdates( |
425 items_to_check, "extra=\"params\"", true, | 440 std::vector<std::string>{kUpdateItemId}, components, "extra=\"params\"", |
| 441 true, |
426 base::Bind(&UpdateCheckerTest::UpdateCheckComplete, | 442 base::Bind(&UpdateCheckerTest::UpdateCheckComplete, |
427 base::Unretained(this))); | 443 base::Unretained(this))); |
428 RunThreads(); | 444 RunThreads(); |
429 | 445 |
430 EXPECT_EQ(2, post_interceptor_->GetHitCount()) | 446 EXPECT_EQ(2, post_interceptor_->GetHitCount()) |
431 << post_interceptor_->GetRequestsAsString(); | 447 << post_interceptor_->GetRequestsAsString(); |
432 ASSERT_EQ(2, post_interceptor_->GetCount()) | 448 ASSERT_EQ(2, post_interceptor_->GetCount()) |
433 << post_interceptor_->GetRequestsAsString(); | 449 << post_interceptor_->GetRequestsAsString(); |
434 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find( | 450 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find( |
435 "<ping rd=\"-2\" ping_freshness=")); | 451 "<ping rd=\"-2\" ping_freshness=")); |
436 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[1].find( | 452 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[1].find( |
437 "<ping rd=\"3383\" ping_freshness=")); | 453 "<ping rd=\"3383\" ping_freshness=")); |
438 } | 454 } |
439 | 455 |
440 TEST_F(UpdateCheckerTest, UpdateCheckUpdateDisabled) { | 456 TEST_F(UpdateCheckerTest, UpdateCheckUpdateDisabled) { |
441 EXPECT_TRUE(post_interceptor_->ExpectRequest( | 457 EXPECT_TRUE(post_interceptor_->ExpectRequest( |
442 new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml"))); | 458 new PartialMatch("updatecheck"), test_file("updatecheck_reply_1.xml"))); |
443 | 459 |
444 config_->SetBrand(""); | 460 config_->SetBrand(""); |
445 update_checker_ = UpdateChecker::Create(config_, metadata_.get()); | 461 update_checker_ = UpdateChecker::Create(config_, metadata_.get()); |
446 | 462 |
447 std::unique_ptr<CrxUpdateItem> item = BuildCrxUpdateItem(); | 463 IdToComponentPtrMap components; |
448 CrxUpdateItem* item_ptr = item.get(); | 464 components[kUpdateItemId] = MakeComponent(); |
| 465 |
| 466 auto& component = components[kUpdateItemId]; |
449 | 467 |
450 // Tests the scenario where: | 468 // Tests the scenario where: |
451 // * the component does not support group policies. | 469 // * the component does not support group policies. |
452 // * the component updates are disabled. | 470 // * the component updates are disabled. |
453 // Expects the group policy to be ignored and the update check to not | 471 // Expects the group policy to be ignored and the update check to not |
454 // include the "updatedisabled" attribute. | 472 // include the "updatedisabled" attribute. |
455 EXPECT_FALSE( | 473 EXPECT_FALSE( |
456 item_ptr->component.supports_group_policy_enable_component_updates); | 474 component->crx_component_.supports_group_policy_enable_component_updates); |
457 IdToCrxUpdateItemMap items_to_check; | 475 |
458 items_to_check[kUpdateItemId] = std::move(item); | |
459 update_checker_->CheckForUpdates( | 476 update_checker_->CheckForUpdates( |
460 items_to_check, "", false, | 477 std::vector<std::string>{kUpdateItemId}, components, "", false, |
461 base::Bind(&UpdateCheckerTest::UpdateCheckComplete, | 478 base::Bind(&UpdateCheckerTest::UpdateCheckComplete, |
462 base::Unretained(this))); | 479 base::Unretained(this))); |
463 RunThreads(); | 480 RunThreads(); |
464 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find( | 481 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[0].find( |
465 std::string("<app appid=\"") + kUpdateItemId + | 482 std::string("<app appid=\"") + kUpdateItemId + |
466 "\" version=\"0.9\">" | 483 "\" version=\"0.9\">" |
467 "<updatecheck/>")); | 484 "<updatecheck/>")); |
468 | 485 |
469 // Tests the scenario where: | 486 // Tests the scenario where: |
470 // * the component supports group policies. | 487 // * the component supports group policies. |
471 // * the component updates are disabled. | 488 // * the component updates are disabled. |
472 // Expects the update check to include the "updatedisabled" attribute. | 489 // Expects the update check to include the "updatedisabled" attribute. |
473 item_ptr->component.supports_group_policy_enable_component_updates = true; | 490 component->crx_component_.supports_group_policy_enable_component_updates = |
| 491 true; |
474 update_checker_ = UpdateChecker::Create(config_, metadata_.get()); | 492 update_checker_ = UpdateChecker::Create(config_, metadata_.get()); |
475 update_checker_->CheckForUpdates( | 493 update_checker_->CheckForUpdates( |
476 items_to_check, "", false, | 494 std::vector<std::string>{kUpdateItemId}, components, "", false, |
477 base::Bind(&UpdateCheckerTest::UpdateCheckComplete, | 495 base::Bind(&UpdateCheckerTest::UpdateCheckComplete, |
478 base::Unretained(this))); | 496 base::Unretained(this))); |
479 RunThreads(); | 497 RunThreads(); |
480 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[1].find( | 498 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[1].find( |
481 std::string("<app appid=\"") + kUpdateItemId + | 499 std::string("<app appid=\"") + kUpdateItemId + |
482 "\" version=\"0.9\">" | 500 "\" version=\"0.9\">" |
483 "<updatecheck updatedisabled=\"true\"/>")); | 501 "<updatecheck updatedisabled=\"true\"/>")); |
484 | 502 |
485 // Tests the scenario where: | 503 // Tests the scenario where: |
486 // * the component does not support group policies. | 504 // * the component does not support group policies. |
487 // * the component updates are enabled. | 505 // * the component updates are enabled. |
488 // Expects the update check to not include the "updatedisabled" attribute. | 506 // Expects the update check to not include the "updatedisabled" attribute. |
489 item_ptr->component.supports_group_policy_enable_component_updates = false; | 507 component->crx_component_.supports_group_policy_enable_component_updates = |
| 508 false; |
490 update_checker_ = UpdateChecker::Create(config_, metadata_.get()); | 509 update_checker_ = UpdateChecker::Create(config_, metadata_.get()); |
491 update_checker_->CheckForUpdates( | 510 update_checker_->CheckForUpdates( |
492 items_to_check, "", true, | 511 std::vector<std::string>{kUpdateItemId}, components, "", true, |
493 base::Bind(&UpdateCheckerTest::UpdateCheckComplete, | 512 base::Bind(&UpdateCheckerTest::UpdateCheckComplete, |
494 base::Unretained(this))); | 513 base::Unretained(this))); |
495 RunThreads(); | 514 RunThreads(); |
496 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[2].find( | 515 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[2].find( |
497 std::string("<app appid=\"") + kUpdateItemId + | 516 std::string("<app appid=\"") + kUpdateItemId + |
498 "\" version=\"0.9\">" | 517 "\" version=\"0.9\">" |
499 "<updatecheck/>")); | 518 "<updatecheck/>")); |
500 | 519 |
501 // Tests the scenario where: | 520 // Tests the scenario where: |
502 // * the component supports group policies. | 521 // * the component supports group policies. |
503 // * the component updates are enabled. | 522 // * the component updates are enabled. |
504 // Expects the update check to not include the "updatedisabled" attribute. | 523 // Expects the update check to not include the "updatedisabled" attribute. |
505 item_ptr->component.supports_group_policy_enable_component_updates = true; | 524 component->crx_component_.supports_group_policy_enable_component_updates = |
| 525 true; |
506 update_checker_ = UpdateChecker::Create(config_, metadata_.get()); | 526 update_checker_ = UpdateChecker::Create(config_, metadata_.get()); |
507 update_checker_->CheckForUpdates( | 527 update_checker_->CheckForUpdates( |
508 items_to_check, "", true, | 528 std::vector<std::string>{kUpdateItemId}, components, "", true, |
509 base::Bind(&UpdateCheckerTest::UpdateCheckComplete, | 529 base::Bind(&UpdateCheckerTest::UpdateCheckComplete, |
510 base::Unretained(this))); | 530 base::Unretained(this))); |
511 RunThreads(); | 531 RunThreads(); |
512 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[3].find( | 532 EXPECT_NE(string::npos, post_interceptor_->GetRequests()[3].find( |
513 std::string("<app appid=\"") + kUpdateItemId + | 533 std::string("<app appid=\"") + kUpdateItemId + |
514 "\" version=\"0.9\">" | 534 "\" version=\"0.9\">" |
515 "<updatecheck/>")); | 535 "<updatecheck/>")); |
516 } | 536 } |
517 | 537 |
518 } // namespace update_client | 538 } // namespace update_client |
OLD | NEW |