blob: dbca631445007f7e72812062dd248b7c4575e9bb [file] [log] [blame]
// Copyright 2018 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 <memory>
#include <utility>
#include <vector>
#include <base/bind.h>
#include <base/run_loop.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include "media_perception/device_management.pb.h"
#include "media_perception/fake_chrome_audio_service_client.h"
#include "media_perception/fake_rtanalytics.h"
#include "media_perception/fake_video_capture_service_client.h"
#include "media_perception/media_perception_impl.h"
#include "media_perception/proto_mojom_conversion.h"
#include "media_perception/serialized_proto.h"
namespace mri {
namespace {
class MediaPerceptionImplTest : public testing::Test {
protected:
void SetUp() override {
fake_vidcap_client_ = new FakeVideoCaptureServiceClient();
vidcap_client_ = std::shared_ptr<VideoCaptureServiceClient>(
fake_vidcap_client_);
fake_cras_client_ = new FakeChromeAudioServiceClient();
cras_client_ = std::shared_ptr<ChromeAudioServiceClient>(
fake_cras_client_);
fake_rtanalytics_ = new FakeRtanalytics();
rtanalytics_ = std::shared_ptr<Rtanalytics>(fake_rtanalytics_);
media_perception_impl_ = std::make_unique<MediaPerceptionImpl>(
mojo::MakeRequest(&media_perception_ptr_),
vidcap_client_, cras_client_, rtanalytics_);
}
chromeos::media_perception::mojom::MediaPerceptionPtr media_perception_ptr_;
FakeVideoCaptureServiceClient* fake_vidcap_client_;
std::shared_ptr<VideoCaptureServiceClient> vidcap_client_;
FakeChromeAudioServiceClient* fake_cras_client_;
std::shared_ptr<ChromeAudioServiceClient> cras_client_;
FakeRtanalytics* fake_rtanalytics_;
std::shared_ptr<Rtanalytics> rtanalytics_;
std::unique_ptr<MediaPerceptionImpl> media_perception_impl_;
};
TEST_F(MediaPerceptionImplTest, TestGetVideoDevices) {
bool get_devices_callback_done = false;
media_perception_ptr_->GetVideoDevices(
base::Bind([](bool* get_devices_callback_done,
std::vector<chromeos::media_perception::mojom::VideoDevicePtr>
devices) {
EXPECT_EQ(devices.size(), 0);
*get_devices_callback_done = true;
}, &get_devices_callback_done));
base::RunLoop().RunUntilIdle();
ASSERT_TRUE(get_devices_callback_done);
// Set up a couple of fake devices.
std::vector<SerializedVideoDevice> serialized_devices;
VideoDevice device;
device.set_id("1");
serialized_devices.push_back(Serialized<VideoDevice>(device).GetBytes());
device.set_id("2");
serialized_devices.push_back(Serialized<VideoDevice>(device).GetBytes());
fake_vidcap_client_->SetDevicesForGetDevices(serialized_devices);
get_devices_callback_done = false;
media_perception_ptr_->GetVideoDevices(
base::Bind([](bool *get_devices_callback_done,
std::vector<chromeos::media_perception::mojom::VideoDevicePtr>
devices) {
EXPECT_EQ(devices.size(), 2);
EXPECT_EQ(devices[0]->id, "1");
EXPECT_EQ(devices[1]->id, "2");
*get_devices_callback_done = true;
}, &get_devices_callback_done));
base::RunLoop().RunUntilIdle();
ASSERT_TRUE(get_devices_callback_done);
}
TEST_F(MediaPerceptionImplTest, TestGetAudioDevices) {
bool get_devices_callback_done = false;
media_perception_ptr_->GetAudioDevices(
base::Bind([](bool* get_devices_callback_done,
std::vector<chromeos::media_perception::mojom::AudioDevicePtr>
devices) {
EXPECT_EQ(devices.size(), 0);
*get_devices_callback_done = true;
}, &get_devices_callback_done));
base::RunLoop().RunUntilIdle();
ASSERT_TRUE(get_devices_callback_done);
// Set up a couple of fake devices.
std::vector<SerializedAudioDevice> serialized_devices;
AudioDevice device;
device.set_id("1");
serialized_devices.push_back(Serialized<AudioDevice>(device).GetBytes());
device.set_id("2");
serialized_devices.push_back(Serialized<AudioDevice>(device).GetBytes());
fake_cras_client_->SetDevicesForGetInputDevices(serialized_devices);
get_devices_callback_done = false;
media_perception_ptr_->GetAudioDevices(
base::Bind([](bool *get_devices_callback_done,
std::vector<chromeos::media_perception::mojom::AudioDevicePtr>
devices) {
EXPECT_EQ(devices.size(), 2);
EXPECT_EQ(devices[0]->id, "1");
EXPECT_EQ(devices[1]->id, "2");
*get_devices_callback_done = true;
}, &get_devices_callback_done));
base::RunLoop().RunUntilIdle();
ASSERT_TRUE(get_devices_callback_done);
}
TEST_F(MediaPerceptionImplTest, TestSetupConfiguration) {
bool setup_configuration_callback_done = false;
media_perception_ptr_->SetupConfiguration(
"test_configuration",
base::Bind([](
bool* setup_configuration_callback_done,
chromeos::media_perception::mojom::SuccessStatusPtr status,
chromeos::media_perception::mojom::PerceptionInterfacesPtr
requests) {
EXPECT_EQ(status->success, true);
EXPECT_EQ(*status->failure_reason, "test_configuration");
*setup_configuration_callback_done = true;
}, &setup_configuration_callback_done));
base::RunLoop().RunUntilIdle();
ASSERT_TRUE(setup_configuration_callback_done);
}
TEST_F(MediaPerceptionImplTest, TestGetTemplateDevices) {
DeviceTemplate template_one;
template_one.set_template_name("one");
DeviceTemplate template_two;
template_two.set_template_name("two");
std::vector<SerializedDeviceTemplate> device_templates;
device_templates.push_back(
Serialized<DeviceTemplate>(template_one).GetBytes());
device_templates.push_back(
Serialized<DeviceTemplate>(template_two).GetBytes());
fake_rtanalytics_->SetSerializedDeviceTemplates(device_templates);
bool get_template_devices_callback_done = false;
media_perception_ptr_->GetTemplateDevices(
"test_configuration",
base::Bind([](
bool* get_template_devices_callback_done,
std::vector<chromeos::media_perception::mojom::DeviceTemplatePtr>
device_templates) {
EXPECT_EQ(device_templates.size(), 2);
EXPECT_EQ(device_templates[0]->template_name, "one");
EXPECT_EQ(device_templates[1]->template_name, "two");
*get_template_devices_callback_done = true;
}, &get_template_devices_callback_done));
base::RunLoop().RunUntilIdle();
ASSERT_TRUE(get_template_devices_callback_done);
}
TEST_F(MediaPerceptionImplTest, TestSetVideoDeviceForTemplateName) {
bool callback_done = false;
chromeos::media_perception::mojom::VideoDevicePtr video_device =
chromeos::media_perception::mojom::VideoDevice::New();
media_perception_ptr_->SetVideoDeviceForTemplateName(
"test_configuration",
"test_template",
std::move(video_device),
base::Bind([](
bool* callback_done,
chromeos::media_perception::mojom::SuccessStatusPtr status) {
EXPECT_EQ(status->success, true);
EXPECT_EQ(*status->failure_reason, "test_template");
*callback_done = true;
}, &callback_done));
base::RunLoop().RunUntilIdle();
ASSERT_TRUE(callback_done);
}
TEST_F(MediaPerceptionImplTest, TestSetAudioDeviceForTemplateName) {
bool callback_done = false;
chromeos::media_perception::mojom::AudioDevicePtr audio_device =
chromeos::media_perception::mojom::AudioDevice::New();
media_perception_ptr_->SetAudioDeviceForTemplateName(
"test_configuration",
"test_template",
std::move(audio_device),
base::Bind([](
bool* callback_done,
chromeos::media_perception::mojom::SuccessStatusPtr status) {
EXPECT_EQ(status->success, true);
EXPECT_EQ(*status->failure_reason, "test_template");
*callback_done = true;
}, &callback_done));
base::RunLoop().RunUntilIdle();
ASSERT_TRUE(callback_done);
}
TEST_F(MediaPerceptionImplTest, TestSetVirtualVideoDeviceForTemplateName) {
bool callback_done = false;
chromeos::media_perception::mojom::VirtualVideoDevicePtr video_device =
chromeos::media_perception::mojom::VirtualVideoDevice::New();
video_device->video_device =
chromeos::media_perception::mojom::VideoDevice::New();
media_perception_ptr_->SetVirtualVideoDeviceForTemplateName(
"test_configuration",
"test_template",
std::move(video_device),
base::Bind([](
bool* callback_done,
chromeos::media_perception::mojom::SuccessStatusPtr status) {
EXPECT_EQ(status->success, true);
EXPECT_EQ(*status->failure_reason, "test_template");
*callback_done = true;
}, &callback_done));
base::RunLoop().RunUntilIdle();
ASSERT_TRUE(callback_done);
}
TEST_F(MediaPerceptionImplTest, TestGetPipelineState) {
bool get_pipeline_callback_done = false;
media_perception_ptr_->GetPipelineState(
"test_configuration",
base::Bind([](
bool* get_pipeline_callback_done,
chromeos::media_perception::mojom::PipelineStatePtr pipeline_state) {
EXPECT_EQ(pipeline_state->status,
chromeos::media_perception::mojom::PipelineStatus::SUSPENDED);
*get_pipeline_callback_done = true;
}, &get_pipeline_callback_done));
base::RunLoop().RunUntilIdle();
ASSERT_TRUE(get_pipeline_callback_done);
}
TEST_F(MediaPerceptionImplTest, TestSetPipelineState) {
bool set_pipeline_callback_done = false;
chromeos::media_perception::mojom::PipelineStatePtr desired_pipeline_state =
chromeos::media_perception::mojom::PipelineState::New();
desired_pipeline_state->status =
chromeos::media_perception::mojom::PipelineStatus::RUNNING;
media_perception_ptr_->SetPipelineState(
"test_configuration",
std::move(desired_pipeline_state),
base::Bind([](
bool* set_pipeline_callback_done,
chromeos::media_perception::mojom::PipelineStatePtr pipeline_state) {
EXPECT_EQ(pipeline_state->status,
chromeos::media_perception::mojom::PipelineStatus::RUNNING);
*set_pipeline_callback_done = true;
}, &set_pipeline_callback_done));
base::RunLoop().RunUntilIdle();
ASSERT_TRUE(set_pipeline_callback_done);
}
} // namespace
} // namespace mri