// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <utility>
#include <vector>
#include "base/run_loop.h"
#include "base/test/bind.h"
#include "base/unguessable_token.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chromeos/crosapi/mojom/video_conference.mojom.h"
#include "chromeos/lacros/lacros_service.h"
#include "content/public/test/browser_test.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace crosapi {
namespace {
class FakeVcManagerMojoClient : public mojom::VideoConferenceManagerClient {
public:
FakeVcManagerMojoClient() = default;
FakeVcManagerMojoClient(const FakeVcManagerMojoClient&) = delete;
FakeVcManagerMojoClient& operator=(const FakeVcManagerMojoClient&) = delete;
~FakeVcManagerMojoClient() override = default;
// crosapi::mojom::VideoConferenceManagerClient overrides
void GetMediaApps(GetMediaAppsCallback callback) override {
std::move(callback).Run(
std::vector<mojom::VideoConferenceMediaAppInfoPtr>());
}
void ReturnToApp(const base::UnguessableToken& id,
ReturnToAppCallback callback) override {}
void SetSystemMediaDeviceStatus(
mojom::VideoConferenceMediaDevice device,
bool disabled,
SetSystemMediaDeviceStatusCallback callback) override {}
void StopAllScreenShare() override {}
mojo::Receiver<mojom::VideoConferenceManagerClient> receiver_{this};
mojo::Remote<mojom::VideoConferenceManager> remote_;
base::UnguessableToken id_{base::UnguessableToken::Create()};
};
// Calls all crosapi::mojom::VideoConference methods.
void CallVcManagerAshMethods(FakeVcManagerMojoClient& client) {
base::RunLoop run_loop1;
client.remote_->RegisterMojoClient(
client.receiver_.BindNewPipeAndPassRemote(), client.id_,
base::BindLambdaForTesting([&](bool success) {
EXPECT_TRUE(success);
run_loop1.Quit();
}));
run_loop1.Run();
base::RunLoop run_loop2;
client.remote_->NotifyMediaUsageUpdate(
crosapi::mojom::VideoConferenceMediaUsageStatus::New(
client.id_, true, false, true, false, true, false),
base::BindLambdaForTesting([&](bool success) {
EXPECT_TRUE(success);
run_loop2.Quit();
}));
run_loop2.Run();
base::RunLoop run_loop3;
client.remote_->NotifyDeviceUsedWhileDisabled(
crosapi::mojom::VideoConferenceMediaDevice::kCamera, u"Test App",
base::BindLambdaForTesting([&](bool success) {
EXPECT_TRUE(success);
run_loop3.Quit();
}));
run_loop3.Run();
}
using VideoConferenceLacrosBrowserTest = InProcessBrowserTest;
// Tests |VideoConferenceManagerAsh| api calls over mojo don't crash.
IN_PROC_BROWSER_TEST_F(VideoConferenceLacrosBrowserTest, Basics) {
auto* lacros_service = chromeos::LacrosService::Get();
ASSERT_TRUE(lacros_service);
ASSERT_TRUE(
lacros_service->IsRegistered<crosapi::mojom::VideoConferenceManager>());
if (!lacros_service->IsAvailable<crosapi::mojom::VideoConferenceManager>()) {
GTEST_SKIP();
}
FakeVcManagerMojoClient client1;
lacros_service->BindVideoConferenceManager(
client1.remote_.BindNewPipeAndPassReceiver());
{
FakeVcManagerMojoClient client2;
lacros_service->BindVideoConferenceManager(
client2.remote_.BindNewPipeAndPassReceiver());
// Call and verify that VideoConferenceManagerAsh methods don't crash.
CallVcManagerAshMethods(client1);
CallVcManagerAshMethods(client2);
}
// Call and verify that VideoConferenceManagerAsh methods don't crash after
// a client has disconnected.
FakeVcManagerMojoClient client3;
lacros_service->BindVideoConferenceManager(
client3.remote_.BindNewPipeAndPassReceiver());
CallVcManagerAshMethods(client3);
}
} // namespace
} // namespace crosapi