| Index: content/browser/indexed_db/indexed_db_cleanup_on_io_error_unittest.cc
|
| diff --git a/content/browser/indexed_db/indexed_db_cleanup_on_io_error_unittest.cc b/content/browser/indexed_db/indexed_db_cleanup_on_io_error_unittest.cc
|
| index 2bcd428c60e3d7c902b5968263d4bc1162c87f87..953d4b4c767c97e7fa88cf8ce21826a6dc65dc8b 100644
|
| --- a/content/browser/indexed_db/indexed_db_cleanup_on_io_error_unittest.cc
|
| +++ b/content/browser/indexed_db/indexed_db_cleanup_on_io_error_unittest.cc
|
| @@ -11,6 +11,8 @@
|
| #include "base/strings/utf_string_conversions.h"
|
| #include "content/browser/indexed_db/indexed_db_backing_store.h"
|
| #include "content/browser/indexed_db/leveldb/leveldb_database.h"
|
| +#include "content/browser/indexed_db/leveldb/mock_leveldb_factory.h"
|
| +#include "testing/gmock/include/gmock/gmock.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| #include "third_party/leveldatabase/env_chromium.h"
|
|
|
| @@ -20,6 +22,9 @@ using content::LevelDBComparator;
|
| using content::LevelDBDatabase;
|
| using content::LevelDBFactory;
|
| using content::LevelDBSnapshot;
|
| +using testing::_;
|
| +using testing::Exactly;
|
| +using testing::Invoke;
|
|
|
| namespace base {
|
| class TaskRunner;
|
| @@ -54,30 +59,27 @@ class BustedLevelDBDatabase : public LevelDBDatabase {
|
| DISALLOW_COPY_AND_ASSIGN(BustedLevelDBDatabase);
|
| };
|
|
|
| -class MockLevelDBFactory : public LevelDBFactory {
|
| +class BustedLevelDBFactory : public LevelDBFactory {
|
| public:
|
| - MockLevelDBFactory() : destroy_called_(false) {}
|
| virtual leveldb::Status OpenLevelDB(
|
| const base::FilePath& file_name,
|
| const LevelDBComparator* comparator,
|
| scoped_ptr<LevelDBDatabase>* db,
|
| bool* is_disk_full = 0) OVERRIDE {
|
| - *db = BustedLevelDBDatabase::Open(file_name, comparator);
|
| - return leveldb::Status::OK();
|
| + if (open_error_.ok())
|
| + *db = BustedLevelDBDatabase::Open(file_name, comparator);
|
| + return open_error_;
|
| }
|
| - virtual leveldb::Status DestroyLevelDB(const base::FilePath& file_name)
|
| - OVERRIDE {
|
| - EXPECT_FALSE(destroy_called_);
|
| - destroy_called_ = true;
|
| + virtual leveldb::Status DestroyLevelDB(
|
| + const base::FilePath& file_name) OVERRIDE {
|
| return leveldb::Status::IOError("error");
|
| }
|
| - virtual ~MockLevelDBFactory() { EXPECT_TRUE(destroy_called_); }
|
| -
|
| - private:
|
| - bool destroy_called_;
|
| + void SetOpenError(const leveldb::Status& open_error) {
|
| + open_error_ = open_error;
|
| + }
|
|
|
| private:
|
| - DISALLOW_COPY_AND_ASSIGN(MockLevelDBFactory);
|
| + leveldb::Status open_error_;
|
| };
|
|
|
| TEST(IndexedDBIOErrorTest, CleanUpTest) {
|
| @@ -87,9 +89,17 @@ TEST(IndexedDBIOErrorTest, CleanUpTest) {
|
| ASSERT_TRUE(temp_directory.CreateUniqueTempDir());
|
| const base::FilePath path = temp_directory.path();
|
| net::URLRequestContext* request_context = NULL;
|
| - MockLevelDBFactory mock_leveldb_factory;
|
| - blink::WebIDBDataLoss data_loss =
|
| - blink::WebIDBDataLossNone;
|
| +
|
| + BustedLevelDBFactory busted_factory;
|
| + content::MockLevelDBFactory mock_leveldb_factory;
|
| + ON_CALL(mock_leveldb_factory, OpenLevelDB(_, _, _, _)).WillByDefault(
|
| + Invoke(&busted_factory, &BustedLevelDBFactory::OpenLevelDB));
|
| + ON_CALL(mock_leveldb_factory, DestroyLevelDB(_)).WillByDefault(
|
| + Invoke(&busted_factory, &BustedLevelDBFactory::DestroyLevelDB));
|
| +
|
| + EXPECT_CALL(mock_leveldb_factory, OpenLevelDB(_, _, _, _)).Times(Exactly(1));
|
| + EXPECT_CALL(mock_leveldb_factory, DestroyLevelDB(_)).Times(Exactly(1));
|
| + blink::WebIDBDataLoss data_loss = blink::WebIDBDataLossNone;
|
| std::string data_loss_message;
|
| bool disk_full = false;
|
| base::TaskRunner* task_runner = NULL;
|
| @@ -109,41 +119,6 @@ TEST(IndexedDBIOErrorTest, CleanUpTest) {
|
| &s);
|
| }
|
|
|
| -// TODO(dgrogan): Remove expect_destroy if we end up not using it again. It is
|
| -// currently set to false in all 4 calls below.
|
| -template <class T>
|
| -class MockErrorLevelDBFactory : public LevelDBFactory {
|
| - public:
|
| - MockErrorLevelDBFactory(T error, bool expect_destroy)
|
| - : error_(error),
|
| - expect_destroy_(expect_destroy),
|
| - destroy_called_(false) {}
|
| - virtual leveldb::Status OpenLevelDB(
|
| - const base::FilePath& file_name,
|
| - const LevelDBComparator* comparator,
|
| - scoped_ptr<LevelDBDatabase>* db,
|
| - bool* is_disk_full = 0) OVERRIDE {
|
| - return MakeIOError(
|
| - "some filename", "some message", leveldb_env::kNewLogger, error_);
|
| - }
|
| - virtual leveldb::Status DestroyLevelDB(const base::FilePath& file_name)
|
| - OVERRIDE {
|
| - EXPECT_FALSE(destroy_called_);
|
| - destroy_called_ = true;
|
| - return leveldb::Status::IOError("error");
|
| - }
|
| - virtual ~MockErrorLevelDBFactory() {
|
| - EXPECT_EQ(expect_destroy_, destroy_called_);
|
| - }
|
| -
|
| - private:
|
| - T error_;
|
| - bool expect_destroy_;
|
| - bool destroy_called_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(MockErrorLevelDBFactory);
|
| -};
|
| -
|
| TEST(IndexedDBNonRecoverableIOErrorTest, NuancedCleanupTest) {
|
| content::IndexedDBFactory* factory = NULL;
|
| const GURL origin("http://localhost:81");
|
| @@ -159,7 +134,18 @@ TEST(IndexedDBNonRecoverableIOErrorTest, NuancedCleanupTest) {
|
| bool clean_journal = false;
|
| leveldb::Status s;
|
|
|
| - MockErrorLevelDBFactory<int> mock_leveldb_factory(ENOSPC, false);
|
| + BustedLevelDBFactory busted_factory;
|
| + content::MockLevelDBFactory mock_leveldb_factory;
|
| + ON_CALL(mock_leveldb_factory, OpenLevelDB(_, _, _, _)).WillByDefault(
|
| + Invoke(&busted_factory, &BustedLevelDBFactory::OpenLevelDB));
|
| + ON_CALL(mock_leveldb_factory, DestroyLevelDB(_)).WillByDefault(
|
| + Invoke(&busted_factory, &BustedLevelDBFactory::DestroyLevelDB));
|
| +
|
| + EXPECT_CALL(mock_leveldb_factory, OpenLevelDB(_, _, _, _)).Times(Exactly(4));
|
| + EXPECT_CALL(mock_leveldb_factory, DestroyLevelDB(_)).Times(Exactly(0));
|
| +
|
| + busted_factory.SetOpenError(MakeIOError(
|
| + "some filename", "some message", leveldb_env::kNewLogger, ENOSPC));
|
| scoped_refptr<IndexedDBBackingStore> backing_store =
|
| IndexedDBBackingStore::Open(factory,
|
| origin,
|
| @@ -174,8 +160,10 @@ TEST(IndexedDBNonRecoverableIOErrorTest, NuancedCleanupTest) {
|
| &s);
|
| ASSERT_TRUE(s.IsIOError());
|
|
|
| - MockErrorLevelDBFactory<base::File::Error> mock_leveldb_factory2(
|
| - base::File::FILE_ERROR_NO_MEMORY, false);
|
| + busted_factory.SetOpenError(MakeIOError("some filename",
|
| + "some message",
|
| + leveldb_env::kNewLogger,
|
| + base::File::FILE_ERROR_NO_MEMORY));
|
| scoped_refptr<IndexedDBBackingStore> backing_store2 =
|
| IndexedDBBackingStore::Open(factory,
|
| origin,
|
| @@ -184,13 +172,14 @@ TEST(IndexedDBNonRecoverableIOErrorTest, NuancedCleanupTest) {
|
| &data_loss,
|
| &data_loss_reason,
|
| &disk_full,
|
| - &mock_leveldb_factory2,
|
| + &mock_leveldb_factory,
|
| task_runner,
|
| clean_journal,
|
| &s);
|
| ASSERT_TRUE(s.IsIOError());
|
|
|
| - MockErrorLevelDBFactory<int> mock_leveldb_factory3(EIO, false);
|
| + busted_factory.SetOpenError(MakeIOError(
|
| + "some filename", "some message", leveldb_env::kNewLogger, EIO));
|
| scoped_refptr<IndexedDBBackingStore> backing_store3 =
|
| IndexedDBBackingStore::Open(factory,
|
| origin,
|
| @@ -199,14 +188,16 @@ TEST(IndexedDBNonRecoverableIOErrorTest, NuancedCleanupTest) {
|
| &data_loss,
|
| &data_loss_reason,
|
| &disk_full,
|
| - &mock_leveldb_factory3,
|
| + &mock_leveldb_factory,
|
| task_runner,
|
| clean_journal,
|
| &s);
|
| ASSERT_TRUE(s.IsIOError());
|
|
|
| - MockErrorLevelDBFactory<base::File::Error> mock_leveldb_factory4(
|
| - base::File::FILE_ERROR_FAILED, false);
|
| + busted_factory.SetOpenError(MakeIOError("some filename",
|
| + "some message",
|
| + leveldb_env::kNewLogger,
|
| + base::File::FILE_ERROR_FAILED));
|
| scoped_refptr<IndexedDBBackingStore> backing_store4 =
|
| IndexedDBBackingStore::Open(factory,
|
| origin,
|
| @@ -215,7 +206,7 @@ TEST(IndexedDBNonRecoverableIOErrorTest, NuancedCleanupTest) {
|
| &data_loss,
|
| &data_loss_reason,
|
| &disk_full,
|
| - &mock_leveldb_factory4,
|
| + &mock_leveldb_factory,
|
| task_runner,
|
| clean_journal,
|
| &s);
|
|
|