blob: 8442043fff0536d21c2041dfeffcf188728f35b1 [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, TestSetTemplateArguments) {
bool set_template_arguments_callback_done = false;
std::vector<uint8_t> arguments;
media_perception_ptr_->SetTemplateArguments(
"test_configuration", arguments,
base::Bind(
[](bool* set_template_arguments_callback_done,
chromeos::media_perception::mojom::SuccessStatusPtr status) {
EXPECT_EQ(status->success, true);
EXPECT_EQ(*status->failure_reason, "test_configuration");
*set_template_arguments_callback_done = true;
},
&set_template_arguments_callback_done));
base::RunLoop().RunUntilIdle();
ASSERT_TRUE(set_template_arguments_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);
}
TEST_F(MediaPerceptionImplTest, TestGetGlobalPipelineState) {
bool get_global_pipeline_callback_done = false;
media_perception_ptr_->GetGlobalPipelineState(base::Bind(
[](bool* get_global_pipeline_callback_done,
chromeos::media_perception::mojom::GlobalPipelineStatePtr state) {
EXPECT_EQ(*state->states[0]->configuration_name, "fake_configuration");
*get_global_pipeline_callback_done = true;
},
&get_global_pipeline_callback_done));
base::RunLoop().RunUntilIdle();
ASSERT_TRUE(get_global_pipeline_callback_done);
}
} // namespace
} // namespace mri