Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(309)

Side by Side Diff: content/child/indexed_db/webidbcursor_impl_unittest.cc

Issue 124323002: IndexedDB: Fix cursor prefetching edge cases (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix test-only leak found by valgrind Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « content/child/indexed_db/webidbcursor_impl.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 12 matching lines...) Expand all
23 namespace content { 23 namespace content {
24 24
25 namespace { 25 namespace {
26 26
27 class MockDispatcher : public IndexedDBDispatcher { 27 class MockDispatcher : public IndexedDBDispatcher {
28 public: 28 public:
29 MockDispatcher(ThreadSafeSender* thread_safe_sender) 29 MockDispatcher(ThreadSafeSender* thread_safe_sender)
30 : IndexedDBDispatcher(thread_safe_sender), 30 : IndexedDBDispatcher(thread_safe_sender),
31 prefetch_calls_(0), 31 prefetch_calls_(0),
32 last_prefetch_count_(0), 32 last_prefetch_count_(0),
33 reset_calls_(0),
34 last_used_count_(0),
33 advance_calls_(0), 35 advance_calls_(0),
34 continue_calls_(0), 36 continue_calls_(0),
35 destroyed_cursor_id_(0) {} 37 destroyed_cursor_id_(0) {}
36 38
37 virtual void RequestIDBCursorPrefetch(int n, 39 virtual void RequestIDBCursorPrefetch(int n,
38 WebIDBCallbacks* callbacks, 40 WebIDBCallbacks* callbacks,
39 int32 ipc_cursor_id) OVERRIDE { 41 int32 ipc_cursor_id) OVERRIDE {
40 ++prefetch_calls_; 42 ++prefetch_calls_;
41 last_prefetch_count_ = n; 43 last_prefetch_count_ = n;
42 callbacks_.reset(callbacks); 44 callbacks_.reset(callbacks);
43 } 45 }
44 46
47 virtual void RequestIDBCursorPrefetchReset(int used_prefetches,
48 int unused_prefetches,
49 int32 ipc_cursor_id) OVERRIDE {
50 ++reset_calls_;
51 last_used_count_ = used_prefetches;
52 }
53
45 virtual void RequestIDBCursorAdvance(unsigned long count, 54 virtual void RequestIDBCursorAdvance(unsigned long count,
46 WebIDBCallbacks* callbacks, 55 WebIDBCallbacks* callbacks,
47 int32 ipc_cursor_id) OVERRIDE { 56 int32 ipc_cursor_id) OVERRIDE {
48 ++advance_calls_; 57 ++advance_calls_;
49 callbacks_.reset(callbacks); 58 callbacks_.reset(callbacks);
50 } 59 }
51 60
52 virtual void RequestIDBCursorContinue(const IndexedDBKey& key, 61 virtual void RequestIDBCursorContinue(const IndexedDBKey& key,
53 const IndexedDBKey& primary_key, 62 const IndexedDBKey& primary_key,
54 WebIDBCallbacks* callbacks, 63 WebIDBCallbacks* callbacks,
55 int32 ipc_cursor_id) OVERRIDE { 64 int32 ipc_cursor_id) OVERRIDE {
56 ++continue_calls_; 65 ++continue_calls_;
57 callbacks_.reset(callbacks); 66 callbacks_.reset(callbacks);
58 } 67 }
59 68
60 virtual void CursorDestroyed(int32 ipc_cursor_id) OVERRIDE { 69 virtual void CursorDestroyed(int32 ipc_cursor_id) OVERRIDE {
61 destroyed_cursor_id_ = ipc_cursor_id; 70 destroyed_cursor_id_ = ipc_cursor_id;
62 } 71 }
63 72
64 int prefetch_calls() { return prefetch_calls_; } 73 int prefetch_calls() { return prefetch_calls_; }
74 int last_prefetch_count() { return last_prefetch_count_; }
75 int reset_calls() { return reset_calls_; }
76 int last_used_count() { return last_used_count_; }
65 int advance_calls() { return advance_calls_; } 77 int advance_calls() { return advance_calls_; }
66 int continue_calls() { return continue_calls_; } 78 int continue_calls() { return continue_calls_; }
67 int last_prefetch_count() { return last_prefetch_count_; }
68 int32 destroyed_cursor_id() { return destroyed_cursor_id_; } 79 int32 destroyed_cursor_id() { return destroyed_cursor_id_; }
69 80
70 private: 81 private:
71 int prefetch_calls_; 82 int prefetch_calls_;
72 int last_prefetch_count_; 83 int last_prefetch_count_;
84 int reset_calls_;
85 int last_used_count_;
73 int advance_calls_; 86 int advance_calls_;
74 int continue_calls_; 87 int continue_calls_;
75 int32 destroyed_cursor_id_; 88 int32 destroyed_cursor_id_;
76 scoped_ptr<WebIDBCallbacks> callbacks_; 89 scoped_ptr<WebIDBCallbacks> callbacks_;
77 }; 90 };
78 91
79 class MockContinueCallbacks : public WebIDBCallbacks { 92 class MockContinueCallbacks : public WebIDBCallbacks {
80 public: 93 public:
81 MockContinueCallbacks(IndexedDBKey* key = 0) : key_(key) {} 94 MockContinueCallbacks(IndexedDBKey* key = 0) : key_(key) {}
82 95
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
240 253
241 // IDBCursor.advance(lots) - beyond the fetched amount 254 // IDBCursor.advance(lots) - beyond the fetched amount
242 cursor.advance(WebIDBCursorImpl::kMaxPrefetchAmount, 255 cursor.advance(WebIDBCursorImpl::kMaxPrefetchAmount,
243 new MockContinueCallbacks(&key)); 256 new MockContinueCallbacks(&key));
244 EXPECT_EQ(1, dispatcher_->advance_calls()); 257 EXPECT_EQ(1, dispatcher_->advance_calls());
245 EXPECT_EQ(1, dispatcher_->prefetch_calls()); 258 EXPECT_EQ(1, dispatcher_->prefetch_calls());
246 EXPECT_EQ(static_cast<int>(WebIDBCursorImpl::kPrefetchContinueThreshold), 259 EXPECT_EQ(static_cast<int>(WebIDBCursorImpl::kPrefetchContinueThreshold),
247 dispatcher_->continue_calls()); 260 dispatcher_->continue_calls());
248 } 261 }
249 262
263 TEST_F(WebIDBCursorImplTest, PrefetchReset) {
264 WebIDBCursorImpl cursor(WebIDBCursorImpl::kInvalidCursorId,
265 thread_safe_sender_.get());
266
267 // Call continue() until prefetching should kick in.
268 int continue_calls = 0;
269 EXPECT_EQ(dispatcher_->continue_calls(), 0);
270 for (int i = 0; i < WebIDBCursorImpl::kPrefetchContinueThreshold; ++i) {
271 cursor.continueFunction(null_key_, new MockContinueCallbacks());
272 EXPECT_EQ(++continue_calls, dispatcher_->continue_calls());
273 EXPECT_EQ(0, dispatcher_->prefetch_calls());
274 }
275
276 // Initiate the prefetch
277 cursor.continueFunction(null_key_, new MockContinueCallbacks());
278 EXPECT_EQ(continue_calls, dispatcher_->continue_calls());
279 EXPECT_EQ(1, dispatcher_->prefetch_calls());
280 EXPECT_EQ(0, dispatcher_->reset_calls());
281
282 // Now invalidate it
283 cursor.ResetPrefetchCache();
284
285 // No reset should have been sent since nothing has been received yet.
286 EXPECT_EQ(0, dispatcher_->reset_calls());
287
288 // Fill the prefetch cache as requested.
289 int prefetch_count = dispatcher_->last_prefetch_count();
290 std::vector<IndexedDBKey> keys(prefetch_count);
291 std::vector<IndexedDBKey> primary_keys(prefetch_count);
292 std::vector<WebData> values(prefetch_count);
293 cursor.SetPrefetchData(keys, primary_keys, values);
294
295 // No reset should have been sent since prefetch data hasn't been used.
296 EXPECT_EQ(0, dispatcher_->reset_calls());
297
298 // The real dispatcher would call cursor->CachedContinue(), so do that:
299 scoped_ptr<WebIDBCallbacks> callbacks(new MockContinueCallbacks());
300 cursor.CachedContinue(callbacks.get());
301
302 // Now the cursor should have reset the rest of the cache.
303 EXPECT_EQ(1, dispatcher_->reset_calls());
304 EXPECT_EQ(1, dispatcher_->last_used_count());
305 }
306
250 } // namespace content 307 } // namespace content
OLDNEW
« no previous file with comments | « content/child/indexed_db/webidbcursor_impl.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698