Commit 856e94bb authored by Ken Rockot's avatar Ken Rockot Committed by Commit Bot

Move filesystem and leveldb services off SM

Moves the test-only filesystem and leveldb services off of Service
Manager APIs. These "services" directories both contain implementation
details used by other parts of the system (so they aren't dead code),
but their test coverage has been implemented using Service Manager
infrastructure, including (unnecessarily) out-of-process service
executables.

This simplifies all of that by dropping Service Manager dependencies
in favor of direct mojom interface usage.

Bug: 977637
Change-Id: Id9ba6b88457e943d582b9de589bd120caf3413de
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1725052Reviewed-by: default avatarMarijn Kruisselbrink <mek@chromium.org>
Reviewed-by: default avatarRobert Sesek <rsesek@chromium.org>
Commit-Queue: Ken Rockot <rockot@google.com>
Cr-Commit-Position: refs/heads/master@{#682030}
parent 3871b2ae
......@@ -2,7 +2,6 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import("//services/service_manager/public/cpp/service_executable.gni")
import("//testing/test.gni")
static_library("lib") {
......@@ -11,8 +10,6 @@ static_library("lib") {
"directory_impl.h",
"file_impl.cc",
"file_impl.h",
"file_system_impl.cc",
"file_system_impl.h",
"lock_table.cc",
"lock_table.h",
"shared_temp_dir.cc",
......@@ -25,28 +22,27 @@ static_library("lib") {
"//base",
"//components/services/filesystem/public/mojom",
"//mojo/public/cpp/system",
"//services/service_manager/public/cpp",
"//services/service_manager/public/mojom",
"//url",
]
}
if (!is_ios) {
# service binaries are not supported on iOS.
service_executable("filesystem") {
source_set("test_support") {
testonly = true
sources = [
"file_system_app.cc",
"file_system_app.h",
"main.cc",
"directory_test_helper.cc",
"directory_test_helper.h",
]
deps = [
"//base/test:test_support",
]
public_deps = [
":lib",
"//base",
"//components/services/filesystem/public/mojom",
"//mojo/public/cpp/bindings",
"//mojo/public/cpp/system",
"//services/service_manager/public/cpp",
]
}
......@@ -54,25 +50,18 @@ if (!is_ios) {
sources = [
"directory_impl_unittest.cc",
"file_impl_unittest.cc",
"files_test_base.cc",
"files_test_base.h",
]
deps = [
":lib",
":test_support",
"//base",
"//base/test:test_support",
"//components/services/filesystem/public/cpp:manifest",
"//components/services/filesystem/public/mojom",
"//mojo/core/test:run_all_unittests",
"//mojo/public/cpp/bindings",
"//mojo/public/cpp/system",
"//services/service_manager/public/cpp",
"//services/service_manager/public/cpp/test:test_support",
"//testing/gtest",
]
data_deps = [
":filesystem",
]
}
}
include_rules = [
"+components/prefs",
"+mojo/public",
"+mojo/util",
"+services/service_manager",
]
......@@ -8,22 +8,37 @@
#include <map>
#include <string>
#include "base/macros.h"
#include "base/stl_util.h"
#include "components/services/filesystem/files_test_base.h"
#include "base/test/scoped_task_environment.h"
#include "components/services/filesystem/directory_test_helper.h"
#include "components/services/filesystem/public/mojom/directory.mojom.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace filesystem {
namespace {
using DirectoryImplTest = FilesTestBase;
class DirectoryImplTest : public testing::Test {
public:
DirectoryImplTest() = default;
mojo::Remote<mojom::Directory> CreateTempDir() {
return test_helper_.CreateTempDir();
}
private:
base::test::ScopedTaskEnvironment task_environment_;
DirectoryTestHelper test_helper_;
DISALLOW_COPY_AND_ASSIGN(DirectoryImplTest);
};
constexpr char kData[] = "one two three";
TEST_F(DirectoryImplTest, Read) {
mojo::Remote<mojom::Directory> directory;
GetTemporaryRoot(&directory);
mojo::Remote<mojom::Directory> directory = CreateTempDir();
base::File::Error error;
// Make some files.
......@@ -79,8 +94,7 @@ TEST_F(DirectoryImplTest, Read) {
// TODO(vtl): Properly test OpenFile() and OpenDirectory() (including flags).
TEST_F(DirectoryImplTest, BasicRenameDelete) {
mojo::Remote<mojom::Directory> directory;
GetTemporaryRoot(&directory);
mojo::Remote<mojom::Directory> directory = CreateTempDir();
base::File::Error error;
// Create my_file.
......@@ -132,8 +146,7 @@ TEST_F(DirectoryImplTest, BasicRenameDelete) {
}
TEST_F(DirectoryImplTest, CantOpenDirectoriesAsFiles) {
mojo::Remote<mojom::Directory> directory;
GetTemporaryRoot(&directory);
mojo::Remote<mojom::Directory> directory = CreateTempDir();
base::File::Error error;
{
......@@ -165,9 +178,7 @@ TEST_F(DirectoryImplTest, Clone) {
base::File::Error error;
{
mojo::Remote<mojom::Directory> directory;
GetTemporaryRoot(&directory);
mojo::Remote<mojom::Directory> directory = CreateTempDir();
directory->Clone(clone_one.BindNewPipeAndPassReceiver());
directory->Clone(clone_two.BindNewPipeAndPassReceiver());
......@@ -193,8 +204,7 @@ TEST_F(DirectoryImplTest, Clone) {
}
TEST_F(DirectoryImplTest, WriteFileReadFile) {
mojo::Remote<mojom::Directory> directory;
GetTemporaryRoot(&directory);
mojo::Remote<mojom::Directory> directory = CreateTempDir();
base::File::Error error;
std::vector<uint8_t> data(kData, kData + strlen(kData));
......@@ -215,8 +225,7 @@ TEST_F(DirectoryImplTest, WriteFileReadFile) {
}
TEST_F(DirectoryImplTest, ReadEmptyFileIsNotFoundError) {
mojo::Remote<mojom::Directory> directory;
GetTemporaryRoot(&directory);
mojo::Remote<mojom::Directory> directory = CreateTempDir();
base::File::Error error;
{
......@@ -229,8 +238,7 @@ TEST_F(DirectoryImplTest, ReadEmptyFileIsNotFoundError) {
}
TEST_F(DirectoryImplTest, CantReadEntireFileOnADirectory) {
mojo::Remote<mojom::Directory> directory;
GetTemporaryRoot(&directory);
mojo::Remote<mojom::Directory> directory = CreateTempDir();
base::File::Error error;
// Create a directory
......@@ -254,8 +262,7 @@ TEST_F(DirectoryImplTest, CantReadEntireFileOnADirectory) {
}
TEST_F(DirectoryImplTest, CantWriteFileOnADirectory) {
mojo::Remote<mojom::Directory> directory;
GetTemporaryRoot(&directory);
mojo::Remote<mojom::Directory> directory = CreateTempDir();
base::File::Error error;
// Create a directory
......@@ -278,8 +285,7 @@ TEST_F(DirectoryImplTest, CantWriteFileOnADirectory) {
}
TEST_F(DirectoryImplTest, Flush) {
mojo::Remote<mojom::Directory> directory;
GetTemporaryRoot(&directory);
mojo::Remote<mojom::Directory> directory = CreateTempDir();
base::File::Error error;
{
......@@ -289,7 +295,5 @@ TEST_F(DirectoryImplTest, Flush) {
}
}
// TODO(vtl): Test delete flags.
} // namespace
} // namespace filesystem
// Copyright 2019 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 "components/services/filesystem/directory_test_helper.h"
#include <memory>
#include <utility>
#include "base/files/file_path.h"
#include "base/files/scoped_temp_dir.h"
#include "base/macros.h"
#include "base/task/post_task.h"
#include "base/test/bind_test_util.h"
#include "components/services/filesystem/directory_impl.h"
#include "components/services/filesystem/lock_table.h"
#include "components/services/filesystem/public/mojom/directory.mojom.h"
#include "components/services/filesystem/shared_temp_dir.h"
#include "mojo/public/cpp/bindings/unique_receiver_set.h"
namespace filesystem {
class DirectoryTestHelper::BlockingState {
public:
BlockingState() : lock_table_(base::MakeRefCounted<LockTable>()) {}
~BlockingState() = default;
void BindNewTempDirectory(mojo::PendingReceiver<mojom::Directory> receiver) {
auto temp_dir = std::make_unique<base::ScopedTempDir>();
CHECK(temp_dir->CreateUniqueTempDir());
base::FilePath path = temp_dir->GetPath();
directories_.Add(
std::make_unique<DirectoryImpl>(
path, base::MakeRefCounted<SharedTempDir>(std::move(temp_dir)),
lock_table_),
std::move(receiver));
}
private:
const scoped_refptr<LockTable> lock_table_;
mojo::UniqueReceiverSet<mojom::Directory> directories_;
DISALLOW_COPY_AND_ASSIGN(BlockingState);
};
DirectoryTestHelper::DirectoryTestHelper()
: blocking_state_(
base::CreateSequencedTaskRunnerWithTraits({base::MayBlock()})) {}
DirectoryTestHelper::~DirectoryTestHelper() = default;
mojo::Remote<mojom::Directory> DirectoryTestHelper::CreateTempDir() {
mojo::Remote<mojom::Directory> remote;
blocking_state_.Post(FROM_HERE, &BlockingState::BindNewTempDirectory,
remote.BindNewPipeAndPassReceiver());
return remote;
}
} // namespace filesystem
// Copyright 2019 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.
#ifndef COMPONENTS_SERVICES_FILESYSTEM_DIRECTORY_TEST_HELPER_H_
#define COMPONENTS_SERVICES_FILESYSTEM_DIRECTORY_TEST_HELPER_H_
#include "base/macros.h"
#include "base/threading/sequence_bound.h"
#include "components/services/filesystem/public/mojom/directory.mojom.h"
#include "mojo/public/cpp/bindings/remote.h"
namespace filesystem {
// Helper class for tests which want to use a remote DirectoryImpl. This binds
// DirectoryImpl instances for temporary directories on a background thread
// which supports blocking operations.
class DirectoryTestHelper {
public:
DirectoryTestHelper();
~DirectoryTestHelper();
mojo::Remote<mojom::Directory> CreateTempDir();
private:
class BlockingState;
base::SequenceBound<BlockingState> blocking_state_;
DISALLOW_COPY_AND_ASSIGN(DirectoryTestHelper);
};
} // namespace filesystem
#endif // COMPONENTS_SERVICES_FILESYSTEM_DIRECTORY_TEST_HELPER_H_
......@@ -8,18 +8,33 @@
#include <vector>
#include "base/files/file.h"
#include "components/services/filesystem/files_test_base.h"
#include "base/macros.h"
#include "base/test/scoped_task_environment.h"
#include "components/services/filesystem/directory_test_helper.h"
#include "components/services/filesystem/public/mojom/directory.mojom.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace filesystem {
namespace {
using FileImplTest = FilesTestBase;
class FileImplTest : public testing::Test {
public:
FileImplTest() = default;
mojo::Remote<mojom::Directory> CreateTempDir() {
return test_helper_.CreateTempDir();
}
private:
base::test::ScopedTaskEnvironment task_environment_;
DirectoryTestHelper test_helper_;
DISALLOW_COPY_AND_ASSIGN(FileImplTest);
};
TEST_F(FileImplTest, CreateWriteCloseRenameOpenRead) {
mojo::Remote<mojom::Directory> directory;
GetTemporaryRoot(&directory);
mojo::Remote<mojom::Directory> directory = CreateTempDir();
base::File::Error error;
bool handled = false;
......@@ -88,8 +103,7 @@ TEST_F(FileImplTest, CreateWriteCloseRenameOpenRead) {
}
TEST_F(FileImplTest, CantWriteInReadMode) {
mojo::Remote<mojom::Directory> directory;
GetTemporaryRoot(&directory);
mojo::Remote<mojom::Directory> directory = CreateTempDir();
base::File::Error error;
std::vector<uint8_t> bytes_to_write;
......@@ -154,8 +168,7 @@ TEST_F(FileImplTest, CantWriteInReadMode) {
}
TEST_F(FileImplTest, OpenInAppendMode) {
mojo::Remote<mojom::Directory> directory;
GetTemporaryRoot(&directory);
mojo::Remote<mojom::Directory> directory = CreateTempDir();
base::File::Error error;
{
......@@ -250,8 +263,7 @@ TEST_F(FileImplTest, OpenInAppendMode) {
}
TEST_F(FileImplTest, OpenInTruncateMode) {
mojo::Remote<mojom::Directory> directory;
GetTemporaryRoot(&directory);
mojo::Remote<mojom::Directory> directory = CreateTempDir();
base::File::Error error;
{
......@@ -348,8 +360,7 @@ TEST_F(FileImplTest, OpenInTruncateMode) {
// Note: Ignore nanoseconds, since it may not always be supported. We expect at
// least second-resolution support though.
TEST_F(FileImplTest, StatTouch) {
mojo::Remote<mojom::Directory> directory;
GetTemporaryRoot(&directory);
mojo::Remote<mojom::Directory> directory = CreateTempDir();
base::File::Error error;
// Create my_file.
......@@ -419,8 +430,7 @@ TEST_F(FileImplTest, StatTouch) {
}
TEST_F(FileImplTest, TellSeek) {
mojo::Remote<mojom::Directory> directory;
GetTemporaryRoot(&directory);
mojo::Remote<mojom::Directory> directory = CreateTempDir();
base::File::Error error;
// Create my_file.
......@@ -505,8 +515,7 @@ TEST_F(FileImplTest, TellSeek) {
}
TEST_F(FileImplTest, Dup) {
mojo::Remote<mojom::Directory> directory;
GetTemporaryRoot(&directory);
mojo::Remote<mojom::Directory> directory = CreateTempDir();
base::File::Error error;
// Create my_file.
......@@ -599,8 +608,7 @@ TEST_F(FileImplTest, Truncate) {
const uint32_t kInitialSize = 1000;
const uint32_t kTruncatedSize = 654;
mojo::Remote<mojom::Directory> directory;
GetTemporaryRoot(&directory);
mojo::Remote<mojom::Directory> directory = CreateTempDir();
base::File::Error error;
// Create my_file.
......@@ -648,8 +656,7 @@ TEST_F(FileImplTest, Truncate) {
}
TEST_F(FileImplTest, AsHandle) {
mojo::Remote<mojom::Directory> directory;
GetTemporaryRoot(&directory);
mojo::Remote<mojom::Directory> directory = CreateTempDir();
base::File::Error error;
{
......@@ -700,8 +707,7 @@ TEST_F(FileImplTest, AsHandle) {
}
TEST_F(FileImplTest, SimpleLockUnlock) {
mojo::Remote<mojom::Directory> directory;
GetTemporaryRoot(&directory);
mojo::Remote<mojom::Directory> directory = CreateTempDir();
base::File::Error error;
// Create my_file.
......@@ -727,8 +733,7 @@ TEST_F(FileImplTest, SimpleLockUnlock) {
}
TEST_F(FileImplTest, CantDoubleLock) {
mojo::Remote<mojom::Directory> directory;
GetTemporaryRoot(&directory);
mojo::Remote<mojom::Directory> directory = CreateTempDir();
base::File::Error error;
// Create my_file.
......@@ -754,8 +759,7 @@ TEST_F(FileImplTest, CantDoubleLock) {
}
TEST_F(FileImplTest, ClosingFileClearsLock) {
mojo::Remote<mojom::Directory> directory;
GetTemporaryRoot(&directory);
mojo::Remote<mojom::Directory> directory = CreateTempDir();
base::File::Error error;
{
......
// Copyright 2015 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 "components/services/filesystem/file_system_app.h"
#include <memory>
#include "base/bind.h"
#include "base/command_line.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "services/service_manager/public/cpp/connector.h"
#if defined(OS_WIN)
#include "base/base_paths_win.h"
#include "base/path_service.h"
#include "base/strings/utf_string_conversions.h"
#elif defined(OS_ANDROID)
#include "base/base_paths_android.h"
#include "base/path_service.h"
#elif defined(OS_LINUX)
#include "base/environment.h"
#include "base/nix/xdg_util.h"
#elif defined(OS_MACOSX)
#include "base/base_paths_mac.h"
#include "base/path_service.h"
#endif
namespace filesystem {
namespace {
const char kUserDataDir[] = "user-data-dir";
} // namespace
FileSystemApp::FileSystemApp(
mojo::PendingReceiver<service_manager::mojom::Service> receiver)
: service_binding_(this, std::move(receiver)),
lock_table_(base::MakeRefCounted<LockTable>()) {}
FileSystemApp::~FileSystemApp() = default;
void FileSystemApp::OnConnect(
const service_manager::ConnectSourceInfo& source_info,
const std::string& interface_name,
mojo::ScopedMessagePipeHandle receiver_pipe) {
if (interface_name == mojom::FileSystem::Name_) {
file_systems_.Add(
std::make_unique<FileSystemImpl>(source_info.identity, GetUserDataDir(),
lock_table_),
mojo::PendingReceiver<mojom::FileSystem>(std::move(receiver_pipe)));
}
}
// static
base::FilePath FileSystemApp::GetUserDataDir() {
base::FilePath path;
base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
if (command_line->HasSwitch(kUserDataDir)) {
path = command_line->GetSwitchValuePath(kUserDataDir);
} else {
#if defined(OS_WIN)
CHECK(base::PathService::Get(base::DIR_LOCAL_APP_DATA, &path));
#elif defined(OS_MACOSX)
CHECK(base::PathService::Get(base::DIR_APP_DATA, &path));
#elif defined(OS_ANDROID)
CHECK(base::PathService::Get(base::DIR_ANDROID_APP_DATA, &path));
#elif defined(OS_LINUX)
std::unique_ptr<base::Environment> env(base::Environment::Create());
path = base::nix::GetXDGDirectory(
env.get(), base::nix::kXdgConfigHomeEnvVar, base::nix::kDotConfigDir);
#else
NOTIMPLEMENTED();
#endif
path = path.Append(FILE_PATH_LITERAL("filesystem"));
}
if (!base::PathExists(path))
base::CreateDirectory(path);
return path;
}
} // namespace filesystem
// Copyright 2015 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.
#ifndef COMPONENTS_SERVICES_FILESYSTEM_FILE_SYSTEM_APP_H_
#define COMPONENTS_SERVICES_FILESYSTEM_FILE_SYSTEM_APP_H_
#include "base/macros.h"
#include "components/services/filesystem/directory_impl.h"
#include "components/services/filesystem/file_system_impl.h"
#include "components/services/filesystem/lock_table.h"
#include "components/services/filesystem/public/mojom/file_system.mojom.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/unique_receiver_set.h"
#include "services/service_manager/public/cpp/service.h"
#include "services/service_manager/public/cpp/service_binding.h"
namespace filesystem {
class FileSystemApp : public service_manager::Service {
public:
explicit FileSystemApp(
mojo::PendingReceiver<service_manager::mojom::Service> receiver);
~FileSystemApp() override;
private:
// Gets the system specific toplevel profile directory.
static base::FilePath GetUserDataDir();
// |service_manager::Service| override:
void OnConnect(const service_manager::ConnectSourceInfo& source_info,
const std::string& interface_name,
mojo::ScopedMessagePipeHandle receiver_pipe) override;
service_manager::ServiceBinding service_binding_;
scoped_refptr<LockTable> lock_table_;
mojo::UniqueReceiverSet<mojom::FileSystem> file_systems_;
DISALLOW_COPY_AND_ASSIGN(FileSystemApp);
};
} // namespace filesystem
#endif // COMPONENTS_SERVICES_FILESYSTEM_FILE_SYSTEM_APP_H_
// Copyright 2015 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 "components/services/filesystem/file_system_impl.h"
#include <stddef.h>
#include <memory>
#include <utility>
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/files/scoped_file.h"
#include "base/files/scoped_temp_dir.h"
#include "base/logging.h"
#include "build/build_config.h"
#include "components/services/filesystem/directory_impl.h"
#include "components/services/filesystem/lock_table.h"
#include "mojo/public/cpp/bindings/self_owned_receiver.h"
#include "services/service_manager/public/cpp/identity.h"
#include "url/gurl.h"
namespace filesystem {
FileSystemImpl::FileSystemImpl(const service_manager::Identity& remote_identity,
base::FilePath persistent_dir,
scoped_refptr<LockTable> lock_table)
: remote_application_name_(remote_identity.name()),
lock_table_(std::move(lock_table)),
persistent_dir_(persistent_dir) {}
FileSystemImpl::~FileSystemImpl() = default;
void FileSystemImpl::OpenTempDirectory(
mojo::PendingReceiver<mojom::Directory> receiver,
OpenTempDirectoryCallback callback) {
// Set only if the |DirectoryImpl| will own a temporary directory.
std::unique_ptr<base::ScopedTempDir> temp_dir(new base::ScopedTempDir);
CHECK(temp_dir->CreateUniqueTempDir());
base::FilePath path = temp_dir->GetPath();
scoped_refptr<SharedTempDir> shared_temp_dir =
new SharedTempDir(std::move(temp_dir));
mojo::MakeSelfOwnedReceiver(
std::make_unique<DirectoryImpl>(path, std::move(shared_temp_dir),
lock_table_),
std::move(receiver));
std::move(callback).Run(base::File::Error::FILE_OK);
}
void FileSystemImpl::OpenPersistentFileSystem(
mojo::PendingReceiver<mojom::Directory> receiver,
OpenPersistentFileSystemCallback callback) {
std::unique_ptr<base::ScopedTempDir> temp_dir;
base::FilePath path = persistent_dir_;
if (!base::PathExists(path))
base::CreateDirectory(path);
scoped_refptr<SharedTempDir> shared_temp_dir =
new SharedTempDir(std::move(temp_dir));
mojo::MakeSelfOwnedReceiver(
std::make_unique<DirectoryImpl>(path, std::move(shared_temp_dir),
lock_table_),
std::move(receiver));
std::move(callback).Run(base::File::Error::FILE_OK);
}
} // namespace filesystem
// Copyright 2015 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.
#ifndef COMPONENTS_SERVICES_FILESYSTEM_FILE_SYSTEM_IMPL_H_
#define COMPONENTS_SERVICES_FILESYSTEM_FILE_SYSTEM_IMPL_H_
#include "base/files/file_path.h"
#include "base/macros.h"
#include "components/services/filesystem/public/mojom/file_system.mojom.h"
#include "components/services/filesystem/shared_temp_dir.h"
#include "mojo/public/cpp/bindings/interface_request.h"
namespace base {
class FilePath;
}
namespace service_manager {
class Identity;
}
namespace filesystem {
class LockTable;
// The base implementation of FileSystemImpl.
class FileSystemImpl : public mojom::FileSystem {
public:
// |persistent_dir| is the directory served to callers of
// |OpenPersistentFileSystem()|.
FileSystemImpl(const service_manager::Identity& remote_identity,
base::FilePath persistent_dir,
scoped_refptr<LockTable> lock_table);
~FileSystemImpl() override;
// mojom::FileSystem:
void OpenTempDirectory(mojo::PendingReceiver<mojom::Directory> receiver,
OpenTempDirectoryCallback callback) override;
void OpenPersistentFileSystem(
mojo::PendingReceiver<mojom::Directory> receiver,
OpenPersistentFileSystemCallback callback) override;
private:
const std::string remote_application_name_;
scoped_refptr<LockTable> lock_table_;
base::FilePath persistent_dir_;
DISALLOW_COPY_AND_ASSIGN(FileSystemImpl);
};
} // namespace filesystem
#endif // COMPONENTS_SERVICES_FILESYSTEM_FILE_SYSTEM_IMPL_H_
// Copyright 2015 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 "components/services/filesystem/files_test_base.h"
#include <utility>
#include "components/services/filesystem/public/cpp/manifest.h"
#include "components/services/filesystem/public/mojom/directory.mojom.h"
#include "components/services/filesystem/public/mojom/types.mojom.h"
#include "services/service_manager/public/cpp/connector.h"
#include "services/service_manager/public/cpp/manifest_builder.h"
namespace filesystem {
const char kTestServiceName[] = "filesystem_service_unittests";
FilesTestBase::FilesTestBase()
: test_service_manager_(
{GetManifest(),
service_manager::ManifestBuilder()
.WithServiceName(kTestServiceName)
.RequireCapability("filesystem", "filesystem:filesystem")
.Build()}),
test_service_(
test_service_manager_.RegisterTestInstance(kTestServiceName)) {}
FilesTestBase::~FilesTestBase() = default;
void FilesTestBase::SetUp() {
connector()->Connect("filesystem", files_.BindNewPipeAndPassReceiver());
}
void FilesTestBase::GetTemporaryRoot(
mojo::Remote<mojom::Directory>* directory) {
base::File::Error error = base::File::Error::FILE_ERROR_FAILED;
bool handled = files()->OpenTempDirectory(
directory->BindNewPipeAndPassReceiver(), &error);
ASSERT_TRUE(handled);
ASSERT_EQ(base::File::Error::FILE_OK, error);
}
} // namespace filesystem
// Copyright 2015 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.
#ifndef COMPONENTS_SERVICES_FILESYSTEM_FILES_TEST_BASE_H_
#define COMPONENTS_SERVICES_FILESYSTEM_FILES_TEST_BASE_H_
#include <utility>
#include "base/bind.h"
#include "base/macros.h"
#include "base/test/scoped_task_environment.h"
#include "components/services/filesystem/public/mojom/file_system.mojom.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "services/service_manager/public/cpp/test/test_service.h"
#include "services/service_manager/public/cpp/test/test_service_manager.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace filesystem {
class FilesTestBase : public testing::Test {
public:
FilesTestBase();
~FilesTestBase() override;
// testing::Test:
void SetUp() override;
protected:
// Note: This has an out parameter rather than returning the Directory remote,
// since |ASSERT_...()| doesn't work with return values.
void GetTemporaryRoot(mojo::Remote<mojom::Directory>* directory);
service_manager::Connector* connector() { return test_service_.connector(); }
mojo::Remote<mojom::FileSystem>& files() { return files_; }
private:
base::test::ScopedTaskEnvironment task_environment_;
service_manager::TestServiceManager test_service_manager_;
service_manager::TestService test_service_;
mojo::Remote<mojom::FileSystem> files_;
DISALLOW_COPY_AND_ASSIGN(FilesTestBase);
};
} // namespace filesystem
#endif // COMPONENTS_SERVICES_FILESYSTEM_FILES_TEST_BASE_H_
// 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 "base/task/single_thread_task_executor.h"
#include "components/services/filesystem/file_system_app.h"
#include "services/service_manager/public/cpp/service_executable/service_main.h"
void ServiceMain(service_manager::mojom::ServiceRequest request) {
base::SingleThreadTaskExecutor main_thread_task_executor;
filesystem::FileSystemApp(std::move(request)).RunUntilTermination();
}
# Copyright 2019 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.
source_set("manifest") {
sources = [
"manifest.cc",
"manifest.h",
]
deps = [
"//base",
"//components/services/filesystem/public/mojom",
"//services/service_manager/public/cpp",
]
}
per-file manifest.cc=set noparent
per-file manifest.cc=file://ipc/SECURITY_OWNERS
per-file manifest.h=set noparent
per-file manifest.h=file://ipc/SECURITY_OWNERS
// Copyright 2019 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 "components/services/filesystem/public/cpp/manifest.h"
#include "base/no_destructor.h"
#include "components/services/filesystem/public/mojom/file_system.mojom.h"
#include "services/service_manager/public/cpp/manifest_builder.h"
namespace filesystem {
const service_manager::Manifest& GetManifest() {
static base::NoDestructor<service_manager::Manifest> manifest{
service_manager::ManifestBuilder()
.WithServiceName("filesystem")
.WithOptions(
service_manager::ManifestOptionsBuilder()
.WithSandboxType("none")
.WithExecutionMode(service_manager::Manifest::ExecutionMode::
kStandaloneExecutable)
.Build())
.ExposeCapability(
"filesystem:filesystem",
service_manager::Manifest::InterfaceList<mojom::FileSystem>())
.Build()};
return *manifest;
}
} // namespace filesystem
// Copyright 2019 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.
#ifndef COMPONENTS_SERVICES_FILESYSTEM_PUBLIC_CPP_MANIFEST_H_
#define COMPONENTS_SERVICES_FILESYSTEM_PUBLIC_CPP_MANIFEST_H_
#include "services/service_manager/public/cpp/manifest.h"
namespace filesystem {
const service_manager::Manifest& GetManifest();
} // namespace filesystem
#endif // COMPONENTS_SERVICES_FILESYSTEM_PUBLIC_CPP_MANIFEST_H_
......@@ -8,7 +8,6 @@ mojom("mojom") {
sources = [
"directory.mojom",
"file.mojom",
"file_system.mojom",
"types.mojom",
]
public_deps = [
......
// Copyright 2015 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.
module filesystem.mojom;
import "components/services/filesystem/public/mojom/directory.mojom";
import "mojo/public/mojom/base/file_error.mojom";
interface FileSystem {
// Opens a temporary filesystem. Will return a different directory each time
// it is called.
[Sync]
OpenTempDirectory(pending_receiver<Directory> directory)
=> (mojo_base.mojom.FileError error);
// Returns a directory which will persist to disk.
[Sync]
OpenPersistentFileSystem(pending_receiver<Directory> directory)
=> (mojo_base.mojom.FileError error);
};
......@@ -2,7 +2,6 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import("//services/service_manager/public/cpp/service_executable.gni")
import("//testing/test.gni")
static_library("lib") {
......@@ -25,27 +24,10 @@ static_library("lib") {
deps = [
"//mojo/public/cpp/system",
"//services/service_manager/public/cpp",
"//third_party/leveldatabase",
]
}
service_executable("leveldb") {
sources = [
"leveldb_app.cc",
"leveldb_app.h",
"main.cc",
]
deps = [
":lib",
"//components/services/leveldb/public/mojom",
"//mojo/public/cpp/bindings",
"//mojo/public/cpp/system",
"//services/service_manager/public/cpp",
]
}
test("leveldb_service_unittests") {
sources = [
"leveldb_mojo_unittest.cc",
......@@ -54,24 +36,18 @@ test("leveldb_service_unittests") {
]
deps = [
":lib",
"//base",
"//base/test:test_support",
"//components/services/filesystem/public/cpp:manifest",
"//components/services/filesystem:lib",
"//components/services/filesystem:test_support",
"//components/services/filesystem/public/mojom",
"//components/services/leveldb/public/cpp",
"//components/services/leveldb/public/cpp:manifest",
"//components/services/leveldb/public/mojom",
"//mojo/core/test:run_all_unittests",
"//mojo/public/cpp/bindings",
"//mojo/public/cpp/system",
"//services/service_manager/public/cpp",
"//services/service_manager/public/cpp/test:test_support",
"//testing/gtest",
"//third_party/leveldatabase",
]
data_deps = [
":leveldb",
"//components/services/filesystem:filesystem",
]
}
include_rules = [
"+components/services/filesystem/public/mojom",
"+mojo/public",
"+mojo/util",
"+services/service_manager",
"+third_party/leveldatabase",
]
// 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 "components/services/leveldb/leveldb_app.h"
#include "base/bind.h"
#include "base/task/post_task.h"
#include "components/services/leveldb/leveldb_service_impl.h"
namespace leveldb {
LevelDBApp::LevelDBApp(service_manager::mojom::ServiceRequest request)
: service_binding_(this, std::move(request)),
file_task_runner_(base::CreateSequencedTaskRunnerWithTraits(
{base::MayBlock(), base::TaskShutdownBehavior::BLOCK_SHUTDOWN})) {
registry_.AddInterface<mojom::LevelDBService>(
base::Bind(&LevelDBApp::Create, base::Unretained(this)));
}
LevelDBApp::~LevelDBApp() {}
void LevelDBApp::OnBindInterface(
const service_manager::BindSourceInfo& source_info,
const std::string& interface_name,
mojo::ScopedMessagePipeHandle interface_pipe) {
registry_.BindInterface(interface_name, std::move(interface_pipe));
}
void LevelDBApp::Create(leveldb::mojom::LevelDBServiceRequest request) {
if (!service_)
service_.reset(new LevelDBServiceImpl(file_task_runner_));
bindings_.AddBinding(service_.get(), std::move(request));
}
} // namespace leveldb
// 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.
#ifndef COMPONENTS_SERVICES_LEVELDB_LEVELDB_APP_H_
#define COMPONENTS_SERVICES_LEVELDB_LEVELDB_APP_H_
#include <memory>
#include "components/services/leveldb/public/mojom/leveldb.mojom.h"
#include "mojo/public/cpp/bindings/binding_set.h"
#include "services/service_manager/public/cpp/binder_registry.h"
#include "services/service_manager/public/cpp/service.h"
#include "services/service_manager/public/cpp/service_binding.h"
namespace base {
class SequencedTaskRunner;
}
namespace leveldb {
class LevelDBApp : public service_manager::Service {
public:
explicit LevelDBApp(service_manager::mojom::ServiceRequest request);
~LevelDBApp() override;
private:
// |Service| override:
void OnBindInterface(const service_manager::BindSourceInfo& source_info,
const std::string& interface_name,
mojo::ScopedMessagePipeHandle interface_pipe) override;
void Create(leveldb::mojom::LevelDBServiceRequest request);
service_manager::ServiceBinding service_binding_;
std::unique_ptr<mojom::LevelDBService> service_;
service_manager::BinderRegistry registry_;
mojo::BindingSet<mojom::LevelDBService> bindings_;
scoped_refptr<base::SequencedTaskRunner> file_task_runner_;
DISALLOW_COPY_AND_ASSIGN(LevelDBApp);
};
} // namespace leveldb
#endif // COMPONENTS_SERVICES_LEVELDB_LEVELDB_APP_H_
......@@ -8,7 +8,6 @@
#include "base/memory/ref_counted.h"
#include "components/services/leveldb/leveldb_mojo_proxy.h"
#include "components/services/leveldb/public/mojom/leveldb.mojom.h"
#include "mojo/public/cpp/bindings/binding_set.h"
namespace base {
class SequencedTaskRunner;
......@@ -22,7 +21,8 @@ class LevelDBServiceImpl : public mojom::LevelDBService {
// The |file_task_runner| is used to run tasks to interact with the
// file_service. Specifically this task runner must NOT be the same as the
// task runner this implementation runs on, or deadlock might occur.
LevelDBServiceImpl(scoped_refptr<base::SequencedTaskRunner> file_task_runner);
explicit LevelDBServiceImpl(
scoped_refptr<base::SequencedTaskRunner> file_task_runner);
~LevelDBServiceImpl() override;
// Overridden from LevelDBService:
......
......@@ -3,21 +3,21 @@
// found in the LICENSE file.
#include "base/bind.h"
#include "base/files/file_path.h"
#include "base/files/scoped_temp_dir.h"
#include "base/macros.h"
#include "base/run_loop.h"
#include "base/task/post_task.h"
#include "base/test/scoped_feature_list.h"
#include "base/test/scoped_task_environment.h"
#include "components/services/filesystem/public/cpp/manifest.h"
#include "components/services/filesystem/directory_test_helper.h"
#include "components/services/filesystem/public/mojom/directory.mojom.h"
#include "components/services/filesystem/public/mojom/file_system.mojom.h"
#include "components/services/filesystem/public/mojom/types.mojom.h"
#include "components/services/leveldb/public/cpp/manifest.h"
#include "components/services/leveldb/leveldb_service_impl.h"
#include "components/services/leveldb/public/cpp/util.h"
#include "components/services/leveldb/public/mojom/leveldb.mojom.h"
#include "mojo/public/cpp/bindings/binding_set.h"
#include "services/service_manager/public/cpp/manifest_builder.h"
#include "services/service_manager/public/cpp/test/test_service.h"
#include "services/service_manager/public/cpp/test/test_service_manager.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "mojo/public/cpp/bindings/self_owned_receiver.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/leveldatabase/leveldb_features.h"
......@@ -158,54 +158,36 @@ void AddKeyPrefixToGetManyRequest(const std::string& key_prefix,
list->emplace_back(mojom::GetManyRequest::NewKeyPrefix(in_arg));
}
const char kTestServiceName[] = "leveldb_service_unittests";
class LevelDBServiceTest : public testing::Test {
public:
LevelDBServiceTest()
: test_service_manager_(
{GetManifest(), filesystem::GetManifest(),
service_manager::ManifestBuilder()
.WithServiceName(kTestServiceName)
.RequireCapability("filesystem", "filesystem:filesystem")
.RequireCapability("leveldb", "leveldb:leveldb")
.Build()}),
test_service_(
test_service_manager_.RegisterTestInstance(kTestServiceName)) {}
: leveldb_service_(base::CreateSequencedTaskRunnerWithTraits(
{base::MayBlock(), base::TaskShutdownBehavior::BLOCK_SHUTDOWN})),
leveldb_receiver_(&leveldb_service_,
leveldb_remote_.BindNewPipeAndPassReceiver()) {}
~LevelDBServiceTest() override = default;
protected:
service_manager::Connector* connector() { return test_service_.connector(); }
void SetUp() override {
// TODO(dullweber): This doesn't seem to work. The reason is probably that
// the LevelDB service is a separate executable here. How should we set
// features that affect a service?
feature_list_.InitAndEnableFeature(leveldb::kLevelDBRewriteFeature);
connector()->BindInterface("filesystem", &files_);
connector()->BindInterface("leveldb", &leveldb_);
}
// Note: This has an out parameter rather than returning the |DirectoryPtr|,
// since |ASSERT_...()| doesn't work with return values.
void GetTempDirectory(filesystem::mojom::DirectoryPtr* directory) {
base::File::Error error = base::File::Error::FILE_ERROR_FAILED;
bool handled = files()->OpenTempDirectory(MakeRequest(directory), &error);
ASSERT_TRUE(handled);
ASSERT_EQ(base::File::Error::FILE_OK, error);
mojo::Remote<filesystem::mojom::Directory> CreateTempDir() {
return directory_helper_.CreateTempDir();
}
filesystem::mojom::FileSystemPtr& files() { return files_; }
mojom::LevelDBServicePtr& leveldb() { return leveldb_; }
mojo::Remote<mojom::LevelDBService>& leveldb() { return leveldb_remote_; }
private:
base::test::ScopedTaskEnvironment task_environment_;
service_manager::TestServiceManager test_service_manager_;
service_manager::TestService test_service_;
base::test::ScopedFeatureList feature_list_;
filesystem::mojom::FileSystemPtr files_;
mojom::LevelDBServicePtr leveldb_;
filesystem::DirectoryTestHelper directory_helper_;
LevelDBServiceImpl leveldb_service_;
mojo::Remote<mojom::LevelDBService> leveldb_remote_;
mojo::Receiver<mojom::LevelDBService> leveldb_receiver_;
DISALLOW_COPY_AND_ASSIGN(LevelDBServiceTest);
};
......@@ -388,8 +370,7 @@ TEST_F(LevelDBServiceTest, WriteBatchPrefixesAndDeletes) {
TEST_F(LevelDBServiceTest, Reconnect) {
mojom::DatabaseError error;
filesystem::mojom::DirectoryPtr temp_directory;
GetTempDirectory(&temp_directory);
mojo::Remote<filesystem::mojom::Directory> temp_directory = CreateTempDir();
{
filesystem::mojom::DirectoryPtr directory;
......@@ -439,8 +420,7 @@ TEST_F(LevelDBServiceTest, Reconnect) {
TEST_F(LevelDBServiceTest, Destroy) {
mojom::DatabaseError error;
filesystem::mojom::DirectoryPtr temp_directory;
GetTempDirectory(&temp_directory);
mojo::Remote<filesystem::mojom::Directory> temp_directory = CreateTempDir();
{
filesystem::mojom::DirectoryPtr directory;
......@@ -721,8 +701,7 @@ TEST_F(LevelDBServiceTest, Prefixed) {
TEST_F(LevelDBServiceTest, RewriteDB) {
mojom::DatabaseError error;
filesystem::mojom::DirectoryPtr directory;
GetTempDirectory(&directory);
filesystem::mojom::DirectoryPtr directory(CreateTempDir().Unbind());
mojom::LevelDBDatabaseAssociatedPtr database;
leveldb_env::Options options;
......
// 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 "base/task/single_thread_task_executor.h"
#include "components/services/leveldb/leveldb_app.h"
#include "services/service_manager/public/cpp/service_executable/service_main.h"
void ServiceMain(service_manager::mojom::ServiceRequest request) {
base::SingleThreadTaskExecutor main_thread_task_executor;
leveldb::LevelDBApp(std::move(request)).RunUntilTermination();
}
......@@ -13,20 +13,6 @@ static_library("cpp") {
deps = [
"//base",
"//components/services/leveldb/public/mojom",
"//services/service_manager/public/cpp",
"//third_party/leveldatabase",
]
}
source_set("manifest") {
sources = [
"manifest.cc",
"manifest.h",
]
deps = [
"//base",
"//components/services/leveldb/public/mojom",
"//services/service_manager/public/cpp",
]
}
per-file manifest.cc=set noparent
per-file manifest.cc=file://ipc/SECURITY_OWNERS
per-file manifest.h=set noparent
per-file manifest.h=file://ipc/SECURITY_OWNERS
// Copyright 2019 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 "components/services/leveldb/public/cpp/manifest.h"
#include "base/no_destructor.h"
#include "components/services/leveldb/public/mojom/leveldb.mojom.h"
#include "services/service_manager/public/cpp/manifest_builder.h"
namespace leveldb {
const service_manager::Manifest& GetManifest() {
static base::NoDestructor<service_manager::Manifest> manifest{
service_manager::ManifestBuilder()
.WithServiceName("leveldb")
.WithDisplayName("LevelDB Service")
.WithOptions(
service_manager::ManifestOptionsBuilder()
.WithSandboxType("none")
.WithExecutionMode(service_manager::Manifest::ExecutionMode ::
kStandaloneExecutable)
.Build())
.ExposeCapability(
"leveldb:leveldb",
service_manager::Manifest::InterfaceList<mojom::LevelDBService>())
.Build()};
return *manifest;
}
} // namespace leveldb
// Copyright 2019 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.
#ifndef COMPONENTS_SERVICES_LEVELDB_PUBLIC_CPP_MANIFEST_H_
#define COMPONENTS_SERVICES_LEVELDB_PUBLIC_CPP_MANIFEST_H_
#include "services/service_manager/public/cpp/manifest.h"
namespace leveldb {
const service_manager::Manifest& GetManifest();
} // namespace leveldb
#endif // COMPONENTS_SERVICES_LEVELDB_PUBLIC_CPP_MANIFEST_H_
......@@ -7,14 +7,13 @@
#include "base/bind.h"
#include "base/macros.h"
#include "base/run_loop.h"
#include "base/task/post_task.h"
#include "base/test/scoped_task_environment.h"
#include "components/services/leveldb/public/cpp/manifest.h"
#include "components/services/leveldb/leveldb_service_impl.h"
#include "components/services/leveldb/public/cpp/remote_iterator.h"
#include "components/services/leveldb/public/cpp/util.h"
#include "components/services/leveldb/public/mojom/leveldb.mojom.h"
#include "services/service_manager/public/cpp/manifest_builder.h"
#include "services/service_manager/public/cpp/test/test_service.h"
#include "services/service_manager/public/cpp/test/test_service_manager.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace leveldb {
......@@ -43,26 +42,17 @@ base::Callback<void(const base::UnguessableToken&)> CaptureToken(
quit_closure);
}
const char kTestServiceName[] = "leveldb_service_unittests";
class RemoteIteratorTest : public testing::Test {
public:
RemoteIteratorTest()
: test_service_manager_(
{GetManifest(), service_manager::ManifestBuilder()
.WithServiceName(kTestServiceName)
.RequireCapability("leveldb", "leveldb:leveldb")
.Build()}),
test_service_(
test_service_manager_.RegisterTestInstance(kTestServiceName)) {}
: leveldb_service_(base::CreateSequencedTaskRunnerWithTraits(
{base::MayBlock(), base::TaskShutdownBehavior::BLOCK_SHUTDOWN})),
leveldb_receiver_(&leveldb_service_,
leveldb_remote_.BindNewPipeAndPassReceiver()) {}
~RemoteIteratorTest() override = default;
protected:
service_manager::Connector* connector() { return test_service_.connector(); }
void SetUp() override {
connector()->BindInterface("leveldb", &leveldb_);
mojom::DatabaseError error;
base::RunLoop run_loop;
leveldb()->OpenInMemory(base::nullopt, "RemoteIteratorTest",
......@@ -86,15 +76,14 @@ class RemoteIteratorTest : public testing::Test {
}
}
mojom::LevelDBServicePtr& leveldb() { return leveldb_; }
mojo::Remote<mojom::LevelDBService>& leveldb() { return leveldb_remote_; }
mojom::LevelDBDatabaseAssociatedPtr& database() { return database_; }
private:
base::test::ScopedTaskEnvironment task_environment_;
service_manager::TestServiceManager test_service_manager_;
service_manager::TestService test_service_;
mojom::LevelDBServicePtr leveldb_;
LevelDBServiceImpl leveldb_service_;
mojo::Remote<mojom::LevelDBService> leveldb_remote_;
mojo::Receiver<mojom::LevelDBService> leveldb_receiver_;
mojom::LevelDBDatabaseAssociatedPtr database_;
DISALLOW_COPY_AND_ASSIGN(RemoteIteratorTest);
......
......@@ -14,7 +14,6 @@
#include "base/strings/utf_string_conversions.h"
#include "base/test/bind_test_util.h"
#include "build/build_config.h"
#include "components/services/filesystem/public/mojom/file_system.mojom.h"
#include "components/services/leveldb/public/cpp/util.h"
#include "content/browser/dom_storage/dom_storage_database.h"
#include "content/browser/dom_storage/dom_storage_task_runner.h"
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment