indexed_db_dispatcher_unittest.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/message_loop/message_loop_proxy.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/child/indexed_db/indexed_db_dispatcher.h"
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/child/indexed_db/webidbcursor_impl.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/child/thread_safe_sender.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/indexed_db/indexed_db_key.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/common/indexed_db/indexed_db_key_range.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/common/indexed_db/indexed_db_messages.h"
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ipc/ipc_sync_message_filter.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebData.h"
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebIDBCallbacks.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebData;
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebIDBCallbacks;
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using blink::WebIDBCursor;
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebIDBDatabase;
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebIDBDatabaseError;
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebIDBKey;
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebVector;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockCallbacks : public WebIDBCallbacks {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MockCallbacks() : error_seen_(false) {}
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void onError(const WebIDBDatabaseError&) { error_seen_ = true; }
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool error_seen() const { return error_seen_; }
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool error_seen_;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class MockDispatcher : public IndexedDBDispatcher {
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MockDispatcher(ThreadSafeSender* sender) : IndexedDBDispatcher(sender) {}
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual bool Send(IPC::Message* msg) OVERRIDE {
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    delete msg;
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return true;
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class IndexedDBDispatcherTest : public testing::Test {
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  IndexedDBDispatcherTest()
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : message_loop_proxy_(base::MessageLoopProxy::current()),
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        sync_message_filter_(new IPC::SyncMessageFilter(NULL)),
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        thread_safe_sender_(new ThreadSafeSender(message_loop_proxy_.get(),
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                 sync_message_filter_.get())) {}
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected:
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<base::MessageLoopProxy> message_loop_proxy_;
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<IPC::SyncMessageFilter> sync_message_filter_;
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<ThreadSafeSender> thread_safe_sender_;
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(IndexedDBDispatcherTest);
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(IndexedDBDispatcherTest, ValueSizeTest) {
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::vector<char> data(kMaxIDBValueSizeInBytes + 1);
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const WebData value(&data.front(), data.size());
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int32 ipc_dummy_id = -1;
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int64 transaction_id = 1;
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int64 object_store_id = 2;
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockCallbacks callbacks;
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  IndexedDBDispatcher dispatcher(thread_safe_sender_.get());
80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  IndexedDBKey key(0, blink::WebIDBKeyTypeNumber);
8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  dispatcher.RequestIDBDatabasePut(ipc_dummy_id,
8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                   transaction_id,
8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                   object_store_id,
8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                   value,
8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                   key,
8690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                   WebIDBDatabase::AddOrUpdate,
8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                   &callbacks,
8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                   WebVector<long long>(),
8990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                   WebVector<WebVector<WebIDBKey> >());
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(callbacks.error_seen());
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(IndexedDBDispatcherTest, KeyAndValueSizeTest) {
95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const size_t kKeySize = 1024 * 1024;
96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const std::vector<char> data(kMaxIDBValueSizeInBytes - kKeySize);
98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const WebData value(&data.front(), data.size());
99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const IndexedDBKey key(
100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      base::string16(kKeySize / sizeof(base::string16::value_type), 'x'));
101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const int32 ipc_dummy_id = -1;
103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const int64 transaction_id = 1;
104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const int64 object_store_id = 2;
105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MockCallbacks callbacks;
107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  IndexedDBDispatcher dispatcher(thread_safe_sender_.get());
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  dispatcher.RequestIDBDatabasePut(ipc_dummy_id,
109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                   transaction_id,
110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                   object_store_id,
111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                   value,
112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                   key,
113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                   WebIDBDatabase::AddOrUpdate,
114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                   &callbacks,
115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                   WebVector<long long>(),
116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                   WebVector<WebVector<WebIDBKey> >());
117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(callbacks.error_seen());
119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace {
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class CursorCallbacks : public WebIDBCallbacks {
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CursorCallbacks(scoped_ptr<WebIDBCursor>* cursor) : cursor_(cursor) {}
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void onSuccess(const WebData&) {}
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void onSuccess(WebIDBCursor* cursor,
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                         const WebIDBKey& key,
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                         const WebIDBKey& primaryKey,
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                         const WebData& value) {
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    cursor_->reset(cursor);
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<WebIDBCursor>* cursor_;
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(IndexedDBDispatcherTest, CursorTransactionId) {
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const int32 ipc_database_id = -1;
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const int64 transaction_id = 1234;
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const int64 object_store_id = 2;
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const int32 index_id = 3;
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const WebIDBCursor::Direction direction = WebIDBCursor::Next;
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const bool key_only = false;
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MockDispatcher dispatcher(thread_safe_sender_.get());
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // First case: successful cursor open.
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<WebIDBCursor> cursor;
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(0UL, dispatcher.cursor_transaction_ids_.size());
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Make a cursor request. This should record the transaction id.
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    dispatcher.RequestIDBDatabaseOpenCursor(ipc_database_id,
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            transaction_id,
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            object_store_id,
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            index_id,
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            IndexedDBKeyRange(),
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            direction,
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            key_only,
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            blink::WebIDBDatabase::NormalTask,
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            new CursorCallbacks(&cursor));
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Verify that the transaction id was captured.
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(1UL, dispatcher.cursor_transaction_ids_.size());
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FALSE(cursor.get());
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int32 ipc_callbacks_id = dispatcher.cursor_transaction_ids_.begin()->first;
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    IndexedDBMsg_CallbacksSuccessIDBCursor_Params params;
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    params.ipc_thread_id = dispatcher.CurrentWorkerId();
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    params.ipc_callbacks_id = ipc_callbacks_id;
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Now simululate the cursor response.
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    params.ipc_cursor_id = WebIDBCursorImpl::kInvalidCursorId;
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    dispatcher.OnSuccessOpenCursor(params);
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(0UL, dispatcher.cursor_transaction_ids_.size());
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(cursor.get());
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WebIDBCursorImpl* impl = static_cast<WebIDBCursorImpl*>(cursor.get());
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // This is the primary expectation of this test: the transaction id was
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // applied to the cursor.
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(transaction_id, impl->transaction_id());
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Second case: null cursor (no data in range)
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<WebIDBCursor> cursor;
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(0UL, dispatcher.cursor_transaction_ids_.size());
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Make a cursor request. This should record the transaction id.
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    dispatcher.RequestIDBDatabaseOpenCursor(ipc_database_id,
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            transaction_id,
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            object_store_id,
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            index_id,
2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            IndexedDBKeyRange(),
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            direction,
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            key_only,
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            blink::WebIDBDatabase::NormalTask,
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            new CursorCallbacks(&cursor));
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Verify that the transaction id was captured.
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(1UL, dispatcher.cursor_transaction_ids_.size());
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FALSE(cursor.get());
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int32 ipc_callbacks_id = dispatcher.cursor_transaction_ids_.begin()->first;
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Now simululate a "null cursor" response.
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    dispatcher.OnSuccessValue(
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        dispatcher.CurrentWorkerId(), ipc_callbacks_id, std::string());
2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Ensure the map result was deleted.
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(0UL, dispatcher.cursor_transaction_ids_.size());
2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FALSE(cursor.get());
2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace {
2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class MockCursor : public WebIDBCursorImpl {
2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MockCursor(int32 ipc_cursor_id,
2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)             int64 transaction_id,
2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)             ThreadSafeSender* thread_safe_sender)
2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : WebIDBCursorImpl(ipc_cursor_id, transaction_id, thread_safe_sender),
2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        reset_count_(0) {}
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // This method is virtual so it can be overridden in unit tests.
2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void ResetPrefetchCache() OVERRIDE { ++reset_count_; }
2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int reset_count() const { return reset_count_; }
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int reset_count_;
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace
2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(IndexedDBDispatcherTest, CursorReset) {
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<WebIDBCursor> cursor;
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MockDispatcher dispatcher(thread_safe_sender_.get());
2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const int32 ipc_database_id = 0;
2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const int32 object_store_id = 0;
2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const int32 index_id = 0;
2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const bool key_only = false;
2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const int cursor1_ipc_id = 1;
2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const int cursor2_ipc_id = 2;
2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const int other_cursor_ipc_id = 2;
2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const int cursor1_transaction_id = 1;
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const int cursor2_transaction_id = 2;
2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const int other_transaction_id = 3;
2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<MockCursor> cursor1(
2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      new MockCursor(WebIDBCursorImpl::kInvalidCursorId,
2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     cursor1_transaction_id,
2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     thread_safe_sender_.get()));
2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<MockCursor> cursor2(
2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      new MockCursor(WebIDBCursorImpl::kInvalidCursorId,
2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     cursor2_transaction_id,
2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     thread_safe_sender_.get()));
2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  dispatcher.cursors_[cursor1_ipc_id] = cursor1.get();
2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  dispatcher.cursors_[cursor2_ipc_id] = cursor2.get();
2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, cursor1->reset_count());
2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, cursor2->reset_count());
2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Other transaction:
2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  dispatcher.RequestIDBDatabaseGet(ipc_database_id,
2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   other_transaction_id,
2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   object_store_id,
2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   index_id,
2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   IndexedDBKeyRange(),
2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   key_only,
2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   new MockCallbacks());
2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, cursor1->reset_count());
2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, cursor2->reset_count());
2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Same transaction:
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  dispatcher.RequestIDBDatabaseGet(ipc_database_id,
2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   cursor1_transaction_id,
2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   object_store_id,
2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   index_id,
2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   IndexedDBKeyRange(),
2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   key_only,
2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   new MockCallbacks());
2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, cursor1->reset_count());
2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, cursor2->reset_count());
2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Same transaction and same cursor:
3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  dispatcher.RequestIDBCursorContinue(IndexedDBKey(),
3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      IndexedDBKey(),
3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      new MockCallbacks(),
3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      cursor1_ipc_id,
3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      cursor1_transaction_id);
3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, cursor1->reset_count());
3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, cursor2->reset_count());
3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Same transaction and different cursor:
3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  dispatcher.RequestIDBCursorContinue(IndexedDBKey(),
3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      IndexedDBKey(),
3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      new MockCallbacks(),
3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      other_cursor_ipc_id,
3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      cursor1_transaction_id);
3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(2, cursor1->reset_count());
3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, cursor2->reset_count());
3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  cursor1.reset();
3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  cursor2.reset();
3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
325