| Index: components/leveldb_proto/proto_database_impl_unittest.cc
|
| diff --git a/components/dom_distiller/core/dom_distiller_database_unittest.cc b/components/leveldb_proto/proto_database_impl_unittest.cc
|
| similarity index 60%
|
| rename from components/dom_distiller/core/dom_distiller_database_unittest.cc
|
| rename to components/leveldb_proto/proto_database_impl_unittest.cc
|
| index 54c9043d440961f0ec561d976542481584eca0a6..073328b0fbdcf55a1a3250467976118f6f9c4723 100644
|
| --- a/components/dom_distiller/core/dom_distiller_database_unittest.cc
|
| +++ b/components/leveldb_proto/proto_database_impl_unittest.cc
|
| @@ -1,8 +1,8 @@
|
| -// Copyright 2013 The Chromium Authors. All rights reserved.
|
| +// 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 "components/dom_distiller/core/dom_distiller_database.h"
|
| +#include "components/leveldb_proto/proto_database_impl.h"
|
|
|
| #include <map>
|
|
|
| @@ -11,7 +11,8 @@
|
| #include "base/files/scoped_temp_dir.h"
|
| #include "base/run_loop.h"
|
| #include "base/threading/thread.h"
|
| -#include "components/dom_distiller/core/article_entry.h"
|
| +#include "components/leveldb_proto/leveldb_database.h"
|
| +#include "components/leveldb_proto/testing/proto/test.pb.h"
|
| #include "testing/gmock/include/gmock/gmock.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| @@ -21,35 +22,33 @@ using testing::Invoke;
|
| using testing::Return;
|
| using testing::_;
|
|
|
| -namespace dom_distiller {
|
| +namespace leveldb_proto {
|
|
|
| namespace {
|
|
|
| -typedef std::map<std::string, ArticleEntry> EntryMap;
|
| +typedef std::map<std::string, TestProto> EntryMap;
|
|
|
| -class MockDB : public DomDistillerDatabase::Database {
|
| +class MockDB : public LevelDB {
|
| public:
|
| MOCK_METHOD1(Init, bool(const base::FilePath&));
|
| - MOCK_METHOD2(Save, bool(const EntryVector&, const EntryVector&));
|
| - MOCK_METHOD1(Load, bool(EntryVector*));
|
| + MOCK_METHOD2(Save, bool(const KeyValueVector&, const KeyVector&));
|
| + MOCK_METHOD1(Load, bool(std::vector<std::string>*));
|
|
|
| MockDB() {
|
| ON_CALL(*this, Init(_)).WillByDefault(Return(true));
|
| ON_CALL(*this, Save(_, _)).WillByDefault(Return(true));
|
| ON_CALL(*this, Load(_)).WillByDefault(Return(true));
|
| }
|
| -
|
| - bool LoadEntries(EntryVector* entries);
|
| };
|
|
|
| class MockDatabaseCaller {
|
| public:
|
| MOCK_METHOD1(InitCallback, void(bool));
|
| MOCK_METHOD1(SaveCallback, void(bool));
|
| - void LoadCallback(bool success, scoped_ptr<EntryVector> entries) {
|
| + void LoadCallback(bool success, scoped_ptr<std::vector<TestProto> > entries) {
|
| LoadCallback1(success, entries.get());
|
| }
|
| - MOCK_METHOD2(LoadCallback1, void(bool, EntryVector*));
|
| + MOCK_METHOD2(LoadCallback1, void(bool, std::vector<TestProto>*));
|
| };
|
|
|
| } // namespace
|
| @@ -57,25 +56,23 @@ class MockDatabaseCaller {
|
| EntryMap GetSmallModel() {
|
| EntryMap model;
|
|
|
| - model["key0"].set_entry_id("key0");
|
| - model["key0"].add_pages()->set_url("http://foo.com/1");
|
| - model["key0"].add_pages()->set_url("http://foo.com/2");
|
| - model["key0"].add_pages()->set_url("http://foo.com/3");
|
| + model["0"].set_id("0");
|
| + model["0"].set_data("http://foo.com/1");
|
|
|
| - model["key1"].set_entry_id("key1");
|
| - model["key1"].add_pages()->set_url("http://bar.com/all");
|
| + model["1"].set_id("1");
|
| + model["1"].set_data("http://bar.com/all");
|
|
|
| - model["key2"].set_entry_id("key2");
|
| - model["key2"].add_pages()->set_url("http://baz.com/1");
|
| + model["2"].set_id("2");
|
| + model["2"].set_data("http://baz.com/1");
|
|
|
| return model;
|
| }
|
|
|
| -void ExpectEntryPointersEquals(EntryMap expected, const EntryVector& actual) {
|
| +void ExpectEntryPointersEquals(EntryMap expected,
|
| + const std::vector<TestProto>& actual) {
|
| EXPECT_EQ(expected.size(), actual.size());
|
| for (size_t i = 0; i < actual.size(); i++) {
|
| - EntryMap::iterator expected_it =
|
| - expected.find(std::string(actual[i].entry_id()));
|
| + EntryMap::iterator expected_it = expected.find(actual[i].id());
|
| EXPECT_TRUE(expected_it != expected.end());
|
| std::string serialized_expected = expected_it->second.SerializeAsString();
|
| std::string serialized_actual = actual[i].SerializeAsString();
|
| @@ -84,11 +81,12 @@ void ExpectEntryPointersEquals(EntryMap expected, const EntryVector& actual) {
|
| }
|
| }
|
|
|
| -class DomDistillerDatabaseTest : public testing::Test {
|
| +class ProtoDatabaseImplTest : public testing::Test {
|
| public:
|
| virtual void SetUp() {
|
| main_loop_.reset(new MessageLoop());
|
| - db_.reset(new DomDistillerDatabase(main_loop_->message_loop_proxy()));
|
| + db_.reset(
|
| + new ProtoDatabaseImpl<TestProto>(main_loop_->message_loop_proxy()));
|
| }
|
|
|
| virtual void TearDown() {
|
| @@ -97,13 +95,13 @@ class DomDistillerDatabaseTest : public testing::Test {
|
| main_loop_.reset();
|
| }
|
|
|
| - scoped_ptr<DomDistillerDatabase> db_;
|
| + scoped_ptr<ProtoDatabaseImpl<TestProto> > db_;
|
| scoped_ptr<MessageLoop> main_loop_;
|
| };
|
|
|
| -// Test that DomDistillerDatabase calls Init on the underlying database and that
|
| +// Test that ProtoDatabaseImpl calls Init on the underlying database and that
|
| // the caller's InitCallback is called with the correct value.
|
| -TEST_F(DomDistillerDatabaseTest, TestDBInitSuccess) {
|
| +TEST_F(ProtoDatabaseImplTest, TestDBInitSuccess) {
|
| base::FilePath path(FILE_PATH_LITERAL("/fake/path"));
|
|
|
| MockDB* mock_db = new MockDB();
|
| @@ -113,14 +111,13 @@ TEST_F(DomDistillerDatabaseTest, TestDBInitSuccess) {
|
| EXPECT_CALL(caller, InitCallback(true));
|
|
|
| db_->InitWithDatabase(
|
| - scoped_ptr<DomDistillerDatabase::Database>(mock_db),
|
| - base::FilePath(path),
|
| + scoped_ptr<LevelDB>(mock_db), base::FilePath(path),
|
| base::Bind(&MockDatabaseCaller::InitCallback, base::Unretained(&caller)));
|
|
|
| base::RunLoop().RunUntilIdle();
|
| }
|
|
|
| -TEST_F(DomDistillerDatabaseTest, TestDBInitFailure) {
|
| +TEST_F(ProtoDatabaseImplTest, TestDBInitFailure) {
|
| base::FilePath path(FILE_PATH_LITERAL("/fake/path"));
|
|
|
| MockDB* mock_db = new MockDB();
|
| @@ -130,31 +127,30 @@ TEST_F(DomDistillerDatabaseTest, TestDBInitFailure) {
|
| EXPECT_CALL(caller, InitCallback(false));
|
|
|
| db_->InitWithDatabase(
|
| - scoped_ptr<DomDistillerDatabase::Database>(mock_db),
|
| - base::FilePath(path),
|
| + scoped_ptr<LevelDB>(mock_db), base::FilePath(path),
|
| base::Bind(&MockDatabaseCaller::InitCallback, base::Unretained(&caller)));
|
|
|
| base::RunLoop().RunUntilIdle();
|
| }
|
|
|
| ACTION_P(AppendLoadEntries, model) {
|
| - EntryVector* output = arg0;
|
| + std::vector<std::string>* output = arg0;
|
| for (EntryMap::const_iterator it = model.begin(); it != model.end(); ++it) {
|
| - output->push_back(it->second);
|
| + output->push_back(it->second.SerializeAsString());
|
| }
|
| return true;
|
| }
|
|
|
| ACTION_P(VerifyLoadEntries, expected) {
|
| - EntryVector* actual = arg1;
|
| + std::vector<TestProto>* actual = arg1;
|
| ExpectEntryPointersEquals(expected, *actual);
|
| }
|
|
|
| -// Test that DomDistillerDatabase calls Load on the underlying database and that
|
| +// Test that ProtoDatabaseImpl calls Load on the underlying database and that
|
| // the caller's LoadCallback is called with the correct success value. Also
|
| // confirms that on success, the expected entries are passed to the caller's
|
| // LoadCallback.
|
| -TEST_F(DomDistillerDatabaseTest, TestDBLoadSuccess) {
|
| +TEST_F(ProtoDatabaseImplTest, TestDBLoadSuccess) {
|
| base::FilePath path(FILE_PATH_LITERAL("/fake/path"));
|
|
|
| MockDB* mock_db = new MockDB();
|
| @@ -164,8 +160,7 @@ TEST_F(DomDistillerDatabaseTest, TestDBLoadSuccess) {
|
| EXPECT_CALL(*mock_db, Init(_));
|
| EXPECT_CALL(caller, InitCallback(_));
|
| db_->InitWithDatabase(
|
| - scoped_ptr<DomDistillerDatabase::Database>(mock_db),
|
| - base::FilePath(path),
|
| + scoped_ptr<LevelDB>(mock_db), base::FilePath(path),
|
| base::Bind(&MockDatabaseCaller::InitCallback, base::Unretained(&caller)));
|
|
|
| EXPECT_CALL(*mock_db, Load(_)).WillOnce(AppendLoadEntries(model));
|
| @@ -177,7 +172,7 @@ TEST_F(DomDistillerDatabaseTest, TestDBLoadSuccess) {
|
| base::RunLoop().RunUntilIdle();
|
| }
|
|
|
| -TEST_F(DomDistillerDatabaseTest, TestDBLoadFailure) {
|
| +TEST_F(ProtoDatabaseImplTest, TestDBLoadFailure) {
|
| base::FilePath path(FILE_PATH_LITERAL("/fake/path"));
|
|
|
| MockDB* mock_db = new MockDB();
|
| @@ -186,8 +181,7 @@ TEST_F(DomDistillerDatabaseTest, TestDBLoadFailure) {
|
| EXPECT_CALL(*mock_db, Init(_));
|
| EXPECT_CALL(caller, InitCallback(_));
|
| db_->InitWithDatabase(
|
| - scoped_ptr<DomDistillerDatabase::Database>(mock_db),
|
| - base::FilePath(path),
|
| + scoped_ptr<LevelDB>(mock_db), base::FilePath(path),
|
| base::Bind(&MockDatabaseCaller::InitCallback, base::Unretained(&caller)));
|
|
|
| EXPECT_CALL(*mock_db, Load(_)).WillOnce(Return(false));
|
| @@ -199,15 +193,24 @@ TEST_F(DomDistillerDatabaseTest, TestDBLoadFailure) {
|
| }
|
|
|
| ACTION_P(VerifyUpdateEntries, expected) {
|
| - const EntryVector& actual = arg0;
|
| - ExpectEntryPointersEquals(expected, actual);
|
| + const KeyValueVector actual = arg0;
|
| + // Create a vector of TestProto from |actual| to reuse the comparison
|
| + // function.
|
| + std::vector<TestProto> extracted_entries;
|
| + for (KeyValueVector::const_iterator it = actual.begin(); it != actual.end();
|
| + ++it) {
|
| + TestProto entry;
|
| + entry.ParseFromString(it->second);
|
| + extracted_entries.push_back(entry);
|
| + }
|
| + ExpectEntryPointersEquals(expected, extracted_entries);
|
| return true;
|
| }
|
|
|
| -// Test that DomDistillerDatabase calls Save on the underlying database with the
|
| +// Test that ProtoDatabaseImpl calls Save on the underlying database with the
|
| // correct entries to save and that the caller's SaveCallback is called with the
|
| // correct success value.
|
| -TEST_F(DomDistillerDatabaseTest, TestDBSaveSuccess) {
|
| +TEST_F(ProtoDatabaseImplTest, TestDBSaveSuccess) {
|
| base::FilePath path(FILE_PATH_LITERAL("/fake/path"));
|
|
|
| MockDB* mock_db = new MockDB();
|
| @@ -217,61 +220,53 @@ TEST_F(DomDistillerDatabaseTest, TestDBSaveSuccess) {
|
| EXPECT_CALL(*mock_db, Init(_));
|
| EXPECT_CALL(caller, InitCallback(_));
|
| db_->InitWithDatabase(
|
| - scoped_ptr<DomDistillerDatabase::Database>(mock_db),
|
| - base::FilePath(path),
|
| + scoped_ptr<LevelDB>(mock_db), base::FilePath(path),
|
| base::Bind(&MockDatabaseCaller::InitCallback, base::Unretained(&caller)));
|
|
|
| - scoped_ptr<EntryVector> entries(new EntryVector());
|
| + scoped_ptr<ProtoDatabase<TestProto>::KeyEntryVector> entries(
|
| + new ProtoDatabase<TestProto>::KeyEntryVector());
|
| for (EntryMap::iterator it = model.begin(); it != model.end(); ++it) {
|
| - entries->push_back(it->second);
|
| + entries->push_back(std::make_pair(it->second.id(), it->second));
|
| }
|
| - scoped_ptr<EntryVector> entries_to_remove(new EntryVector());
|
| + scoped_ptr<KeyVector> keys_to_remove(new KeyVector());
|
|
|
| EXPECT_CALL(*mock_db, Save(_, _)).WillOnce(VerifyUpdateEntries(model));
|
| EXPECT_CALL(caller, SaveCallback(true));
|
| db_->UpdateEntries(
|
| - entries.Pass(),
|
| - entries_to_remove.Pass(),
|
| + entries.Pass(), keys_to_remove.Pass(),
|
| base::Bind(&MockDatabaseCaller::SaveCallback, base::Unretained(&caller)));
|
|
|
| base::RunLoop().RunUntilIdle();
|
| }
|
|
|
| -TEST_F(DomDistillerDatabaseTest, TestDBSaveFailure) {
|
| +TEST_F(ProtoDatabaseImplTest, TestDBSaveFailure) {
|
| base::FilePath path(FILE_PATH_LITERAL("/fake/path"));
|
|
|
| MockDB* mock_db = new MockDB();
|
| MockDatabaseCaller caller;
|
| - scoped_ptr<EntryVector> entries(new EntryVector());
|
| - scoped_ptr<EntryVector> entries_to_remove(new EntryVector());
|
| + scoped_ptr<ProtoDatabase<TestProto>::KeyEntryVector> entries(
|
| + new ProtoDatabase<TestProto>::KeyEntryVector());
|
| + scoped_ptr<KeyVector> keys_to_remove(new KeyVector());
|
|
|
| EXPECT_CALL(*mock_db, Init(_));
|
| EXPECT_CALL(caller, InitCallback(_));
|
| db_->InitWithDatabase(
|
| - scoped_ptr<DomDistillerDatabase::Database>(mock_db),
|
| - base::FilePath(path),
|
| + scoped_ptr<LevelDB>(mock_db), base::FilePath(path),
|
| base::Bind(&MockDatabaseCaller::InitCallback, base::Unretained(&caller)));
|
|
|
| EXPECT_CALL(*mock_db, Save(_, _)).WillOnce(Return(false));
|
| EXPECT_CALL(caller, SaveCallback(false));
|
| db_->UpdateEntries(
|
| - entries.Pass(),
|
| - entries_to_remove.Pass(),
|
| + entries.Pass(), keys_to_remove.Pass(),
|
| base::Bind(&MockDatabaseCaller::SaveCallback, base::Unretained(&caller)));
|
|
|
| base::RunLoop().RunUntilIdle();
|
| }
|
|
|
| -ACTION_P(VerifyRemoveEntries, expected) {
|
| - const EntryVector& actual = arg1;
|
| - ExpectEntryPointersEquals(expected, actual);
|
| - return true;
|
| -}
|
| -
|
| -// Test that DomDistillerDatabase calls Save on the underlying database with the
|
| +// Test that ProtoDatabaseImpl calls Save on the underlying database with the
|
| // correct entries to delete and that the caller's SaveCallback is called with
|
| // the correct success value.
|
| -TEST_F(DomDistillerDatabaseTest, TestDBRemoveSuccess) {
|
| +TEST_F(ProtoDatabaseImplTest, TestDBRemoveSuccess) {
|
| base::FilePath path(FILE_PATH_LITERAL("/fake/path"));
|
|
|
| MockDB* mock_db = new MockDB();
|
| @@ -281,55 +276,53 @@ TEST_F(DomDistillerDatabaseTest, TestDBRemoveSuccess) {
|
| EXPECT_CALL(*mock_db, Init(_));
|
| EXPECT_CALL(caller, InitCallback(_));
|
| db_->InitWithDatabase(
|
| - scoped_ptr<DomDistillerDatabase::Database>(mock_db),
|
| - base::FilePath(path),
|
| + scoped_ptr<LevelDB>(mock_db), base::FilePath(path),
|
| base::Bind(&MockDatabaseCaller::InitCallback, base::Unretained(&caller)));
|
|
|
| - scoped_ptr<EntryVector> entries(new EntryVector());
|
| - scoped_ptr<EntryVector> entries_to_remove(new EntryVector());
|
| + scoped_ptr<ProtoDatabase<TestProto>::KeyEntryVector> entries(
|
| + new ProtoDatabase<TestProto>::KeyEntryVector());
|
| + scoped_ptr<KeyVector> keys_to_remove(new KeyVector());
|
| for (EntryMap::iterator it = model.begin(); it != model.end(); ++it) {
|
| - entries_to_remove->push_back(it->second);
|
| + keys_to_remove->push_back(it->second.id());
|
| }
|
|
|
| - EXPECT_CALL(*mock_db, Save(_, _)).WillOnce(VerifyRemoveEntries(model));
|
| + KeyVector keys_copy(*keys_to_remove.get());
|
| + EXPECT_CALL(*mock_db, Save(_, keys_copy)).WillOnce(Return(true));
|
| EXPECT_CALL(caller, SaveCallback(true));
|
| db_->UpdateEntries(
|
| - entries.Pass(),
|
| - entries_to_remove.Pass(),
|
| + entries.Pass(), keys_to_remove.Pass(),
|
| base::Bind(&MockDatabaseCaller::SaveCallback, base::Unretained(&caller)));
|
|
|
| base::RunLoop().RunUntilIdle();
|
| }
|
|
|
| -TEST_F(DomDistillerDatabaseTest, TestDBRemoveFailure) {
|
| +TEST_F(ProtoDatabaseImplTest, TestDBRemoveFailure) {
|
| base::FilePath path(FILE_PATH_LITERAL("/fake/path"));
|
|
|
| MockDB* mock_db = new MockDB();
|
| MockDatabaseCaller caller;
|
| - scoped_ptr<EntryVector> entries(new EntryVector());
|
| - scoped_ptr<EntryVector> entries_to_remove(new EntryVector());
|
| + scoped_ptr<ProtoDatabase<TestProto>::KeyEntryVector> entries(
|
| + new ProtoDatabase<TestProto>::KeyEntryVector());
|
| + scoped_ptr<KeyVector> keys_to_remove(new KeyVector());
|
|
|
| EXPECT_CALL(*mock_db, Init(_));
|
| EXPECT_CALL(caller, InitCallback(_));
|
| db_->InitWithDatabase(
|
| - scoped_ptr<DomDistillerDatabase::Database>(mock_db),
|
| - base::FilePath(path),
|
| + scoped_ptr<LevelDB>(mock_db), base::FilePath(path),
|
| base::Bind(&MockDatabaseCaller::InitCallback, base::Unretained(&caller)));
|
|
|
| EXPECT_CALL(*mock_db, Save(_, _)).WillOnce(Return(false));
|
| EXPECT_CALL(caller, SaveCallback(false));
|
| db_->UpdateEntries(
|
| - entries.Pass(),
|
| - entries_to_remove.Pass(),
|
| + entries.Pass(), keys_to_remove.Pass(),
|
| base::Bind(&MockDatabaseCaller::SaveCallback, base::Unretained(&caller)));
|
|
|
| base::RunLoop().RunUntilIdle();
|
| }
|
|
|
| -
|
| // This tests that normal usage of the real database does not cause any
|
| // threading violations.
|
| -TEST(DomDistillerDatabaseThreadingTest, TestDBDestruction) {
|
| +TEST(ProtoDatabaseImplThreadingTest, TestDBDestruction) {
|
| base::MessageLoop main_loop;
|
|
|
| ScopedTempDir temp_dir;
|
| @@ -338,14 +331,13 @@ TEST(DomDistillerDatabaseThreadingTest, TestDBDestruction) {
|
| base::Thread db_thread("dbthread");
|
| ASSERT_TRUE(db_thread.Start());
|
|
|
| - scoped_ptr<DomDistillerDatabase> db(
|
| - new DomDistillerDatabase(db_thread.message_loop_proxy()));
|
| + scoped_ptr<ProtoDatabaseImpl<TestProto> > db(
|
| + new ProtoDatabaseImpl<TestProto>(db_thread.message_loop_proxy()));
|
|
|
| MockDatabaseCaller caller;
|
| EXPECT_CALL(caller, InitCallback(_));
|
| - db->Init(
|
| - temp_dir.path(),
|
| - base::Bind(&MockDatabaseCaller::InitCallback, base::Unretained(&caller)));
|
| + db->Init(temp_dir.path(), base::Bind(&MockDatabaseCaller::InitCallback,
|
| + base::Unretained(&caller)));
|
|
|
| db.reset();
|
|
|
| @@ -363,35 +355,43 @@ void TestLevelDBSaveAndLoad(bool close_after_save) {
|
| ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
|
|
|
| EntryMap model = GetSmallModel();
|
| - EntryVector save_entries;
|
| - EntryVector load_entries;
|
| - EntryVector remove_entries;
|
| +
|
| + KeyValueVector save_entries;
|
| + std::vector<std::string> load_entries;
|
| + KeyVector remove_keys;
|
|
|
| for (EntryMap::iterator it = model.begin(); it != model.end(); ++it) {
|
| - save_entries.push_back(it->second);
|
| + save_entries.push_back(
|
| + std::make_pair(it->second.id(), it->second.SerializeAsString()));
|
| }
|
|
|
| - scoped_ptr<DomDistillerDatabase::LevelDB> db(
|
| - new DomDistillerDatabase::LevelDB());
|
| + scoped_ptr<LevelDB> db(new LevelDB());
|
| EXPECT_TRUE(db->Init(temp_dir.path()));
|
| - EXPECT_TRUE(db->Save(save_entries, remove_entries));
|
| + EXPECT_TRUE(db->Save(save_entries, remove_keys));
|
|
|
| if (close_after_save) {
|
| - db.reset(new DomDistillerDatabase::LevelDB());
|
| + db.reset(new LevelDB());
|
| EXPECT_TRUE(db->Init(temp_dir.path()));
|
| }
|
|
|
| EXPECT_TRUE(db->Load(&load_entries));
|
| -
|
| - ExpectEntryPointersEquals(model, load_entries);
|
| + // Convert the strings back to TestProto.
|
| + std::vector<TestProto> loaded_protos;
|
| + for (std::vector<std::string>::iterator it = load_entries.begin();
|
| + it != load_entries.end(); ++it) {
|
| + TestProto entry;
|
| + entry.ParseFromString(*it);
|
| + loaded_protos.push_back(entry);
|
| + }
|
| + ExpectEntryPointersEquals(model, loaded_protos);
|
| }
|
|
|
| -TEST(DomDistillerDatabaseLevelDBTest, TestDBSaveAndLoad) {
|
| +TEST(ProtoDatabaseImplLevelDBTest, TestDBSaveAndLoad) {
|
| TestLevelDBSaveAndLoad(false);
|
| }
|
|
|
| -TEST(DomDistillerDatabaseLevelDBTest, TestDBCloseAndReopen) {
|
| +TEST(ProtoDatabaseImplLevelDBTest, TestDBCloseAndReopen) {
|
| TestLevelDBSaveAndLoad(true);
|
| }
|
|
|
| -} // namespace dom_distiller
|
| +} // namespace leveldb_proto
|
|
|