// 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 COMPONENTS_LEVELDB_PROTO_TESTING_FAKE_DB_H_ #define COMPONENTS_LEVELDB_PROTO_TESTING_FAKE_DB_H_ #include #include #include "base/bind.h" #include "base/callback.h" #include "base/files/file_path.h" #include "base/memory/scoped_ptr.h" #include "components/leveldb_proto/proto_database.h" namespace leveldb_proto { namespace test { template class FakeDB : public ProtoDatabase { using Callback = base::Callback; public: using EntryMap = typename base::hash_map; explicit FakeDB(EntryMap* db); ~FakeDB() override; // ProtoDatabase implementation. void Init(const base::FilePath& database_dir, const typename ProtoDatabase::InitCallback& callback) override; void UpdateEntries( scoped_ptr::KeyEntryVector> entries_to_save, scoped_ptr> keys_to_remove, const typename ProtoDatabase::UpdateCallback& callback) override; void LoadEntries( const typename ProtoDatabase::LoadCallback& callback) override; base::FilePath& GetDirectory(); void InitCallback(bool success); void LoadCallback(bool success); void UpdateCallback(bool success); static base::FilePath DirectoryForTestDB(); private: static void RunLoadCallback( const typename ProtoDatabase::LoadCallback& callback, scoped_ptr> entries, bool success); base::FilePath dir_; EntryMap* db_; Callback init_callback_; Callback load_callback_; Callback update_callback_; }; template FakeDB::FakeDB(EntryMap* db) : db_(db) {} template FakeDB::~FakeDB() {} template void FakeDB::Init(const base::FilePath& database_dir, const typename ProtoDatabase::InitCallback& callback) { dir_ = database_dir; init_callback_ = callback; } template void FakeDB::UpdateEntries( scoped_ptr::KeyEntryVector> entries_to_save, scoped_ptr> keys_to_remove, const typename ProtoDatabase::UpdateCallback& callback) { for (const auto& pair : *entries_to_save) (*db_)[pair.first] = pair.second; for (const auto& key : *keys_to_remove) db_->erase(key); update_callback_ = callback; } template void FakeDB::LoadEntries( const typename ProtoDatabase::LoadCallback& callback) { scoped_ptr> entries(new std::vector()); for (const auto& pair : *db_) entries->push_back(pair.second); load_callback_ = base::Bind(RunLoadCallback, callback, base::Passed(&entries)); } template base::FilePath& FakeDB::GetDirectory() { return dir_; } template void FakeDB::InitCallback(bool success) { init_callback_.Run(success); init_callback_.Reset(); } template void FakeDB::LoadCallback(bool success) { load_callback_.Run(success); load_callback_.Reset(); } template void FakeDB::UpdateCallback(bool success) { update_callback_.Run(success); update_callback_.Reset(); } // static template void FakeDB::RunLoadCallback( const typename ProtoDatabase::LoadCallback& callback, scoped_ptr> entries, bool success) { callback.Run(success, entries.Pass()); } // static template base::FilePath FakeDB::DirectoryForTestDB() { return base::FilePath(FILE_PATH_LITERAL("/fake/path")); } } // namespace test } // namespace leveldb_proto #endif // COMPONENTS_LEVELDB_PROTO_TESTING_FAKE_DB_H_