darkwing/server/services/browser_profile_services/config/
media_devices.rsuse crate::server::{
dtos::{
browser_profile_dto::{BrowserProfileFullData, Mode},
start_dto::StartRequest,
},
error::Error,
};
use serde::{Deserialize, Serialize};
use super::{FromStartRequest, Navigator, Screen};
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct MediaDevices {
pub(super) speaker: u8,
pub(super) microphone: u8,
pub(super) webcamera: u8,
pub(super) microphone_name: String,
pub(super) webcamera_name: String,
}
impl FromStartRequest<MediaDevices> for MediaDevices {
fn from_start_request(
bp: &BrowserProfileFullData,
_request: &StartRequest,
_navigator: &Navigator,
_screen: &Screen,
_token: &str,
) -> Result<Self, Error> {
let speaker = if bp.media_devices.mode == Mode::Manual {
bp.media_devices.audio_outputs
} else {
0
};
let microphone = if bp.media_devices.mode == Mode::Manual {
bp.media_devices.audio_inputs
} else {
0
};
let webcamera = if bp.media_devices.mode == Mode::Manual {
bp.media_devices.video_inputs
} else {
0
};
Ok(Self {
speaker,
microphone,
webcamera,
microphone_name: "".to_string(),
webcamera_name: "".to_string(),
})
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::server::services::browser_profile_services::config::consts::LINUX_MOCK_PROFILE;
fn create_base_profile() -> BrowserProfileFullData {
BrowserProfileFullData {
media_devices: crate::server::dtos::browser_profile_dto::MediaDevices {
mode: Mode::Auto,
audio_inputs: 0,
audio_outputs: 0,
video_inputs: 0,
},
..LINUX_MOCK_PROFILE.clone()
}
}
fn create_base_request() -> StartRequest {
StartRequest::get_mock()
}
#[test]
fn test_manual_mode_with_devices() -> Result<(), Error> {
let mut profile = create_base_profile();
profile.media_devices.mode = Mode::Manual;
profile.media_devices.audio_outputs = 2;
profile.media_devices.audio_inputs = 1;
profile.media_devices.video_inputs = 1;
let request = create_base_request();
let navigator = Navigator::default();
let screen = Screen::default();
let token = String::new();
let result = MediaDevices::from_start_request(
&profile, &request, &navigator, &screen, &token,
)?;
assert_eq!(result.speaker, 2);
assert_eq!(result.microphone, 1);
assert_eq!(result.webcamera, 1);
assert_eq!(result.microphone_name, "");
assert_eq!(result.webcamera_name, "");
Ok(())
}
#[test]
fn test_auto_mode_no_devices() -> Result<(), Error> {
let profile = create_base_profile();
let request = create_base_request();
let navigator = Navigator::default();
let screen = Screen::default();
let token = String::new();
let result = MediaDevices::from_start_request(
&profile, &request, &navigator, &screen, &token,
)?;
assert_eq!(result.speaker, 0);
assert_eq!(result.microphone, 0);
assert_eq!(result.webcamera, 0);
assert_eq!(result.microphone_name, "");
assert_eq!(result.webcamera_name, "");
Ok(())
}
#[test]
fn test_manual_mode_zero_devices() -> Result<(), Error> {
let mut profile = create_base_profile();
profile.media_devices.mode = Mode::Manual;
profile.media_devices.audio_outputs = 0;
profile.media_devices.audio_inputs = 0;
profile.media_devices.video_inputs = 0;
let request = create_base_request();
let navigator = Navigator::default();
let screen = Screen::default();
let token = String::new();
let result = MediaDevices::from_start_request(
&profile, &request, &navigator, &screen, &token,
)?;
assert_eq!(result.speaker, 0);
assert_eq!(result.microphone, 0);
assert_eq!(result.webcamera, 0);
assert_eq!(result.microphone_name, "");
assert_eq!(result.webcamera_name, "");
Ok(())
}
}