diff options
author | stanisc <stanisc@chromium.org> | 2014-11-20 20:45:52 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-11-21 04:46:11 +0000 |
commit | 115f299f986e72331e7b2867b0cb64d952ecb85a (patch) | |
tree | 23fec3ad31ca837f7c9ff943cc506589b0478f70 | |
parent | 9f7c198f303f3cfdbb63c58eea0d0de8891d9662 (diff) | |
download | chromium_src-115f299f986e72331e7b2867b0cb64d952ecb85a.zip chromium_src-115f299f986e72331e7b2867b0cb64d952ecb85a.tar.gz chromium_src-115f299f986e72331e7b2867b0cb64d952ecb85a.tar.bz2 |
Sync: Attachment Store APIs for accessing attachment metadata
Introduced two new API methods to AttachmentStoreBase:
- ReadMetadata
- ReadAllMetadata
Added unimplemented overrides for these two methods into 5 classes that
derive from AttachmentStoreBase. For now the only class that has a real
implementation and unit test coverage of the new methods
is AttachmentStoreHandle.
I'll provide implementation and test coverage for all other classes
in the next change.
BUG=435205
Review URL: https://codereview.chromium.org/736093003
Cr-Commit-Position: refs/heads/master@{#305168}
-rw-r--r-- | sync/BUILD.gn | 3 | ||||
-rw-r--r-- | sync/api/attachments/attachment_metadata.cc | 24 | ||||
-rw-r--r-- | sync/api/attachments/attachment_metadata.h | 41 | ||||
-rw-r--r-- | sync/api/attachments/attachment_metadata_unittest.cc | 21 | ||||
-rw-r--r-- | sync/api/attachments/attachment_store.h | 19 | ||||
-rw-r--r-- | sync/internal_api/attachments/attachment_service_impl_unittest.cc | 9 | ||||
-rw-r--r-- | sync/internal_api/attachments/attachment_store_handle.cc | 16 | ||||
-rw-r--r-- | sync/internal_api/attachments/attachment_store_handle_unittest.cc | 44 | ||||
-rw-r--r-- | sync/internal_api/attachments/in_memory_attachment_store.cc | 13 | ||||
-rw-r--r-- | sync/internal_api/attachments/on_disk_attachment_store.cc | 12 | ||||
-rw-r--r-- | sync/internal_api/public/attachments/attachment_store_handle.h | 3 | ||||
-rw-r--r-- | sync/internal_api/public/attachments/in_memory_attachment_store.h | 3 | ||||
-rw-r--r-- | sync/internal_api/public/attachments/on_disk_attachment_store.h | 3 | ||||
-rw-r--r-- | sync/sync.gyp | 2 | ||||
-rw-r--r-- | sync/sync_tests.gypi | 1 |
15 files changed, 214 insertions, 0 deletions
diff --git a/sync/BUILD.gn b/sync/BUILD.gn index 237ffe6..67b12b3 100644 --- a/sync/BUILD.gn +++ b/sync/BUILD.gn @@ -18,6 +18,8 @@ source_set("sync_core") { "api/attachments/attachment.h", "api/attachments/attachment_id.cc", "api/attachments/attachment_id.h", + "api/attachments/attachment_metadata.cc", + "api/attachments/attachment_metadata.h", "api/attachments/attachment_store.cc", "api/attachments/attachment_store.h", "api/string_ordinal.h", @@ -548,6 +550,7 @@ static_library("test_support_sync_api") { test("sync_unit_tests") { sources = [ "api/attachments/attachment_id_unittest.cc", + "api/attachments/attachment_metadata_unittest.cc", "api/attachments/attachment_unittest.cc", "api/sync_change_unittest.cc", "api/sync_data_unittest.cc", diff --git a/sync/api/attachments/attachment_metadata.cc b/sync/api/attachments/attachment_metadata.cc new file mode 100644 index 0000000..202de23 --- /dev/null +++ b/sync/api/attachments/attachment_metadata.cc @@ -0,0 +1,24 @@ +// 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_metadata.h" + +namespace syncer { + +AttachmentMetadata::AttachmentMetadata(const AttachmentId& id, size_t size) + : id_(id), size_(size) { +} + +AttachmentMetadata::~AttachmentMetadata() { +} + +const AttachmentId& AttachmentMetadata::GetId() const { + return id_; +} + +size_t AttachmentMetadata::GetSize() const { + return size_; +} + +} // namespace syncer diff --git a/sync/api/attachments/attachment_metadata.h b/sync/api/attachments/attachment_metadata.h new file mode 100644 index 0000000..10761f8 --- /dev/null +++ b/sync/api/attachments/attachment_metadata.h @@ -0,0 +1,41 @@ +// 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. + +#ifndef SYNC_API_ATTACHMENTS_ATTACHMENT_METADATA_H_ +#define SYNC_API_ATTACHMENTS_ATTACHMENT_METADATA_H_ + +#include <vector> + +#include "base/basictypes.h" +#include "sync/api/attachments/attachment_id.h" +#include "sync/base/sync_export.h" + +namespace syncer { + +// This class represents immutable Attachment metadata. +// +// It is OK to copy and return AttachmentMetadata by value. +class SYNC_EXPORT AttachmentMetadata { + public: + AttachmentMetadata(const AttachmentId& id, size_t size); + ~AttachmentMetadata(); + + // Default copy and assignment are welcome. + + // Returns this attachment's id. + const AttachmentId& GetId() const; + + // Returns this attachment's size in bytes. + size_t GetSize() const; + + private: + AttachmentId id_; + size_t size_; +}; + +typedef std::vector<syncer::AttachmentMetadata> AttachmentMetadataList; + +} // namespace syncer + +#endif // SYNC_API_ATTACHMENTS_ATTACHMENT_METADATA_H_ diff --git a/sync/api/attachments/attachment_metadata_unittest.cc b/sync/api/attachments/attachment_metadata_unittest.cc new file mode 100644 index 0000000..06477d0 --- /dev/null +++ b/sync/api/attachments/attachment_metadata_unittest.cc @@ -0,0 +1,21 @@ +// 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_metadata.h" + +#include "testing/gtest/include/gtest/gtest.h" + +namespace syncer { + +class AttachmentMetadataTest : public testing::Test {}; + +TEST_F(AttachmentMetadataTest, Create) { + AttachmentId id = AttachmentId::Create(); + size_t size = 42; + AttachmentMetadata metadata(id, size); + EXPECT_EQ(metadata.GetId(), id); + EXPECT_EQ(metadata.GetSize(), size); +} + +} // namespace syncer diff --git a/sync/api/attachments/attachment_store.h b/sync/api/attachments/attachment_store.h index 3c41a27..6c7791a 100644 --- a/sync/api/attachments/attachment_store.h +++ b/sync/api/attachments/attachment_store.h @@ -10,6 +10,7 @@ #include "base/memory/scoped_ptr.h" #include "sync/api/attachments/attachment.h" #include "sync/api/attachments/attachment_id.h" +#include "sync/api/attachments/attachment_metadata.h" #include "sync/base/sync_export.h" namespace base { @@ -42,6 +43,9 @@ class SYNC_EXPORT AttachmentStoreBase { scoped_ptr<AttachmentIdList>)> ReadCallback; typedef base::Callback<void(const Result&)> WriteCallback; typedef base::Callback<void(const Result&)> DropCallback; + typedef base::Callback<void(const Result&, + scoped_ptr<AttachmentMetadataList>)> + ReadMetadataCallback; AttachmentStoreBase(); virtual ~AttachmentStoreBase(); @@ -84,6 +88,21 @@ class SYNC_EXPORT AttachmentStoreBase { // successfully. virtual void Drop(const AttachmentIdList& ids, const DropCallback& callback) = 0; + + // Asynchronously reads metadata for the attachments identified by |ids|. + // + // |callback| will be invoked when finished. AttachmentStore will attempt to + // read metadata for all attachments specified in ids. If any of the + // metadata entries do not exist or could not be read, |callback|'s Result + // will be UNSPECIFIED_ERROR. + virtual void ReadMetadata(const AttachmentIdList& ids, + const ReadMetadataCallback& callback) = 0; + + // Asynchronously reads metadata for all attachments in the store. + // + // |callback| will be invoked when finished. If any of the metadata entries + // could not be read, |callback|'s Result will be UNSPECIFIED_ERROR. + virtual void ReadAllMetadata(const ReadMetadataCallback& callback) = 0; }; // AttachmentStore is an interface exposed to data type and AttachmentService diff --git a/sync/internal_api/attachments/attachment_service_impl_unittest.cc b/sync/internal_api/attachments/attachment_service_impl_unittest.cc index db0cff3..b83af16 100644 --- a/sync/internal_api/attachments/attachment_service_impl_unittest.cc +++ b/sync/internal_api/attachments/attachment_service_impl_unittest.cc @@ -41,6 +41,15 @@ class MockAttachmentStore : public AttachmentStore, NOTREACHED(); } + void ReadMetadata(const AttachmentIdList& ids, + const ReadMetadataCallback& callback) override { + NOTREACHED(); + } + + void ReadAllMetadata(const 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) { diff --git a/sync/internal_api/attachments/attachment_store_handle.cc b/sync/internal_api/attachments/attachment_store_handle.cc index bfb637a..d770b6a 100644 --- a/sync/internal_api/attachments/attachment_store_handle.cc +++ b/sync/internal_api/attachments/attachment_store_handle.cc @@ -67,4 +67,20 @@ void AttachmentStoreHandle::Drop(const AttachmentIdList& ids, callback)); } +void AttachmentStoreHandle::ReadMetadata(const AttachmentIdList& ids, + const ReadMetadataCallback& callback) { + DCHECK(CalledOnValidThread()); + backend_task_runner_->PostTask( + FROM_HERE, base::Bind(&AttachmentStoreBase::ReadMetadata, + base::Unretained(backend_.get()), ids, callback)); +} + +void AttachmentStoreHandle::ReadAllMetadata( + const ReadMetadataCallback& callback) { + DCHECK(CalledOnValidThread()); + backend_task_runner_->PostTask( + FROM_HERE, base::Bind(&AttachmentStoreBase::ReadAllMetadata, + base::Unretained(backend_.get()), callback)); +} + } // namespace syncer diff --git a/sync/internal_api/attachments/attachment_store_handle_unittest.cc b/sync/internal_api/attachments/attachment_store_handle_unittest.cc index 637e374..0764ee0 100644 --- a/sync/internal_api/attachments/attachment_store_handle_unittest.cc +++ b/sync/internal_api/attachments/attachment_store_handle_unittest.cc @@ -24,10 +24,14 @@ class MockAttachmentStore : public AttachmentStoreBase { MockAttachmentStore(const base::Closure& read_called, const base::Closure& write_called, const base::Closure& drop_called, + const base::Closure& read_metadata_called, + const base::Closure& read_all_metadata_called, const base::Closure& dtor_called) : read_called_(read_called), write_called_(write_called), drop_called_(drop_called), + read_metadata_called_(read_metadata_called), + read_all_metadata_called_(read_all_metadata_called), dtor_called_(dtor_called) {} ~MockAttachmentStore() override { dtor_called_.Run(); } @@ -47,9 +51,20 @@ class MockAttachmentStore : public AttachmentStoreBase { drop_called_.Run(); } + void ReadMetadata(const AttachmentIdList& ids, + const ReadMetadataCallback& callback) override { + read_metadata_called_.Run(); + } + + void ReadAllMetadata(const ReadMetadataCallback& callback) override { + read_all_metadata_called_.Run(); + } + base::Closure read_called_; base::Closure write_called_; base::Closure drop_called_; + base::Closure read_metadata_called_; + base::Closure read_all_metadata_called_; base::Closure dtor_called_; }; @@ -61,6 +76,8 @@ class AttachmentStoreHandleTest : public testing::Test { : read_call_count_(0), write_call_count_(0), drop_call_count_(0), + read_metadata_call_count_(0), + read_all_metadata_call_count_(0), dtor_call_count_(0) {} virtual void SetUp() { @@ -71,6 +88,10 @@ class AttachmentStoreHandleTest : public testing::Test { base::Unretained(this)), base::Bind(&AttachmentStoreHandleTest::DropCalled, base::Unretained(this)), + base::Bind(&AttachmentStoreHandleTest::ReadMetadataCalled, + base::Unretained(this)), + base::Bind(&AttachmentStoreHandleTest::ReadAllMetadataCalled, + base::Unretained(this)), base::Bind(&AttachmentStoreHandleTest::DtorCalled, base::Unretained(this)))); attachment_store_handle_ = new AttachmentStoreHandle( @@ -87,12 +108,21 @@ class AttachmentStoreHandleTest : public testing::Test { NOTREACHED(); } + static void ReadMetadataDone(const AttachmentStore::Result& result, + scoped_ptr<AttachmentMetadataList> metadata) { + NOTREACHED(); + } + void ReadCalled() { ++read_call_count_; } void WriteCalled() { ++write_call_count_; } void DropCalled() { ++drop_call_count_; } + void ReadMetadataCalled() { ++read_metadata_call_count_; } + + void ReadAllMetadataCalled() { ++read_all_metadata_call_count_; } + void DtorCalled() { ++dtor_call_count_; } void RunMessageLoop() { @@ -105,6 +135,8 @@ class AttachmentStoreHandleTest : public testing::Test { int read_call_count_; int write_call_count_; int drop_call_count_; + int read_metadata_call_count_; + int read_all_metadata_call_count_; int dtor_call_count_; }; @@ -131,6 +163,18 @@ TEST_F(AttachmentStoreHandleTest, MethodsCalled) { RunMessageLoop(); EXPECT_EQ(drop_call_count_, 1); + attachment_store_handle_->ReadMetadata( + ids, base::Bind(&AttachmentStoreHandleTest::ReadMetadataDone)); + EXPECT_EQ(read_metadata_call_count_, 0); + RunMessageLoop(); + EXPECT_EQ(read_metadata_call_count_, 1); + + attachment_store_handle_->ReadAllMetadata( + base::Bind(&AttachmentStoreHandleTest::ReadMetadataDone)); + EXPECT_EQ(read_all_metadata_call_count_, 0); + RunMessageLoop(); + EXPECT_EQ(read_all_metadata_call_count_, 1); + // Releasing referehce to AttachmentStoreHandle should result in // MockAttachmentStore being deleted on backend loop. attachment_store_handle_ = NULL; diff --git a/sync/internal_api/attachments/in_memory_attachment_store.cc b/sync/internal_api/attachments/in_memory_attachment_store.cc index c1e366d..6dbc4fa 100644 --- a/sync/internal_api/attachments/in_memory_attachment_store.cc +++ b/sync/internal_api/attachments/in_memory_attachment_store.cc @@ -77,4 +77,17 @@ void InMemoryAttachmentStore::Drop(const AttachmentIdList& ids, callback_task_runner_->PostTask(FROM_HERE, base::Bind(callback, result)); } +void InMemoryAttachmentStore::ReadMetadata( + const AttachmentIdList& ids, + const ReadMetadataCallback& callback) { + // TODO(stanisc): implement this. + NOTIMPLEMENTED(); +} + +void InMemoryAttachmentStore::ReadAllMetadata( + const ReadMetadataCallback& callback) { + // TODO(stanisc): implement this. + NOTIMPLEMENTED(); +} + } // namespace syncer diff --git a/sync/internal_api/attachments/on_disk_attachment_store.cc b/sync/internal_api/attachments/on_disk_attachment_store.cc index 9af3104..76f96bc 100644 --- a/sync/internal_api/attachments/on_disk_attachment_store.cc +++ b/sync/internal_api/attachments/on_disk_attachment_store.cc @@ -157,6 +157,18 @@ void OnDiskAttachmentStore::Drop(const AttachmentIdList& ids, callback_task_runner_->PostTask(FROM_HERE, base::Bind(callback, result_code)); } +void OnDiskAttachmentStore::ReadMetadata(const AttachmentIdList& ids, + const ReadMetadataCallback& callback) { + // TODO(stanisc): implement this. + NOTIMPLEMENTED(); +} + +void OnDiskAttachmentStore::ReadAllMetadata( + const ReadMetadataCallback& callback) { + // TODO(stanisc): implement this. + NOTIMPLEMENTED(); +} + AttachmentStore::Result OnDiskAttachmentStore::OpenOrCreate( const base::FilePath& path) { DCHECK(CalledOnValidThread()); diff --git a/sync/internal_api/public/attachments/attachment_store_handle.h b/sync/internal_api/public/attachments/attachment_store_handle.h index 012a603..d30e047 100644 --- a/sync/internal_api/public/attachments/attachment_store_handle.h +++ b/sync/internal_api/public/attachments/attachment_store_handle.h @@ -45,6 +45,9 @@ class SYNC_EXPORT AttachmentStoreHandle : public AttachmentStore, void Write(const AttachmentList& attachments, const WriteCallback& callback) override; void Drop(const AttachmentIdList& id, const DropCallback& callback) override; + void ReadMetadata(const AttachmentIdList& ids, + const ReadMetadataCallback& callback) override; + void ReadAllMetadata(const ReadMetadataCallback& callback) override; private: ~AttachmentStoreHandle() override; diff --git a/sync/internal_api/public/attachments/in_memory_attachment_store.h b/sync/internal_api/public/attachments/in_memory_attachment_store.h index c586ef0..d0b8dda 100644 --- a/sync/internal_api/public/attachments/in_memory_attachment_store.h +++ b/sync/internal_api/public/attachments/in_memory_attachment_store.h @@ -30,6 +30,9 @@ class SYNC_EXPORT InMemoryAttachmentStore : public AttachmentStoreBase, void Write(const AttachmentList& attachments, const WriteCallback& callback) override; void Drop(const AttachmentIdList& ids, const DropCallback& callback) override; + void ReadMetadata(const AttachmentIdList& ids, + const ReadMetadataCallback& callback) override; + void ReadAllMetadata(const ReadMetadataCallback& callback) override; private: scoped_refptr<base::SingleThreadTaskRunner> callback_task_runner_; diff --git a/sync/internal_api/public/attachments/on_disk_attachment_store.h b/sync/internal_api/public/attachments/on_disk_attachment_store.h index e8d6096..4d7c0fd 100644 --- a/sync/internal_api/public/attachments/on_disk_attachment_store.h +++ b/sync/internal_api/public/attachments/on_disk_attachment_store.h @@ -41,6 +41,9 @@ class SYNC_EXPORT OnDiskAttachmentStore : public AttachmentStoreBase, void Write(const AttachmentList& attachments, const WriteCallback& callback) override; void Drop(const AttachmentIdList& ids, const DropCallback& callback) override; + void ReadMetadata(const AttachmentIdList& ids, + const ReadMetadataCallback& callback) override; + void ReadAllMetadata(const ReadMetadataCallback& callback) override; // Opens leveldb database at |path|. It will create directory and database if // it doesn't exist. diff --git a/sync/sync.gyp b/sync/sync.gyp index f49c8f8..7544fbf 100644 --- a/sync/sync.gyp +++ b/sync/sync.gyp @@ -63,6 +63,8 @@ 'api/attachments/attachment.h', 'api/attachments/attachment_id.cc', 'api/attachments/attachment_id.h', + 'api/attachments/attachment_metadata.cc', + 'api/attachments/attachment_metadata.h', 'api/attachments/attachment_store.cc', 'api/attachments/attachment_store.h', 'api/string_ordinal.h', diff --git a/sync/sync_tests.gypi b/sync/sync_tests.gypi index 3eda426..b1ef9cf 100644 --- a/sync/sync_tests.gypi +++ b/sync/sync_tests.gypi @@ -260,6 +260,7 @@ ], 'sources': [ 'api/attachments/attachment_id_unittest.cc', + 'api/attachments/attachment_metadata_unittest.cc', 'api/attachments/attachment_unittest.cc', 'api/sync_change_unittest.cc', 'api/sync_data_unittest.cc', |