summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorstanisc <stanisc@chromium.org>2014-11-20 20:45:52 -0800
committerCommit bot <commit-bot@chromium.org>2014-11-21 04:46:11 +0000
commit115f299f986e72331e7b2867b0cb64d952ecb85a (patch)
tree23fec3ad31ca837f7c9ff943cc506589b0478f70
parent9f7c198f303f3cfdbb63c58eea0d0de8891d9662 (diff)
downloadchromium_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.gn3
-rw-r--r--sync/api/attachments/attachment_metadata.cc24
-rw-r--r--sync/api/attachments/attachment_metadata.h41
-rw-r--r--sync/api/attachments/attachment_metadata_unittest.cc21
-rw-r--r--sync/api/attachments/attachment_store.h19
-rw-r--r--sync/internal_api/attachments/attachment_service_impl_unittest.cc9
-rw-r--r--sync/internal_api/attachments/attachment_store_handle.cc16
-rw-r--r--sync/internal_api/attachments/attachment_store_handle_unittest.cc44
-rw-r--r--sync/internal_api/attachments/in_memory_attachment_store.cc13
-rw-r--r--sync/internal_api/attachments/on_disk_attachment_store.cc12
-rw-r--r--sync/internal_api/public/attachments/attachment_store_handle.h3
-rw-r--r--sync/internal_api/public/attachments/in_memory_attachment_store.h3
-rw-r--r--sync/internal_api/public/attachments/on_disk_attachment_store.h3
-rw-r--r--sync/sync.gyp2
-rw-r--r--sync/sync_tests.gypi1
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',