75 lines
2.8 KiB
C#
75 lines
2.8 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using Paca.Mobile.Core;
|
|
using Paca.Tests.Infrastructure;
|
|
using Xunit;
|
|
|
|
namespace Paca.Tests.Core;
|
|
|
|
/// <summary>
|
|
/// Gate 203 ~ 206: 스마트 대기열 우선순위 큐 및 동적 동시성 할당 엔진 기계적 검증
|
|
/// </summary>
|
|
public class SmartPriorityQueueGateTests
|
|
{
|
|
[Fact]
|
|
public void Gate203_SmartPriorityQueue_Orders_By_Priority_Then_Time()
|
|
{
|
|
var queue = new SmartPriorityQueueManager();
|
|
|
|
queue.Enqueue("job-1", "Normal Job 1", DownloadPriorityLevel.Normal, DateTimeOffset.UtcNow.AddMinutes(-5));
|
|
queue.Enqueue("job-2", "Low Job", DownloadPriorityLevel.Low, DateTimeOffset.UtcNow.AddMinutes(-4));
|
|
queue.Enqueue("job-3", "Urgent Job", DownloadPriorityLevel.Urgent, DateTimeOffset.UtcNow); // 가장 나중에 추가됨
|
|
|
|
var list = queue.GetScheduledJobs();
|
|
|
|
Assert.Equal("job-3", list[0].Id); // Urgent가 최상단
|
|
Assert.Equal("job-1", list[1].Id); // Normal
|
|
Assert.Equal("job-2", list[2].Id); // Low
|
|
}
|
|
|
|
[Fact]
|
|
public void Gate204_SmartPriorityQueue_BumpToTop()
|
|
{
|
|
var queue = new SmartPriorityQueueManager();
|
|
|
|
queue.Enqueue("job-1", "Job 1", DownloadPriorityLevel.Normal);
|
|
queue.Enqueue("job-2", "Job 2", DownloadPriorityLevel.Normal);
|
|
queue.Enqueue("job-3", "Job 3", DownloadPriorityLevel.Normal);
|
|
|
|
// job-3을 맨 위로 올리기(Bump)
|
|
var bumped = queue.BumpToTop("job-3");
|
|
Assert.True(bumped);
|
|
|
|
var list = queue.GetScheduledJobs();
|
|
Assert.Equal("job-3", list[0].Id);
|
|
Assert.Equal(DownloadPriorityLevel.Urgent, list[0].Priority);
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData(NetworkProfileType.WiFi, 4)]
|
|
[InlineData(NetworkProfileType.Cellular5G, 3)]
|
|
[InlineData(NetworkProfileType.CellularLTE, 2)]
|
|
[InlineData(NetworkProfileType.Cellular3G, 1)]
|
|
public void Gate205_DynamicConcurrencyAllocator_Adjusts_By_Network(NetworkProfileType network, int expectedConcurrency)
|
|
{
|
|
var concurrency = DynamicConcurrencyAllocator.DetermineMaxConcurrentDownloads(network, isBatterySavingMode: false);
|
|
Assert.Equal(expectedConcurrency, concurrency);
|
|
|
|
// 배터리 절약 모드 켜지면 무조건 1개로 제한
|
|
var batterySavingConcurrency = DynamicConcurrencyAllocator.DetermineMaxConcurrentDownloads(network, isBatterySavingMode: true);
|
|
Assert.Equal(1, batterySavingConcurrency);
|
|
}
|
|
|
|
[Fact]
|
|
public void Gate206_ServerHost_QueuePriority_Endpoint_Audit()
|
|
{
|
|
var serverHostPath = Path.Combine(SourceTree.Root, "src", "Paca.Server", "ServerHost.cs");
|
|
Assert.True(File.Exists(serverHostPath), "ServerHost.cs must exist");
|
|
|
|
var code = File.ReadAllText(serverHostPath);
|
|
|
|
Assert.Contains("/api/queue/{id}/priority", code);
|
|
}
|
|
}
|