Commit 36871d60 authored by Harvey Yang's avatar Harvey Yang Committed by Chromium LUCI CQ

sensors: Support multiple clients in FakeSensorService

Supporting multiple sensor clients in FakeSensorService simplifies some
unit tests of disconnections.

BUG=b:172208566, b:172414302
TEST=unit tests

Change-Id: I77ccbc79760e2a3833de6d39fadf4d5e00a4001b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2631390Reviewed-by: default avatarRyo Hashimoto <hashimoto@chromium.org>
Reviewed-by: default avatarRaphael Kubo da Costa <raphael.kubo.da.costa@intel.com>
Commit-Queue: Cheng-Hao Yang <chenghaoyang@chromium.org>
Cr-Commit-Position: refs/heads/master@{#844453}
parent 5506b20e
......@@ -13,8 +13,7 @@ FakeSensorHalServer::~FakeSensorHalServer() = default;
void FakeSensorHalServer::CreateChannel(
mojo::PendingReceiver<mojom::SensorService> sensor_service_receiver) {
DCHECK(!sensor_service_->is_bound());
sensor_service_->Bind(std::move(sensor_service_receiver));
sensor_service_->AddReceiver(std::move(sensor_service_receiver));
}
mojo::PendingRemote<mojom::SensorHalServer> FakeSensorHalServer::PassRemote() {
......
......@@ -21,26 +21,23 @@ FakeSensorService::~FakeSensorService() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
}
bool FakeSensorService::is_bound() {
void FakeSensorService::AddReceiver(
mojo::PendingReceiver<mojom::SensorService> pending_receiver) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
return receiver_.is_bound();
receiver_set_.Add(this, std::move(pending_receiver));
}
void FakeSensorService::Bind(
mojo::PendingReceiver<mojom::SensorService> pending_receiver) {
void FakeSensorService::ClearReceivers() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
DCHECK(!is_bound());
receiver_.Bind(std::move(pending_receiver));
receiver_.set_disconnect_handler(base::BindOnce(
&FakeSensorService::OnServiceDisconnect, base::Unretained(this)));
receiver_set_.Clear();
}
void FakeSensorService::OnServiceDisconnect() {
bool FakeSensorService::HasReceivers() const {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
receiver_.reset();
return !receiver_set_.empty();
}
void FakeSensorService::SetDevice(
......
......@@ -12,7 +12,7 @@
#include "base/sequence_checker.h"
#include "chromeos/components/sensors/fake_sensor_device.h"
#include "chromeos/components/sensors/mojom/sensor.mojom.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
#include "mojo/public/cpp/bindings/remote_set.h"
namespace chromeos {
......@@ -25,9 +25,10 @@ class FakeSensorService final : public mojom::SensorService {
FakeSensorService& operator=(const FakeSensorService&) = delete;
~FakeSensorService() override;
bool is_bound();
void Bind(mojo::PendingReceiver<mojom::SensorService> pending_receiver);
void OnServiceDisconnect();
void AddReceiver(
mojo::PendingReceiver<mojom::SensorService> pending_receiver);
void ClearReceivers();
bool HasReceivers() const;
void SetDevice(int32_t iio_device_id,
std::set<mojom::DeviceType> types,
......@@ -58,7 +59,7 @@ class FakeSensorService final : public mojom::SensorService {
// First is the iio_device_id, second is the device's data.
std::map<int32_t, DeviceData> devices_;
mojo::Receiver<mojom::SensorService> receiver_{this};
mojo::ReceiverSet<mojom::SensorService> receiver_set_;
mojo::RemoteSet<mojom::SensorServiceNewDevicesObserver> observers_;
SEQUENCE_CHECKER(sequence_checker_);
......
......@@ -55,7 +55,7 @@ TEST_F(SensorHalDispatcherTest, ServerConnectionError) {
// Wait until the server and client get the established Mojo channel.
base::RunLoop().RunUntilIdle();
EXPECT_TRUE(fake_server->GetSensorService()->is_bound());
EXPECT_TRUE(fake_server->GetSensorService()->HasReceivers());
EXPECT_TRUE(fake_client->SensorServiceIsValid());
// Re-create a new server to simulate a server crash.
......@@ -72,7 +72,7 @@ TEST_F(SensorHalDispatcherTest, ServerConnectionError) {
// client.
base::RunLoop().RunUntilIdle();
EXPECT_TRUE(fake_server->GetSensorService()->is_bound());
EXPECT_TRUE(fake_server->GetSensorService()->HasReceivers());
EXPECT_TRUE(fake_client->SensorServiceIsValid());
}
......@@ -93,12 +93,12 @@ TEST_F(SensorHalDispatcherTest, ClientConnectionError) {
// Wait until the server and client get the established Mojo channel.
base::RunLoop().RunUntilIdle();
EXPECT_TRUE(fake_server->GetSensorService()->is_bound());
EXPECT_TRUE(fake_server->GetSensorService()->HasReceivers());
EXPECT_TRUE(fake_client->SensorServiceIsValid());
// Re-create a new client to simulate a client crash.
fake_client = std::make_unique<FakeSensorHalClient>();
fake_server->GetSensorService()->OnServiceDisconnect();
fake_server->GetSensorService()->ClearReceivers();
remote_client = fake_client->PassRemote();
SensorHalDispatcher::GetInstance()->RegisterClient(std::move(remote_client));
......@@ -107,7 +107,7 @@ TEST_F(SensorHalDispatcherTest, ClientConnectionError) {
// client.
base::RunLoop().RunUntilIdle();
EXPECT_TRUE(fake_server->GetSensorService()->is_bound());
EXPECT_TRUE(fake_server->GetSensorService()->HasReceivers());
EXPECT_TRUE(fake_client->SensorServiceIsValid());
}
......
......@@ -343,7 +343,7 @@ TEST_F(PlatformSensorProviderChromeOSTest, Reconnect) {
EXPECT_TRUE(CreateSensor(mojom::SensorType::GYROSCOPE));
// Simulate a disconnection of IIO Service.
sensor_hal_server_->GetSensorService()->OnServiceDisconnect();
sensor_hal_server_->GetSensorService()->ClearReceivers();
sensor_hal_server_->OnServerDisconnect();
// Remove the stored Mojo remote of the ambient light sensor.
sensor_devices_.back()->ClearReceivers();
......
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