Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Add test timeout and -AsJob test
  • Loading branch information
jborean93 committed Aug 1, 2025
commit 5e87464d35d234c284f5ae24ddcd175a138f919b
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.PowerShell.EditorServices.Handlers;
using Nerdbank.Streams;
Expand Down Expand Up @@ -54,11 +55,15 @@ public class DebugAdapterProtocolMessageTests(ITestOutputHelper output) : IAsync
/// </summary>
private Task<StoppedEvent> nextStopped => nextStoppedTcs.Task;

private readonly TaskCompletionSource<StartDebuggingAttachRequestArguments> startDebuggingAttachRequestTcs = new();
/// <summary>
/// This task is useful for waiting until a StartDebuggingAttachRequest is received.
/// </summary>
private Task<StartDebuggingAttachRequestArguments> startDebuggingAttachRequest => startDebuggingAttachRequestTcs.Task;
private readonly TaskCompletionSource<StartDebuggingAttachRequestArguments> startDebuggingAttachRequestTcs = new();

/// <summary>
/// This task is useful for waiting until the debug session has terminated.
/// </summary>
private readonly TaskCompletionSource<TerminatedEvent> terminatedTcs = new();

public async Task InitializeAsync()
{
Expand Down Expand Up @@ -112,6 +117,11 @@ send until a launch is sent.
startDebuggingAttachRequestTcs.SetResult(request);
return Task.CompletedTask;
})
.OnTerminated((TerminatedEvent e) =>
{
terminatedTcs.SetResult(e);
return Task.CompletedTask;
})
;
});

Expand Down Expand Up @@ -545,16 +555,62 @@ public async Task CanLaunchScriptWithNewChildAttachSession(

string script = NewTestFile($"Start-DebugAttachSession {paramString}");

using CancellationTokenSource timeoutCts = new(30000);
using CancellationTokenRegistration _ = timeoutCts.Token.Register(() =>
{
startDebuggingAttachRequestTcs.TrySetCanceled();
});
using CancellationTokenRegistration _2 = timeoutCts.Token.Register(() =>
{
terminatedTcs.TrySetCanceled();
});

await client.LaunchScript(script);
await client.RequestConfigurationDone(new ConfigurationDoneArguments());

StartDebuggingAttachRequestArguments attachRequest = await startDebuggingAttachRequest;
StartDebuggingAttachRequestArguments attachRequest = await startDebuggingAttachRequestTcs.Task;
Assert.Equal("attach", attachRequest.Request);
Assert.Equal(expectedComputerName, attachRequest.Configuration.ComputerName);
Assert.Equal(expectedPipeName, attachRequest.Configuration.CustomPipeName);
Assert.Equal(expectedProcessId, attachRequest.Configuration.ProcessId);
Assert.Equal(expectedRunspaceId, attachRequest.Configuration.RunspaceId);
Assert.Equal(expectedRunspaceName, attachRequest.Configuration.RunspaceName);

await terminatedTcs.Task;
}

[SkippableFact]
public async Task CanLaunchScriptWithNewChildAttachSessionAsJob()
{
Skip.If(PsesStdioLanguageServerProcessHost.RunningInConstrainedLanguageMode,
"PowerShellEditorServices.Command is not signed to run FLM in Constrained Language Mode.");
Skip.If(PsesStdioLanguageServerProcessHost.IsWindowsPowerShell,
"WinPS does not have ThreadJob, needed by -AsJob, present by default.");

string script = NewTestFile("Start-DebugAttachSession -AsJob | Receive-Job -Wait -AutoRemoveJob");

using CancellationTokenSource timeoutCts = new(30000);
using CancellationTokenRegistration _1 = timeoutCts.Token.Register(() =>
{
startDebuggingAttachRequestTcs.TrySetCanceled();
});
using CancellationTokenRegistration _2 = timeoutCts.Token.Register(() =>
{
terminatedTcs.TrySetCanceled();
});

await client.LaunchScript(script);
await client.RequestConfigurationDone(new ConfigurationDoneArguments());

StartDebuggingAttachRequestArguments attachRequest = await startDebuggingAttachRequestTcs.Task;
Assert.Equal("attach", attachRequest.Request);
Assert.Null(attachRequest.Configuration.ComputerName);
Assert.Null(attachRequest.Configuration.CustomPipeName);
Assert.Equal(0, attachRequest.Configuration.ProcessId);
Assert.Equal(0, attachRequest.Configuration.RunspaceId);
Assert.Null(attachRequest.Configuration.RunspaceName);

await terminatedTcs.Task;
}

private record StartDebuggingAttachRequestArguments(PsesAttachRequestArguments Configuration, string Request);
Expand Down
Loading