releases/tests/Paca.Tests/Core/BatterySaverPowerManagerTests.cs

147 lines
6 KiB
C#

using System;
using Paca.Core;
using Paca.Core.Platform;
using Xunit;
namespace Paca.Tests.Core;
public class BatterySaverPowerManagerTests
{
[Fact]
public void 정상_상태_완전한_동시성_유지_및_백그라운드_작업_허용()
{
var manager = new BatterySaverPowerManager();
manager.UpdateBatteryState(percent: 85, isCharging: false);
Assert.False(manager.IsLowPowerModeActive);
Assert.False(manager.ShouldDeferBackgroundProcessing);
Assert.Equal(8, manager.CalculateOptimalConcurrency(baseConcurrency: 8));
Assert.True(manager.CanExecuteCpuIntensiveTask());
}
[Fact]
public void 충전_중일_때는_배터리_15퍼센트여도_풀파워_유지()
{
var manager = new BatterySaverPowerManager();
manager.UpdateBatteryState(percent: 15, isCharging: true);
Assert.False(manager.IsLowPowerModeActive);
Assert.False(manager.ShouldDeferBackgroundProcessing);
Assert.Equal(8, manager.CalculateOptimalConcurrency(baseConcurrency: 8));
Assert.True(manager.CanExecuteCpuIntensiveTask());
}
[Fact]
public void 배터리_20퍼센트_이하_방전_중_동시성_감축_및_백그라운드_유예()
{
var manager = new BatterySaverPowerManager(lowBatteryThresholdPercent: 20);
manager.UpdateBatteryState(percent: 18, isCharging: false);
Assert.True(manager.IsLowPowerModeActive);
Assert.True(manager.ShouldDeferBackgroundProcessing);
// 8개의 병렬 다운로드 -> 2개로 자동 감축 (전력 및 RF 소모 75% 절감)
Assert.Equal(2, manager.CalculateOptimalConcurrency(baseConcurrency: 8));
Assert.False(manager.CanExecuteCpuIntensiveTask());
}
[Fact]
public void 배터리_10퍼센트_이하_크리티컬_단일_스트림_최소_전력_모드()
{
var manager = new BatterySaverPowerManager();
manager.UpdateBatteryState(percent: 8, isCharging: false);
Assert.True(manager.IsLowPowerModeActive);
// 크리티컬 상황에서는 최소 1개 스트림으로 다운로드 중단 방지
Assert.Equal(1, manager.CalculateOptimalConcurrency(baseConcurrency: 8));
Assert.True(manager.ShouldDeferBackgroundProcessing);
}
[Fact]
public void OS_절전_모드_활성화시_배터리_잔량_무관_절전_진입()
{
var manager = new BatterySaverPowerManager();
manager.UpdateBatteryState(percent: 60, isCharging: false, isOsPowerSaverEnabled: true);
Assert.True(manager.IsLowPowerModeActive);
Assert.True(manager.ShouldDeferBackgroundProcessing);
Assert.Equal(2, manager.CalculateOptimalConcurrency(baseConcurrency: 8));
}
[Fact]
public void 충전기_연결시_즉시_풀파워_복구_및_이벤트_발행()
{
var manager = new BatterySaverPowerManager();
manager.UpdateBatteryState(percent: 12, isCharging: false);
Assert.True(manager.IsLowPowerModeActive);
bool eventFired = false;
PowerStateChangedEventArgs? capturedArgs = null;
manager.PowerStateChanged += (s, e) =>
{
eventFired = true;
capturedArgs = e;
};
// 충전기 연결
manager.UpdateBatteryState(percent: 12, isCharging: true);
Assert.True(eventFired);
Assert.NotNull(capturedArgs);
Assert.False(capturedArgs!.IsLowPowerModeActive);
Assert.False(manager.IsLowPowerModeActive);
Assert.Equal(8, manager.CalculateOptimalConcurrency(baseConcurrency: 8));
}
[Fact]
public void 절전_모드_대역폭_권장_제한치_계산_검증()
{
var manager = new BatterySaverPowerManager();
// 정상 상태에서는 설정된 대역폭 유지
manager.UpdateBatteryState(percent: 90, isCharging: false);
Assert.Equal(10000, manager.CalculateBandwidthLimitKbps(baseLimitKbps: 10000));
Assert.Null(manager.CalculateBandwidthLimitKbps(baseLimitKbps: null));
// 절전 모드에서는 대역폭 상한 제안 (무제한일 경우 2000 Kbps로 쓰로틀링)
manager.UpdateBatteryState(percent: 15, isCharging: false);
Assert.Equal(2000, manager.CalculateBandwidthLimitKbps(baseLimitKbps: null));
// 기존 제한이 더 크면 2000으로 강제
Assert.Equal(2000, manager.CalculateBandwidthLimitKbps(baseLimitKbps: 8000));
// 기존 제한이 이미 2000보다 작으면 기존 것 존중
Assert.Equal(1000, manager.CalculateBandwidthLimitKbps(baseLimitKbps: 1000));
}
[Fact]
public void HlsDownloader_배터리_절전모드_연동_동시성_감축_검증()
{
var powerManager = new BatterySaverPowerManager();
var config = new Paca.Core.Config.AppConfig { Concurrency = 8 };
var http = new System.Net.Http.HttpClient();
var downloader = new Paca.Core.Hls.HlsDownloader(http, config, Paca.Core.Platform.DesktopMediaMuxer.Default, powerManager);
// 정상 상태: 8
powerManager.UpdateBatteryState(percent: 90, isCharging: false);
Assert.Equal(8, downloader.GetEffectiveConcurrency());
// 배터리 15% 방전 중: 2로 감축
powerManager.UpdateBatteryState(percent: 15, isCharging: false);
Assert.Equal(2, downloader.GetEffectiveConcurrency());
// 충전기 연결: 8로 즉시 복귀
powerManager.UpdateBatteryState(percent: 15, isCharging: true);
Assert.Equal(8, downloader.GetEffectiveConcurrency());
}
[Fact]
public void VideoPosterExtractor_배터리_절전모드시_썸네일_추출_유예_판정_검증()
{
var powerManager = new BatterySaverPowerManager();
powerManager.UpdateBatteryState(percent: 15, isCharging: false);
Assert.True(VideoPosterExtractor.ShouldDeferExtraction(powerManager));
powerManager.UpdateBatteryState(percent: 15, isCharging: true);
Assert.False(VideoPosterExtractor.ShouldDeferExtraction(powerManager));
Assert.False(VideoPosterExtractor.ShouldDeferExtraction(null));
}
}