use serde::{Deserialize, Serialize};
use std::time::Duration;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MobileTestingConfig {
pub enabled: bool,
pub max_test_duration: Duration,
pub benchmark_config: BenchmarkConfig,
pub battery_test_config: BatteryTestConfig,
pub stress_test_config: StressTestConfig,
pub memory_test_config: MemoryTestConfig,
pub enable_detailed_logging: bool,
pub output_directory: String,
pub device_farm_config: Option<DeviceFarmConfig>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BenchmarkConfig {
pub warmup_iterations: usize,
pub benchmark_iterations: usize,
pub input_sizes: Vec<Vec<usize>>,
pub target_latency_ms: f32,
pub target_throughput: f32,
pub precision_modes: Vec<PrecisionMode>,
pub power_modes: Vec<PowerMode>,
pub thermal_conditions: Vec<ThermalCondition>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BatteryTestConfig {
pub test_duration: Duration,
pub inference_frequency: Duration,
pub power_measurement_interval: Duration,
pub target_power_consumption_mw: f32,
pub target_battery_drain_percent_per_hour: f32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StressTestConfig {
pub test_duration: Duration,
pub concurrent_threads: usize,
pub memory_pressure_enabled: bool,
pub thermal_stress_enabled: bool,
pub cpu_stress_level: f32,
pub memory_stress_level: f32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MemoryTestConfig {
pub enable_leak_detection: bool,
pub memory_stress_duration: Duration,
pub max_memory_usage_mb: usize,
pub gc_stress_enabled: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DeviceFarmConfig {
pub provider: DeviceFarmProvider,
pub credentials: DeviceFarmCredentials,
pub execution_settings: DeviceFarmExecutionSettings,
pub device_selection: DeviceSelectionCriteria,
pub parallelism: DeviceFarmParallelism,
pub timeouts: DeviceFarmTimeouts,
pub result_aggregation: ResultAggregationSettings,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum DeviceFarmProvider {
AWS {
region: String,
project_name: String,
},
Firebase {
project_id: String,
test_lab_id: String,
},
BrowserStack {
username: String,
build_name: String,
},
SauceLabs {
datacenter: String,
build_name: String,
},
AppCenter {
owner_name: String,
app_name: String,
},
Local {
device_pool_size: usize,
devices: Vec<String>,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DeviceFarmCredentials {
pub access_key: Option<String>,
pub secret_key: Option<String>,
pub api_token: Option<String>,
pub username: Option<String>,
pub password: Option<String>,
pub service_account_json: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DeviceFarmExecutionSettings {
pub max_parallel_devices: usize,
pub execution_timeout: Duration,
pub retry_failed_tests: bool,
pub max_retry_attempts: usize,
pub video_recording: bool,
pub screenshot_capture: bool,
pub performance_monitoring: bool,
pub device_logs: bool,
pub network_logs: bool,
pub app_crash_logs: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DeviceSelectionCriteria {
pub device_types: Vec<DeviceType>,
pub os_versions: Vec<String>,
pub hardware_requirements: HardwareRequirements,
pub gpu_requirements: GpuRequirements,
pub regions: Vec<String>,
pub availability_requirements: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum DeviceType {
Phone,
Tablet,
Watch,
TV,
Auto,
Generic,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HardwareRequirements {
pub min_ram_mb: usize,
pub min_cpu_cores: usize,
pub min_storage_gb: usize,
pub required_sensors: Vec<String>,
pub required_connectivity: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GpuRequirements {
pub vendor: Option<String>,
pub min_memory_mb: Option<usize>,
pub required_features: Vec<String>,
pub min_compute_capability: Option<f32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DeviceFarmParallelism {
pub distribution_strategy: TestDistributionStrategy,
pub load_balancing: LoadBalancingSettings,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum TestDistributionStrategy {
RoundRobin,
LeastLoaded,
Random,
DeviceCapabilityBased,
GeographicOptimal,
CostOptimal,
PerformanceOptimal,
AvailabilityBased,
CustomWeighted { weights: Vec<(String, f32)> },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LoadBalancingSettings {
pub dynamic_rebalancing: bool,
pub rebalancing_interval: Duration,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DeviceFarmTimeouts {
pub device_allocation_timeout: Duration,
pub test_execution_timeout: Duration,
pub result_collection_timeout: Duration,
pub device_cleanup_timeout: Duration,
pub overall_session_timeout: Duration,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResultAggregationSettings {
pub statistical_analysis: StatisticalAnalysisSettings,
pub report_generation: ReportGenerationSettings,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StatisticalAnalysisSettings {
pub calculate_percentiles: bool,
pub percentile_levels: Vec<f32>,
pub confidence_level: f32,
pub outlier_detection: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReportGenerationSettings {
pub formats: Vec<ReportFormat>,
pub include_device_details: bool,
pub include_charts: bool,
pub include_raw_data: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ReportFormat {
JSON,
XML,
HTML,
PDF,
CSV,
Markdown,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum PrecisionMode {
FP32,
FP16,
INT8,
INT4,
Mixed,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum PowerMode {
HighPerformance,
Balanced,
PowerSaver,
Adaptive,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum ThermalCondition {
Cool,
Nominal,
Warm,
Hot,
Critical,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TargetMetrics {
pub target_latency_ms: f32,
pub target_throughput_ops_per_sec: f32,
pub target_accuracy_percent: f32,
pub target_memory_usage_mb: usize,
pub target_power_consumption_mw: f32,
pub target_thermal_efficiency: f32,
}
impl Default for MobileTestingConfig {
fn default() -> Self {
Self {
enabled: true,
max_test_duration: Duration::from_secs(300), benchmark_config: BenchmarkConfig::default(),
battery_test_config: BatteryTestConfig::default(),
stress_test_config: StressTestConfig::default(),
memory_test_config: MemoryTestConfig::default(),
enable_detailed_logging: true,
output_directory: "./test_results".to_string(),
device_farm_config: None,
}
}
}
impl Default for BenchmarkConfig {
fn default() -> Self {
Self {
warmup_iterations: 10,
benchmark_iterations: 100,
input_sizes: vec![
vec![1, 224, 224, 3], vec![1, 512], vec![1, 1024], ],
target_latency_ms: 100.0,
target_throughput: 10.0,
precision_modes: vec![PrecisionMode::FP32, PrecisionMode::FP16],
power_modes: vec![PowerMode::Balanced],
thermal_conditions: vec![ThermalCondition::Nominal],
}
}
}
impl Default for BatteryTestConfig {
fn default() -> Self {
Self {
test_duration: Duration::from_secs(3600), inference_frequency: Duration::from_millis(100), power_measurement_interval: Duration::from_secs(1),
target_power_consumption_mw: 500.0,
target_battery_drain_percent_per_hour: 5.0,
}
}
}
impl Default for StressTestConfig {
fn default() -> Self {
Self {
test_duration: Duration::from_secs(600), concurrent_threads: 4,
memory_pressure_enabled: true,
thermal_stress_enabled: true,
cpu_stress_level: 0.8,
memory_stress_level: 0.8,
}
}
}
impl Default for MemoryTestConfig {
fn default() -> Self {
Self {
enable_leak_detection: true,
memory_stress_duration: Duration::from_secs(300), max_memory_usage_mb: 512,
gc_stress_enabled: true,
}
}
}