// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/lacros/file_change_service_bridge.h"
#include "chrome/browser/file_system_access/chrome_file_system_access_permission_context.h"
#include "chrome/browser/file_system_access/file_system_access_permission_context_factory.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chromeos/crosapi/mojom/file_change_service_bridge.mojom.h"
#include "chromeos/lacros/lacros_service.h"
#include "content/public/test/browser_test.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "storage/browser/file_system/file_system_url.h"
#include "storage/common/file_system/file_system_types.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
namespace {
// Aliases.
using ::crosapi::mojom::FileChangeServiceBridge;
using ::testing::Eq;
using ::testing::NiceMock;
// MockFileChangeServiceBridge -------------------------------------------------
class MockFileChangeServiceBridge : public FileChangeServiceBridge {
public:
// FileChangeServiceBridge:
MOCK_METHOD(void,
OnFileCreatedFromShowSaveFilePicker,
(const GURL& file_picker_binding_context,
const base::FilePath& url),
(override));
};
// FileChangeServiceBridgeBrowserTest ------------------------------------------
// Base class for tests of the `FileChangeServiceBridge`.
class FileChangeServiceBridgeBrowserTest : public InProcessBrowserTest {
public:
// Returns the mock `FileChangeServiceBridge` for use by crosapi.
NiceMock<MockFileChangeServiceBridge>& file_change_service_bridge() {
return file_change_service_bridge_;
}
private:
// InProcessBrowserTest:
void CreatedBrowserMainParts(
content::BrowserMainParts* browser_main_parts) override {
InProcessBrowserTest::CreatedBrowserMainParts(browser_main_parts);
// Inject the mock `FileChangeServiceBridge` for use by crosapi.
chromeos::LacrosService::Get()->InjectRemoteForTesting(
file_change_service_bridge_receiver_
.BindNewPipeAndPassRemoteWithVersion());
}
// The mock `FileChangeServiceBridge` injected for use by crosapi.
NiceMock<MockFileChangeServiceBridge> file_change_service_bridge_;
mojo::Receiver<FileChangeServiceBridge> file_change_service_bridge_receiver_{
&file_change_service_bridge_};
};
} // namespace
// Tests -----------------------------------------------------------------------
// Verifies that `OnFileCreatedFromShowSaveFilePicker()` events are propagated.
IN_PROC_BROWSER_TEST_F(FileChangeServiceBridgeBrowserTest,
PropagatesOnFileCreatedFromShowSaveFilePickerEvents) {
// Create and cache metadata for a file creation event.
const GURL file_picker_binding_context("http://example.com/foo");
const base::FilePath file_path("bar");
const storage::FileSystemURL url = storage::FileSystemURL::CreateForTest(
blink::StorageKey(), storage::FileSystemType::kFileSystemTypeTest,
file_path);
// Expect the `file_change_service_bridge()` in Ash to be notified of file
// creation event from Lacros.
EXPECT_CALL(file_change_service_bridge(),
OnFileCreatedFromShowSaveFilePicker(
Eq(file_picker_binding_context), Eq(url.path())));
// Notify the chrome file system access permission context in Lacros of the
// file creation event to propagate the event to the
// `file_change_service_bridge()` in Ash.
FileSystemAccessPermissionContextFactory::GetForProfile(browser()->profile())
->OnFileCreatedFromShowSaveFilePicker(file_picker_binding_context, url);
}