| Index: sync/internal_api/attachments/attachment_service_impl_unittest.cc
|
| diff --git a/sync/internal_api/attachments/attachment_service_impl_unittest.cc b/sync/internal_api/attachments/attachment_service_impl_unittest.cc
|
| index dbbf89fdb8235000623e3287058100be2d23c58f..85bbb6a9a8d2671919e06a1db6d80779ff64bc2c 100644
|
| --- a/sync/internal_api/attachments/attachment_service_impl_unittest.cc
|
| +++ b/sync/internal_api/attachments/attachment_service_impl_unittest.cc
|
| @@ -8,6 +8,7 @@
|
| #include "base/memory/weak_ptr.h"
|
| #include "base/message_loop/message_loop.h"
|
| #include "base/run_loop.h"
|
| +#include "base/timer/mock_timer.h"
|
| #include "sync/internal_api/public/attachments/fake_attachment_downloader.h"
|
| #include "sync/internal_api/public/attachments/fake_attachment_uploader.h"
|
| #include "testing/gmock/include/gmock/gmock-matchers.h"
|
| @@ -155,6 +156,7 @@ class AttachmentServiceImplTest : public testing::Test,
|
| AttachmentServiceImplTest() {}
|
|
|
| virtual void SetUp() OVERRIDE {
|
| + network_change_notifier_.reset(net::NetworkChangeNotifier::CreateMock());
|
| InitializeAttachmentService(make_scoped_ptr(new MockAttachmentUploader()),
|
| make_scoped_ptr(new MockAttachmentDownloader()),
|
| this);
|
| @@ -192,12 +194,19 @@ class AttachmentServiceImplTest : public testing::Test,
|
| uploader.PassAs<AttachmentUploader>(),
|
| downloader.PassAs<AttachmentDownloader>(),
|
| delegate,
|
| - base::TimeDelta(),
|
| - base::TimeDelta()));
|
| + base::TimeDelta::FromMinutes(1),
|
| + base::TimeDelta::FromMinutes(8)));
|
| +
|
| + scoped_ptr<base::MockTimer> timer_to_pass(
|
| + new base::MockTimer(false, false));
|
| + mock_timer_ = timer_to_pass.get();
|
| + attachment_service_->SetTimerForTest(timer_to_pass.PassAs<base::Timer>());
|
| }
|
|
|
| AttachmentService* attachment_service() { return attachment_service_.get(); }
|
|
|
| + base::MockTimer* mock_timer() { return mock_timer_; }
|
| +
|
| AttachmentService::GetOrDownloadCallback download_callback() {
|
| return base::Bind(&AttachmentServiceImplTest::DownloadDone,
|
| base::Unretained(this));
|
| @@ -214,6 +223,14 @@ class AttachmentServiceImplTest : public testing::Test,
|
| run_loop.RunUntilIdle();
|
| }
|
|
|
| + void RunLoopAndFireTimer() {
|
| + RunLoop();
|
| + if (mock_timer()->IsRunning()) {
|
| + mock_timer()->Fire();
|
| + }
|
| + RunLoop();
|
| + }
|
| +
|
| const std::vector<AttachmentService::GetOrDownloadResult>&
|
| download_results() const {
|
| return download_results_;
|
| @@ -223,6 +240,10 @@ class AttachmentServiceImplTest : public testing::Test,
|
| return *last_download_attachments_.get();
|
| }
|
|
|
| + net::NetworkChangeNotifier* network_change_notifier() {
|
| + return network_change_notifier_.get();
|
| + }
|
| +
|
| MockAttachmentStore* store() { return attachment_store_.get(); }
|
|
|
| MockAttachmentDownloader* downloader() {
|
| @@ -239,10 +260,12 @@ class AttachmentServiceImplTest : public testing::Test,
|
|
|
| private:
|
| base::MessageLoop message_loop_;
|
| + scoped_ptr<net::NetworkChangeNotifier> network_change_notifier_;
|
| base::WeakPtr<MockAttachmentStore> attachment_store_;
|
| base::WeakPtr<MockAttachmentDownloader> attachment_downloader_;
|
| base::WeakPtr<MockAttachmentUploader> attachment_uploader_;
|
| - scoped_ptr<AttachmentService> attachment_service_;
|
| + scoped_ptr<AttachmentServiceImpl> attachment_service_;
|
| + base::MockTimer* mock_timer_; // not owned
|
|
|
| std::vector<AttachmentService::GetOrDownloadResult> download_results_;
|
| scoped_ptr<AttachmentMap> last_download_attachments_;
|
| @@ -353,13 +376,13 @@ TEST_F(AttachmentServiceImplTest, UploadAttachments_Success) {
|
| attachment_service()->UploadAttachments(attachment_ids);
|
|
|
| for (unsigned i = 0; i < num_attachments; ++i) {
|
| - RunLoop();
|
| + RunLoopAndFireTimer();
|
| // See that the service has issued a read for at least one of the
|
| // attachments.
|
| - ASSERT_GE(1U, store()->read_ids.size());
|
| + ASSERT_GE(store()->read_ids.size(), 1U);
|
| store()->RespondToRead(attachment_ids);
|
| RunLoop();
|
| - ASSERT_GE(1U, uploader()->upload_requests.size());
|
| + ASSERT_GE(uploader()->upload_requests.size(), 1U);
|
| uploader()->RespondToUpload(uploader()->upload_requests.begin()->first,
|
| AttachmentUploader::UPLOAD_SUCCESS);
|
| }
|
| @@ -384,13 +407,13 @@ TEST_F(AttachmentServiceImplTest, UploadAttachments_Success_NoDelegate) {
|
| AttachmentIdSet attachment_ids;
|
| attachment_ids.insert(AttachmentId::Create());
|
| attachment_service()->UploadAttachments(attachment_ids);
|
| - RunLoop();
|
| - EXPECT_EQ(1U, store()->read_ids.size());
|
| - EXPECT_EQ(0U, uploader()->upload_requests.size());
|
| + RunLoopAndFireTimer();
|
| + ASSERT_EQ(1U, store()->read_ids.size());
|
| + ASSERT_EQ(0U, uploader()->upload_requests.size());
|
| store()->RespondToRead(attachment_ids);
|
| RunLoop();
|
| - EXPECT_EQ(0U, store()->read_ids.size());
|
| - EXPECT_EQ(1U, uploader()->upload_requests.size());
|
| + ASSERT_EQ(0U, store()->read_ids.size());
|
| + ASSERT_EQ(1U, uploader()->upload_requests.size());
|
| uploader()->RespondToUpload(*attachment_ids.begin(),
|
| AttachmentUploader::UPLOAD_SUCCESS);
|
| RunLoop();
|
| @@ -402,8 +425,8 @@ TEST_F(AttachmentServiceImplTest, UploadAttachments_SomeMissingFromStore) {
|
| attachment_ids.insert(AttachmentId::Create());
|
| attachment_ids.insert(AttachmentId::Create());
|
| attachment_service()->UploadAttachments(attachment_ids);
|
| - RunLoop();
|
| - ASSERT_GE(1U, store()->read_ids.size());
|
| + RunLoopAndFireTimer();
|
| + ASSERT_GE(store()->read_ids.size(), 1U);
|
|
|
| ASSERT_EQ(0U, uploader()->upload_requests.size());
|
| store()->RespondToRead(attachment_ids);
|
| @@ -412,9 +435,9 @@ TEST_F(AttachmentServiceImplTest, UploadAttachments_SomeMissingFromStore) {
|
|
|
| uploader()->RespondToUpload(uploader()->upload_requests.begin()->first,
|
| AttachmentUploader::UPLOAD_SUCCESS);
|
| - RunLoop();
|
| + RunLoopAndFireTimer();
|
| ASSERT_EQ(1U, on_attachment_uploaded_list().size());
|
| - ASSERT_GE(1U, store()->read_ids.size());
|
| + ASSERT_GE(store()->read_ids.size(), 1U);
|
| // Not found!
|
| store()->RespondToRead(AttachmentIdSet());
|
| RunLoop();
|
| @@ -431,8 +454,8 @@ TEST_F(AttachmentServiceImplTest, UploadAttachments_AllMissingFromStore) {
|
| attachment_service()->UploadAttachments(attachment_ids);
|
|
|
| for (unsigned i = 0; i < num_attachments; ++i) {
|
| - RunLoop();
|
| - ASSERT_GE(1U, store()->read_ids.size());
|
| + RunLoopAndFireTimer();
|
| + ASSERT_GE(store()->read_ids.size(), 1U);
|
| // None found!
|
| store()->RespondToRead(AttachmentIdSet());
|
| }
|
| @@ -466,9 +489,9 @@ TEST_F(AttachmentServiceImplTest, UploadAttachments_OneUploadFails) {
|
| }
|
| attachment_service()->UploadAttachments(attachment_ids);
|
|
|
| - for (unsigned i = 0; i < num_attachments; ++i) {
|
| - RunLoop();
|
| - ASSERT_GE(1U, store()->read_ids.size());
|
| + for (unsigned i = 0; i < 3; ++i) {
|
| + RunLoopAndFireTimer();
|
| + ASSERT_GE(store()->read_ids.size(), 1U);
|
| store()->RespondToRead(attachment_ids);
|
| RunLoop();
|
| ASSERT_EQ(1U, uploader()->upload_requests.size());
|
| @@ -482,9 +505,50 @@ TEST_F(AttachmentServiceImplTest, UploadAttachments_OneUploadFails) {
|
| }
|
| uploader()->RespondToUpload(uploader()->upload_requests.begin()->first,
|
| result);
|
| + RunLoop();
|
| }
|
| - RunLoop();
|
| ASSERT_EQ(2U, on_attachment_uploaded_list().size());
|
| }
|
|
|
| +// Attempt an upload, respond with transient error to trigger backoff, issue
|
| +// network disconnect/connect events and see that backoff is cleared.
|
| +TEST_F(AttachmentServiceImplTest,
|
| + UploadAttachments_ResetBackoffAfterNetworkChange) {
|
| + AttachmentIdSet attachment_ids;
|
| + attachment_ids.insert(AttachmentId::Create());
|
| + attachment_service()->UploadAttachments(attachment_ids);
|
| +
|
| + RunLoopAndFireTimer();
|
| + ASSERT_EQ(1U, store()->read_ids.size());
|
| + store()->RespondToRead(attachment_ids);
|
| + RunLoop();
|
| + ASSERT_EQ(1U, uploader()->upload_requests.size());
|
| +
|
| + uploader()->RespondToUpload(uploader()->upload_requests.begin()->first,
|
| + AttachmentUploader::UPLOAD_TRANSIENT_ERROR);
|
| + RunLoop();
|
| +
|
| + // See that we are in backoff.
|
| + ASSERT_TRUE(mock_timer()->IsRunning());
|
| + ASSERT_GT(mock_timer()->GetCurrentDelay(), base::TimeDelta());
|
| +
|
| + // Issue a network disconnect event.
|
| + network_change_notifier()->NotifyObserversOfNetworkChangeForTests(
|
| + net::NetworkChangeNotifier::CONNECTION_NONE);
|
| + RunLoop();
|
| +
|
| + // Still in backoff.
|
| + ASSERT_TRUE(mock_timer()->IsRunning());
|
| + ASSERT_GT(mock_timer()->GetCurrentDelay(), base::TimeDelta());
|
| +
|
| + // Issue a network connect event.
|
| + net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
|
| + net::NetworkChangeNotifier::CONNECTION_WIFI);
|
| + RunLoop();
|
| +
|
| + // No longer in backoff.
|
| + ASSERT_TRUE(mock_timer()->IsRunning());
|
| + ASSERT_EQ(base::TimeDelta(), mock_timer()->GetCurrentDelay());
|
| +}
|
| +
|
| } // namespace syncer
|
|
|