1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// found in the LICENSE file.
4868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/indexed_db/indexed_db_database.h"
6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <set>
8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/auto_reset.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/logging.h"
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/run_loop.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/indexed_db/indexed_db.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/indexed_db/indexed_db_backing_store.h"
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/browser/indexed_db/indexed_db_callbacks.h"
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/browser/indexed_db/indexed_db_connection.h"
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/indexed_db/indexed_db_cursor.h"
19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/indexed_db/indexed_db_fake_backing_store.h"
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/indexed_db/indexed_db_transaction.h"
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/browser/indexed_db/indexed_db_value.h"
221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/browser/indexed_db/mock_indexed_db_callbacks.h"
231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/browser/indexed_db/mock_indexed_db_database_callbacks.h"
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/browser/indexed_db/mock_indexed_db_factory.h"
257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "testing/gtest/include/gtest/gtest.h"
26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16;
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace {
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const int kFakeChildProcessId = 0;
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace content {
34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST(IndexedDBDatabaseTest, BackingStoreRetention) {
36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_refptr<IndexedDBFakeBackingStore> backing_store =
37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      new IndexedDBFakeBackingStore();
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(backing_store->HasOneRef());
39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_refptr<MockIndexedDBFactory> factory = new MockIndexedDBFactory();
410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  leveldb::Status s;
420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  scoped_refptr<IndexedDBDatabase> db =
430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      IndexedDBDatabase::Create(ASCIIToUTF16("db"),
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                backing_store.get(),
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                factory.get(),
460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                IndexedDBDatabase::Identifier(),
470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                &s);
480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(s.ok());
49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(backing_store->HasOneRef());  // local and db
50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  db = NULL;
51868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(backing_store->HasOneRef());  // local
52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST(IndexedDBDatabaseTest, ConnectionLifecycle) {
55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_refptr<IndexedDBFakeBackingStore> backing_store =
56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      new IndexedDBFakeBackingStore();
57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(backing_store->HasOneRef());  // local
58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_refptr<MockIndexedDBFactory> factory = new MockIndexedDBFactory();
600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  leveldb::Status s;
61ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  scoped_refptr<IndexedDBDatabase> db =
62ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      IndexedDBDatabase::Create(ASCIIToUTF16("db"),
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                backing_store.get(),
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                factory.get(),
650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                IndexedDBDatabase::Identifier(),
660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                &s);
670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(s.ok());
68868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(backing_store->HasOneRef());  // local and db
69868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_refptr<MockIndexedDBCallbacks> request1(new MockIndexedDBCallbacks());
711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_refptr<MockIndexedDBDatabaseCallbacks> callbacks1(
721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      new MockIndexedDBDatabaseCallbacks());
73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const int64 transaction_id1 = 1;
74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  IndexedDBPendingConnection connection1(
75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      request1,
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      callbacks1,
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      kFakeChildProcessId,
78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      transaction_id1,
79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      IndexedDBDatabaseMetadata::DEFAULT_INT_VERSION);
80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  db->OpenConnection(connection1);
81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(backing_store->HasOneRef());  // db, connection count > 0
83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_refptr<MockIndexedDBCallbacks> request2(new MockIndexedDBCallbacks());
851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_refptr<MockIndexedDBDatabaseCallbacks> callbacks2(
861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      new MockIndexedDBDatabaseCallbacks());
87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const int64 transaction_id2 = 2;
88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  IndexedDBPendingConnection connection2(
89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      request2,
90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      callbacks2,
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      kFakeChildProcessId,
92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      transaction_id2,
93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      IndexedDBDatabaseMetadata::DEFAULT_INT_VERSION);
94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  db->OpenConnection(connection2);
95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(backing_store->HasOneRef());  // local and connection
97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  request1->connection()->ForceClose();
998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_FALSE(request1->connection()->IsConnected());
100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(backing_store->HasOneRef());  // local and connection
102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  request2->connection()->ForceClose();
1048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_FALSE(request2->connection()->IsConnected());
1058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(backing_store->HasOneRef());
1071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(db->backing_store());
108868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  db = NULL;
110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST(IndexedDBDatabaseTest, ForcedClose) {
113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_refptr<IndexedDBFakeBackingStore> backing_store =
114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      new IndexedDBFakeBackingStore();
115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(backing_store->HasOneRef());
116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_refptr<MockIndexedDBFactory> factory = new MockIndexedDBFactory();
1180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  leveldb::Status s;
119ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  scoped_refptr<IndexedDBDatabase> database =
120ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      IndexedDBDatabase::Create(ASCIIToUTF16("db"),
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                backing_store.get(),
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                factory.get(),
1230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                IndexedDBDatabase::Identifier(),
1240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                &s);
1250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(s.ok());
126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(backing_store->HasOneRef());  // local and db
127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_refptr<MockIndexedDBDatabaseCallbacks> callbacks(
1291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      new MockIndexedDBDatabaseCallbacks());
1301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_refptr<MockIndexedDBCallbacks> request(new MockIndexedDBCallbacks());
131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const int64 upgrade_transaction_id = 3;
132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  IndexedDBPendingConnection connection(
133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      request,
134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      callbacks,
135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      kFakeChildProcessId,
136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      upgrade_transaction_id,
137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      IndexedDBDatabaseMetadata::DEFAULT_INT_VERSION);
138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  database->OpenConnection(connection);
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(database.get(), request->connection()->database());
140868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const int64 transaction_id = 123;
142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const std::vector<int64> scope;
1437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  database->CreateTransaction(transaction_id,
1447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                              request->connection(),
1457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                              scope,
146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                              blink::WebIDBTransactionModeReadOnly);
147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  request->connection()->ForceClose();
149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(backing_store->HasOneRef());  // local
1511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_TRUE(callbacks->abort_called());
152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass MockDeleteCallbacks : public IndexedDBCallbacks {
1557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public:
1567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  MockDeleteCallbacks()
1577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      : IndexedDBCallbacks(NULL, 0, 0),
1587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        blocked_called_(false),
159a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        success_called_(false) {}
1607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void OnBlocked(int64 existing_version) OVERRIDE {
1627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    blocked_called_ = true;
1637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
164f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void OnSuccess(int64 result) OVERRIDE { success_called_ = true; }
1657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool blocked_called() const { return blocked_called_; }
1675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  bool success_called() const { return success_called_; }
1687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch private:
1705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual ~MockDeleteCallbacks() {}
1717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool blocked_called_;
173a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  bool success_called_;
174f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
175f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockDeleteCallbacks);
1767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
1777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1787dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST(IndexedDBDatabaseTest, PendingDelete) {
1797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<IndexedDBFakeBackingStore> backing_store =
1807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      new IndexedDBFakeBackingStore();
1817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(backing_store->HasOneRef());  // local
1827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_refptr<MockIndexedDBFactory> factory = new MockIndexedDBFactory();
1840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  leveldb::Status s;
185ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  scoped_refptr<IndexedDBDatabase> db =
186ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      IndexedDBDatabase::Create(ASCIIToUTF16("db"),
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                backing_store.get(),
1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                factory.get(),
1890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                IndexedDBDatabase::Identifier(),
1900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                &s);
1910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(s.ok());
1927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(backing_store->HasOneRef());  // local and db
1937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_refptr<MockIndexedDBCallbacks> request1(new MockIndexedDBCallbacks());
1951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_refptr<MockIndexedDBDatabaseCallbacks> callbacks1(
1961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      new MockIndexedDBDatabaseCallbacks());
1977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const int64 transaction_id1 = 1;
198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  IndexedDBPendingConnection connection(
199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      request1,
200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      callbacks1,
201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      kFakeChildProcessId,
202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      transaction_id1,
203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      IndexedDBDatabaseMetadata::DEFAULT_INT_VERSION);
204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  db->OpenConnection(connection);
2057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(backing_store->HasOneRef());  // local and db
2077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<MockDeleteCallbacks> request2(new MockDeleteCallbacks());
2097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  db->DeleteDatabase(request2);
2107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(request2->blocked_called());
212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  db->VersionChangeIgnored();
2137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(request2->blocked_called());
214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(backing_store->HasOneRef());  // local and db
2167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
21758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  db->Close(request1->connection(), true /* forced */);
2187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_FALSE(db->backing_store());
2207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(backing_store->HasOneRef());  // local
2215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(request2->success_called());
2227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
2237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void DummyOperation(IndexedDBTransaction* transaction) {
225cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
226cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
227cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class IndexedDBDatabaseOperationTest : public testing::Test {
228cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
2295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  IndexedDBDatabaseOperationTest()
2305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      : commit_success_(leveldb::Status::OK()),
2315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        factory_(new MockIndexedDBFactory()) {}
232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void SetUp() {
234cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    backing_store_ = new IndexedDBFakeBackingStore();
235cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    leveldb::Status s;
236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    db_ = IndexedDBDatabase::Create(ASCIIToUTF16("db"),
2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                    backing_store_.get(),
2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                    factory_.get(),
239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                    IndexedDBDatabase::Identifier(),
240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                    &s);
241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ASSERT_TRUE(s.ok());
242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    request_ = new MockIndexedDBCallbacks();
244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    callbacks_ = new MockIndexedDBDatabaseCallbacks();
245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const int64 transaction_id = 1;
246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    db_->OpenConnection(IndexedDBPendingConnection(
247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        request_,
248cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        callbacks_,
249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        kFakeChildProcessId,
250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        transaction_id,
251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        IndexedDBDatabaseMetadata::DEFAULT_INT_VERSION));
252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(IndexedDBDatabaseMetadata::NO_INT_VERSION,
253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)              db_->metadata().int_version);
254cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    transaction_ = new IndexedDBTransaction(
256cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        transaction_id,
257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        callbacks_,
258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        std::set<int64>() /*scope*/,
259116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        blink::WebIDBTransactionModeVersionChange,
2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        db_.get(),
261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        new IndexedDBFakeBackingStore::FakeTransaction(commit_success_));
2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    db_->TransactionCreated(transaction_.get());
263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Add a dummy task which takes the place of the VersionChangeOperation
265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // which kicks off the upgrade. This ensures that the transaction has
266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // processed at least one task before the CreateObjectStore call.
267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    transaction_->ScheduleTask(base::Bind(&DummyOperation));
268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
270cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void RunPostedTasks() { base::RunLoop().RunUntilIdle(); }
271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) protected:
273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_refptr<IndexedDBFakeBackingStore> backing_store_;
274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_refptr<IndexedDBDatabase> db_;
275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_refptr<MockIndexedDBCallbacks> request_;
276cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_refptr<MockIndexedDBDatabaseCallbacks> callbacks_;
277cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_refptr<IndexedDBTransaction> transaction_;
278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
27946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  leveldb::Status commit_success_;
280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::MessageLoop message_loop_;
2835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_refptr<MockIndexedDBFactory> factory_;
284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(IndexedDBDatabaseOperationTest);
286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(IndexedDBDatabaseOperationTest, CreateObjectStore) {
289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(0ULL, db_->metadata().object_stores.size());
290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const int64 store_id = 1001;
291cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  db_->CreateObjectStore(transaction_->id(),
292cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         store_id,
293cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         ASCIIToUTF16("store"),
294cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         IndexedDBKeyPath(),
295cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         false /*auto_increment*/);
296cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(1ULL, db_->metadata().object_stores.size());
297cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RunPostedTasks();
298cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  transaction_->Commit();
299cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(1ULL, db_->metadata().object_stores.size());
300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
301cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(IndexedDBDatabaseOperationTest, CreateIndex) {
303cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(0ULL, db_->metadata().object_stores.size());
304cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const int64 store_id = 1001;
305cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  db_->CreateObjectStore(transaction_->id(),
306cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         store_id,
307cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         ASCIIToUTF16("store"),
308cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         IndexedDBKeyPath(),
309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         false /*auto_increment*/);
310cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(1ULL, db_->metadata().object_stores.size());
311cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const int64 index_id = 2002;
312cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  db_->CreateIndex(transaction_->id(),
313cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   store_id,
314cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   index_id,
315cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   ASCIIToUTF16("index"),
316cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   IndexedDBKeyPath(),
317cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   false /*unique*/,
318cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   false /*multi_entry*/);
319cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(
320cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      1ULL,
321cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      db_->metadata().object_stores.find(store_id)->second.indexes.size());
322cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RunPostedTasks();
323cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  transaction_->Commit();
324cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(1ULL, db_->metadata().object_stores.size());
325cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(
326cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      1ULL,
327cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      db_->metadata().object_stores.find(store_id)->second.indexes.size());
328cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
330cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class IndexedDBDatabaseOperationAbortTest
331cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : public IndexedDBDatabaseOperationTest {
332cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
33346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  IndexedDBDatabaseOperationAbortTest() {
33446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    commit_success_ = leveldb::Status::NotFound("Bummer.");
33546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
336f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
337f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private:
338f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(IndexedDBDatabaseOperationAbortTest);
339cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
340cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(IndexedDBDatabaseOperationAbortTest, CreateObjectStore) {
342cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(0ULL, db_->metadata().object_stores.size());
343cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const int64 store_id = 1001;
344cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  db_->CreateObjectStore(transaction_->id(),
345cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         store_id,
346cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         ASCIIToUTF16("store"),
347cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         IndexedDBKeyPath(),
348cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         false /*auto_increment*/);
349cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(1ULL, db_->metadata().object_stores.size());
350cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RunPostedTasks();
351cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  transaction_->Commit();
352cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(0ULL, db_->metadata().object_stores.size());
353cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
354cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
355cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(IndexedDBDatabaseOperationAbortTest, CreateIndex) {
356cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(0ULL, db_->metadata().object_stores.size());
357cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const int64 store_id = 1001;
358cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  db_->CreateObjectStore(transaction_->id(),
359cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         store_id,
360cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         ASCIIToUTF16("store"),
361cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         IndexedDBKeyPath(),
362cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         false /*auto_increment*/);
363cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(1ULL, db_->metadata().object_stores.size());
364cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const int64 index_id = 2002;
365cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  db_->CreateIndex(transaction_->id(),
366cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   store_id,
367cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   index_id,
368cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   ASCIIToUTF16("index"),
369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   IndexedDBKeyPath(),
370cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   false /*unique*/,
371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   false /*multi_entry*/);
372cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(
373cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      1ULL,
374cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      db_->metadata().object_stores.find(store_id)->second.indexes.size());
375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RunPostedTasks();
376cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  transaction_->Commit();
377cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(0ULL, db_->metadata().object_stores.size());
378cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
379cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
380cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(IndexedDBDatabaseOperationTest, CreatePutDelete) {
381cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(0ULL, db_->metadata().object_stores.size());
382cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const int64 store_id = 1001;
383cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
384cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Creation is synchronous.
385cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  db_->CreateObjectStore(transaction_->id(),
386cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         store_id,
387cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         ASCIIToUTF16("store"),
388cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         IndexedDBKeyPath(),
389cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         false /*auto_increment*/);
390cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(1ULL, db_->metadata().object_stores.size());
391cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
392cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
393cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Put is asynchronous
394cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  IndexedDBValue value("value1", std::vector<IndexedDBBlobInfo>());
39503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ScopedVector<storage::BlobDataHandle> handles;
396cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<IndexedDBKey> key(new IndexedDBKey("key"));
397cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::vector<IndexedDBDatabase::IndexKeys> index_keys;
398cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_refptr<MockIndexedDBCallbacks> request(
399cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      new MockIndexedDBCallbacks(false));
400cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  db_->Put(transaction_->id(),
401cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)           store_id,
402cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)           &value,
403cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)           &handles,
404cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)           key.Pass(),
405116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch           blink::WebIDBPutModeAddOnly,
406cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)           request,
407cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)           index_keys);
408cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
409cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Deletion is asynchronous.
410cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  db_->DeleteObjectStore(transaction_->id(),
411cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         store_id);
412cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(1ULL, db_->metadata().object_stores.size());
413cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
414cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // This will execute the Put then Delete.
415cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RunPostedTasks();
416cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(0ULL, db_->metadata().object_stores.size());
41746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
418f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  transaction_->Commit();  // Cleans up the object hierarchy.
419cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
420cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
421868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}  // namespace content
422