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"
16c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "third_party/WebKit/public/platform/WebBlobInfo.h"
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebData.h"
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebIDBCallbacks.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochusing blink::WebBlobInfo;
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebData;
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebIDBCallbacks;
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using blink::WebIDBCursor;
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebIDBDatabase;
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebIDBDatabaseError;
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebIDBKey;
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebVector;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockCallbacks : public WebIDBCallbacks {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MockCallbacks() : error_seen_(false) {}
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void onError(const WebIDBDatabaseError&) { error_seen_ = true; }
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool error_seen() const { return error_seen_; }
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool error_seen_;
42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockCallbacks);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class MockDispatcher : public IndexedDBDispatcher {
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  explicit MockDispatcher(ThreadSafeSender* sender)
49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      : IndexedDBDispatcher(sender) {}
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual bool Send(IPC::Message* msg) OVERRIDE {
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    delete msg;
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return true;
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private:
57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockDispatcher);
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class IndexedDBDispatcherTest : public testing::Test {
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  IndexedDBDispatcherTest()
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : message_loop_proxy_(base::MessageLoopProxy::current()),
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        sync_message_filter_(new IPC::SyncMessageFilter(NULL)),
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        thread_safe_sender_(new ThreadSafeSender(message_loop_proxy_.get(),
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                 sync_message_filter_.get())) {}
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected:
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<base::MessageLoopProxy> message_loop_proxy_;
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<IPC::SyncMessageFilter> sync_message_filter_;
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<ThreadSafeSender> thread_safe_sender_;
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(IndexedDBDispatcherTest);
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(IndexedDBDispatcherTest, ValueSizeTest) {
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::vector<char> data(kMaxIDBValueSizeInBytes + 1);
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const WebData value(&data.front(), data.size());
82c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const WebVector<WebBlobInfo> web_blob_info;
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int32 ipc_dummy_id = -1;
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int64 transaction_id = 1;
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int64 object_store_id = 2;
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockCallbacks callbacks;
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  IndexedDBDispatcher dispatcher(thread_safe_sender_.get());
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  IndexedDBKey key(0, blink::WebIDBKeyTypeNumber);
9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  dispatcher.RequestIDBDatabasePut(ipc_dummy_id,
9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                   transaction_id,
9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                   object_store_id,
9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                   value,
94c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                   web_blob_info,
9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                   key,
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   blink::WebIDBPutModeAddOrUpdate,
9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                   &callbacks,
9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                   WebVector<long long>(),
9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                   WebVector<WebVector<WebIDBKey> >());
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(callbacks.error_seen());
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(IndexedDBDispatcherTest, KeyAndValueSizeTest) {
105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const size_t kKeySize = 1024 * 1024;
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const std::vector<char> data(kMaxIDBValueSizeInBytes - kKeySize);
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const WebData value(&data.front(), data.size());
109c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const WebVector<WebBlobInfo> web_blob_info;
110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const IndexedDBKey key(
111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      base::string16(kKeySize / sizeof(base::string16::value_type), 'x'));
112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const int32 ipc_dummy_id = -1;
114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const int64 transaction_id = 1;
115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const int64 object_store_id = 2;
116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MockCallbacks callbacks;
118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  IndexedDBDispatcher dispatcher(thread_safe_sender_.get());
119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  dispatcher.RequestIDBDatabasePut(ipc_dummy_id,
120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                   transaction_id,
121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                   object_store_id,
122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                   value,
123c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                   web_blob_info,
124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                   key,
125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   blink::WebIDBPutModeAddOrUpdate,
126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                   &callbacks,
127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                   WebVector<long long>(),
128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                   WebVector<WebVector<WebIDBKey> >());
129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(callbacks.error_seen());
131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace {
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class CursorCallbacks : public WebIDBCallbacks {
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
137f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  explicit CursorCallbacks(scoped_ptr<WebIDBCursor>* cursor)
138f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      : cursor_(cursor) {}
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void onSuccess(const WebData&,
1415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                         const WebVector<WebBlobInfo>&) OVERRIDE {}
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void onSuccess(WebIDBCursor* cursor,
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                         const WebIDBKey& key,
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                         const WebIDBKey& primaryKey,
1455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                         const WebData& value,
1465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                         const WebVector<WebBlobInfo>&) OVERRIDE {
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    cursor_->reset(cursor);
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<WebIDBCursor>* cursor_;
152f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
153f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(CursorCallbacks);
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(IndexedDBDispatcherTest, CursorTransactionId) {
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const int32 ipc_database_id = -1;
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const int64 transaction_id = 1234;
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const int64 object_store_id = 2;
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const int32 index_id = 3;
163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const blink::WebIDBCursorDirection direction =
164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      blink::WebIDBCursorDirectionNext;
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const bool key_only = false;
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MockDispatcher dispatcher(thread_safe_sender_.get());
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // First case: successful cursor open.
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<WebIDBCursor> cursor;
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(0UL, dispatcher.cursor_transaction_ids_.size());
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Make a cursor request. This should record the transaction id.
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    dispatcher.RequestIDBDatabaseOpenCursor(ipc_database_id,
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            transaction_id,
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            object_store_id,
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            index_id,
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            IndexedDBKeyRange(),
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            direction,
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            key_only,
182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                            blink::WebIDBTaskTypeNormal,
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            new CursorCallbacks(&cursor));
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Verify that the transaction id was captured.
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(1UL, dispatcher.cursor_transaction_ids_.size());
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FALSE(cursor.get());
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int32 ipc_callbacks_id = dispatcher.cursor_transaction_ids_.begin()->first;
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    IndexedDBMsg_CallbacksSuccessIDBCursor_Params params;
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    params.ipc_thread_id = dispatcher.CurrentWorkerId();
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    params.ipc_callbacks_id = ipc_callbacks_id;
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Now simululate the cursor response.
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    params.ipc_cursor_id = WebIDBCursorImpl::kInvalidCursorId;
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    dispatcher.OnSuccessOpenCursor(params);
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(0UL, dispatcher.cursor_transaction_ids_.size());
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(cursor.get());
2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WebIDBCursorImpl* impl = static_cast<WebIDBCursorImpl*>(cursor.get());
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // This is the primary expectation of this test: the transaction id was
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // applied to the cursor.
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(transaction_id, impl->transaction_id());
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Second case: null cursor (no data in range)
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<WebIDBCursor> cursor;
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(0UL, dispatcher.cursor_transaction_ids_.size());
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Make a cursor request. This should record the transaction id.
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    dispatcher.RequestIDBDatabaseOpenCursor(ipc_database_id,
2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            transaction_id,
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            object_store_id,
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            index_id,
2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            IndexedDBKeyRange(),
2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            direction,
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            key_only,
223116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                            blink::WebIDBTaskTypeNormal,
2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            new CursorCallbacks(&cursor));
2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Verify that the transaction id was captured.
2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(1UL, dispatcher.cursor_transaction_ids_.size());
2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FALSE(cursor.get());
2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int32 ipc_callbacks_id = dispatcher.cursor_transaction_ids_.begin()->first;
2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Now simululate a "null cursor" response.
233c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    IndexedDBMsg_CallbacksSuccessValue_Params params;
234c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    params.ipc_thread_id = dispatcher.CurrentWorkerId();
235c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    params.ipc_callbacks_id = ipc_callbacks_id;
236c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    dispatcher.OnSuccessValue(params);
2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Ensure the map result was deleted.
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(0UL, dispatcher.cursor_transaction_ids_.size());
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FALSE(cursor.get());
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace {
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class MockCursor : public WebIDBCursorImpl {
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MockCursor(int32 ipc_cursor_id,
2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)             int64 transaction_id,
2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)             ThreadSafeSender* thread_safe_sender)
2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : WebIDBCursorImpl(ipc_cursor_id, transaction_id, thread_safe_sender),
2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        reset_count_(0) {}
2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // This method is virtual so it can be overridden in unit tests.
2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void ResetPrefetchCache() OVERRIDE { ++reset_count_; }
2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int reset_count() const { return reset_count_; }
2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int reset_count_;
261f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
262f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockCursor);
2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace
2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(IndexedDBDispatcherTest, CursorReset) {
2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<WebIDBCursor> cursor;
2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MockDispatcher dispatcher(thread_safe_sender_.get());
2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const int32 ipc_database_id = 0;
2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const int32 object_store_id = 0;
2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const int32 index_id = 0;
2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const bool key_only = false;
2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const int cursor1_ipc_id = 1;
2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const int cursor2_ipc_id = 2;
2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const int other_cursor_ipc_id = 2;
2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const int cursor1_transaction_id = 1;
2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const int cursor2_transaction_id = 2;
2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const int other_transaction_id = 3;
2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<MockCursor> cursor1(
2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      new MockCursor(WebIDBCursorImpl::kInvalidCursorId,
2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     cursor1_transaction_id,
2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     thread_safe_sender_.get()));
2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<MockCursor> cursor2(
2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      new MockCursor(WebIDBCursorImpl::kInvalidCursorId,
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     cursor2_transaction_id,
2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     thread_safe_sender_.get()));
2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  dispatcher.cursors_[cursor1_ipc_id] = cursor1.get();
2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  dispatcher.cursors_[cursor2_ipc_id] = cursor2.get();
2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, cursor1->reset_count());
2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, cursor2->reset_count());
2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Other transaction:
2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  dispatcher.RequestIDBDatabaseGet(ipc_database_id,
3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   other_transaction_id,
3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   object_store_id,
3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   index_id,
3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   IndexedDBKeyRange(),
3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   key_only,
3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   new MockCallbacks());
3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, cursor1->reset_count());
3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, cursor2->reset_count());
3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Same transaction:
3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  dispatcher.RequestIDBDatabaseGet(ipc_database_id,
3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   cursor1_transaction_id,
3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   object_store_id,
3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   index_id,
3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   IndexedDBKeyRange(),
3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   key_only,
3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   new MockCallbacks());
3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, cursor1->reset_count());
3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, cursor2->reset_count());
3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Same transaction and same cursor:
3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  dispatcher.RequestIDBCursorContinue(IndexedDBKey(),
3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      IndexedDBKey(),
3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      new MockCallbacks(),
3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      cursor1_ipc_id,
3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      cursor1_transaction_id);
3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, cursor1->reset_count());
3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, cursor2->reset_count());
3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Same transaction and different cursor:
3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  dispatcher.RequestIDBCursorContinue(IndexedDBKey(),
3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      IndexedDBKey(),
3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      new MockCallbacks(),
3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      other_cursor_ipc_id,
3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      cursor1_transaction_id);
3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(2, cursor1->reset_count());
3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, cursor2->reset_count());
3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  cursor1.reset();
3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  cursor2.reset();
3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
347