Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1377)

Unified Diff: content/browser/indexed_db/indexed_db_factory_unittest.cc

Issue 2773823002: Use a two-part data format version in IndexedDB metadata. (Closed)
Patch Set: jsbell, cmumford Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/indexed_db/indexed_db_factory_unittest.cc
diff --git a/content/browser/indexed_db/indexed_db_factory_unittest.cc b/content/browser/indexed_db/indexed_db_factory_unittest.cc
index 5dae53c3f2314eca34006b3d4f6d6c92cc597922..14adfa55ce7f7761a69012a43438c123318b86c0 100644
--- a/content/browser/indexed_db/indexed_db_factory_unittest.cc
+++ b/content/browser/indexed_db/indexed_db_factory_unittest.cc
@@ -43,9 +43,9 @@ class MockIDBFactory : public IndexedDBFactoryImpl {
IndexedDBDataLossInfo data_loss_info;
bool disk_full;
leveldb::Status s;
- scoped_refptr<IndexedDBBackingStore> backing_store =
- OpenBackingStore(origin, data_directory, nullptr /* request_context */,
- &data_loss_info, &disk_full, &s);
+ scoped_refptr<IndexedDBBackingStore> backing_store = OpenBackingStore(
+ origin, data_directory, IndexedDBDataFormatVersion(),
+ nullptr /* request_context */, &data_loss_info, &disk_full, &s);
EXPECT_EQ(blink::WebIDBDataLossNone, data_loss_info.status);
return backing_store;
}
@@ -69,24 +69,28 @@ class MockIDBFactory : public IndexedDBFactoryImpl {
class IndexedDBFactoryTest : public testing::Test {
public:
- IndexedDBFactoryTest() {
+ void SetUp() override {
+ ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
task_runner_ = new base::TestSimpleTaskRunner();
quota_manager_proxy_ = new MockQuotaManagerProxy(nullptr, nullptr);
context_ = new IndexedDBContextImpl(
- base::FilePath(), nullptr /* special_storage_policy */,
+ temp_dir_.GetPath(), nullptr /* special_storage_policy */,
quota_manager_proxy_.get(), task_runner_.get());
idb_factory_ = new MockIDBFactory(context_.get());
}
- ~IndexedDBFactoryTest() override {
+
+ void TearDown() override {
quota_manager_proxy_->SimulateQuotaManagerDestroyed();
}
protected:
+ IndexedDBFactoryTest() {}
MockIDBFactory* factory() const { return idb_factory_.get(); }
void clear_factory() { idb_factory_ = nullptr; }
IndexedDBContextImpl* context() const { return context_.get(); }
private:
+ base::ScopedTempDir temp_dir_;
scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
scoped_refptr<IndexedDBContextImpl> context_;
scoped_refptr<MockIDBFactory> idb_factory_;
@@ -213,6 +217,7 @@ class DiskFullFactory : public IndexedDBFactoryImpl {
scoped_refptr<IndexedDBBackingStore> OpenBackingStore(
const Origin& origin,
const base::FilePath& data_directory,
+ const IndexedDBDataFormatVersion& data_format_version,
scoped_refptr<net::URLRequestContextGetter> request_context_getter,
IndexedDBDataLossInfo* data_loss_info,
bool* disk_full,
@@ -259,7 +264,7 @@ TEST_F(IndexedDBFactoryTest, QuotaErrorOnDiskFull) {
callbacks, dummy_database_callbacks, 0 /* child_process_id */,
2 /* transaction_id */, 1 /* version */));
factory->Open(name, std::move(connection), nullptr /* request_context */,
- origin, temp_directory.GetPath());
+ origin, temp_directory.GetPath(), IndexedDBDataFormatVersion());
EXPECT_TRUE(callbacks->error_called());
}
@@ -279,7 +284,7 @@ TEST_F(IndexedDBFactoryTest, BackingStoreReleasedOnForcedClose) {
IndexedDBDatabaseMetadata::DEFAULT_VERSION));
factory()->Open(ASCIIToUTF16("db"), std::move(connection),
nullptr /* request_context */, origin,
- temp_directory.GetPath());
+ temp_directory.GetPath(), IndexedDBDataFormatVersion());
EXPECT_TRUE(callbacks->connection());
@@ -308,7 +313,7 @@ TEST_F(IndexedDBFactoryTest, BackingStoreReleaseDelayedOnClose) {
IndexedDBDatabaseMetadata::DEFAULT_VERSION));
factory()->Open(ASCIIToUTF16("db"), std::move(connection),
nullptr /* request_context */, origin,
- temp_directory.GetPath());
+ temp_directory.GetPath(), IndexedDBDataFormatVersion());
EXPECT_TRUE(callbacks->connection());
IndexedDBBackingStore* store =
@@ -345,6 +350,7 @@ TEST_F(IndexedDBFactoryTest, DeleteDatabaseClosesBackingStore) {
new MockIndexedDBCallbacks(expect_connection));
factory()->DeleteDatabase(ASCIIToUTF16("db"), nullptr /* request_context */,
callbacks, origin, temp_directory.GetPath(),
+ IndexedDBDataFormatVersion(),
false /* force_close */);
EXPECT_TRUE(factory()->IsBackingStoreOpen(origin));
@@ -369,6 +375,7 @@ TEST_F(IndexedDBFactoryTest, GetDatabaseNamesClosesBackingStore) {
scoped_refptr<MockIndexedDBCallbacks> callbacks(
new MockIndexedDBCallbacks(expect_connection));
factory()->GetDatabaseNames(callbacks, origin, temp_directory.GetPath(),
+ IndexedDBDataFormatVersion(),
nullptr /* request_context */);
EXPECT_TRUE(factory()->IsBackingStoreOpen(origin));
@@ -397,7 +404,7 @@ TEST_F(IndexedDBFactoryTest, ForceCloseReleasesBackingStore) {
IndexedDBDatabaseMetadata::DEFAULT_VERSION));
factory()->Open(ASCIIToUTF16("db"), std::move(connection),
nullptr /* request_context */, origin,
- temp_directory.GetPath());
+ temp_directory.GetPath(), IndexedDBDataFormatVersion());
EXPECT_TRUE(callbacks->connection());
EXPECT_TRUE(factory()->IsBackingStoreOpen(origin));
@@ -479,7 +486,7 @@ TEST_F(IndexedDBFactoryTest, DatabaseFailedOpen) {
db_version));
factory()->Open(db_name, std::move(connection),
nullptr /* request_context */, origin,
- temp_directory.GetPath());
+ temp_directory.GetPath(), IndexedDBDataFormatVersion());
EXPECT_TRUE(factory()->IsDatabaseOpen(origin, db_name));
// Pump the message loop so the upgrade transaction can run.
@@ -502,7 +509,7 @@ TEST_F(IndexedDBFactoryTest, DatabaseFailedOpen) {
db_version - 1));
factory()->Open(db_name, std::move(connection),
nullptr /* request_context */, origin,
- temp_directory.GetPath());
+ temp_directory.GetPath(), IndexedDBDataFormatVersion());
EXPECT_TRUE(callbacks->saw_error());
EXPECT_FALSE(factory()->IsDatabaseOpen(origin, db_name));
}
@@ -510,5 +517,79 @@ TEST_F(IndexedDBFactoryTest, DatabaseFailedOpen) {
// Terminate all pending-close timers.
factory()->ForceClose(origin);
}
+namespace {
+
+class DataLossCallbacks final : public MockIndexedDBCallbacks {
+ public:
+ blink::WebIDBDataLoss data_loss() const { return data_loss_; }
+ void OnSuccess(std::unique_ptr<IndexedDBConnection> connection,
+ const IndexedDBDatabaseMetadata& metadata) override {
+ if (!connection_)
+ connection_ = std::move(connection);
+ }
+ void OnError(const IndexedDBDatabaseError& error) final {
+ ADD_FAILURE() << "Unexpected IDB error: " << error.message();
+ }
+ void OnUpgradeNeeded(int64_t old_version,
+ std::unique_ptr<IndexedDBConnection> connection,
+ const content::IndexedDBDatabaseMetadata& metadata,
+ const IndexedDBDataLossInfo& data_loss) final {
+ connection_ = std::move(connection);
+ data_loss_ = data_loss.status;
+ }
+
+ private:
+ ~DataLossCallbacks() final {}
+ blink::WebIDBDataLoss data_loss_ = blink::WebIDBDataLossNone;
+};
+
+TEST_F(IndexedDBFactoryTest, DataFormatVersion) {
+ auto try_open = [this](const Origin& origin,
+ const IndexedDBDataFormatVersion& version) {
+ auto db_callbacks = make_scoped_refptr(new MockIndexedDBDatabaseCallbacks);
+ auto callbacks = make_scoped_refptr(new DataLossCallbacks);
+ const int64_t transaction_id = 1;
+ factory()->Open(ASCIIToUTF16("test_db"),
+ base::MakeUnique<IndexedDBPendingConnection>(
+ callbacks, db_callbacks, 0 /* child_process_id */,
+ transaction_id, 1 /* version */),
+ nullptr /* request_context */, origin,
+ context()->data_path(), version);
+ base::RunLoop().RunUntilIdle();
+ auto* connection = callbacks->connection();
+ EXPECT_TRUE(connection);
+ connection->database()->Commit(connection->GetTransaction(transaction_id));
+ connection->Close();
+ factory()->ForceClose(origin);
+ return callbacks->data_loss();
+ };
+
+ using blink::WebIDBDataLossNone;
+ using blink::WebIDBDataLossTotal;
+ const struct {
+ const char* origin;
+ IndexedDBDataFormatVersion open_version_1;
+ IndexedDBDataFormatVersion open_version_2;
+ blink::WebIDBDataLoss expected_data_loss;
+ } kTestCases[] = {
+ {"http://same-version.com/", {3, 4}, {3, 4}, WebIDBDataLossNone},
+ {"http://blink-upgrade.com/", {3, 4}, {3, 5}, WebIDBDataLossNone},
+ {"http://v8-upgrade.com/", {3, 4}, {4, 4}, WebIDBDataLossNone},
+ {"http://both-upgrade.com/", {3, 4}, {4, 5}, WebIDBDataLossNone},
+ {"http://blink-downgrade.com/", {3, 4}, {3, 3}, WebIDBDataLossTotal},
+ {"http://v8-downgrade.com/", {3, 4}, {2, 4}, WebIDBDataLossTotal},
+ {"http://both-downgrade.com/", {3, 4}, {2, 3}, WebIDBDataLossTotal},
+ {"http://v8-up-blink-down.com/", {3, 4}, {4, 2}, WebIDBDataLossTotal},
+ {"http://v8-down-blink-up.com/", {3, 4}, {2, 5}, WebIDBDataLossTotal},
+ };
+ for (const auto& test : kTestCases) {
+ SCOPED_TRACE(test.origin);
+ const Origin origin(GURL(test.origin));
+ ASSERT_EQ(WebIDBDataLossNone, try_open(origin, test.open_version_1));
+ EXPECT_EQ(test.expected_data_loss, try_open(origin, test.open_version_2));
+ }
+}
+
+} // namespace
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698