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 "base/memory/scoped_ptr.h" | 5 #include "base/memory/scoped_ptr.h" |
6 #include "base/values.h" | 6 #include "base/values.h" |
7 #include "content/child/indexed_db/indexed_db_dispatcher.h" | 7 #include "content/child/indexed_db/indexed_db_dispatcher.h" |
8 #include "content/child/indexed_db/indexed_db_key_builders.h" | 8 #include "content/child/indexed_db/indexed_db_key_builders.h" |
9 #include "content/child/indexed_db/webidbcursor_impl.h" | 9 #include "content/child/indexed_db/webidbcursor_impl.h" |
10 #include "content/child/thread_safe_sender.h" | 10 #include "content/child/thread_safe_sender.h" |
(...skipping 10 matching lines...) Expand all Loading... |
21 using blink::WebIDBKey; | 21 using blink::WebIDBKey; |
22 using blink::WebIDBKeyTypeNumber; | 22 using blink::WebIDBKeyTypeNumber; |
23 using blink::WebVector; | 23 using blink::WebVector; |
24 | 24 |
25 namespace content { | 25 namespace content { |
26 | 26 |
27 namespace { | 27 namespace { |
28 | 28 |
29 class MockDispatcher : public IndexedDBDispatcher { | 29 class MockDispatcher : public IndexedDBDispatcher { |
30 public: | 30 public: |
31 MockDispatcher(ThreadSafeSender* thread_safe_sender) | 31 explicit MockDispatcher(ThreadSafeSender* thread_safe_sender) |
32 : IndexedDBDispatcher(thread_safe_sender), | 32 : IndexedDBDispatcher(thread_safe_sender), |
33 prefetch_calls_(0), | 33 prefetch_calls_(0), |
34 last_prefetch_count_(0), | 34 last_prefetch_count_(0), |
35 reset_calls_(0), | 35 reset_calls_(0), |
36 last_used_count_(0), | 36 last_used_count_(0), |
37 advance_calls_(0), | 37 advance_calls_(0), |
38 continue_calls_(0), | 38 continue_calls_(0), |
39 destroyed_cursor_id_(0) {} | 39 destroyed_cursor_id_(0) {} |
40 | 40 |
41 virtual void RequestIDBCursorPrefetch(int n, | 41 virtual void RequestIDBCursorPrefetch(int n, |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
96 class MockContinueCallbacks : public WebIDBCallbacks { | 96 class MockContinueCallbacks : public WebIDBCallbacks { |
97 public: | 97 public: |
98 MockContinueCallbacks(IndexedDBKey* key = 0, | 98 MockContinueCallbacks(IndexedDBKey* key = 0, |
99 WebVector<WebBlobInfo>* webBlobInfo = 0) | 99 WebVector<WebBlobInfo>* webBlobInfo = 0) |
100 : key_(key), webBlobInfo_(webBlobInfo) {} | 100 : key_(key), webBlobInfo_(webBlobInfo) {} |
101 | 101 |
102 virtual void onSuccess(const WebIDBKey& key, | 102 virtual void onSuccess(const WebIDBKey& key, |
103 const WebIDBKey& primaryKey, | 103 const WebIDBKey& primaryKey, |
104 const WebData& value, | 104 const WebData& value, |
105 const WebVector<WebBlobInfo>& webBlobInfo) OVERRIDE { | 105 const WebVector<WebBlobInfo>& webBlobInfo) OVERRIDE { |
106 | |
107 if (key_) | 106 if (key_) |
108 *key_ = IndexedDBKeyBuilder::Build(key); | 107 *key_ = IndexedDBKeyBuilder::Build(key); |
109 if (webBlobInfo_) | 108 if (webBlobInfo_) |
110 *webBlobInfo_ = webBlobInfo; | 109 *webBlobInfo_ = webBlobInfo; |
111 } | 110 } |
112 | 111 |
113 private: | 112 private: |
114 IndexedDBKey* key_; | 113 IndexedDBKey* key_; |
115 WebVector<WebBlobInfo>* webBlobInfo_; | 114 WebVector<WebBlobInfo>* webBlobInfo_; |
116 }; | 115 }; |
(...skipping 16 matching lines...) Expand all Loading... |
133 scoped_refptr<ThreadSafeSender> thread_safe_sender_; | 132 scoped_refptr<ThreadSafeSender> thread_safe_sender_; |
134 scoped_ptr<MockDispatcher> dispatcher_; | 133 scoped_ptr<MockDispatcher> dispatcher_; |
135 | 134 |
136 private: | 135 private: |
137 scoped_refptr<IPC::SyncMessageFilter> sync_message_filter_; | 136 scoped_refptr<IPC::SyncMessageFilter> sync_message_filter_; |
138 | 137 |
139 DISALLOW_COPY_AND_ASSIGN(WebIDBCursorImplTest); | 138 DISALLOW_COPY_AND_ASSIGN(WebIDBCursorImplTest); |
140 }; | 139 }; |
141 | 140 |
142 TEST_F(WebIDBCursorImplTest, PrefetchTest) { | 141 TEST_F(WebIDBCursorImplTest, PrefetchTest) { |
143 | |
144 const int64 transaction_id = 1; | 142 const int64 transaction_id = 1; |
145 { | 143 { |
146 WebIDBCursorImpl cursor(WebIDBCursorImpl::kInvalidCursorId, | 144 WebIDBCursorImpl cursor(WebIDBCursorImpl::kInvalidCursorId, |
147 transaction_id, | 145 transaction_id, |
148 thread_safe_sender_.get()); | 146 thread_safe_sender_.get()); |
149 | 147 |
150 // Call continue() until prefetching should kick in. | 148 // Call continue() until prefetching should kick in. |
151 int continue_calls = 0; | 149 int continue_calls = 0; |
152 EXPECT_EQ(dispatcher_->continue_calls(), 0); | 150 EXPECT_EQ(dispatcher_->continue_calls(), 0); |
153 for (int i = 0; i < WebIDBCursorImpl::kPrefetchContinueThreshold; ++i) { | 151 for (int i = 0; i < WebIDBCursorImpl::kPrefetchContinueThreshold; ++i) { |
154 cursor.continueFunction(null_key_, new MockContinueCallbacks()); | 152 cursor.continueFunction(null_key_, new MockContinueCallbacks()); |
155 EXPECT_EQ(++continue_calls, dispatcher_->continue_calls()); | 153 EXPECT_EQ(++continue_calls, dispatcher_->continue_calls()); |
156 EXPECT_EQ(0, dispatcher_->prefetch_calls()); | 154 EXPECT_EQ(0, dispatcher_->prefetch_calls()); |
157 } | 155 } |
158 | 156 |
159 // Do enough repetitions to verify that the count grows each time, | 157 // Do enough repetitions to verify that the count grows each time, |
160 // but not so many that the maximum limit is hit. | 158 // but not so many that the maximum limit is hit. |
161 const int kPrefetchRepetitions = 5; | 159 const int kPrefetchRepetitions = 5; |
162 | 160 |
163 int expected_key = 0; | 161 int expected_key = 0; |
164 int last_prefetch_count = 0; | 162 int last_prefetch_count = 0; |
165 for (int repetitions = 0; repetitions < kPrefetchRepetitions; | 163 for (int repetitions = 0; repetitions < kPrefetchRepetitions; |
166 ++repetitions) { | 164 ++repetitions) { |
167 | |
168 // Initiate the prefetch | 165 // Initiate the prefetch |
169 cursor.continueFunction(null_key_, new MockContinueCallbacks()); | 166 cursor.continueFunction(null_key_, new MockContinueCallbacks()); |
170 EXPECT_EQ(continue_calls, dispatcher_->continue_calls()); | 167 EXPECT_EQ(continue_calls, dispatcher_->continue_calls()); |
171 EXPECT_EQ(repetitions + 1, dispatcher_->prefetch_calls()); | 168 EXPECT_EQ(repetitions + 1, dispatcher_->prefetch_calls()); |
172 | 169 |
173 // Verify that the requested count has increased since last time. | 170 // Verify that the requested count has increased since last time. |
174 int prefetch_count = dispatcher_->last_prefetch_count(); | 171 int prefetch_count = dispatcher_->last_prefetch_count(); |
175 EXPECT_GT(prefetch_count, last_prefetch_count); | 172 EXPECT_GT(prefetch_count, last_prefetch_count); |
176 last_prefetch_count = prefetch_count; | 173 last_prefetch_count = prefetch_count; |
177 | 174 |
(...skipping 27 matching lines...) Expand all Loading... |
205 EXPECT_EQ(expected_key++, key.number()); | 202 EXPECT_EQ(expected_key++, key.number()); |
206 } | 203 } |
207 } | 204 } |
208 } | 205 } |
209 | 206 |
210 EXPECT_EQ(dispatcher_->destroyed_cursor_id(), | 207 EXPECT_EQ(dispatcher_->destroyed_cursor_id(), |
211 WebIDBCursorImpl::kInvalidCursorId); | 208 WebIDBCursorImpl::kInvalidCursorId); |
212 } | 209 } |
213 | 210 |
214 TEST_F(WebIDBCursorImplTest, AdvancePrefetchTest) { | 211 TEST_F(WebIDBCursorImplTest, AdvancePrefetchTest) { |
215 | |
216 const int64 transaction_id = 1; | 212 const int64 transaction_id = 1; |
217 WebIDBCursorImpl cursor(WebIDBCursorImpl::kInvalidCursorId, | 213 WebIDBCursorImpl cursor(WebIDBCursorImpl::kInvalidCursorId, |
218 transaction_id, | 214 transaction_id, |
219 thread_safe_sender_.get()); | 215 thread_safe_sender_.get()); |
220 | 216 |
221 // Call continue() until prefetching should kick in. | 217 // Call continue() until prefetching should kick in. |
222 EXPECT_EQ(0, dispatcher_->continue_calls()); | 218 EXPECT_EQ(0, dispatcher_->continue_calls()); |
223 for (int i = 0; i < WebIDBCursorImpl::kPrefetchContinueThreshold; ++i) { | 219 for (int i = 0; i < WebIDBCursorImpl::kPrefetchContinueThreshold; ++i) { |
224 cursor.continueFunction(null_key_, new MockContinueCallbacks()); | 220 cursor.continueFunction(null_key_, new MockContinueCallbacks()); |
225 } | 221 } |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
324 // The real dispatcher would call cursor->CachedContinue(), so do that: | 320 // The real dispatcher would call cursor->CachedContinue(), so do that: |
325 scoped_ptr<WebIDBCallbacks> callbacks(new MockContinueCallbacks()); | 321 scoped_ptr<WebIDBCallbacks> callbacks(new MockContinueCallbacks()); |
326 cursor.CachedContinue(callbacks.get()); | 322 cursor.CachedContinue(callbacks.get()); |
327 | 323 |
328 // Now the cursor should have reset the rest of the cache. | 324 // Now the cursor should have reset the rest of the cache. |
329 EXPECT_EQ(1, dispatcher_->reset_calls()); | 325 EXPECT_EQ(1, dispatcher_->reset_calls()); |
330 EXPECT_EQ(1, dispatcher_->last_used_count()); | 326 EXPECT_EQ(1, dispatcher_->last_used_count()); |
331 } | 327 } |
332 | 328 |
333 } // namespace content | 329 } // namespace content |
OLD | NEW |