| Index: sync/api/attachments/attachment_service_impl_unittest.cc
|
| diff --git a/sync/api/attachments/attachment_service_impl_unittest.cc b/sync/api/attachments/attachment_service_impl_unittest.cc
|
| deleted file mode 100644
|
| index dcb96b84aba33e6cdc29b8d7b8b1b68b7755d207..0000000000000000000000000000000000000000
|
| --- a/sync/api/attachments/attachment_service_impl_unittest.cc
|
| +++ /dev/null
|
| @@ -1,452 +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/api/attachments/attachment_service_impl.h"
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/memory/weak_ptr.h"
|
| -#include "base/message_loop/message_loop.h"
|
| -#include "base/run_loop.h"
|
| -#include "sync/internal_api/public/attachments/fake_attachment_downloader.h"
|
| -#include "sync/internal_api/public/attachments/fake_attachment_uploader.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -namespace syncer {
|
| -
|
| -class MockAttachmentStore : public AttachmentStore,
|
| - public base::SupportsWeakPtr<MockAttachmentStore> {
|
| - public:
|
| - MockAttachmentStore() {}
|
| -
|
| - virtual void Read(const AttachmentIdList& ids,
|
| - const ReadCallback& callback) OVERRIDE {
|
| - read_ids.push_back(ids);
|
| - read_callbacks.push_back(callback);
|
| - }
|
| -
|
| - virtual void Write(const AttachmentList& attachments,
|
| - const WriteCallback& callback) OVERRIDE {
|
| - write_attachments.push_back(attachments);
|
| - write_callbacks.push_back(callback);
|
| - }
|
| -
|
| - virtual void Drop(const AttachmentIdList& ids,
|
| - const DropCallback& 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();
|
| - ReadCallback callback = read_callbacks.back();
|
| - AttachmentIdList ids = read_ids.back();
|
| - read_callbacks.pop_back();
|
| - read_ids.pop_back();
|
| -
|
| - scoped_ptr<AttachmentMap> attachments(new AttachmentMap());
|
| - scoped_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::CreateWithId(*iter, data);
|
| - attachments->insert(std::make_pair(*iter, attachment));
|
| - } else {
|
| - unavailable_attachments->push_back(*iter);
|
| - }
|
| - }
|
| - Result result =
|
| - unavailable_attachments->empty() ? SUCCESS : UNSPECIFIED_ERROR;
|
| -
|
| - base::MessageLoop::current()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback,
|
| - result,
|
| - base::Passed(&attachments),
|
| - base::Passed(&unavailable_attachments)));
|
| - }
|
| -
|
| - // Respond to Write request with |result|.
|
| - void RespondToWrite(const Result& result) {
|
| - WriteCallback callback = write_callbacks.back();
|
| - AttachmentList attachments = write_attachments.back();
|
| - write_callbacks.pop_back();
|
| - write_attachments.pop_back();
|
| - base::MessageLoop::current()->PostTask(FROM_HERE,
|
| - base::Bind(callback, result));
|
| - }
|
| -
|
| - std::vector<AttachmentIdList> read_ids;
|
| - std::vector<ReadCallback> read_callbacks;
|
| - std::vector<AttachmentList> write_attachments;
|
| - std::vector<WriteCallback> write_callbacks;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(MockAttachmentStore);
|
| -};
|
| -
|
| -class MockAttachmentDownloader
|
| - : public AttachmentDownloader,
|
| - public base::SupportsWeakPtr<MockAttachmentDownloader> {
|
| - public:
|
| - MockAttachmentDownloader() {}
|
| -
|
| - virtual 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());
|
| - scoped_ptr<Attachment> attachment;
|
| - if (result == DOWNLOAD_SUCCESS) {
|
| - scoped_refptr<base::RefCountedString> data = new base::RefCountedString();
|
| - attachment.reset(new Attachment(Attachment::CreateWithId(id, data)));
|
| - }
|
| - base::MessageLoop::current()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(download_requests[id], result, base::Passed(&attachment)));
|
| -
|
| - download_requests.erase(id);
|
| - }
|
| -
|
| - std::map<AttachmentId, DownloadCallback> download_requests;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(MockAttachmentDownloader);
|
| -};
|
| -
|
| -class MockAttachmentUploader
|
| - : public AttachmentUploader,
|
| - public base::SupportsWeakPtr<MockAttachmentUploader> {
|
| - public:
|
| - MockAttachmentUploader() {}
|
| -
|
| - // AttachmentUploader implementation.
|
| - virtual 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::MessageLoop::current()->PostTask(
|
| - FROM_HERE, base::Bind(upload_requests[id], result, id));
|
| - upload_requests.erase(id);
|
| - }
|
| -
|
| - std::map<AttachmentId, UploadCallback> upload_requests;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(MockAttachmentUploader);
|
| -};
|
| -
|
| -class AttachmentServiceImplTest : public testing::Test,
|
| - public AttachmentService::Delegate {
|
| - protected:
|
| - AttachmentServiceImplTest() {}
|
| -
|
| - virtual void SetUp() OVERRIDE {
|
| - InitializeAttachmentService(make_scoped_ptr(new MockAttachmentUploader()),
|
| - make_scoped_ptr(new MockAttachmentDownloader()),
|
| - this);
|
| - }
|
| -
|
| - virtual void TearDown() OVERRIDE {
|
| - attachment_service_.reset();
|
| - ASSERT_FALSE(attachment_store_);
|
| - ASSERT_FALSE(attachment_uploader_);
|
| - ASSERT_FALSE(attachment_downloader_);
|
| - }
|
| -
|
| - // AttachmentService::Delegate implementation.
|
| - virtual void OnAttachmentUploaded(
|
| - const AttachmentId& attachment_id) OVERRIDE {
|
| - on_attachment_uploaded_list_.push_back(attachment_id);
|
| - }
|
| -
|
| - void InitializeAttachmentService(
|
| - scoped_ptr<MockAttachmentUploader> uploader,
|
| - scoped_ptr<MockAttachmentDownloader> downloader,
|
| - AttachmentService::Delegate* delegate) {
|
| - scoped_ptr<MockAttachmentStore> attachment_store(new MockAttachmentStore());
|
| - attachment_store_ = attachment_store->AsWeakPtr();
|
| -
|
| - if (uploader.get()) {
|
| - attachment_uploader_ = uploader->AsWeakPtr();
|
| - }
|
| - if (downloader.get()) {
|
| - attachment_downloader_ = downloader->AsWeakPtr();
|
| - }
|
| - attachment_service_.reset(
|
| - new AttachmentServiceImpl(attachment_store.PassAs<AttachmentStore>(),
|
| - uploader.PassAs<AttachmentUploader>(),
|
| - downloader.PassAs<AttachmentDownloader>(),
|
| - delegate));
|
| - }
|
| -
|
| - AttachmentService* attachment_service() { return attachment_service_.get(); }
|
| -
|
| - AttachmentService::GetOrDownloadCallback download_callback() {
|
| - return base::Bind(&AttachmentServiceImplTest::DownloadDone,
|
| - base::Unretained(this));
|
| - }
|
| -
|
| - AttachmentService::StoreCallback store_callback() {
|
| - return base::Bind(&AttachmentServiceImplTest::StoreDone,
|
| - base::Unretained(this));
|
| - }
|
| -
|
| - void DownloadDone(const AttachmentService::GetOrDownloadResult& result,
|
| - scoped_ptr<AttachmentMap> attachments) {
|
| - download_results_.push_back(result);
|
| - last_download_attachments_ = attachments.Pass();
|
| - }
|
| -
|
| - void StoreDone(const AttachmentService::StoreResult& result) {
|
| - store_results_.push_back(result);
|
| - }
|
| -
|
| - void RunLoop() {
|
| - base::RunLoop run_loop;
|
| - run_loop.RunUntilIdle();
|
| - }
|
| -
|
| - const std::vector<AttachmentService::GetOrDownloadResult>&
|
| - download_results() const {
|
| - return download_results_;
|
| - }
|
| -
|
| - const AttachmentMap& last_download_attachments() const {
|
| - return *last_download_attachments_.get();
|
| - }
|
| -
|
| - const std::vector<AttachmentService::StoreResult>& store_results() const {
|
| - return store_results_;
|
| - }
|
| -
|
| - MockAttachmentStore* store() { return attachment_store_.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_;
|
| - base::WeakPtr<MockAttachmentStore> attachment_store_;
|
| - base::WeakPtr<MockAttachmentDownloader> attachment_downloader_;
|
| - base::WeakPtr<MockAttachmentUploader> attachment_uploader_;
|
| - scoped_ptr<AttachmentService> attachment_service_;
|
| -
|
| - std::vector<AttachmentService::GetOrDownloadResult> download_results_;
|
| - scoped_ptr<AttachmentMap> last_download_attachments_;
|
| - std::vector<AttachmentId> on_attachment_uploaded_list_;
|
| -
|
| - std::vector<AttachmentService::StoreResult> store_results_;
|
| -};
|
| -
|
| -TEST_F(AttachmentServiceImplTest, GetOrDownload_EmptyAttachmentList) {
|
| - AttachmentIdList attachment_ids;
|
| - attachment_service()->GetOrDownloadAttachments(attachment_ids,
|
| - download_callback());
|
| - 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());
|
| - attachment_service()->GetOrDownloadAttachments(attachment_ids,
|
| - download_callback());
|
| - AttachmentIdSet local_attachments;
|
| - local_attachments.insert(attachment_ids[0]);
|
| - 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 3 ids.
|
| - AttachmentIdList attachment_ids;
|
| - attachment_ids.push_back(AttachmentId::Create());
|
| - attachment_ids.push_back(AttachmentId::Create());
|
| - attachment_ids.push_back(AttachmentId::Create());
|
| - // Call attachment service.
|
| - attachment_service()->GetOrDownloadAttachments(attachment_ids,
|
| - download_callback());
|
| - // 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(2U, 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 downloader fail attachment 2.
|
| - downloader()->RespondToDownload(
|
| - attachment_ids[2], 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());
|
| -}
|
| -
|
| -TEST_F(AttachmentServiceImplTest, GetOrDownload_NoDownloader) {
|
| - // No downloader.
|
| - InitializeAttachmentService(
|
| - make_scoped_ptr<MockAttachmentUploader>(new MockAttachmentUploader()),
|
| - make_scoped_ptr<MockAttachmentDownloader>(NULL),
|
| - this);
|
| -
|
| - AttachmentIdList attachment_ids;
|
| - attachment_ids.push_back(AttachmentId::Create());
|
| - attachment_service()->GetOrDownloadAttachments(attachment_ids,
|
| - download_callback());
|
| - 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, StoreAttachments_Success) {
|
| - scoped_refptr<base::RefCountedString> data = new base::RefCountedString();
|
| - Attachment attachment(Attachment::Create(data));
|
| - AttachmentList attachments;
|
| - attachments.push_back(attachment);
|
| - attachment_service()->StoreAttachments(attachments, store_callback());
|
| - EXPECT_EQ(1U, store()->write_attachments.size());
|
| - EXPECT_EQ(1U, uploader()->upload_requests.size());
|
| -
|
| - store()->RespondToWrite(AttachmentStore::SUCCESS);
|
| - uploader()->RespondToUpload(attachment.GetId(),
|
| - AttachmentUploader::UPLOAD_SUCCESS);
|
| - RunLoop();
|
| - ASSERT_EQ(1U, store_results().size());
|
| - EXPECT_EQ(AttachmentService::STORE_SUCCESS, store_results()[0]);
|
| - ASSERT_EQ(1U, on_attachment_uploaded_list().size());
|
| - EXPECT_EQ(attachment.GetId(), on_attachment_uploaded_list()[0]);
|
| -}
|
| -
|
| -TEST_F(AttachmentServiceImplTest,
|
| - StoreAttachments_StoreFailsWithUnspecifiedError) {
|
| - scoped_refptr<base::RefCountedString> data = new base::RefCountedString();
|
| - Attachment attachment(Attachment::Create(data));
|
| - AttachmentList attachments;
|
| - attachments.push_back(attachment);
|
| - attachment_service()->StoreAttachments(attachments, store_callback());
|
| - EXPECT_EQ(1U, store()->write_attachments.size());
|
| - EXPECT_EQ(1U, uploader()->upload_requests.size());
|
| -
|
| - store()->RespondToWrite(AttachmentStore::UNSPECIFIED_ERROR);
|
| - uploader()->RespondToUpload(attachment.GetId(),
|
| - AttachmentUploader::UPLOAD_SUCCESS);
|
| - RunLoop();
|
| - ASSERT_EQ(1U, store_results().size());
|
| - EXPECT_EQ(AttachmentService::STORE_UNSPECIFIED_ERROR, store_results()[0]);
|
| - ASSERT_EQ(1U, on_attachment_uploaded_list().size());
|
| - EXPECT_EQ(attachment.GetId(), on_attachment_uploaded_list()[0]);
|
| -}
|
| -
|
| -TEST_F(AttachmentServiceImplTest,
|
| - StoreAttachments_UploadFailsWithUnspecifiedError) {
|
| - scoped_refptr<base::RefCountedString> data = new base::RefCountedString();
|
| - Attachment attachment(Attachment::Create(data));
|
| - AttachmentList attachments;
|
| - attachments.push_back(attachment);
|
| - attachment_service()->StoreAttachments(attachments, store_callback());
|
| - EXPECT_EQ(1U, store()->write_attachments.size());
|
| - EXPECT_EQ(1U, uploader()->upload_requests.size());
|
| -
|
| - store()->RespondToWrite(AttachmentStore::SUCCESS);
|
| - uploader()->RespondToUpload(attachment.GetId(),
|
| - AttachmentUploader::UPLOAD_UNSPECIFIED_ERROR);
|
| - RunLoop();
|
| - ASSERT_EQ(1U, store_results().size());
|
| - // Even though the upload failed, the Store operation is successful.
|
| - EXPECT_EQ(AttachmentService::STORE_SUCCESS, store_results()[0]);
|
| - EXPECT_TRUE(on_attachment_uploaded_list().empty());
|
| -}
|
| -
|
| -TEST_F(AttachmentServiceImplTest, StoreAttachments_NoDelegate) {
|
| - InitializeAttachmentService(make_scoped_ptr(new MockAttachmentUploader()),
|
| - make_scoped_ptr(new MockAttachmentDownloader()),
|
| - NULL); // No delegate.
|
| -
|
| - scoped_refptr<base::RefCountedString> data = new base::RefCountedString();
|
| - Attachment attachment(Attachment::Create(data));
|
| - AttachmentList attachments;
|
| - attachments.push_back(attachment);
|
| - attachment_service()->StoreAttachments(attachments, store_callback());
|
| - EXPECT_EQ(1U, store()->write_attachments.size());
|
| - EXPECT_EQ(1U, uploader()->upload_requests.size());
|
| -
|
| - store()->RespondToWrite(AttachmentStore::SUCCESS);
|
| - uploader()->RespondToUpload(attachment.GetId(),
|
| - AttachmentUploader::UPLOAD_SUCCESS);
|
| - RunLoop();
|
| - ASSERT_EQ(1U, store_results().size());
|
| - EXPECT_EQ(AttachmentService::STORE_SUCCESS, store_results()[0]);
|
| - EXPECT_TRUE(on_attachment_uploaded_list().empty());
|
| -}
|
| -
|
| -TEST_F(AttachmentServiceImplTest, StoreAttachments_NoUploader) {
|
| - // No uploader.
|
| - InitializeAttachmentService(make_scoped_ptr<MockAttachmentUploader>(NULL),
|
| - make_scoped_ptr(new MockAttachmentDownloader()),
|
| - this);
|
| -
|
| - scoped_refptr<base::RefCountedString> data = new base::RefCountedString();
|
| - Attachment attachment(Attachment::Create(data));
|
| - AttachmentList attachments;
|
| - attachments.push_back(attachment);
|
| - attachment_service()->StoreAttachments(attachments, store_callback());
|
| - EXPECT_EQ(1U, store()->write_attachments.size());
|
| -
|
| - store()->RespondToWrite(AttachmentStore::SUCCESS);
|
| - RunLoop();
|
| - ASSERT_EQ(1U, store_results().size());
|
| - EXPECT_EQ(AttachmentService::STORE_SUCCESS, store_results()[0]);
|
| - EXPECT_TRUE(on_attachment_uploaded_list().empty());
|
| -}
|
| -
|
| -} // namespace syncer
|
|
|