| 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 "sync/internal_api/public/attachments/attachment_service_impl.h" | 5 #include "sync/internal_api/public/attachments/attachment_service_impl.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/memory/weak_ptr.h" | 8 #include "base/memory/weak_ptr.h" |
| 9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
| 10 #include "base/run_loop.h" | 10 #include "base/run_loop.h" |
| 11 #include "base/timer/mock_timer.h" |
| 11 #include "sync/internal_api/public/attachments/fake_attachment_downloader.h" | 12 #include "sync/internal_api/public/attachments/fake_attachment_downloader.h" |
| 12 #include "sync/internal_api/public/attachments/fake_attachment_uploader.h" | 13 #include "sync/internal_api/public/attachments/fake_attachment_uploader.h" |
| 13 #include "testing/gmock/include/gmock/gmock-matchers.h" | 14 #include "testing/gmock/include/gmock/gmock-matchers.h" |
| 14 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
| 15 | 16 |
| 16 namespace syncer { | 17 namespace syncer { |
| 17 | 18 |
| 18 class MockAttachmentStore : public AttachmentStore, | 19 class MockAttachmentStore : public AttachmentStore, |
| 19 public base::SupportsWeakPtr<MockAttachmentStore> { | 20 public base::SupportsWeakPtr<MockAttachmentStore> { |
| 20 public: | 21 public: |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 148 | 149 |
| 149 DISALLOW_COPY_AND_ASSIGN(MockAttachmentUploader); | 150 DISALLOW_COPY_AND_ASSIGN(MockAttachmentUploader); |
| 150 }; | 151 }; |
| 151 | 152 |
| 152 class AttachmentServiceImplTest : public testing::Test, | 153 class AttachmentServiceImplTest : public testing::Test, |
| 153 public AttachmentService::Delegate { | 154 public AttachmentService::Delegate { |
| 154 protected: | 155 protected: |
| 155 AttachmentServiceImplTest() {} | 156 AttachmentServiceImplTest() {} |
| 156 | 157 |
| 157 virtual void SetUp() OVERRIDE { | 158 virtual void SetUp() OVERRIDE { |
| 159 network_change_notifier_.reset(net::NetworkChangeNotifier::CreateMock()); |
| 158 InitializeAttachmentService(make_scoped_ptr(new MockAttachmentUploader()), | 160 InitializeAttachmentService(make_scoped_ptr(new MockAttachmentUploader()), |
| 159 make_scoped_ptr(new MockAttachmentDownloader()), | 161 make_scoped_ptr(new MockAttachmentDownloader()), |
| 160 this); | 162 this); |
| 161 } | 163 } |
| 162 | 164 |
| 163 virtual void TearDown() OVERRIDE { | 165 virtual void TearDown() OVERRIDE { |
| 164 attachment_service_.reset(); | 166 attachment_service_.reset(); |
| 165 ASSERT_FALSE(attachment_store_); | 167 ASSERT_FALSE(attachment_store_); |
| 166 ASSERT_FALSE(attachment_uploader_); | 168 ASSERT_FALSE(attachment_uploader_); |
| 167 ASSERT_FALSE(attachment_downloader_); | 169 ASSERT_FALSE(attachment_downloader_); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 185 attachment_uploader_ = uploader->AsWeakPtr(); | 187 attachment_uploader_ = uploader->AsWeakPtr(); |
| 186 } | 188 } |
| 187 if (downloader.get()) { | 189 if (downloader.get()) { |
| 188 attachment_downloader_ = downloader->AsWeakPtr(); | 190 attachment_downloader_ = downloader->AsWeakPtr(); |
| 189 } | 191 } |
| 190 attachment_service_.reset( | 192 attachment_service_.reset( |
| 191 new AttachmentServiceImpl(attachment_store, | 193 new AttachmentServiceImpl(attachment_store, |
| 192 uploader.PassAs<AttachmentUploader>(), | 194 uploader.PassAs<AttachmentUploader>(), |
| 193 downloader.PassAs<AttachmentDownloader>(), | 195 downloader.PassAs<AttachmentDownloader>(), |
| 194 delegate, | 196 delegate, |
| 195 base::TimeDelta(), | 197 base::TimeDelta::FromMinutes(1), |
| 196 base::TimeDelta())); | 198 base::TimeDelta::FromMinutes(8))); |
| 199 |
| 200 scoped_ptr<base::MockTimer> timer_to_pass( |
| 201 new base::MockTimer(false, false)); |
| 202 mock_timer_ = timer_to_pass.get(); |
| 203 attachment_service_->SetTimerForTest(timer_to_pass.PassAs<base::Timer>()); |
| 197 } | 204 } |
| 198 | 205 |
| 199 AttachmentService* attachment_service() { return attachment_service_.get(); } | 206 AttachmentService* attachment_service() { return attachment_service_.get(); } |
| 200 | 207 |
| 208 base::MockTimer* mock_timer() { return mock_timer_; } |
| 209 |
| 201 AttachmentService::GetOrDownloadCallback download_callback() { | 210 AttachmentService::GetOrDownloadCallback download_callback() { |
| 202 return base::Bind(&AttachmentServiceImplTest::DownloadDone, | 211 return base::Bind(&AttachmentServiceImplTest::DownloadDone, |
| 203 base::Unretained(this)); | 212 base::Unretained(this)); |
| 204 } | 213 } |
| 205 | 214 |
| 206 void DownloadDone(const AttachmentService::GetOrDownloadResult& result, | 215 void DownloadDone(const AttachmentService::GetOrDownloadResult& result, |
| 207 scoped_ptr<AttachmentMap> attachments) { | 216 scoped_ptr<AttachmentMap> attachments) { |
| 208 download_results_.push_back(result); | 217 download_results_.push_back(result); |
| 209 last_download_attachments_ = attachments.Pass(); | 218 last_download_attachments_ = attachments.Pass(); |
| 210 } | 219 } |
| 211 | 220 |
| 212 void RunLoop() { | 221 void RunLoop() { |
| 213 base::RunLoop run_loop; | 222 base::RunLoop run_loop; |
| 214 run_loop.RunUntilIdle(); | 223 run_loop.RunUntilIdle(); |
| 215 } | 224 } |
| 216 | 225 |
| 226 void RunLoopAndFireTimer() { |
| 227 RunLoop(); |
| 228 if (mock_timer()->IsRunning()) { |
| 229 mock_timer()->Fire(); |
| 230 } |
| 231 RunLoop(); |
| 232 } |
| 233 |
| 217 const std::vector<AttachmentService::GetOrDownloadResult>& | 234 const std::vector<AttachmentService::GetOrDownloadResult>& |
| 218 download_results() const { | 235 download_results() const { |
| 219 return download_results_; | 236 return download_results_; |
| 220 } | 237 } |
| 221 | 238 |
| 222 const AttachmentMap& last_download_attachments() const { | 239 const AttachmentMap& last_download_attachments() const { |
| 223 return *last_download_attachments_.get(); | 240 return *last_download_attachments_.get(); |
| 224 } | 241 } |
| 225 | 242 |
| 243 net::NetworkChangeNotifier* network_change_notifier() { |
| 244 return network_change_notifier_.get(); |
| 245 } |
| 246 |
| 226 MockAttachmentStore* store() { return attachment_store_.get(); } | 247 MockAttachmentStore* store() { return attachment_store_.get(); } |
| 227 | 248 |
| 228 MockAttachmentDownloader* downloader() { | 249 MockAttachmentDownloader* downloader() { |
| 229 return attachment_downloader_.get(); | 250 return attachment_downloader_.get(); |
| 230 } | 251 } |
| 231 | 252 |
| 232 MockAttachmentUploader* uploader() { | 253 MockAttachmentUploader* uploader() { |
| 233 return attachment_uploader_.get(); | 254 return attachment_uploader_.get(); |
| 234 } | 255 } |
| 235 | 256 |
| 236 const std::vector<AttachmentId>& on_attachment_uploaded_list() const { | 257 const std::vector<AttachmentId>& on_attachment_uploaded_list() const { |
| 237 return on_attachment_uploaded_list_; | 258 return on_attachment_uploaded_list_; |
| 238 } | 259 } |
| 239 | 260 |
| 240 private: | 261 private: |
| 241 base::MessageLoop message_loop_; | 262 base::MessageLoop message_loop_; |
| 263 scoped_ptr<net::NetworkChangeNotifier> network_change_notifier_; |
| 242 base::WeakPtr<MockAttachmentStore> attachment_store_; | 264 base::WeakPtr<MockAttachmentStore> attachment_store_; |
| 243 base::WeakPtr<MockAttachmentDownloader> attachment_downloader_; | 265 base::WeakPtr<MockAttachmentDownloader> attachment_downloader_; |
| 244 base::WeakPtr<MockAttachmentUploader> attachment_uploader_; | 266 base::WeakPtr<MockAttachmentUploader> attachment_uploader_; |
| 245 scoped_ptr<AttachmentService> attachment_service_; | 267 scoped_ptr<AttachmentServiceImpl> attachment_service_; |
| 268 base::MockTimer* mock_timer_; // not owned |
| 246 | 269 |
| 247 std::vector<AttachmentService::GetOrDownloadResult> download_results_; | 270 std::vector<AttachmentService::GetOrDownloadResult> download_results_; |
| 248 scoped_ptr<AttachmentMap> last_download_attachments_; | 271 scoped_ptr<AttachmentMap> last_download_attachments_; |
| 249 std::vector<AttachmentId> on_attachment_uploaded_list_; | 272 std::vector<AttachmentId> on_attachment_uploaded_list_; |
| 250 }; | 273 }; |
| 251 | 274 |
| 252 TEST_F(AttachmentServiceImplTest, GetStore) { | 275 TEST_F(AttachmentServiceImplTest, GetStore) { |
| 253 EXPECT_EQ(store(), attachment_service()->GetStore()); | 276 EXPECT_EQ(store(), attachment_service()->GetStore()); |
| 254 } | 277 } |
| 255 | 278 |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 346 | 369 |
| 347 TEST_F(AttachmentServiceImplTest, UploadAttachments_Success) { | 370 TEST_F(AttachmentServiceImplTest, UploadAttachments_Success) { |
| 348 AttachmentIdSet attachment_ids; | 371 AttachmentIdSet attachment_ids; |
| 349 const unsigned num_attachments = 3; | 372 const unsigned num_attachments = 3; |
| 350 for (unsigned i = 0; i < num_attachments; ++i) { | 373 for (unsigned i = 0; i < num_attachments; ++i) { |
| 351 attachment_ids.insert(AttachmentId::Create()); | 374 attachment_ids.insert(AttachmentId::Create()); |
| 352 } | 375 } |
| 353 attachment_service()->UploadAttachments(attachment_ids); | 376 attachment_service()->UploadAttachments(attachment_ids); |
| 354 | 377 |
| 355 for (unsigned i = 0; i < num_attachments; ++i) { | 378 for (unsigned i = 0; i < num_attachments; ++i) { |
| 356 RunLoop(); | 379 RunLoopAndFireTimer(); |
| 357 // See that the service has issued a read for at least one of the | 380 // See that the service has issued a read for at least one of the |
| 358 // attachments. | 381 // attachments. |
| 359 ASSERT_GE(1U, store()->read_ids.size()); | 382 ASSERT_GE(store()->read_ids.size(), 1U); |
| 360 store()->RespondToRead(attachment_ids); | 383 store()->RespondToRead(attachment_ids); |
| 361 RunLoop(); | 384 RunLoop(); |
| 362 ASSERT_GE(1U, uploader()->upload_requests.size()); | 385 ASSERT_GE(uploader()->upload_requests.size(), 1U); |
| 363 uploader()->RespondToUpload(uploader()->upload_requests.begin()->first, | 386 uploader()->RespondToUpload(uploader()->upload_requests.begin()->first, |
| 364 AttachmentUploader::UPLOAD_SUCCESS); | 387 AttachmentUploader::UPLOAD_SUCCESS); |
| 365 } | 388 } |
| 366 RunLoop(); | 389 RunLoop(); |
| 367 ASSERT_EQ(0U, store()->read_ids.size()); | 390 ASSERT_EQ(0U, store()->read_ids.size()); |
| 368 ASSERT_EQ(0U, uploader()->upload_requests.size()); | 391 ASSERT_EQ(0U, uploader()->upload_requests.size()); |
| 369 | 392 |
| 370 // See that all the attachments were uploaded. | 393 // See that all the attachments were uploaded. |
| 371 ASSERT_EQ(attachment_ids.size(), on_attachment_uploaded_list().size()); | 394 ASSERT_EQ(attachment_ids.size(), on_attachment_uploaded_list().size()); |
| 372 AttachmentIdSet::const_iterator iter = attachment_ids.begin(); | 395 AttachmentIdSet::const_iterator iter = attachment_ids.begin(); |
| 373 const AttachmentIdSet::const_iterator end = attachment_ids.end(); | 396 const AttachmentIdSet::const_iterator end = attachment_ids.end(); |
| 374 for (iter = attachment_ids.begin(); iter != end; ++iter) { | 397 for (iter = attachment_ids.begin(); iter != end; ++iter) { |
| 375 EXPECT_THAT(on_attachment_uploaded_list(), testing::Contains(*iter)); | 398 EXPECT_THAT(on_attachment_uploaded_list(), testing::Contains(*iter)); |
| 376 } | 399 } |
| 377 } | 400 } |
| 378 | 401 |
| 379 TEST_F(AttachmentServiceImplTest, UploadAttachments_Success_NoDelegate) { | 402 TEST_F(AttachmentServiceImplTest, UploadAttachments_Success_NoDelegate) { |
| 380 InitializeAttachmentService(make_scoped_ptr(new MockAttachmentUploader()), | 403 InitializeAttachmentService(make_scoped_ptr(new MockAttachmentUploader()), |
| 381 make_scoped_ptr(new MockAttachmentDownloader()), | 404 make_scoped_ptr(new MockAttachmentDownloader()), |
| 382 NULL); // No delegate. | 405 NULL); // No delegate. |
| 383 | 406 |
| 384 AttachmentIdSet attachment_ids; | 407 AttachmentIdSet attachment_ids; |
| 385 attachment_ids.insert(AttachmentId::Create()); | 408 attachment_ids.insert(AttachmentId::Create()); |
| 386 attachment_service()->UploadAttachments(attachment_ids); | 409 attachment_service()->UploadAttachments(attachment_ids); |
| 387 RunLoop(); | 410 RunLoopAndFireTimer(); |
| 388 EXPECT_EQ(1U, store()->read_ids.size()); | 411 ASSERT_EQ(1U, store()->read_ids.size()); |
| 389 EXPECT_EQ(0U, uploader()->upload_requests.size()); | 412 ASSERT_EQ(0U, uploader()->upload_requests.size()); |
| 390 store()->RespondToRead(attachment_ids); | 413 store()->RespondToRead(attachment_ids); |
| 391 RunLoop(); | 414 RunLoop(); |
| 392 EXPECT_EQ(0U, store()->read_ids.size()); | 415 ASSERT_EQ(0U, store()->read_ids.size()); |
| 393 EXPECT_EQ(1U, uploader()->upload_requests.size()); | 416 ASSERT_EQ(1U, uploader()->upload_requests.size()); |
| 394 uploader()->RespondToUpload(*attachment_ids.begin(), | 417 uploader()->RespondToUpload(*attachment_ids.begin(), |
| 395 AttachmentUploader::UPLOAD_SUCCESS); | 418 AttachmentUploader::UPLOAD_SUCCESS); |
| 396 RunLoop(); | 419 RunLoop(); |
| 397 ASSERT_TRUE(on_attachment_uploaded_list().empty()); | 420 ASSERT_TRUE(on_attachment_uploaded_list().empty()); |
| 398 } | 421 } |
| 399 | 422 |
| 400 TEST_F(AttachmentServiceImplTest, UploadAttachments_SomeMissingFromStore) { | 423 TEST_F(AttachmentServiceImplTest, UploadAttachments_SomeMissingFromStore) { |
| 401 AttachmentIdSet attachment_ids; | 424 AttachmentIdSet attachment_ids; |
| 402 attachment_ids.insert(AttachmentId::Create()); | 425 attachment_ids.insert(AttachmentId::Create()); |
| 403 attachment_ids.insert(AttachmentId::Create()); | 426 attachment_ids.insert(AttachmentId::Create()); |
| 404 attachment_service()->UploadAttachments(attachment_ids); | 427 attachment_service()->UploadAttachments(attachment_ids); |
| 405 RunLoop(); | 428 RunLoopAndFireTimer(); |
| 406 ASSERT_GE(1U, store()->read_ids.size()); | 429 ASSERT_GE(store()->read_ids.size(), 1U); |
| 407 | 430 |
| 408 ASSERT_EQ(0U, uploader()->upload_requests.size()); | 431 ASSERT_EQ(0U, uploader()->upload_requests.size()); |
| 409 store()->RespondToRead(attachment_ids); | 432 store()->RespondToRead(attachment_ids); |
| 410 RunLoop(); | 433 RunLoop(); |
| 411 ASSERT_EQ(1U, uploader()->upload_requests.size()); | 434 ASSERT_EQ(1U, uploader()->upload_requests.size()); |
| 412 | 435 |
| 413 uploader()->RespondToUpload(uploader()->upload_requests.begin()->first, | 436 uploader()->RespondToUpload(uploader()->upload_requests.begin()->first, |
| 414 AttachmentUploader::UPLOAD_SUCCESS); | 437 AttachmentUploader::UPLOAD_SUCCESS); |
| 415 RunLoop(); | 438 RunLoopAndFireTimer(); |
| 416 ASSERT_EQ(1U, on_attachment_uploaded_list().size()); | 439 ASSERT_EQ(1U, on_attachment_uploaded_list().size()); |
| 417 ASSERT_GE(1U, store()->read_ids.size()); | 440 ASSERT_GE(store()->read_ids.size(), 1U); |
| 418 // Not found! | 441 // Not found! |
| 419 store()->RespondToRead(AttachmentIdSet()); | 442 store()->RespondToRead(AttachmentIdSet()); |
| 420 RunLoop(); | 443 RunLoop(); |
| 421 // No upload requests since the read failed. | 444 // No upload requests since the read failed. |
| 422 ASSERT_EQ(0U, uploader()->upload_requests.size()); | 445 ASSERT_EQ(0U, uploader()->upload_requests.size()); |
| 423 } | 446 } |
| 424 | 447 |
| 425 TEST_F(AttachmentServiceImplTest, UploadAttachments_AllMissingFromStore) { | 448 TEST_F(AttachmentServiceImplTest, UploadAttachments_AllMissingFromStore) { |
| 426 AttachmentIdSet attachment_ids; | 449 AttachmentIdSet attachment_ids; |
| 427 const unsigned num_attachments = 2; | 450 const unsigned num_attachments = 2; |
| 428 for (unsigned i = 0; i < num_attachments; ++i) { | 451 for (unsigned i = 0; i < num_attachments; ++i) { |
| 429 attachment_ids.insert(AttachmentId::Create()); | 452 attachment_ids.insert(AttachmentId::Create()); |
| 430 } | 453 } |
| 431 attachment_service()->UploadAttachments(attachment_ids); | 454 attachment_service()->UploadAttachments(attachment_ids); |
| 432 | 455 |
| 433 for (unsigned i = 0; i < num_attachments; ++i) { | 456 for (unsigned i = 0; i < num_attachments; ++i) { |
| 434 RunLoop(); | 457 RunLoopAndFireTimer(); |
| 435 ASSERT_GE(1U, store()->read_ids.size()); | 458 ASSERT_GE(store()->read_ids.size(), 1U); |
| 436 // None found! | 459 // None found! |
| 437 store()->RespondToRead(AttachmentIdSet()); | 460 store()->RespondToRead(AttachmentIdSet()); |
| 438 } | 461 } |
| 439 RunLoop(); | 462 RunLoop(); |
| 440 | 463 |
| 441 // Nothing uploaded. | 464 // Nothing uploaded. |
| 442 EXPECT_EQ(0U, uploader()->upload_requests.size()); | 465 EXPECT_EQ(0U, uploader()->upload_requests.size()); |
| 443 // See that the delegate was never called. | 466 // See that the delegate was never called. |
| 444 ASSERT_EQ(0U, on_attachment_uploaded_list().size()); | 467 ASSERT_EQ(0U, on_attachment_uploaded_list().size()); |
| 445 } | 468 } |
| (...skipping 13 matching lines...) Expand all Loading... |
| 459 | 482 |
| 460 // Upload three attachments. For one of them, server responds with error. | 483 // Upload three attachments. For one of them, server responds with error. |
| 461 TEST_F(AttachmentServiceImplTest, UploadAttachments_OneUploadFails) { | 484 TEST_F(AttachmentServiceImplTest, UploadAttachments_OneUploadFails) { |
| 462 AttachmentIdSet attachment_ids; | 485 AttachmentIdSet attachment_ids; |
| 463 const unsigned num_attachments = 3; | 486 const unsigned num_attachments = 3; |
| 464 for (unsigned i = 0; i < num_attachments; ++i) { | 487 for (unsigned i = 0; i < num_attachments; ++i) { |
| 465 attachment_ids.insert(AttachmentId::Create()); | 488 attachment_ids.insert(AttachmentId::Create()); |
| 466 } | 489 } |
| 467 attachment_service()->UploadAttachments(attachment_ids); | 490 attachment_service()->UploadAttachments(attachment_ids); |
| 468 | 491 |
| 469 for (unsigned i = 0; i < num_attachments; ++i) { | 492 for (unsigned i = 0; i < 3; ++i) { |
| 470 RunLoop(); | 493 RunLoopAndFireTimer(); |
| 471 ASSERT_GE(1U, store()->read_ids.size()); | 494 ASSERT_GE(store()->read_ids.size(), 1U); |
| 472 store()->RespondToRead(attachment_ids); | 495 store()->RespondToRead(attachment_ids); |
| 473 RunLoop(); | 496 RunLoop(); |
| 474 ASSERT_EQ(1U, uploader()->upload_requests.size()); | 497 ASSERT_EQ(1U, uploader()->upload_requests.size()); |
| 475 AttachmentUploader::UploadResult result = | 498 AttachmentUploader::UploadResult result = |
| 476 AttachmentUploader::UPLOAD_SUCCESS; | 499 AttachmentUploader::UPLOAD_SUCCESS; |
| 477 // Fail the 2nd one. | 500 // Fail the 2nd one. |
| 478 if (i == 2U) { | 501 if (i == 2U) { |
| 479 result = AttachmentUploader::UPLOAD_UNSPECIFIED_ERROR; | 502 result = AttachmentUploader::UPLOAD_UNSPECIFIED_ERROR; |
| 480 } else { | 503 } else { |
| 481 result = AttachmentUploader::UPLOAD_SUCCESS; | 504 result = AttachmentUploader::UPLOAD_SUCCESS; |
| 482 } | 505 } |
| 483 uploader()->RespondToUpload(uploader()->upload_requests.begin()->first, | 506 uploader()->RespondToUpload(uploader()->upload_requests.begin()->first, |
| 484 result); | 507 result); |
| 508 RunLoop(); |
| 485 } | 509 } |
| 486 RunLoop(); | |
| 487 ASSERT_EQ(2U, on_attachment_uploaded_list().size()); | 510 ASSERT_EQ(2U, on_attachment_uploaded_list().size()); |
| 488 } | 511 } |
| 489 | 512 |
| 513 // Attempt an upload, respond with transient error to trigger backoff, issue |
| 514 // network disconnect/connect events and see that backoff is cleared. |
| 515 TEST_F(AttachmentServiceImplTest, |
| 516 UploadAttachments_ResetBackoffAfterNetworkChange) { |
| 517 AttachmentIdSet attachment_ids; |
| 518 attachment_ids.insert(AttachmentId::Create()); |
| 519 attachment_service()->UploadAttachments(attachment_ids); |
| 520 |
| 521 RunLoopAndFireTimer(); |
| 522 ASSERT_EQ(1U, store()->read_ids.size()); |
| 523 store()->RespondToRead(attachment_ids); |
| 524 RunLoop(); |
| 525 ASSERT_EQ(1U, uploader()->upload_requests.size()); |
| 526 |
| 527 uploader()->RespondToUpload(uploader()->upload_requests.begin()->first, |
| 528 AttachmentUploader::UPLOAD_TRANSIENT_ERROR); |
| 529 RunLoop(); |
| 530 |
| 531 // See that we are in backoff. |
| 532 ASSERT_TRUE(mock_timer()->IsRunning()); |
| 533 ASSERT_GT(mock_timer()->GetCurrentDelay(), base::TimeDelta()); |
| 534 |
| 535 // Issue a network disconnect event. |
| 536 network_change_notifier()->NotifyObserversOfNetworkChangeForTests( |
| 537 net::NetworkChangeNotifier::CONNECTION_NONE); |
| 538 RunLoop(); |
| 539 |
| 540 // Still in backoff. |
| 541 ASSERT_TRUE(mock_timer()->IsRunning()); |
| 542 ASSERT_GT(mock_timer()->GetCurrentDelay(), base::TimeDelta()); |
| 543 |
| 544 // Issue a network connect event. |
| 545 net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests( |
| 546 net::NetworkChangeNotifier::CONNECTION_WIFI); |
| 547 RunLoop(); |
| 548 |
| 549 // No longer in backoff. |
| 550 ASSERT_TRUE(mock_timer()->IsRunning()); |
| 551 ASSERT_EQ(base::TimeDelta(), mock_timer()->GetCurrentDelay()); |
| 552 } |
| 553 |
| 490 } // namespace syncer | 554 } // namespace syncer |
| OLD | NEW |