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 |
deleted file mode 100644 |
index 792408971b453c6bbc405cf2577fca54e635b7eb..0000000000000000000000000000000000000000 |
--- a/sync/internal_api/attachments/attachment_service_impl_unittest.cc |
+++ /dev/null |
@@ -1,640 +0,0 @@ |
-// Copyright 2014 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "sync/internal_api/public/attachments/attachment_service_impl.h" |
- |
-#include <algorithm> |
-#include <map> |
-#include <utility> |
-#include <vector> |
- |
-#include "base/bind.h" |
-#include "base/location.h" |
-#include "base/macros.h" |
-#include "base/memory/ptr_util.h" |
-#include "base/memory/weak_ptr.h" |
-#include "base/message_loop/message_loop.h" |
-#include "base/run_loop.h" |
-#include "base/single_thread_task_runner.h" |
-#include "base/threading/thread_task_runner_handle.h" |
-#include "base/timer/mock_timer.h" |
-#include "sync/api/attachments/attachment_store_backend.h" |
-#include "sync/internal_api/public/attachments/attachment_util.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" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-namespace syncer { |
- |
-namespace { |
- |
-class MockAttachmentStoreBackend |
- : public AttachmentStoreBackend, |
- public base::SupportsWeakPtr<MockAttachmentStoreBackend> { |
- public: |
- MockAttachmentStoreBackend( |
- const scoped_refptr<base::SequencedTaskRunner>& callback_task_runner) |
- : AttachmentStoreBackend(callback_task_runner) {} |
- |
- ~MockAttachmentStoreBackend() override {} |
- |
- void Init(const AttachmentStore::InitCallback& callback) override {} |
- |
- void Read(AttachmentStore::Component component, |
- const AttachmentIdList& ids, |
- const AttachmentStore::ReadCallback& callback) override { |
- read_ids.push_back(ids); |
- read_callbacks.push_back(callback); |
- } |
- |
- void Write(AttachmentStore::Component component, |
- const AttachmentList& attachments, |
- const AttachmentStore::WriteCallback& callback) override { |
- write_attachments.push_back(attachments); |
- write_callbacks.push_back(callback); |
- } |
- |
- void SetReference(AttachmentStore::Component component, |
- const AttachmentIdList& ids) override { |
- set_reference_ids.push_back(std::make_pair(component, ids)); |
- } |
- |
- void DropReference(AttachmentStore::Component component, |
- const AttachmentIdList& ids, |
- const AttachmentStore::DropCallback& callback) override { |
- ASSERT_EQ(AttachmentStore::SYNC, component); |
- drop_ids.push_back(ids); |
- } |
- |
- void ReadMetadataById( |
- AttachmentStore::Component component, |
- const AttachmentIdList& ids, |
- const AttachmentStore::ReadMetadataCallback& callback) override { |
- NOTREACHED(); |
- } |
- |
- void ReadMetadata( |
- AttachmentStore::Component component, |
- const AttachmentStore::ReadMetadataCallback& callback) override { |
- NOTREACHED(); |
- } |
- |
- // Respond to Read request. Attachments found in local_attachments should be |
- // returned, everything else should be reported unavailable. |
- void RespondToRead(const AttachmentIdSet& local_attachments) { |
- scoped_refptr<base::RefCountedString> data = new base::RefCountedString(); |
- AttachmentStore::ReadCallback callback = read_callbacks.back(); |
- AttachmentIdList ids = read_ids.back(); |
- read_callbacks.pop_back(); |
- read_ids.pop_back(); |
- |
- std::unique_ptr<AttachmentMap> attachments(new AttachmentMap()); |
- std::unique_ptr<AttachmentIdList> unavailable_attachments( |
- new AttachmentIdList()); |
- for (AttachmentIdList::const_iterator iter = ids.begin(); iter != ids.end(); |
- ++iter) { |
- if (local_attachments.find(*iter) != local_attachments.end()) { |
- Attachment attachment = Attachment::CreateFromParts(*iter, data); |
- attachments->insert(std::make_pair(*iter, attachment)); |
- } else { |
- unavailable_attachments->push_back(*iter); |
- } |
- } |
- AttachmentStore::Result result = unavailable_attachments->empty() |
- ? AttachmentStore::SUCCESS |
- : AttachmentStore::UNSPECIFIED_ERROR; |
- |
- base::ThreadTaskRunnerHandle::Get()->PostTask( |
- FROM_HERE, base::Bind(callback, result, base::Passed(&attachments), |
- base::Passed(&unavailable_attachments))); |
- } |
- |
- // Respond to Write request with |result|. |
- void RespondToWrite(const AttachmentStore::Result& result) { |
- AttachmentStore::WriteCallback callback = write_callbacks.back(); |
- write_callbacks.pop_back(); |
- write_attachments.pop_back(); |
- base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
- base::Bind(callback, result)); |
- } |
- |
- std::vector<AttachmentIdList> read_ids; |
- std::vector<AttachmentStore::ReadCallback> read_callbacks; |
- std::vector<AttachmentList> write_attachments; |
- std::vector<AttachmentStore::WriteCallback> write_callbacks; |
- std::vector<std::pair<AttachmentStore::Component, AttachmentIdList>> |
- set_reference_ids; |
- std::vector<AttachmentIdList> drop_ids; |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(MockAttachmentStoreBackend); |
-}; |
- |
-class MockAttachmentDownloader |
- : public AttachmentDownloader, |
- public base::SupportsWeakPtr<MockAttachmentDownloader> { |
- public: |
- MockAttachmentDownloader() {} |
- |
- void DownloadAttachment(const AttachmentId& id, |
- const DownloadCallback& callback) override { |
- ASSERT_TRUE(download_requests.find(id) == download_requests.end()); |
- download_requests.insert(std::make_pair(id, callback)); |
- } |
- |
- // Multiple requests to download will be active at the same time. |
- // RespondToDownload should respond to only one of them. |
- void RespondToDownload(const AttachmentId& id, const DownloadResult& result) { |
- ASSERT_TRUE(download_requests.find(id) != download_requests.end()); |
- std::unique_ptr<Attachment> attachment; |
- if (result == DOWNLOAD_SUCCESS) { |
- scoped_refptr<base::RefCountedString> data = new base::RefCountedString(); |
- attachment.reset(new Attachment(Attachment::CreateFromParts(id, data))); |
- } |
- base::ThreadTaskRunnerHandle::Get()->PostTask( |
- FROM_HERE, |
- base::Bind(download_requests[id], result, base::Passed(&attachment))); |
- |
- download_requests.erase(id); |
- } |
- |
- std::map<AttachmentId, DownloadCallback> download_requests; |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(MockAttachmentDownloader); |
-}; |
- |
-class MockAttachmentUploader |
- : public AttachmentUploader, |
- public base::SupportsWeakPtr<MockAttachmentUploader> { |
- public: |
- MockAttachmentUploader() {} |
- |
- // AttachmentUploader implementation. |
- void UploadAttachment(const Attachment& attachment, |
- const UploadCallback& callback) override { |
- const AttachmentId id = attachment.GetId(); |
- ASSERT_TRUE(upload_requests.find(id) == upload_requests.end()); |
- upload_requests.insert(std::make_pair(id, callback)); |
- } |
- |
- void RespondToUpload(const AttachmentId& id, const UploadResult& result) { |
- ASSERT_TRUE(upload_requests.find(id) != upload_requests.end()); |
- base::ThreadTaskRunnerHandle::Get()->PostTask( |
- FROM_HERE, base::Bind(upload_requests[id], result, id)); |
- upload_requests.erase(id); |
- } |
- |
- std::map<AttachmentId, UploadCallback> upload_requests; |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(MockAttachmentUploader); |
-}; |
- |
-} // namespace |
- |
-class AttachmentServiceImplTest : public testing::Test, |
- public AttachmentService::Delegate { |
- protected: |
- AttachmentServiceImplTest() {} |
- |
- void SetUp() override { |
- network_change_notifier_.reset(net::NetworkChangeNotifier::CreateMock()); |
- InitializeAttachmentService( |
- base::WrapUnique(new MockAttachmentUploader()), |
- base::WrapUnique(new MockAttachmentDownloader()), this); |
- } |
- |
- void TearDown() override { |
- attachment_service_.reset(); |
- RunLoop(); |
- ASSERT_FALSE(attachment_store_backend_); |
- ASSERT_FALSE(attachment_uploader_); |
- ASSERT_FALSE(attachment_downloader_); |
- } |
- |
- // AttachmentService::Delegate implementation. |
- void OnAttachmentUploaded(const AttachmentId& attachment_id) override { |
- on_attachment_uploaded_list_.push_back(attachment_id); |
- } |
- |
- void InitializeAttachmentService( |
- std::unique_ptr<MockAttachmentUploader> uploader, |
- std::unique_ptr<MockAttachmentDownloader> downloader, |
- AttachmentService::Delegate* delegate) { |
- // Initialize mock attachment store |
- scoped_refptr<base::SingleThreadTaskRunner> runner = |
- base::ThreadTaskRunnerHandle::Get(); |
- std::unique_ptr<MockAttachmentStoreBackend> attachment_store_backend( |
- new MockAttachmentStoreBackend(runner)); |
- attachment_store_backend_ = attachment_store_backend->AsWeakPtr(); |
- std::unique_ptr<AttachmentStore> attachment_store = |
- AttachmentStore::CreateMockStoreForTest( |
- std::move(attachment_store_backend)); |
- |
- if (uploader.get()) { |
- attachment_uploader_ = uploader->AsWeakPtr(); |
- } |
- if (downloader.get()) { |
- attachment_downloader_ = downloader->AsWeakPtr(); |
- } |
- attachment_service_.reset(new AttachmentServiceImpl( |
- attachment_store->CreateAttachmentStoreForSync(), std::move(uploader), |
- std::move(downloader), delegate, base::TimeDelta::FromMinutes(1), |
- base::TimeDelta::FromMinutes(8))); |
- |
- std::unique_ptr<base::MockTimer> timer_to_pass( |
- new base::MockTimer(false, false)); |
- mock_timer_ = timer_to_pass.get(); |
- attachment_service_->SetTimerForTest(std::move(timer_to_pass)); |
- } |
- |
- 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)); |
- } |
- |
- void DownloadDone(const AttachmentService::GetOrDownloadResult& result, |
- std::unique_ptr<AttachmentMap> attachments) { |
- download_results_.push_back(result); |
- last_download_attachments_ = std::move(attachments); |
- } |
- |
- void RunLoop() { |
- base::RunLoop run_loop; |
- run_loop.RunUntilIdle(); |
- } |
- |
- void RunLoopAndFireTimer() { |
- RunLoop(); |
- if (mock_timer()->IsRunning()) { |
- mock_timer()->Fire(); |
- RunLoop(); |
- } |
- } |
- |
- static AttachmentIdSet AttachmentIdSetFromList( |
- const AttachmentIdList& id_list) { |
- AttachmentIdSet id_set; |
- std::copy(id_list.begin(), id_list.end(), |
- std::inserter(id_set, id_set.end())); |
- return id_set; |
- } |
- |
- const std::vector<AttachmentService::GetOrDownloadResult>& |
- download_results() const { |
- return download_results_; |
- } |
- |
- const AttachmentMap& last_download_attachments() const { |
- return *last_download_attachments_.get(); |
- } |
- |
- net::NetworkChangeNotifier* network_change_notifier() { |
- return network_change_notifier_.get(); |
- } |
- |
- MockAttachmentStoreBackend* store() { |
- return attachment_store_backend_.get(); |
- } |
- |
- MockAttachmentDownloader* downloader() { |
- return attachment_downloader_.get(); |
- } |
- |
- MockAttachmentUploader* uploader() { |
- return attachment_uploader_.get(); |
- } |
- |
- const std::vector<AttachmentId>& on_attachment_uploaded_list() const { |
- return on_attachment_uploaded_list_; |
- } |
- |
- private: |
- base::MessageLoop message_loop_; |
- std::unique_ptr<net::NetworkChangeNotifier> network_change_notifier_; |
- base::WeakPtr<MockAttachmentStoreBackend> attachment_store_backend_; |
- base::WeakPtr<MockAttachmentDownloader> attachment_downloader_; |
- base::WeakPtr<MockAttachmentUploader> attachment_uploader_; |
- std::unique_ptr<AttachmentServiceImpl> attachment_service_; |
- base::MockTimer* mock_timer_; // not owned |
- |
- std::vector<AttachmentService::GetOrDownloadResult> download_results_; |
- std::unique_ptr<AttachmentMap> last_download_attachments_; |
- std::vector<AttachmentId> on_attachment_uploaded_list_; |
-}; |
- |
-TEST_F(AttachmentServiceImplTest, GetOrDownload_EmptyAttachmentList) { |
- AttachmentIdList attachment_ids; |
- attachment_service()->GetOrDownloadAttachments(attachment_ids, |
- download_callback()); |
- RunLoop(); |
- store()->RespondToRead(AttachmentIdSet()); |
- |
- RunLoop(); |
- EXPECT_EQ(1U, download_results().size()); |
- EXPECT_EQ(0U, last_download_attachments().size()); |
-} |
- |
-TEST_F(AttachmentServiceImplTest, GetOrDownload_Local) { |
- AttachmentIdList attachment_ids; |
- attachment_ids.push_back(AttachmentId::Create(0, 0)); |
- attachment_service()->GetOrDownloadAttachments(attachment_ids, |
- download_callback()); |
- AttachmentIdSet local_attachments; |
- local_attachments.insert(attachment_ids[0]); |
- RunLoop(); |
- EXPECT_EQ(1U, store()->set_reference_ids.size()); |
- EXPECT_EQ(AttachmentStore::MODEL_TYPE, store()->set_reference_ids[0].first); |
- store()->RespondToRead(local_attachments); |
- |
- RunLoop(); |
- EXPECT_EQ(1U, download_results().size()); |
- EXPECT_EQ(1U, last_download_attachments().size()); |
- EXPECT_TRUE(last_download_attachments().find(attachment_ids[0]) != |
- last_download_attachments().end()); |
-} |
- |
-TEST_F(AttachmentServiceImplTest, GetOrDownload_LocalRemoteUnavailable) { |
- // Create attachment list with 4 ids. |
- AttachmentIdList attachment_ids; |
- attachment_ids.push_back(AttachmentId::Create(0, 0)); |
- attachment_ids.push_back(AttachmentId::Create(0, 0)); |
- attachment_ids.push_back(AttachmentId::Create(0, 0)); |
- attachment_ids.push_back(AttachmentId::Create(0, 0)); |
- // Call attachment service. |
- attachment_service()->GetOrDownloadAttachments(attachment_ids, |
- download_callback()); |
- RunLoop(); |
- // Ensure AttachmentStore is called. |
- EXPECT_FALSE(store()->read_ids.empty()); |
- |
- // Make AttachmentStore return only attachment 0. |
- AttachmentIdSet local_attachments; |
- local_attachments.insert(attachment_ids[0]); |
- store()->RespondToRead(local_attachments); |
- RunLoop(); |
- // Ensure Downloader called with right attachment ids |
- EXPECT_EQ(3U, downloader()->download_requests.size()); |
- |
- // Make downloader return attachment 1. |
- downloader()->RespondToDownload(attachment_ids[1], |
- AttachmentDownloader::DOWNLOAD_SUCCESS); |
- RunLoop(); |
- // Ensure consumer callback is not called. |
- EXPECT_TRUE(download_results().empty()); |
- // Make AttachmentStore acknowledge writing attachment 1. |
- store()->RespondToWrite(AttachmentStore::SUCCESS); |
- RunLoop(); |
- // Ensure consumer callback is not called. |
- EXPECT_TRUE(download_results().empty()); |
- |
- // Make downloader return attachment 2. |
- downloader()->RespondToDownload(attachment_ids[2], |
- AttachmentDownloader::DOWNLOAD_SUCCESS); |
- RunLoop(); |
- // Ensure consumer callback is not called. |
- EXPECT_TRUE(download_results().empty()); |
- // Make AttachmentStore fail writing attachment 2. |
- store()->RespondToWrite(AttachmentStore::UNSPECIFIED_ERROR); |
- RunLoop(); |
- // Ensure consumer callback is not called. |
- EXPECT_TRUE(download_results().empty()); |
- |
- // Make downloader fail attachment 3. |
- downloader()->RespondToDownload( |
- attachment_ids[3], AttachmentDownloader::DOWNLOAD_UNSPECIFIED_ERROR); |
- RunLoop(); |
- |
- // Ensure callback is called |
- EXPECT_FALSE(download_results().empty()); |
- // There should be only two attachments returned, 0 and 1. |
- EXPECT_EQ(2U, last_download_attachments().size()); |
- EXPECT_TRUE(last_download_attachments().find(attachment_ids[0]) != |
- last_download_attachments().end()); |
- EXPECT_TRUE(last_download_attachments().find(attachment_ids[1]) != |
- last_download_attachments().end()); |
- EXPECT_TRUE(last_download_attachments().find(attachment_ids[2]) == |
- last_download_attachments().end()); |
- EXPECT_TRUE(last_download_attachments().find(attachment_ids[3]) == |
- last_download_attachments().end()); |
-} |
- |
-TEST_F(AttachmentServiceImplTest, GetOrDownload_NoDownloader) { |
- // No downloader. |
- InitializeAttachmentService( |
- base::WrapUnique<MockAttachmentUploader>(new MockAttachmentUploader()), |
- base::WrapUnique<MockAttachmentDownloader>(NULL), this); |
- |
- AttachmentIdList attachment_ids; |
- attachment_ids.push_back(AttachmentId::Create(0, 0)); |
- attachment_service()->GetOrDownloadAttachments(attachment_ids, |
- download_callback()); |
- RunLoop(); |
- EXPECT_FALSE(store()->read_ids.empty()); |
- |
- AttachmentIdSet local_attachments; |
- store()->RespondToRead(local_attachments); |
- RunLoop(); |
- ASSERT_EQ(1U, download_results().size()); |
- EXPECT_EQ(AttachmentService::GET_UNSPECIFIED_ERROR, download_results()[0]); |
- EXPECT_TRUE(last_download_attachments().empty()); |
-} |
- |
-TEST_F(AttachmentServiceImplTest, UploadAttachments_Success) { |
- AttachmentIdList attachment_ids; |
- const unsigned num_attachments = 3; |
- for (unsigned i = 0; i < num_attachments; ++i) { |
- attachment_ids.push_back(AttachmentId::Create(0, 0)); |
- } |
- attachment_service()->UploadAttachments(attachment_ids); |
- RunLoop(); |
- ASSERT_EQ(1U, store()->set_reference_ids.size()); |
- EXPECT_EQ(AttachmentStore::SYNC, store()->set_reference_ids[0].first); |
- for (unsigned i = 0; i < num_attachments; ++i) { |
- RunLoopAndFireTimer(); |
- // See that the service has issued a read for at least one of the |
- // attachments. |
- ASSERT_GE(store()->read_ids.size(), 1U); |
- store()->RespondToRead(AttachmentIdSetFromList(attachment_ids)); |
- RunLoop(); |
- ASSERT_GE(uploader()->upload_requests.size(), 1U); |
- uploader()->RespondToUpload(uploader()->upload_requests.begin()->first, |
- AttachmentUploader::UPLOAD_SUCCESS); |
- } |
- RunLoop(); |
- ASSERT_EQ(0U, store()->read_ids.size()); |
- ASSERT_EQ(0U, uploader()->upload_requests.size()); |
- |
- // See that all the attachments were uploaded. |
- ASSERT_EQ(attachment_ids.size(), on_attachment_uploaded_list().size()); |
- for (auto iter = attachment_ids.begin(); iter != attachment_ids.end(); |
- ++iter) { |
- EXPECT_THAT(on_attachment_uploaded_list(), testing::Contains(*iter)); |
- } |
- EXPECT_EQ(num_attachments, store()->drop_ids.size()); |
-} |
- |
-TEST_F(AttachmentServiceImplTest, UploadAttachments_Success_NoDelegate) { |
- InitializeAttachmentService(base::WrapUnique(new MockAttachmentUploader()), |
- base::WrapUnique(new MockAttachmentDownloader()), |
- NULL); // No delegate. |
- |
- AttachmentIdList attachment_ids; |
- attachment_ids.push_back(AttachmentId::Create(0, 0)); |
- attachment_service()->UploadAttachments(attachment_ids); |
- RunLoopAndFireTimer(); |
- ASSERT_EQ(1U, store()->read_ids.size()); |
- ASSERT_EQ(0U, uploader()->upload_requests.size()); |
- store()->RespondToRead(AttachmentIdSetFromList(attachment_ids)); |
- RunLoop(); |
- ASSERT_EQ(0U, store()->read_ids.size()); |
- ASSERT_EQ(1U, uploader()->upload_requests.size()); |
- uploader()->RespondToUpload(*attachment_ids.begin(), |
- AttachmentUploader::UPLOAD_SUCCESS); |
- RunLoop(); |
- ASSERT_TRUE(on_attachment_uploaded_list().empty()); |
-} |
- |
-TEST_F(AttachmentServiceImplTest, UploadAttachments_SomeMissingFromStore) { |
- AttachmentIdList attachment_ids; |
- attachment_ids.push_back(AttachmentId::Create(0, 0)); |
- attachment_ids.push_back(AttachmentId::Create(0, 0)); |
- attachment_service()->UploadAttachments(attachment_ids); |
- RunLoopAndFireTimer(); |
- ASSERT_GE(store()->read_ids.size(), 1U); |
- |
- ASSERT_EQ(0U, uploader()->upload_requests.size()); |
- store()->RespondToRead(AttachmentIdSetFromList(attachment_ids)); |
- RunLoop(); |
- ASSERT_EQ(1U, uploader()->upload_requests.size()); |
- |
- uploader()->RespondToUpload(uploader()->upload_requests.begin()->first, |
- AttachmentUploader::UPLOAD_SUCCESS); |
- RunLoopAndFireTimer(); |
- ASSERT_EQ(1U, on_attachment_uploaded_list().size()); |
- ASSERT_GE(store()->read_ids.size(), 1U); |
- // Not found! |
- store()->RespondToRead(AttachmentIdSet()); |
- RunLoop(); |
- // No upload requests since the read failed. |
- ASSERT_EQ(0U, uploader()->upload_requests.size()); |
- EXPECT_EQ(attachment_ids.size(), store()->drop_ids.size()); |
-} |
- |
-TEST_F(AttachmentServiceImplTest, UploadAttachments_AllMissingFromStore) { |
- AttachmentIdList attachment_ids; |
- const unsigned num_attachments = 2; |
- for (unsigned i = 0; i < num_attachments; ++i) { |
- attachment_ids.push_back(AttachmentId::Create(0, 0)); |
- } |
- attachment_service()->UploadAttachments(attachment_ids); |
- |
- for (unsigned i = 0; i < num_attachments; ++i) { |
- RunLoopAndFireTimer(); |
- ASSERT_GE(store()->read_ids.size(), 1U); |
- // None found! |
- store()->RespondToRead(AttachmentIdSet()); |
- } |
- RunLoop(); |
- |
- // Nothing uploaded. |
- EXPECT_EQ(0U, uploader()->upload_requests.size()); |
- // See that the delegate was never called. |
- ASSERT_EQ(0U, on_attachment_uploaded_list().size()); |
- EXPECT_EQ(num_attachments, store()->drop_ids.size()); |
-} |
- |
-TEST_F(AttachmentServiceImplTest, UploadAttachments_NoUploader) { |
- InitializeAttachmentService(base::WrapUnique<MockAttachmentUploader>(NULL), |
- base::WrapUnique(new MockAttachmentDownloader()), |
- this); |
- |
- AttachmentIdList attachment_ids; |
- attachment_ids.push_back(AttachmentId::Create(0, 0)); |
- attachment_service()->UploadAttachments(attachment_ids); |
- RunLoop(); |
- EXPECT_EQ(0U, store()->read_ids.size()); |
- ASSERT_EQ(0U, on_attachment_uploaded_list().size()); |
- EXPECT_EQ(0U, store()->drop_ids.size()); |
-} |
- |
-// Upload three attachments. For one of them, server responds with error. |
-TEST_F(AttachmentServiceImplTest, UploadAttachments_OneUploadFails) { |
- AttachmentIdList attachment_ids; |
- const unsigned num_attachments = 3; |
- for (unsigned i = 0; i < num_attachments; ++i) { |
- attachment_ids.push_back(AttachmentId::Create(0, 0)); |
- } |
- attachment_service()->UploadAttachments(attachment_ids); |
- |
- for (unsigned i = 0; i < 3; ++i) { |
- RunLoopAndFireTimer(); |
- ASSERT_GE(store()->read_ids.size(), 1U); |
- store()->RespondToRead(AttachmentIdSetFromList(attachment_ids)); |
- RunLoop(); |
- ASSERT_EQ(1U, uploader()->upload_requests.size()); |
- AttachmentUploader::UploadResult result = |
- AttachmentUploader::UPLOAD_SUCCESS; |
- // Fail the 2nd one. |
- if (i == 2U) { |
- result = AttachmentUploader::UPLOAD_UNSPECIFIED_ERROR; |
- } else { |
- result = AttachmentUploader::UPLOAD_SUCCESS; |
- } |
- uploader()->RespondToUpload(uploader()->upload_requests.begin()->first, |
- result); |
- RunLoop(); |
- } |
- ASSERT_EQ(2U, on_attachment_uploaded_list().size()); |
- EXPECT_EQ(num_attachments, store()->drop_ids.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) { |
- AttachmentIdList attachment_ids; |
- attachment_ids.push_back(AttachmentId::Create(0, 0)); |
- attachment_service()->UploadAttachments(attachment_ids); |
- |
- RunLoopAndFireTimer(); |
- ASSERT_EQ(1U, store()->read_ids.size()); |
- store()->RespondToRead(AttachmentIdSetFromList(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 |