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);
}
}
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);
}
}