| Index: content/child/indexed_db/indexed_db_dispatcher_unittest.cc
 | 
| diff --git a/content/child/indexed_db/indexed_db_dispatcher_unittest.cc b/content/child/indexed_db/indexed_db_dispatcher_unittest.cc
 | 
| deleted file mode 100644
 | 
| index 029689f388eb7b134735e19390b0546b11017829..0000000000000000000000000000000000000000
 | 
| --- a/content/child/indexed_db/indexed_db_dispatcher_unittest.cc
 | 
| +++ /dev/null
 | 
| @@ -1,322 +0,0 @@
 | 
| -// Copyright 2013 The Chromium Authors. All rights reserved.
 | 
| -// Use of this source code is governed by a BSD-style license that can be
 | 
| -// found in the LICENSE file.
 | 
| -
 | 
| -#include "content/child/indexed_db/indexed_db_dispatcher.h"
 | 
| -
 | 
| -#include <stddef.h>
 | 
| -#include <stdint.h>
 | 
| -
 | 
| -#include <memory>
 | 
| -
 | 
| -#include "base/macros.h"
 | 
| -#include "base/single_thread_task_runner.h"
 | 
| -#include "base/threading/thread_task_runner_handle.h"
 | 
| -#include "base/values.h"
 | 
| -#include "content/child/indexed_db/mock_webidbcallbacks.h"
 | 
| -#include "content/child/indexed_db/webidbcursor_impl.h"
 | 
| -#include "content/child/thread_safe_sender.h"
 | 
| -#include "content/common/indexed_db/indexed_db_key.h"
 | 
| -#include "content/common/indexed_db/indexed_db_key_range.h"
 | 
| -#include "content/common/indexed_db/indexed_db_messages.h"
 | 
| -#include "ipc/ipc_sync_message_filter.h"
 | 
| -#include "testing/gtest/include/gtest/gtest.h"
 | 
| -#include "third_party/WebKit/public/platform/WebBlobInfo.h"
 | 
| -#include "third_party/WebKit/public/platform/WebData.h"
 | 
| -#include "third_party/WebKit/public/web/WebHeap.h"
 | 
| -
 | 
| -using blink::WebBlobInfo;
 | 
| -using blink::WebData;
 | 
| -using blink::WebIDBCursor;
 | 
| -using blink::WebIDBKey;
 | 
| -using blink::WebVector;
 | 
| -using testing::_;
 | 
| -using testing::Invoke;
 | 
| -using testing::StrictMock;
 | 
| -using testing::WithArgs;
 | 
| -
 | 
