blob: 12765d2c105198941595aecfb8f1d0d35dc2d77c [file] [log] [blame]
// Copyright 2020 The Chromium OS 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 <gmock/gmock.h>
#include <gtest/gtest.h>
#include <memory>
#include <utility>
#include <base/run_loop.h>
#include <base/task/single_thread_task_executor.h>
#include <libmems/test_fakes.h>
#include <mojo/core/embedder/scoped_ipc_support.h>
#include "iioservice/daemon/sensor_hal_server_impl.h"
#include "mojo/cros_sensor_service.mojom.h"
using ::testing::_;
namespace iioservice {
namespace {
class MockSensorServiceImpl final : public SensorServiceImpl {
public:
MockSensorServiceImpl(
scoped_refptr<base::SequencedTaskRunner> ipc_task_runner,
std::unique_ptr<libmems::IioContext> context)
: SensorServiceImpl(
std::move(ipc_task_runner),
std::move(context),
SensorDeviceImpl::ScopedSensorDeviceImpl(
nullptr, SensorDeviceImpl::SensorDeviceImplDeleter)) {}
void AddReceiver(
mojo::PendingReceiver<cros::mojom::SensorService> request) override {
DoAddReceiver(std::move(request));
}
MOCK_METHOD1(DoAddReceiver,
void(mojo::PendingReceiver<cros::mojom::SensorService> request));
};
class FakeSensorHalServerImpl final : public SensorHalServerImpl {
public:
using ScopedFakeSensorHalServerImpl =
std::unique_ptr<FakeSensorHalServerImpl,
decltype(&SensorHalServerImplDeleter)>;
static ScopedFakeSensorHalServerImpl Create(
scoped_refptr<base::SequencedTaskRunner> ipc_task_runner,
mojo::PendingReceiver<cros::mojom::SensorHalServer> server_receiver,
MojoOnFailureCallback mojo_on_failure_callback) {
ScopedFakeSensorHalServerImpl server(
new FakeSensorHalServerImpl(std::move(ipc_task_runner),
std::move(server_receiver),
std::move(mojo_on_failure_callback)),
SensorHalServerImplDeleter);
server->SetSensorService();
return server;
}
protected:
void SetSensorService() override {
std::unique_ptr<MockSensorServiceImpl,
decltype(&SensorServiceImpl::SensorServiceImplDeleter)>
sensor_service(new MockSensorServiceImpl(
ipc_task_runner_,
std::make_unique<libmems::fakes::FakeIioContext>()),
SensorServiceImpl::SensorServiceImplDeleter);
EXPECT_CALL(*sensor_service.get(), DoAddReceiver(_)).Times(1);
sensor_service_ = std::move(sensor_service);
}
private:
FakeSensorHalServerImpl(
scoped_refptr<base::SequencedTaskRunner> ipc_task_runner,
mojo::PendingReceiver<cros::mojom::SensorHalServer> server_receiver,
MojoOnFailureCallback mojo_on_failure_callback)
: SensorHalServerImpl(std::move(ipc_task_runner),
std::move(server_receiver),
std::move(mojo_on_failure_callback)) {}
};
class SensorHalServerImplTest : public ::testing::Test {
public:
SensorHalServerImplTest()
: ipc_thread_(std::make_unique<base::Thread>("IPCThread")) {}
protected:
void SetUp() override {
task_executor_ = std::make_unique<base::SingleThreadTaskExecutor>(
base::MessagePumpType::IO);
EXPECT_TRUE(ipc_thread_->Start());
ipc_support_ = std::make_unique<mojo::core::ScopedIPCSupport>(
ipc_thread_->task_runner(),
mojo::core::ScopedIPCSupport::ShutdownPolicy::CLEAN);
}
MOCK_METHOD(void, DoMojoOnFailureCallback, ());
void SetupServer() {
base::RunLoop run_loop;
ipc_thread_->task_runner()->PostTask(
FROM_HERE,
base::BindOnce(&SensorHalServerImplTest::CreateServerOnThread,
base::Unretained(this), run_loop.QuitClosure()));
run_loop.Run();
}
void CreateServerOnThread(base::RepeatingClosure closure) {
CHECK(ipc_thread_->task_runner()->BelongsToCurrentThread());
server_ = FakeSensorHalServerImpl::Create(
ipc_thread_->task_runner(), remote_.BindNewPipeAndPassReceiver(),
base::BindOnce(&SensorHalServerImplTest::DoMojoOnFailureCallback,
base::Unretained(this)));
closure.Run();
}
void TearDown() override {
server_.reset();
ipc_support_.reset();
ipc_thread_->Stop();
task_executor_.reset();
}
std::unique_ptr<base::Thread> ipc_thread_;
std::unique_ptr<mojo::core::ScopedIPCSupport> ipc_support_;
mojo::Remote<cros::mojom::SensorHalServer> remote_;
std::unique_ptr<base::SingleThreadTaskExecutor> task_executor_;
FakeSensorHalServerImpl::ScopedFakeSensorHalServerImpl server_ = {
nullptr, SensorHalServerImpl::SensorHalServerImplDeleter};
};
TEST_F(SensorHalServerImplTest, CreateChannelAndDisconnect) {
SetupServer();
mojo::Remote<cros::mojom::SensorService> receiver;
remote_->CreateChannel(receiver.BindNewPipeAndPassReceiver());
EXPECT_CALL(*this, DoMojoOnFailureCallback).Times(1);
remote_.reset();
}
} // namespace
} // namespace iioservice