| Index: chrome/browser/browsing_data/media_licenses_counter_browsertest.cc
|
| diff --git a/chrome/browser/browsing_data/media_licenses_counter_browsertest.cc b/chrome/browser/browsing_data/media_licenses_counter_browsertest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f9f984bed813dafe2773892f85e0ca274dd7ed57
|
| --- /dev/null
|
| +++ b/chrome/browser/browsing_data/media_licenses_counter_browsertest.cc
|
| @@ -0,0 +1,215 @@
|
| +// Copyright 2016 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 "chrome/browser/browsing_data/media_licenses_counter.h"
|
| +
|
| +#include "base/memory/ptr_util.h"
|
| +#include "base/run_loop.h"
|
| +#include "chrome/browser/ui/browser.h"
|
| +#include "chrome/common/pref_names.h"
|
| +#include "chrome/test/base/in_process_browser_test.h"
|
| +#include "components/prefs/pref_service.h"
|
| +#include "content/public/browser/browser_thread.h"
|
| +#include "content/public/browser/storage_partition.h"
|
| +#include "ppapi/shared_impl/ppapi_constants.h"
|
| +#include "storage/browser/fileapi/async_file_util.h"
|
| +#include "storage/browser/fileapi/file_system_context.h"
|
| +#include "storage/browser/fileapi/file_system_operation_context.h"
|
| +#include "storage/browser/fileapi/isolated_context.h"
|
| +#include "storage/browser/quota/quota_manager.h"
|
| +#include "storage/common/fileapi/file_system_util.h"
|
| +#include "url/gurl.h"
|
| +
|
| +namespace {
|
| +
|
| +const char kTestOrigin[] = "https://host1/";
|
| +const GURL kOrigin(kTestOrigin);
|
| +const char kClearKeyCdmPluginId[] = "application_x-ppapi-clearkey-cdm";
|
| +
|
| +class MediaLicensesCounterTest : public InProcessBrowserTest {
|
| + public:
|
| + void SetUpOnMainThread() override { SetMediaLicenseDeletionPref(true); }
|
| +
|
| + void SetMediaLicenseDeletionPref(bool value) {
|
| + browser()->profile()->GetPrefs()->SetBoolean(prefs::kDeleteMediaLicenses,
|
| + value);
|
| + }
|
| +
|
| + // Create some test data for origin |kOrigin|.
|
| + void CreateMediaLicenseTestData() {
|
| + storage::FileSystemContext* filesystem_context =
|
| + content::BrowserContext::GetDefaultStoragePartition(
|
| + browser()->profile())
|
| + ->GetFileSystemContext();
|
| + std::string clearkey_fsid =
|
| + CreateFileSystem(filesystem_context, kClearKeyCdmPluginId, kOrigin);
|
| + CreateFile(filesystem_context, kOrigin, clearkey_fsid, "foo");
|
| + }
|
| +
|
| + // Start running and allow the asynchronous IO operations to complete.
|
| + void RunAndWaitForResult() {
|
| + DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
| + run_loop_.reset(new base::RunLoop());
|
| + run_loop_->Run();
|
| + }
|
| +
|
| + // Callback from the counter.
|
| + void CountingCallback(std::unique_ptr<BrowsingDataCounter::Result> result) {
|
| + DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
| +
|
| + callback_called_ = true;
|
| + finished_ = result->Finished();
|
| + if (finished_) {
|
| + MediaLicensesCounter::MediaLicenseResult* media_result =
|
| + static_cast<MediaLicensesCounter::MediaLicenseResult*>(result.get());
|
| + count_ = media_result->Value();
|
| + origin_ = media_result->GetOneOrigin();
|
| + }
|
| +
|
| + if (run_loop_ && finished_)
|
| + run_loop_->Quit();
|
| + }
|
| +
|
| + bool CallbackCalled() { return callback_called_; }
|
| +
|
| + BrowsingDataCounter::ResultInt GetCount() {
|
| + DCHECK(finished_);
|
| + return count_;
|
| + }
|
| +
|
| + const std::string& GetOrigin() {
|
| + DCHECK(finished_);
|
| + return origin_;
|
| + }
|
| +
|
| + private:
|
| + // Creates a PluginPrivateFileSystem for the |plugin_name| and |origin|
|
| + // provided. Returns the file system ID for the created
|
| + // PluginPrivateFileSystem.
|
| + std::string CreateFileSystem(storage::FileSystemContext* filesystem_context,
|
| + const std::string& plugin_name,
|
| + const GURL& origin) {
|
| + std::string fsid = storage::IsolatedContext::GetInstance()
|
| + ->RegisterFileSystemForVirtualPath(
|
| + storage::kFileSystemTypePluginPrivate,
|
| + ppapi::kPluginPrivateRootName, base::FilePath());
|
| + EXPECT_TRUE(storage::ValidateIsolatedFileSystemId(fsid));
|
| + filesystem_context->OpenPluginPrivateFileSystem(
|
| + origin, storage::kFileSystemTypePluginPrivate, fsid, plugin_name,
|
| + storage::OPEN_FILE_SYSTEM_CREATE_IF_NONEXISTENT,
|
| + base::Bind(&MediaLicensesCounterTest::OnFileSystemOpened,
|
| + base::Unretained(this)));
|
| + RunAndWaitForResult();
|
| + return fsid;
|
| + }
|
| +
|
| + // Creates a file named |file_name| in the PluginPrivateFileSystem identified
|
| + // by |origin| and |fsid|.
|
| + void CreateFile(storage::FileSystemContext* filesystem_context,
|
| + const GURL& origin,
|
| + const std::string& fsid,
|
| + const std::string& file_name) {
|
| + std::string root = storage::GetIsolatedFileSystemRootURIString(
|
| + origin, fsid, ppapi::kPluginPrivateRootName);
|
| + storage::FileSystemURL file_url =
|
| + filesystem_context->CrackURL(GURL(root + file_name));
|
| + storage::AsyncFileUtil* file_util = filesystem_context->GetAsyncFileUtil(
|
| + storage::kFileSystemTypePluginPrivate);
|
| + std::unique_ptr<storage::FileSystemOperationContext> operation_context =
|
| + base::WrapUnique(
|
| + new storage::FileSystemOperationContext(filesystem_context));
|
| + operation_context->set_allowed_bytes_growth(
|
| + storage::QuotaManager::kNoLimit);
|
| + file_util->EnsureFileExists(
|
| + std::move(operation_context), file_url,
|
| + base::Bind(&MediaLicensesCounterTest::OnFileCreated,
|
| + base::Unretained(this)));
|
| + RunAndWaitForResult();
|
| + }
|
| +
|
| + void OnFileSystemOpened(base::File::Error result) {
|
| + EXPECT_EQ(base::File::FILE_OK, result) << base::File::ErrorToString(result);
|
| + if (run_loop_)
|
| + run_loop_->Quit();
|
| + }
|
| +
|
| + void OnFileCreated(base::File::Error result, bool created) {
|
| + EXPECT_EQ(base::File::FILE_OK, result) << base::File::ErrorToString(result);
|
| + EXPECT_TRUE(created);
|
| + if (run_loop_)
|
| + run_loop_->Quit();
|
| + }
|
| +
|
| + bool callback_called_ = false;
|
| + bool finished_ = false;
|
| + BrowsingDataCounter::ResultInt count_;
|
| + std::string origin_;
|
| +
|
| + std::unique_ptr<base::RunLoop> run_loop_;
|
| +};
|
| +
|
| +// Tests that for the empty file system, the result is zero.
|
| +IN_PROC_BROWSER_TEST_F(MediaLicensesCounterTest, Empty) {
|
| + MediaLicensesCounter counter;
|
| + counter.Init(browser()->profile(),
|
| + base::Bind(&MediaLicensesCounterTest::CountingCallback,
|
| + base::Unretained(this)));
|
| + counter.Restart();
|
| +
|
| + RunAndWaitForResult();
|
| +
|
| + EXPECT_TRUE(CallbackCalled());
|
| + EXPECT_EQ(0u, GetCount());
|
| + EXPECT_TRUE(GetOrigin().empty());
|
| +}
|
| +
|
| +// Tests that for a non-empty file system, the result is nonzero.
|
| +IN_PROC_BROWSER_TEST_F(MediaLicensesCounterTest, NonEmpty) {
|
| + CreateMediaLicenseTestData();
|
| +
|
| + MediaLicensesCounter counter;
|
| + counter.Init(browser()->profile(),
|
| + base::Bind(&MediaLicensesCounterTest::CountingCallback,
|
| + base::Unretained(this)));
|
| + counter.Restart();
|
| +
|
| + RunAndWaitForResult();
|
| +
|
| + EXPECT_TRUE(CallbackCalled());
|
| + EXPECT_EQ(1u, GetCount());
|
| + EXPECT_EQ(kOrigin.host(), GetOrigin());
|
| +}
|
| +
|
| +// Tests that the counter does not count if the deletion preference is false.
|
| +IN_PROC_BROWSER_TEST_F(MediaLicensesCounterTest, PrefIsFalse) {
|
| + SetMediaLicenseDeletionPref(false);
|
| +
|
| + MediaLicensesCounter counter;
|
| + counter.Init(browser()->profile(),
|
| + base::Bind(&MediaLicensesCounterTest::CountingCallback,
|
| + base::Unretained(this)));
|
| + counter.Restart();
|
| +
|
| + EXPECT_FALSE(CallbackCalled());
|
| +}
|
| +
|
| +// Tests that the counter starts counting automatically when the deletion
|
| +// pref changes to true.
|
| +IN_PROC_BROWSER_TEST_F(MediaLicensesCounterTest, PrefChanged) {
|
| + SetMediaLicenseDeletionPref(false);
|
| +
|
| + MediaLicensesCounter counter;
|
| + counter.Init(browser()->profile(),
|
| + base::Bind(&MediaLicensesCounterTest::CountingCallback,
|
| + base::Unretained(this)));
|
| + SetMediaLicenseDeletionPref(true);
|
| +
|
| + RunAndWaitForResult();
|
| +
|
| + EXPECT_TRUE(CallbackCalled());
|
| + EXPECT_EQ(0u, GetCount());
|
| + EXPECT_TRUE(GetOrigin().empty());
|
| +}
|
| +
|
| +} // namespace
|
|
|