using System.Diagnostics; using XFEEDToolBox.Core.Models; using XFEEDToolBox.Core.Session; using XFEEDToolBox.Services; using XFEExtension.NetCore.XUnit.Attributes; namespace XFEEDToolBox.Test; [TestFixture] public sealed class WindowsGameSessionLifetimeTests { private static readonly GameSessionTarget Missing=new(int.MaxValue,1,"missing-game.exe","launcher",false); [Test]public async Task APidWhichDisappearsAfterTerminationIsAlreadyExited() { var driver=new WindowsGameSessionDriver(()=>new()); Check.That(await driver.HasExitedAsync(Missing,default)); Check.That(await driver.HasExitedAsync(Missing with{ProcessId=0,StartedUtcTicks=0},default)); var typed=false;try{await driver.ValidateExitAsync(Missing,default);}catch(StartupClientExitedException){typed=true;} Check.That(typed); } [Test]public async Task AReusedPidIsTheEndOfTheOldInstanceAndCannotBeTerminated() { using var current=Process.GetCurrentProcess();var driver=new WindowsGameSessionDriver(()=>new()); var target=new GameSessionTarget(current.Id,current.StartTime.ToUniversalTime().Ticks,current.MainModule!.FileName,"launcher",false); Check.That(!await driver.HasExitedAsync(target,default)); var previous=target with{StartedUtcTicks=target.StartedUtcTicks-1}; Check.That(await driver.HasExitedAsync(previous,default)); var typed=false;try{await driver.TerminateAsync(previous,default);}catch(StartupClientExitedException){typed=true;} Check.That(typed&&!current.HasExited); } [Test]public async Task CancellationStillWinsEvenWhenTheRequestedProcessIsGone() { using var stop=new CancellationTokenSource();stop.Cancel();var driver=new WindowsGameSessionDriver(()=>new());var cancelled=false; try{await driver.HasExitedAsync(Missing,stop.Token);}catch(OperationCanceledException){cancelled=true;} Check.That(cancelled); } }