| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <stddef.h> |
| 6 #include <stdint.h> |
| 7 |
| 8 #include "base/macros.h" |
| 5 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 6 #include "base/single_thread_task_runner.h" | 10 #include "base/single_thread_task_runner.h" |
| 7 #include "base/thread_task_runner_handle.h" | 11 #include "base/thread_task_runner_handle.h" |
| 8 #include "base/values.h" | 12 #include "base/values.h" |
| 9 #include "content/child/indexed_db/indexed_db_dispatcher.h" | 13 #include "content/child/indexed_db/indexed_db_dispatcher.h" |
| 10 #include "content/child/indexed_db/mock_webidbcallbacks.h" | 14 #include "content/child/indexed_db/mock_webidbcallbacks.h" |
| 11 #include "content/child/indexed_db/webidbcursor_impl.h" | 15 #include "content/child/indexed_db/webidbcursor_impl.h" |
| 12 #include "content/child/thread_safe_sender.h" | 16 #include "content/child/thread_safe_sender.h" |
| 13 #include "content/common/indexed_db/indexed_db_key.h" | 17 #include "content/common/indexed_db/indexed_db_key.h" |
| 14 #include "content/common/indexed_db/indexed_db_key_range.h" | 18 #include "content/common/indexed_db/indexed_db_key_range.h" |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 74 }; | 78 }; |
| 75 | 79 |
| 76 TEST_F(IndexedDBDispatcherTest, ValueSizeTest) { | 80 TEST_F(IndexedDBDispatcherTest, ValueSizeTest) { |
| 77 // For testing use a much smaller maximum size to prevent allocating >100 MB | 81 // For testing use a much smaller maximum size to prevent allocating >100 MB |
| 78 // of memory, which crashes on memory-constrained systems. | 82 // of memory, which crashes on memory-constrained systems. |
| 79 const size_t kMaxValueSizeForTesting = 10 * 1024 * 1024; // 10 MB | 83 const size_t kMaxValueSizeForTesting = 10 * 1024 * 1024; // 10 MB |
| 80 | 84 |
| 81 const std::vector<char> data(kMaxValueSizeForTesting + 1); | 85 const std::vector<char> data(kMaxValueSizeForTesting + 1); |
| 82 const WebData value(&data.front(), data.size()); | 86 const WebData value(&data.front(), data.size()); |
| 83 const WebVector<WebBlobInfo> web_blob_info; | 87 const WebVector<WebBlobInfo> web_blob_info; |
| 84 const int32 ipc_dummy_id = -1; | 88 const int32_t ipc_dummy_id = -1; |
| 85 const int64 transaction_id = 1; | 89 const int64_t transaction_id = 1; |
| 86 const int64 object_store_id = 2; | 90 const int64_t object_store_id = 2; |
| 87 | 91 |
| 88 StrictMock<MockWebIDBCallbacks> callbacks; | 92 StrictMock<MockWebIDBCallbacks> callbacks; |
| 89 EXPECT_CALL(callbacks, onError(_)).Times(1); | 93 EXPECT_CALL(callbacks, onError(_)).Times(1); |
| 90 | 94 |
| 91 IndexedDBDispatcher dispatcher(thread_safe_sender_.get()); | 95 IndexedDBDispatcher dispatcher(thread_safe_sender_.get()); |
| 92 dispatcher.max_put_value_size_ = kMaxValueSizeForTesting; | 96 dispatcher.max_put_value_size_ = kMaxValueSizeForTesting; |
| 93 IndexedDBKey key(0, blink::WebIDBKeyTypeNumber); | 97 IndexedDBKey key(0, blink::WebIDBKeyTypeNumber); |
| 94 dispatcher.RequestIDBDatabasePut(ipc_dummy_id, | 98 dispatcher.RequestIDBDatabasePut(ipc_dummy_id, |
| 95 transaction_id, | 99 transaction_id, |
| 96 object_store_id, | 100 object_store_id, |
| (...skipping 11 matching lines...) Expand all Loading... |
| 108 // of memory, which crashes on memory-constrained systems. | 112 // of memory, which crashes on memory-constrained systems. |
| 109 const size_t kMaxValueSizeForTesting = 10 * 1024 * 1024; // 10 MB | 113 const size_t kMaxValueSizeForTesting = 10 * 1024 * 1024; // 10 MB |
| 110 const size_t kKeySize = 1024 * 1024; | 114 const size_t kKeySize = 1024 * 1024; |
| 111 | 115 |
| 112 const std::vector<char> data(kMaxValueSizeForTesting - kKeySize); | 116 const std::vector<char> data(kMaxValueSizeForTesting - kKeySize); |
| 113 const WebData value(&data.front(), data.size()); | 117 const WebData value(&data.front(), data.size()); |
| 114 const WebVector<WebBlobInfo> web_blob_info; | 118 const WebVector<WebBlobInfo> web_blob_info; |
| 115 const IndexedDBKey key( | 119 const IndexedDBKey key( |
| 116 base::string16(kKeySize / sizeof(base::string16::value_type), 'x')); | 120 base::string16(kKeySize / sizeof(base::string16::value_type), 'x')); |
| 117 | 121 |
| 118 const int32 ipc_dummy_id = -1; | 122 const int32_t ipc_dummy_id = -1; |
| 119 const int64 transaction_id = 1; | 123 const int64_t transaction_id = 1; |
| 120 const int64 object_store_id = 2; | 124 const int64_t object_store_id = 2; |
| 121 | 125 |
| 122 StrictMock<MockWebIDBCallbacks> callbacks; | 126 StrictMock<MockWebIDBCallbacks> callbacks; |
| 123 EXPECT_CALL(callbacks, onError(_)).Times(1); | 127 EXPECT_CALL(callbacks, onError(_)).Times(1); |
| 124 | 128 |
| 125 IndexedDBDispatcher dispatcher(thread_safe_sender_.get()); | 129 IndexedDBDispatcher dispatcher(thread_safe_sender_.get()); |
| 126 dispatcher.max_put_value_size_ = kMaxValueSizeForTesting; | 130 dispatcher.max_put_value_size_ = kMaxValueSizeForTesting; |
| 127 dispatcher.RequestIDBDatabasePut(ipc_dummy_id, | 131 dispatcher.RequestIDBDatabasePut(ipc_dummy_id, |
| 128 transaction_id, | 132 transaction_id, |
| 129 object_store_id, | 133 object_store_id, |
| 130 value, | 134 value, |
| 131 web_blob_info, | 135 web_blob_info, |
| 132 key, | 136 key, |
| 133 blink::WebIDBPutModeAddOrUpdate, | 137 blink::WebIDBPutModeAddOrUpdate, |
| 134 &callbacks, | 138 &callbacks, |
| 135 WebVector<long long>(), | 139 WebVector<long long>(), |
| 136 WebVector<WebVector<WebIDBKey> >()); | 140 WebVector<WebVector<WebIDBKey> >()); |
| 137 } | 141 } |
| 138 | 142 |
| 139 TEST_F(IndexedDBDispatcherTest, CursorTransactionId) { | 143 TEST_F(IndexedDBDispatcherTest, CursorTransactionId) { |
| 140 const int32 ipc_database_id = -1; | 144 const int32_t ipc_database_id = -1; |
| 141 const int64 transaction_id = 1234; | 145 const int64_t transaction_id = 1234; |
| 142 const int64 object_store_id = 2; | 146 const int64_t object_store_id = 2; |
| 143 const int32 index_id = 3; | 147 const int32_t index_id = 3; |
| 144 const blink::WebIDBCursorDirection direction = | 148 const blink::WebIDBCursorDirection direction = |
| 145 blink::WebIDBCursorDirectionNext; | 149 blink::WebIDBCursorDirectionNext; |
| 146 const bool key_only = false; | 150 const bool key_only = false; |
| 147 | 151 |
| 148 MockDispatcher dispatcher(thread_safe_sender_.get()); | 152 MockDispatcher dispatcher(thread_safe_sender_.get()); |
| 149 | 153 |
| 150 // First case: successful cursor open. | 154 // First case: successful cursor open. |
| 151 { | 155 { |
| 152 scoped_ptr<WebIDBCursor> cursor; | 156 scoped_ptr<WebIDBCursor> cursor; |
| 153 EXPECT_EQ(0UL, dispatcher.cursor_transaction_ids_.size()); | 157 EXPECT_EQ(0UL, dispatcher.cursor_transaction_ids_.size()); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 164 // Make a cursor request. This should record the transaction id. | 168 // Make a cursor request. This should record the transaction id. |
| 165 dispatcher.RequestIDBDatabaseOpenCursor( | 169 dispatcher.RequestIDBDatabaseOpenCursor( |
| 166 ipc_database_id, transaction_id, object_store_id, index_id, | 170 ipc_database_id, transaction_id, object_store_id, index_id, |
| 167 IndexedDBKeyRange(), direction, key_only, blink::WebIDBTaskTypeNormal, | 171 IndexedDBKeyRange(), direction, key_only, blink::WebIDBTaskTypeNormal, |
| 168 callbacks); | 172 callbacks); |
| 169 | 173 |
| 170 // Verify that the transaction id was captured. | 174 // Verify that the transaction id was captured. |
| 171 EXPECT_EQ(1UL, dispatcher.cursor_transaction_ids_.size()); | 175 EXPECT_EQ(1UL, dispatcher.cursor_transaction_ids_.size()); |
| 172 EXPECT_FALSE(cursor.get()); | 176 EXPECT_FALSE(cursor.get()); |
| 173 | 177 |
| 174 int32 ipc_callbacks_id = dispatcher.cursor_transaction_ids_.begin()->first; | 178 int32_t ipc_callbacks_id = |
| 179 dispatcher.cursor_transaction_ids_.begin()->first; |
| 175 | 180 |
| 176 IndexedDBMsg_CallbacksSuccessIDBCursor_Params params; | 181 IndexedDBMsg_CallbacksSuccessIDBCursor_Params params; |
| 177 params.ipc_thread_id = dispatcher.CurrentWorkerId(); | 182 params.ipc_thread_id = dispatcher.CurrentWorkerId(); |
| 178 params.ipc_callbacks_id = ipc_callbacks_id; | 183 params.ipc_callbacks_id = ipc_callbacks_id; |
| 179 | 184 |
| 180 // Now simululate the cursor response. | 185 // Now simululate the cursor response. |
| 181 params.ipc_cursor_id = WebIDBCursorImpl::kInvalidCursorId; | 186 params.ipc_cursor_id = WebIDBCursorImpl::kInvalidCursorId; |
| 182 dispatcher.OnSuccessOpenCursor(params); | 187 dispatcher.OnSuccessOpenCursor(params); |
| 183 | 188 |
| 184 EXPECT_EQ(0UL, dispatcher.cursor_transaction_ids_.size()); | 189 EXPECT_EQ(0UL, dispatcher.cursor_transaction_ids_.size()); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 202 | 207 |
| 203 // Make a cursor request. This should record the transaction id. | 208 // Make a cursor request. This should record the transaction id. |
| 204 dispatcher.RequestIDBDatabaseOpenCursor( | 209 dispatcher.RequestIDBDatabaseOpenCursor( |
| 205 ipc_database_id, transaction_id, object_store_id, index_id, | 210 ipc_database_id, transaction_id, object_store_id, index_id, |
| 206 IndexedDBKeyRange(), direction, key_only, blink::WebIDBTaskTypeNormal, | 211 IndexedDBKeyRange(), direction, key_only, blink::WebIDBTaskTypeNormal, |
| 207 callbacks); | 212 callbacks); |
| 208 | 213 |
| 209 // Verify that the transaction id was captured. | 214 // Verify that the transaction id was captured. |
| 210 EXPECT_EQ(1UL, dispatcher.cursor_transaction_ids_.size()); | 215 EXPECT_EQ(1UL, dispatcher.cursor_transaction_ids_.size()); |
| 211 | 216 |
| 212 int32 ipc_callbacks_id = dispatcher.cursor_transaction_ids_.begin()->first; | 217 int32_t ipc_callbacks_id = |
| 218 dispatcher.cursor_transaction_ids_.begin()->first; |
| 213 | 219 |
| 214 // Now simululate a "null cursor" response. | 220 // Now simululate a "null cursor" response. |
| 215 IndexedDBMsg_CallbacksSuccessValue_Params params; | 221 IndexedDBMsg_CallbacksSuccessValue_Params params; |
| 216 params.ipc_thread_id = dispatcher.CurrentWorkerId(); | 222 params.ipc_thread_id = dispatcher.CurrentWorkerId(); |
| 217 params.ipc_callbacks_id = ipc_callbacks_id; | 223 params.ipc_callbacks_id = ipc_callbacks_id; |
| 218 dispatcher.OnSuccessValue(params); | 224 dispatcher.OnSuccessValue(params); |
| 219 | 225 |
| 220 // Ensure the map result was deleted. | 226 // Ensure the map result was deleted. |
| 221 EXPECT_EQ(0UL, dispatcher.cursor_transaction_ids_.size()); | 227 EXPECT_EQ(0UL, dispatcher.cursor_transaction_ids_.size()); |
| 222 } | 228 } |
| 223 } | 229 } |
| 224 | 230 |
| 225 namespace { | 231 namespace { |
| 226 | 232 |
| 227 class MockCursor : public WebIDBCursorImpl { | 233 class MockCursor : public WebIDBCursorImpl { |
| 228 public: | 234 public: |
| 229 MockCursor(int32 ipc_cursor_id, | 235 MockCursor(int32_t ipc_cursor_id, |
| 230 int64 transaction_id, | 236 int64_t transaction_id, |
| 231 ThreadSafeSender* thread_safe_sender) | 237 ThreadSafeSender* thread_safe_sender) |
| 232 : WebIDBCursorImpl(ipc_cursor_id, transaction_id, thread_safe_sender), | 238 : WebIDBCursorImpl(ipc_cursor_id, transaction_id, thread_safe_sender), |
| 233 reset_count_(0) {} | 239 reset_count_(0) {} |
| 234 | 240 |
| 235 // This method is virtual so it can be overridden in unit tests. | 241 // This method is virtual so it can be overridden in unit tests. |
| 236 void ResetPrefetchCache() override { ++reset_count_; } | 242 void ResetPrefetchCache() override { ++reset_count_; } |
| 237 | 243 |
| 238 int reset_count() const { return reset_count_; } | 244 int reset_count() const { return reset_count_; } |
| 239 | 245 |
| 240 private: | 246 private: |
| 241 int reset_count_; | 247 int reset_count_; |
| 242 | 248 |
| 243 DISALLOW_COPY_AND_ASSIGN(MockCursor); | 249 DISALLOW_COPY_AND_ASSIGN(MockCursor); |
| 244 }; | 250 }; |
| 245 | 251 |
| 246 } // namespace | 252 } // namespace |
| 247 | 253 |
| 248 TEST_F(IndexedDBDispatcherTest, CursorReset) { | 254 TEST_F(IndexedDBDispatcherTest, CursorReset) { |
| 249 scoped_ptr<WebIDBCursor> cursor; | 255 scoped_ptr<WebIDBCursor> cursor; |
| 250 MockDispatcher dispatcher(thread_safe_sender_.get()); | 256 MockDispatcher dispatcher(thread_safe_sender_.get()); |
| 251 | 257 |
| 252 const int32 ipc_database_id = 0; | 258 const int32_t ipc_database_id = 0; |
| 253 const int32 object_store_id = 0; | 259 const int32_t object_store_id = 0; |
| 254 const int32 index_id = 0; | 260 const int32_t index_id = 0; |
| 255 const bool key_only = false; | 261 const bool key_only = false; |
| 256 const int cursor1_ipc_id = 1; | 262 const int cursor1_ipc_id = 1; |
| 257 const int cursor2_ipc_id = 2; | 263 const int cursor2_ipc_id = 2; |
| 258 const int other_cursor_ipc_id = 2; | 264 const int other_cursor_ipc_id = 2; |
| 259 const int cursor1_transaction_id = 1; | 265 const int cursor1_transaction_id = 1; |
| 260 const int cursor2_transaction_id = 2; | 266 const int cursor2_transaction_id = 2; |
| 261 const int other_transaction_id = 3; | 267 const int other_transaction_id = 3; |
| 262 | 268 |
| 263 scoped_ptr<MockCursor> cursor1( | 269 scoped_ptr<MockCursor> cursor1( |
| 264 new MockCursor(WebIDBCursorImpl::kInvalidCursorId, | 270 new MockCursor(WebIDBCursorImpl::kInvalidCursorId, |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 306 other_cursor_ipc_id, cursor1_transaction_id); | 312 other_cursor_ipc_id, cursor1_transaction_id); |
| 307 | 313 |
| 308 EXPECT_EQ(2, cursor1->reset_count()); | 314 EXPECT_EQ(2, cursor1->reset_count()); |
| 309 EXPECT_EQ(0, cursor2->reset_count()); | 315 EXPECT_EQ(0, cursor2->reset_count()); |
| 310 | 316 |
| 311 cursor1.reset(); | 317 cursor1.reset(); |
| 312 cursor2.reset(); | 318 cursor2.reset(); |
| 313 } | 319 } |
| 314 | 320 |
| 315 } // namespace content | 321 } // namespace content |
| OLD | NEW |