blob: e1a6c108bddeab789595a757b7c92a5fdea1c4f8 [file] [log] [blame]
// Copyright 2021 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 "base/barrier_closure.h"
#include "base/files/scoped_temp_dir.h"
#include "base/run_loop.h"
#include "base/test/task_environment.h"
#include "base/threading/thread.h"
#include "base/time/default_clock.h"
#include "components/services/storage/public/cpp/buckets/bucket_info.h"
#include "components/services/storage/public/cpp/buckets/constants.h"
#include "components/services/storage/public/cpp/quota_error_or.h"
#include "content/browser/indexed_db/indexed_db_context_impl.h"
#include "content/browser/indexed_db/indexed_db_factory_impl.h"
#include "content/browser/indexed_db/mock_indexed_db_callbacks.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "storage/browser/test/mock_quota_manager.h"
#include "storage/browser/test/mock_quota_manager_proxy.h"
#include "storage/browser/test/quota_manager_proxy_sync.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/public/common/storage_key/storage_key.h"
namespace content {
class IndexedDBContextTest : public testing::Test {
public:
void SetUp() override {
ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
quota_manager_ = base::MakeRefCounted<storage::MockQuotaManager>(
/*is_incognito=*/false, temp_dir_.GetPath(),
base::ThreadTaskRunnerHandle::Get().get(),
/*special storage policy=*/nullptr);
quota_manager_proxy_ = base::MakeRefCounted<storage::MockQuotaManagerProxy>(
quota_manager_.get(), base::ThreadTaskRunnerHandle::Get());
indexed_db_context_ = base::MakeRefCounted<IndexedDBContextImpl>(
temp_dir_.GetPath(), quota_manager_proxy_.get(),
base::DefaultClock::GetInstance(),
/*blob_storage_context=*/mojo::NullRemote(),
/*file_system_access_context=*/mojo::NullRemote(),
base::SequencedTaskRunnerHandle::Get(),
base::SequencedTaskRunnerHandle::Get());
}
protected:
base::ScopedTempDir temp_dir_;
// These tests need a full TaskEnvironment because IndexedDBContextImpl
// uses the thread pool for querying QuotaDatabase.
base::test::TaskEnvironment task_environment_;
scoped_refptr<IndexedDBContextImpl> indexed_db_context_;
scoped_refptr<storage::MockQuotaManager> quota_manager_;
scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy_;
const blink::StorageKey example_storage_key_ =
blink::StorageKey::CreateFromStringForTesting("https://example.com");
const blink::StorageKey google_storage_key_ =
blink::StorageKey::CreateFromStringForTesting("https://google.com");
};
TEST_F(IndexedDBContextTest, DefaultBucketCreatedOnBindIndexedDB) {
mojo::Remote<blink::mojom::IDBFactory> example_remote;
indexed_db_context_->BindIndexedDB(
example_storage_key_, example_remote.BindNewPipeAndPassReceiver());
mojo::Remote<blink::mojom::IDBFactory> google_remote;
indexed_db_context_->BindIndexedDB(
google_storage_key_, google_remote.BindNewPipeAndPassReceiver());
storage::QuotaManagerProxySync quota_manager_proxy_sync(
quota_manager_proxy_.get());
// Call a method on both IDBFactory remotes and wait for both replies
// to ensure that BindIndexedDB has completed for both storage keys.
base::RunLoop loop;
auto callbacks = base::MakeRefCounted<MockIndexedDBCallbacks>(
/*expect_connection=*/false);
callbacks->CallOnInfoSuccess(base::BarrierClosure(2, loop.QuitClosure()));
indexed_db_context_->GetIDBFactory()->GetDatabaseInfo(
callbacks, example_storage_key_, indexed_db_context_->data_path());
indexed_db_context_->GetIDBFactory()->GetDatabaseInfo(
callbacks, google_storage_key_, indexed_db_context_->data_path());
loop.Run();
// Check default bucket exists for https://example.com.
storage::QuotaErrorOr<storage::BucketInfo> result =
quota_manager_proxy_sync.GetBucket(example_storage_key_,
storage::kDefaultBucketName,
blink::mojom::StorageType::kTemporary);
ASSERT_TRUE(result.ok());
EXPECT_EQ(result->name, storage::kDefaultBucketName);
EXPECT_EQ(result->storage_key, example_storage_key_);
EXPECT_GT(result->id.value(), 0);
// Check default bucket exists for https://google.com.
result = quota_manager_proxy_sync.GetBucket(
google_storage_key_, storage::kDefaultBucketName,
blink::mojom::StorageType::kTemporary);
ASSERT_TRUE(result.ok());
EXPECT_EQ(result->name, storage::kDefaultBucketName);
EXPECT_EQ(result->storage_key, google_storage_key_);
EXPECT_GT(result->id.value(), 0);
}
} // namespace content