Commit cbc28ee2 authored by Kyle Williams's avatar Kyle Williams Committed by Chromium LUCI CQ

chromebox_for_meetings: Create Scafolding for Diagnostics service

Adds the boilerplate code for integrating with the meet devices mojom
binder service for chromium.

BUG=b:174846892
TEST='autoninja -C ~/chromium/src/out_${SDK_BOARD}/Release chrome chrome_sandbox nacl_helper'

Change-Id: Ib0171f58e272128a4d5469f2c0bffd082d2bb30d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2575758
Commit-Queue: Kyle Williams <kdgwill@chromium.org>
Reviewed-by: default avatarDominick Ng <dominickn@chromium.org>
Reviewed-by: default avatarAlexander Alekseev <alemate@chromium.org>
Cr-Commit-Position: refs/heads/master@{#835569}
parent d3ae0022
......@@ -3101,6 +3101,8 @@ source_set("chromeos") {
"chromebox_for_meetings/browser/cfm_browser_service.h",
"chromebox_for_meetings/cfm_chrome_services.cc",
"chromebox_for_meetings/cfm_chrome_services.h",
"chromebox_for_meetings/diagnostics/diagnostics_service.cc",
"chromebox_for_meetings/diagnostics/diagnostics_service.h",
"chromebox_for_meetings/logger/cfm_logger_service.cc",
"chromebox_for_meetings/logger/cfm_logger_service.h",
"chromebox_for_meetings/logger/reporting_pipeline.cc",
......@@ -4123,6 +4125,7 @@ source_set("unit_tests") {
if (is_cfm) {
sources += [
"chromebox_for_meetings/browser/cfm_browser_service_unittest.cc",
"chromebox_for_meetings/diagnostics/diagnostics_service_unittest.cc",
"chromebox_for_meetings/logger/cfm_logger_service_unittest.cc",
"chromebox_for_meetings/service_adaptor_unittest.cc",
]
......
......@@ -5,6 +5,7 @@
#include "chrome/browser/chromeos/chromebox_for_meetings/cfm_chrome_services.h"
#include "chrome/browser/chromeos/chromebox_for_meetings/browser/cfm_browser_service.h"
#include "chrome/browser/chromeos/chromebox_for_meetings/diagnostics/diagnostics_service.h"
#include "chrome/browser/chromeos/chromebox_for_meetings/logger/cfm_logger_service.h"
#include "chromeos/components/chromebox_for_meetings/features/features.h"
#include "chromeos/dbus/chromebox_for_meetings/cfm_hotline_client.h"
......@@ -19,6 +20,7 @@ void InitializeCfmServices() {
CfmBrowserService::Initialize();
CfmLoggerService::Initialize();
DiagnosticsService::Initialize();
}
void ShutdownCfmServices() {
......@@ -26,6 +28,7 @@ void ShutdownCfmServices() {
return;
}
DiagnosticsService::Shutdown();
CfmLoggerService::Shutdown();
CfmBrowserService::Shutdown();
}
......
// Copyright 2020 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/chromeos/chromebox_for_meetings/diagnostics/diagnostics_service.h"
#include "base/bind.h"
#include "base/macros.h"
#include "chromeos/dbus/chromebox_for_meetings/cfm_hotline_client.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
namespace chromeos {
namespace cfm {
namespace {
static DiagnosticsService* g_info_service = nullptr;
} // namespace
// static
void DiagnosticsService::Initialize() {
CHECK(!g_info_service);
g_info_service = new DiagnosticsService();
}
// static
void DiagnosticsService::Shutdown() {
CHECK(g_info_service);
delete g_info_service;
g_info_service = nullptr;
}
// static
DiagnosticsService* DiagnosticsService::Get() {
CHECK(g_info_service)
<< "DeviceInfoService::Get() called before Initialize()";
return g_info_service;
}
// static
bool DiagnosticsService::IsInitialized() {
return g_info_service;
}
bool DiagnosticsService::ServiceRequestReceived(
const std::string& interface_name) {
if (interface_name != mojom::MeetDevicesDiagnostics::Name_) {
return false;
}
service_adaptor_.BindServiceAdaptor();
return true;
}
void DiagnosticsService::OnAdaptorDisconnect() {
LOG(ERROR) << "mojom::Diagnostics Service Adaptor has been disconnected";
// CleanUp to follow the lifecycle of the primary CfmServiceContext
receivers_.Clear();
}
void DiagnosticsService::OnBindService(
mojo::ScopedMessagePipeHandle receiver_pipe) {
receivers_.Add(this, mojo::PendingReceiver<mojom::MeetDevicesDiagnostics>(
std::move(receiver_pipe)));
}
// Private methods
DiagnosticsService::DiagnosticsService()
: service_adaptor_(mojom::MeetDevicesDiagnostics::Name_, this) {
CfmHotlineClient::Get()->AddObserver(this);
}
DiagnosticsService::~DiagnosticsService() {
CfmHotlineClient::Get()->RemoveObserver(this);
}
} // namespace cfm
} // namespace chromeos
// Copyright 2020 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 CHROME_BROWSER_CHROMEOS_CHROMEBOX_FOR_MEETINGS_DIAGNOSTICS_DIAGNOSTICS_SERVICE_H_
#define CHROME_BROWSER_CHROMEOS_CHROMEBOX_FOR_MEETINGS_DIAGNOSTICS_DIAGNOSTICS_SERVICE_H_
#include "base/memory/weak_ptr.h"
#include "chrome/browser/chromeos/chromebox_for_meetings/service_adaptor.h"
#include "chromeos/dbus/chromebox_for_meetings/cfm_observer.h"
#include "chromeos/services/chromebox_for_meetings/public/mojom/meet_devices_diagnostics.mojom.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
namespace chromeos {
namespace cfm {
// Implementation of the MeetDevicesDiagnostics Service.
class DiagnosticsService : public CfmObserver,
public ServiceAdaptor::Delegate,
public mojom::MeetDevicesDiagnostics {
public:
DiagnosticsService(const DiagnosticsService&) = delete;
DiagnosticsService& operator=(const DiagnosticsService&) = delete;
// Manage singleton instance.
static void Initialize();
static void Shutdown();
static DiagnosticsService* Get();
static bool IsInitialized();
protected:
// Forward |CfmObserver| implementation
bool ServiceRequestReceived(const std::string& interface_name) override;
// Disconnect handler for |mojom::CfmServiceAdaptor|
void OnAdaptorDisconnect() override;
// Forward |ServiceAdaptorDelegate| implementation
void OnBindService(mojo::ScopedMessagePipeHandle receiver_pipe) override;
private:
DiagnosticsService();
~DiagnosticsService() override;
ServiceAdaptor service_adaptor_;
mojo::ReceiverSet<mojom::MeetDevicesDiagnostics> receivers_;
};
} // namespace cfm
} // namespace chromeos
#endif // CHROME_BROWSER_CHROMEOS_CHROMEBOX_FOR_MEETINGS_DIAGNOSTICS_DIAGNOSTICS_SERVICE_H_
// Copyright 2020 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/chromeos/chromebox_for_meetings/diagnostics/diagnostics_service.h"
#include <memory>
#include <utility>
#include <vector>
#include "base/bind.h"
#include "base/macros.h"
#include "base/optional.h"
#include "base/run_loop.h"
#include "base/strings/string_number_conversions.h"
#include "base/test/bind.h"
#include "base/test/mock_callback.h"
#include "base/test/task_environment.h"
#include "chromeos/dbus/chromebox_for_meetings/fake_cfm_hotline_client.h"
#include "chromeos/services/chromebox_for_meetings/public/cpp/fake_service_connection.h"
#include "chromeos/services/chromebox_for_meetings/public/cpp/fake_service_context.h"
#include "chromeos/services/chromebox_for_meetings/public/cpp/service_connection.h"
#include "chromeos/services/chromebox_for_meetings/public/mojom/cfm_service_manager.mojom.h"
#include "chromeos/services/chromebox_for_meetings/public/mojom/meet_devices_diagnostics.mojom.h"
#include "content/public/test/test_utils.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "testing/gmock/include/gmock/gmock.h"
namespace chromeos {
namespace cfm {
namespace {
class CfmDiagnosticsServiceTest : public ::testing::Test {
public:
CfmDiagnosticsServiceTest() = default;
CfmDiagnosticsServiceTest(const CfmDiagnosticsServiceTest&) = delete;
CfmDiagnosticsServiceTest& operator=(const CfmDiagnosticsServiceTest&) =
delete;
void SetUp() override {
CfmHotlineClient::InitializeFake();
ServiceConnection::UseFakeServiceConnectionForTesting(
&fake_service_connection_);
DiagnosticsService::Initialize();
}
void TearDown() override {
DiagnosticsService::Shutdown();
CfmHotlineClient::Shutdown();
}
FakeCfmHotlineClient* GetClient() {
return static_cast<FakeCfmHotlineClient*>(CfmHotlineClient::Get());
}
// Returns a mojo::Remote for the mojom::MeetDevicesDiagnostics by faking the
// way the cfm mojom binder daemon would request it through chrome.
const mojo::Remote<mojom::MeetDevicesDiagnostics>& GetDiagnosticsRemote() {
if (diagnostics_remote_.is_bound()) {
return diagnostics_remote_;
}
// if there is no valid remote create one
auto* interface_name = mojom::MeetDevicesDiagnostics::Name_;
base::RunLoop run_loop;
// Fake out CfmServiceContext
fake_service_connection_.SetCallback(base::BindLambdaForTesting(
[&](mojo::PendingReceiver<mojom::CfmServiceContext> pending_receiver,
bool success) {
ASSERT_TRUE(success);
context_receiver_set_.Add(&context_, std::move(pending_receiver));
}));
context_.SetFakeProvideAdaptorCallback(base::BindLambdaForTesting(
[&](const std::string& service_id,
mojo::PendingRemote<mojom::CfmServiceAdaptor>
pending_adaptor_remote,
mojom::CfmServiceContext::ProvideAdaptorCallback callback) {
ASSERT_EQ(interface_name, service_id);
adaptor_remote_.Bind(std::move(pending_adaptor_remote));
std::move(callback).Run(true);
}));
EXPECT_TRUE(GetClient()->FakeEmitSignal(interface_name));
run_loop.RunUntilIdle();
EXPECT_TRUE(adaptor_remote_.is_connected());
adaptor_remote_->OnBindService(
diagnostics_remote_.BindNewPipeAndPassReceiver().PassPipe());
EXPECT_TRUE(diagnostics_remote_.is_connected());
return diagnostics_remote_;
}
protected:
FakeCfmServiceContext context_;
mojo::Remote<mojom::MeetDevicesDiagnostics> diagnostics_remote_;
mojo::ReceiverSet<mojom::CfmServiceContext> context_receiver_set_;
mojo::Remote<mojom::CfmServiceAdaptor> adaptor_remote_;
FakeServiceConnectionImpl fake_service_connection_;
base::test::SingleThreadTaskEnvironment task_environment_;
};
// This test ensures that the DiagnosticsInfoService is discoverable by its
// mojom name by sending a signal received by CfmHotlineClient.
TEST_F(CfmDiagnosticsServiceTest, InfoServiceAvailable) {
ASSERT_TRUE(
GetClient()->FakeEmitSignal(mojom::MeetDevicesDiagnostics::Name_));
}
// This test ensures that the CfmDeviceInfoService correctly registers itself
// for discovery by the cfm mojom binder daemon and correctly returns a
// working mojom remote.
TEST_F(CfmDiagnosticsServiceTest, GetDiagnosticsRemote) {
ASSERT_TRUE(GetDiagnosticsRemote().is_connected());
}
TEST_F(CfmDiagnosticsServiceTest, GetDeviceInfoService) {
const auto& details_remote = GetDiagnosticsRemote();
ASSERT_TRUE(details_remote.is_connected());
}
} // namespace
} // namespace cfm
} // namespace chromeos
......@@ -8,6 +8,7 @@ mojom("mojom") {
sources = [
"cfm_browser.mojom",
"cfm_service_manager.mojom",
"meet_devices_diagnostics.mojom",
"meet_devices_logger.mojom",
]
public_deps = [ "//mojo/public/mojom/base" ]
......
// Copyright 2020 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 chromeos.cfm.mojom;
// Interface defined by chromium specifically for the ChromeboxForMeetings
// platform to query system diagnostics of devices in the fleet.
interface MeetDevicesDiagnostics {};
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