| -namespace content {
 | 
| -namespace {
 | 
| -
 | 
| -class MockDispatcher : public IndexedDBDispatcher {
 | 
| - public:
 | 
| -  explicit MockDispatcher(ThreadSafeSender* sender)
 | 
| -      : IndexedDBDispatcher(sender) {}
 | 
| -
 | 
| -  bool Send(IPC::Message* msg) override {
 | 
| -    delete msg;
 | 
| -    return true;
 | 
| -  }
 | 
| -
 | 
| - private:
 | 
| -  DISALLOW_COPY_AND_ASSIGN(MockDispatcher);
 | 
| -};
 | 
| -
 | 
| -class MockSyncMessageFilter : public IPC::SyncMessageFilter {
 | 
| - public:
 | 
| -  MockSyncMessageFilter()
 | 
| -      : SyncMessageFilter(nullptr, false /* is_channel_send_thread_safe */) {}
 | 
| -
 | 
| - private:
 | 
| -  ~MockSyncMessageFilter() override {}
 | 
| -};
 | 
| -
 | 
| -}  // namespace
 | 
| -
 | 
| -class IndexedDBDispatcherTest : public testing::Test {
 | 
| - public:
 | 
| -  IndexedDBDispatcherTest()
 | 
| -      : thread_safe_sender_(new ThreadSafeSender(
 | 
| -            base::ThreadTaskRunnerHandle::Get(), new MockSyncMessageFilter)) {}
 | 
| -
 | 
| -  void TearDown() override { blink::WebHeap::collectAllGarbageForTesting(); }
 | 
| -
 | 
| - protected:
 | 
| -  base::MessageLoop message_loop_;
 | 
| -  scoped_refptr<ThreadSafeSender> thread_safe_sender_;
 | 
| -
 | 
| - private:
 | 
| -  DISALLOW_COPY_AND_ASSIGN(IndexedDBDispatcherTest);
 | 
| -};
 | 
| -
 | 
| -TEST_F(IndexedDBDispatcherTest, ValueSizeTest) {
 | 
| -  // For testing use a much smaller maximum size to prevent allocating >100 MB
 | 
| -  // of memory, which crashes on memory-constrained systems.
 | 
| -  const size_t kMaxValueSizeForTesting = 10 * 1024 * 1024;  // 10 MB
 | 
| -
 | 
| -  const std::vector<char> data(kMaxValueSizeForTesting + 1);
 | 
| -  const WebData value(&data.front(), data.size());
 | 
| -  const WebVector<WebBlobInfo> web_blob_info;
 | 
| -  const int32_t ipc_dummy_id = -1;
 | 
| -  const int64_t transaction_id = 1;
 | 
| -  const int64_t object_store_id = 2;
 | 
| -
 | 
| -  StrictMock<MockWebIDBCallbacks> callbacks;
 | 
| -  EXPECT_CALL(callbacks, onError(_)).Times(1);
 | 
| -
 | 
| -  IndexedDBDispatcher dispatcher(thread_safe_sender_.get());
 | 
| -  dispatcher.max_put_value_size_ = kMaxValueSizeForTesting;
 | 
| -  IndexedDBKey key(0, blink::WebIDBKeyTypeNumber);
 | 
| -  dispatcher.RequestIDBDatabasePut(ipc_dummy_id,
 | 
| -                                   transaction_id,
 | 
| -                                   object_store_id,
 | 
| -                                   value,
 | 
| -                                   web_blob_info,
 | 
| -                                   key,
 | 
| -                                   blink::WebIDBPutModeAddOrUpdate,
 | 
| -                                   &callbacks,
 | 
| -                                   WebVector<long long>(),
 | 
| -                                   WebVector<WebVector<WebIDBKey> >());
 | 
| -}
 | 
| -
 | 
| -TEST_F(IndexedDBDispatcherTest, KeyAndValueSizeTest) {
 | 
| -  // For testing use a much smaller maximum size to prevent allocating >100 MB
 | 
| -  // of memory, which crashes on memory-constrained systems.
 | 
| -  const size_t kMaxValueSizeForTesting = 10 * 1024 * 1024;  // 10 MB
 | 
| -  const size_t kKeySize = 1024 * 1024;
 | 
| -
 | 
| -  const std::vector<char> data(kMaxValueSizeForTesting - kKeySize);
 | 
| -  const WebData value(&data.front(), data.size());
 | 
| -  const WebVector<WebBlobInfo> web_blob_info;
 | 
| -  const IndexedDBKey key(
 | 
| -      base::string16(kKeySize / sizeof(base::string16::value_type), 'x'));
 | 
| -
 | 
| -  const int32_t ipc_dummy_id = -1;
 | 
| -  const int64_t transaction_id = 1;
 | 
| -  const int64_t object_store_id = 2;
 | 
| -
 | 
| -  StrictMock<MockWebIDBCallbacks> callbacks;
 | 
| -  EXPECT_CALL(callbacks, onError(_)).Times(1);
 | 
| -
 | 
| -  IndexedDBDispatcher dispatcher(thread_safe_sender_.get());
 | 
| -  dispatcher.max_put_value_size_ = kMaxValueSizeForTesting;
 | 
| -  dispatcher.RequestIDBDatabasePut(ipc_dummy_id,
 | 
| -                                   transaction_id,
 | 
| -                                   object_store_id,
 | 
| -                                   value,
 | 
| -                                   web_blob_info,
 | 
| -                                   key,
 | 
| -                                   blink::WebIDBPutModeAddOrUpdate,
 | 
| -                                   &callbacks,
 | 
| -                                   WebVector<long long>(),
 | 
| -                                   WebVector<WebVector<WebIDBKey> >());
 | 
| -}
 | 
| -
 | 
| -TEST_F(IndexedDBDispatcherTest, CursorTransactionId) {
 | 
| -  const int32_t ipc_database_id = -1;
 | 
| -  const int64_t transaction_id = 1234;
 | 
| -  const int64_t object_store_id = 2;
 | 
| -  const int32_t index_id = 3;
 | 
| -  const blink::WebIDBCursorDirection direction =
 | 
| -      blink::WebIDBCursorDirectionNext;
 | 
| -  const bool key_only = false;
 | 
| -
 | 
| -  MockDispatcher dispatcher(thread_safe_sender_.get());
 | 
| -
 | 
| -  // First case: successful cursor open.
 | 
| -  {
 | 
| -    std::unique_ptr<WebIDBCursor> cursor;
 | 
| -    EXPECT_EQ(0UL, dispatcher.cursor_transaction_ids_.size());
 | 
| -
 | 
| -    auto* callbacks = new StrictMock<MockWebIDBCallbacks>();
 | 
| -    // Reference first param (cursor) to keep it alive.
 | 
| -    // TODO(cmumford): Cleanup (and below) once std::addressof() is allowed.
 | 
| -    ON_CALL(*callbacks, onSuccess(testing::A<WebIDBCursor*>(), _, _, _))
 | 
| -        .WillByDefault(
 | 
| -            WithArgs<0>(Invoke(&cursor.operator=(nullptr),
 | 
| -                               &std::unique_ptr<WebIDBCursor>::reset)));
 | 
| -    EXPECT_CALL(*callbacks, onSuccess(testing::A<WebIDBCursor*>(), _, _, _))
 | 
| -        .Times(1);
 | 
| -
 | 
| -    // Make a cursor request. This should record the transaction id.
 | 
| -    dispatcher.RequestIDBDatabaseOpenCursor(
 | 
| -        ipc_database_id, transaction_id, object_store_id, index_id,
 | 
| -        IndexedDBKeyRange(), direction, key_only, blink::WebIDBTaskTypeNormal,
 | 
| -        callbacks);
 | 
| -
 | 
| -    // Verify that the transaction id was captured.
 | 
| -    EXPECT_EQ(1UL, dispatcher.cursor_transaction_ids_.size());
 | 
| -    EXPECT_FALSE(cursor.get());
 | 
| -
 | 
| -    int32_t ipc_callbacks_id =
 | 
| -        dispatcher.cursor_transaction_ids_.begin()->first;
 | 
| -
 | 
| -    IndexedDBMsg_CallbacksSuccessIDBCursor_Params params;
 | 
| -    params.ipc_thread_id = dispatcher.CurrentWorkerId();
 | 
| -    params.ipc_callbacks_id = ipc_callbacks_id;
 | 
| -
 | 
| -    // Now simululate the cursor response.
 | 
| -    params.ipc_cursor_id = WebIDBCursorImpl::kInvalidCursorId;
 | 
| -    dispatcher.OnSuccessOpenCursor(params);
 | 
| -
 | 
| -    EXPECT_EQ(0UL, dispatcher.cursor_transaction_ids_.size());
 | 
| -
 | 
| -    EXPECT_TRUE(cursor.get());
 | 
| -
 | 
| -    WebIDBCursorImpl* impl = static_cast<WebIDBCursorImpl*>(cursor.get());
 | 
| -
 | 
| -    // This is the primary expectation of this test: the transaction id was
 | 
| -    // applied to the cursor.
 | 
| -    EXPECT_EQ(transaction_id, impl->transaction_id());
 | 
| -  }
 | 
| -
 | 
| -  // Second case: null cursor (no data in range)
 | 
| -  {
 | 
| -    EXPECT_EQ(0UL, dispatcher.cursor_transaction_ids_.size());
 | 
| -
 | 
| -    auto* callbacks = new StrictMock<MockWebIDBCallbacks>();
 | 
| -    EXPECT_CALL(*callbacks, onSuccess(testing::A<const blink::WebIDBValue&>()))
 | 
| -        .Times(1);
 | 
| -
 | 
| -    // Make a cursor request. This should record the transaction id.
 | 
| -    dispatcher.RequestIDBDatabaseOpenCursor(
 | 
| -        ipc_database_id, transaction_id, object_store_id, index_id,
 | 
| -        IndexedDBKeyRange(), direction, key_only, blink::WebIDBTaskTypeNormal,
 | 
| -        callbacks);
 | 
| -
 | 
| -    // Verify that the transaction id was captured.
 | 
| -    EXPECT_EQ(1UL, dispatcher.cursor_transaction_ids_.size());
 | 
| -
 | 
| -    int32_t ipc_callbacks_id =
 | 
| -        dispatcher.cursor_transaction_ids_.begin()->first;
 | 
| -
 | 
| -    // Now simululate a "null cursor" response.
 | 
| -    IndexedDBMsg_CallbacksSuccessValue_Params params;
 | 
| -    params.ipc_thread_id = dispatcher.CurrentWorkerId();
 | 
| -    params.ipc_callbacks_id = ipc_callbacks_id;
 | 
| -    dispatcher.OnSuccessValue(params);
 | 
| -
 | 
| -    // Ensure the map result was deleted.
 | 
| -    EXPECT_EQ(0UL, dispatcher.cursor_transaction_ids_.size());
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -namespace {
 | 
| -
 | 
| -class MockCursor : public WebIDBCursorImpl {
 | 
| - public:
 | 
| -  MockCursor(int32_t ipc_cursor_id,
 | 
| -             int64_t transaction_id,
 | 
| -             ThreadSafeSender* thread_safe_sender)
 | 
| -      : WebIDBCursorImpl(ipc_cursor_id, transaction_id, thread_safe_sender),
 | 
| -        reset_count_(0) {}
 | 
| -
 | 
| -  // This method is virtual so it can be overridden in unit tests.
 | 
| -  void ResetPrefetchCache() override { ++reset_count_; }
 | 
| -
 | 
| -  int reset_count() const { return reset_count_; }
 | 
| -
 | 
| - private:
 | 
| -  int reset_count_;
 | 
| -
 | 
| -  DISALLOW_COPY_AND_ASSIGN(MockCursor);
 | 
| -};
 | 
| -
 | 
| -}  // namespace
 | 
| -
 | 
| -TEST_F(IndexedDBDispatcherTest, CursorReset) {
 | 
| -  std::unique_ptr<WebIDBCursor> cursor;
 | 
| -  MockDispatcher dispatcher(thread_safe_sender_.get());
 | 
| -
 | 
| -  const int32_t ipc_database_id = 0;
 | 
| -  const int32_t object_store_id = 0;
 | 
| -  const int32_t index_id = 0;
 | 
| -  const bool key_only = false;
 | 
| -  const int cursor1_ipc_id = 1;
 | 
| -  const int cursor2_ipc_id = 2;
 | 
| -  const int other_cursor_ipc_id = 2;
 | 
| -  const int cursor1_transaction_id = 1;
 | 
| -  const int cursor2_transaction_id = 2;
 | 
| -  const int other_transaction_id = 3;
 | 
| -
 | 
| -  std::unique_ptr<MockCursor> cursor1(
 | 
| -      new MockCursor(WebIDBCursorImpl::kInvalidCursorId, cursor1_transaction_id,
 | 
| -                     thread_safe_sender_.get()));
 | 
| -
 | 
| -  std::unique_ptr<MockCursor> cursor2(
 | 
| -      new MockCursor(WebIDBCursorImpl::kInvalidCursorId, cursor2_transaction_id,
 | 
| -                     thread_safe_sender_.get()));
 | 
| -
 | 
| -  dispatcher.cursors_[cursor1_ipc_id] = cursor1.get();
 | 
| -  dispatcher.cursors_[cursor2_ipc_id] = cursor2.get();
 | 
| -
 | 
| -  EXPECT_EQ(0, cursor1->reset_count());
 | 
| -  EXPECT_EQ(0, cursor2->reset_count());
 | 
| -
 | 
| -  // Other transaction:
 | 
| -  dispatcher.RequestIDBDatabaseGet(
 | 
| -      ipc_database_id, other_transaction_id, object_store_id, index_id,
 | 
| -      IndexedDBKeyRange(), key_only, new StrictMock<MockWebIDBCallbacks>());
 | 
| -
 | 
| -  EXPECT_EQ(0, cursor1->reset_count());
 | 
| -  EXPECT_EQ(0, cursor2->reset_count());
 | 
| -
 | 
| -  // Same transaction:
 | 
| -  dispatcher.RequestIDBDatabaseGet(
 | 
| -      ipc_database_id, cursor1_transaction_id, object_store_id, index_id,
 | 
| -      IndexedDBKeyRange(), key_only, new StrictMock<MockWebIDBCallbacks>());
 | 
| -
 | 
| -  EXPECT_EQ(1, cursor1->reset_count());
 | 
| -  EXPECT_EQ(0, cursor2->reset_count());
 | 
| -
 | 
| -  // Same transaction and same cursor:
 | 
| -  dispatcher.RequestIDBCursorContinue(IndexedDBKey(), IndexedDBKey(),
 | 
| -                                      new StrictMock<MockWebIDBCallbacks>(),
 | 
| -                                      cursor1_ipc_id, cursor1_transaction_id);
 | 
| -
 | 
| -  EXPECT_EQ(1, cursor1->reset_count());
 | 
| -  EXPECT_EQ(0, cursor2->reset_count());
 | 
| -
 | 
| -  // Same transaction and different cursor:
 | 
| -  dispatcher.RequestIDBCursorContinue(
 | 
| -      IndexedDBKey(), IndexedDBKey(), new StrictMock<MockWebIDBCallbacks>(),
 | 
| -      other_cursor_ipc_id, cursor1_transaction_id);
 | 
| -
 | 
| -  EXPECT_EQ(2, cursor1->reset_count());
 | 
| -  EXPECT_EQ(0, cursor2->reset_count());
 | 
| -
 | 
| -  cursor1.reset();
 | 
| -  cursor2.reset();
 | 
| -}
 | 
| -
 | 
| -}  // namespace content
 | 
| 
 |