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

Unified Diff: content/child/indexed_db/webidbcursor_impl_unittest.cc

Issue 104663007: IndexedDB: Optimize IDBCursor.advance() if it occurs within prefetched range (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Added comments about virtual usage Created 7 years 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/child/indexed_db/webidbcursor_impl.cc ('k') | content/child/thread_safe_sender.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/child/indexed_db/webidbcursor_impl_unittest.cc
diff --git a/content/child/indexed_db/webidbcursor_impl_unittest.cc b/content/child/indexed_db/webidbcursor_impl_unittest.cc
index d8494d435d25fab576a4097f376c588045b101e0..14842df9c3e802a8ec50ed8f444fd04d1ddbeeab 100644
--- a/content/child/indexed_db/webidbcursor_impl_unittest.cc
+++ b/content/child/indexed_db/webidbcursor_impl_unittest.cc
@@ -30,6 +30,7 @@ class MockDispatcher : public IndexedDBDispatcher {
: IndexedDBDispatcher(thread_safe_sender),
prefetch_calls_(0),
last_prefetch_count_(0),
+ advance_calls_(0),
continue_calls_(0),
destroyed_cursor_id_(0) {}
@@ -41,6 +42,13 @@ class MockDispatcher : public IndexedDBDispatcher {
callbacks_.reset(callbacks);
}
+ virtual void RequestIDBCursorAdvance(unsigned long count,
+ WebIDBCallbacks* callbacks,
+ int32 ipc_cursor_id) OVERRIDE {
+ ++advance_calls_;
+ callbacks_.reset(callbacks);
+ }
+
virtual void RequestIDBCursorContinue(const IndexedDBKey& key,
const IndexedDBKey& primary_key,
WebIDBCallbacks* callbacks,
@@ -54,6 +62,7 @@ class MockDispatcher : public IndexedDBDispatcher {
}
int prefetch_calls() { return prefetch_calls_; }
+ int advance_calls() { return advance_calls_; }
int continue_calls() { return continue_calls_; }
int last_prefetch_count() { return last_prefetch_count_; }
int32 destroyed_cursor_id() { return destroyed_cursor_id_; }
@@ -61,6 +70,7 @@ class MockDispatcher : public IndexedDBDispatcher {
private:
int prefetch_calls_;
int last_prefetch_count_;
+ int advance_calls_;
int continue_calls_;
int32 destroyed_cursor_id_;
scoped_ptr<WebIDBCallbacks> callbacks_;
@@ -84,31 +94,41 @@ class MockContinueCallbacks : public WebIDBCallbacks {
} // namespace
-TEST(WebIDBCursorImplTest, PrefetchTest) {
+class WebIDBCursorImplTest : public testing::Test {
+ public:
+ WebIDBCursorImplTest() {
+ null_key_.assignNull();
+ sync_message_filter_ = new IPC::SyncMessageFilter(NULL);
+ thread_safe_sender_ = new ThreadSafeSender(
+ base::MessageLoopProxy::current(), sync_message_filter_.get());
+ dispatcher_ =
+ make_scoped_ptr(new MockDispatcher(thread_safe_sender_.get()));
+ }
- WebIDBKey null_key;
- null_key.assignNull();
+ protected:
+ WebIDBKey null_key_;
+ scoped_refptr<ThreadSafeSender> thread_safe_sender_;
+ scoped_ptr<MockDispatcher> dispatcher_;
- scoped_refptr<base::MessageLoopProxy> message_loop_proxy(
- base::MessageLoopProxy::current());
- scoped_refptr<IPC::SyncMessageFilter> sync_message_filter(
- new IPC::SyncMessageFilter(NULL));
- scoped_refptr<ThreadSafeSender> thread_safe_sender(new ThreadSafeSender(
- message_loop_proxy.get(), sync_message_filter.get()));
+ private:
+ scoped_refptr<IPC::SyncMessageFilter> sync_message_filter_;
- MockDispatcher dispatcher(thread_safe_sender.get());
+ DISALLOW_COPY_AND_ASSIGN(WebIDBCursorImplTest);
+};
+
+TEST_F(WebIDBCursorImplTest, PrefetchTest) {
{
WebIDBCursorImpl cursor(WebIDBCursorImpl::kInvalidCursorId,
- thread_safe_sender.get());
+ thread_safe_sender_.get());
// Call continue() until prefetching should kick in.
int continue_calls = 0;
- EXPECT_EQ(dispatcher.continue_calls(), 0);
+ EXPECT_EQ(dispatcher_->continue_calls(), 0);
for (int i = 0; i < WebIDBCursorImpl::kPrefetchContinueThreshold; ++i) {
- cursor.continueFunction(null_key, new MockContinueCallbacks());
- EXPECT_EQ(++continue_calls, dispatcher.continue_calls());
- EXPECT_EQ(0, dispatcher.prefetch_calls());
+ cursor.continueFunction(null_key_, new MockContinueCallbacks());
+ EXPECT_EQ(++continue_calls, dispatcher_->continue_calls());
+ EXPECT_EQ(0, dispatcher_->prefetch_calls());
}
// Do enough repetitions to verify that the count grows each time,
@@ -121,12 +141,12 @@ TEST(WebIDBCursorImplTest, PrefetchTest) {
++repetitions) {
// Initiate the prefetch
- cursor.continueFunction(null_key, new MockContinueCallbacks());
- EXPECT_EQ(continue_calls, dispatcher.continue_calls());
- EXPECT_EQ(repetitions + 1, dispatcher.prefetch_calls());
+ cursor.continueFunction(null_key_, new MockContinueCallbacks());
+ EXPECT_EQ(continue_calls, dispatcher_->continue_calls());
+ EXPECT_EQ(repetitions + 1, dispatcher_->prefetch_calls());
// Verify that the requested count has increased since last time.
- int prefetch_count = dispatcher.last_prefetch_count();
+ int prefetch_count = dispatcher_->last_prefetch_count();
EXPECT_GT(prefetch_count, last_prefetch_count);
last_prefetch_count = prefetch_count;
@@ -146,9 +166,9 @@ TEST(WebIDBCursorImplTest, PrefetchTest) {
// Verify that the cache is used for subsequent continue() calls.
for (int i = 0; i < prefetch_count; ++i) {
IndexedDBKey key;
- cursor.continueFunction(null_key, new MockContinueCallbacks(&key));
- EXPECT_EQ(continue_calls, dispatcher.continue_calls());
- EXPECT_EQ(repetitions + 1, dispatcher.prefetch_calls());
+ cursor.continueFunction(null_key_, new MockContinueCallbacks(&key));
+ EXPECT_EQ(continue_calls, dispatcher_->continue_calls());
+ EXPECT_EQ(repetitions + 1, dispatcher_->prefetch_calls());
EXPECT_EQ(WebIDBKeyTypeNumber, key.type());
EXPECT_EQ(expected_key++, key.number());
@@ -156,8 +176,75 @@ TEST(WebIDBCursorImplTest, PrefetchTest) {
}
}
- EXPECT_EQ(dispatcher.destroyed_cursor_id(),
+ EXPECT_EQ(dispatcher_->destroyed_cursor_id(),
WebIDBCursorImpl::kInvalidCursorId);
}
+TEST_F(WebIDBCursorImplTest, AdvancePrefetchTest) {
+
+ WebIDBCursorImpl cursor(WebIDBCursorImpl::kInvalidCursorId,
+ thread_safe_sender_.get());
+
+ // Call continue() until prefetching should kick in.
+ EXPECT_EQ(0, dispatcher_->continue_calls());
+ for (int i = 0; i < WebIDBCursorImpl::kPrefetchContinueThreshold; ++i) {
+ cursor.continueFunction(null_key_, new MockContinueCallbacks());
+ }
+ EXPECT_EQ(0, dispatcher_->prefetch_calls());
+
+ // Initiate the prefetch
+ cursor.continueFunction(null_key_, new MockContinueCallbacks());
+
+ EXPECT_EQ(1, dispatcher_->prefetch_calls());
+ EXPECT_EQ(static_cast<int>(WebIDBCursorImpl::kPrefetchContinueThreshold),
+ dispatcher_->continue_calls());
+ EXPECT_EQ(0, dispatcher_->advance_calls());
+
+ const int prefetch_count = dispatcher_->last_prefetch_count();
+
+ // Fill the prefetch cache as requested.
+ int expected_key = 0;
+ std::vector<IndexedDBKey> keys;
+ std::vector<IndexedDBKey> primary_keys(prefetch_count);
+ std::vector<WebData> values(prefetch_count);
+ for (int i = 0; i < prefetch_count; ++i) {
+ keys.push_back(IndexedDBKey(expected_key + i, WebIDBKeyTypeNumber));
+ }
+ cursor.SetPrefetchData(keys, primary_keys, values);
+
+ // Note that the real dispatcher would call cursor->CachedContinue()
+ // immediately after cursor->SetPrefetchData() to service the request
+ // that initiated the prefetch.
+
+ // Need at least this many in the cache for the test steps.
+ ASSERT_GE(prefetch_count, 5);
+
+ // IDBCursor.continue()
+ IndexedDBKey key;
+ cursor.continueFunction(null_key_, new MockContinueCallbacks(&key));
+ EXPECT_EQ(0, key.number());
+
+ // IDBCursor.advance(1)
+ cursor.advance(1, new MockContinueCallbacks(&key));
+ EXPECT_EQ(1, key.number());
+
+ // IDBCursor.continue()
+ cursor.continueFunction(null_key_, new MockContinueCallbacks(&key));
+ EXPECT_EQ(2, key.number());
+
+ // IDBCursor.advance(2)
+ cursor.advance(2, new MockContinueCallbacks(&key));
+ EXPECT_EQ(4, key.number());
+
+ EXPECT_EQ(0, dispatcher_->advance_calls());
+
+ // IDBCursor.advance(lots) - beyond the fetched amount
+ cursor.advance(WebIDBCursorImpl::kMaxPrefetchAmount,
+ new MockContinueCallbacks(&key));
+ EXPECT_EQ(1, dispatcher_->advance_calls());
+ EXPECT_EQ(1, dispatcher_->prefetch_calls());
+ EXPECT_EQ(static_cast<int>(WebIDBCursorImpl::kPrefetchContinueThreshold),
+ dispatcher_->continue_calls());
+}
+
} // namespace content
« no previous file with comments | « content/child/indexed_db/webidbcursor_impl.cc ('k') | content/child/thread_safe_sender.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698