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