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