|
6 | 6 | using System.Linq;
|
7 | 7 | using System.Runtime.InteropServices;
|
8 | 8 | using System.Text;
|
| 9 | +using System.Threading; |
9 | 10 | using System.Threading.Tasks;
|
10 | 11 | using Microsoft.PowerShell.EditorServices.Handlers;
|
11 | 12 | using Nerdbank.Streams;
|
@@ -54,11 +55,15 @@ public class DebugAdapterProtocolMessageTests(ITestOutputHelper output) : IAsync
|
54 | 55 | /// </summary>
|
55 | 56 | private Task<StoppedEvent> nextStopped => nextStoppedTcs.Task;
|
56 | 57 |
|
57 |
| - private readonly TaskCompletionSource<StartDebuggingAttachRequestArguments> startDebuggingAttachRequestTcs = new(); |
58 | 58 | /// <summary>
|
59 | 59 | /// This task is useful for waiting until a StartDebuggingAttachRequest is received.
|
60 | 60 | /// </summary>
|
61 |
| - private Task<StartDebuggingAttachRequestArguments> startDebuggingAttachRequest => startDebuggingAttachRequestTcs.Task; |
| 61 | + private readonly TaskCompletionSource<StartDebuggingAttachRequestArguments> startDebuggingAttachRequestTcs = new(); |
| 62 | + |
| 63 | + /// <summary> |
| 64 | + /// This task is useful for waiting until the debug session has terminated. |
| 65 | + /// </summary> |
| 66 | + private readonly TaskCompletionSource<TerminatedEvent> terminatedTcs = new(); |
62 | 67 |
|
63 | 68 | public async Task InitializeAsync()
|
64 | 69 | {
|
@@ -112,6 +117,11 @@ send until a launch is sent.
|
112 | 117 | startDebuggingAttachRequestTcs.SetResult(request);
|
113 | 118 | return Task.CompletedTask;
|
114 | 119 | })
|
| 120 | + .OnTerminated((TerminatedEvent e) => |
| 121 | + { |
| 122 | + terminatedTcs.SetResult(e); |
| 123 | + return Task.CompletedTask; |
| 124 | + }) |
115 | 125 | ;
|
116 | 126 | });
|
117 | 127 |
|
@@ -545,16 +555,62 @@ public async Task CanLaunchScriptWithNewChildAttachSession(
|
545 | 555 |
|
546 | 556 | string script = NewTestFile($"Start-DebugAttachSession {paramString}");
|
547 | 557 |
|
| 558 | + using CancellationTokenSource timeoutCts = new(30000); |
| 559 | + using CancellationTokenRegistration _ = timeoutCts.Token.Register(() => |
| 560 | + { |
| 561 | + startDebuggingAttachRequestTcs.TrySetCanceled(); |
| 562 | + }); |
| 563 | + using CancellationTokenRegistration _2 = timeoutCts.Token.Register(() => |
| 564 | + { |
| 565 | + terminatedTcs.TrySetCanceled(); |
| 566 | + }); |
| 567 | + |
548 | 568 | await client.LaunchScript(script);
|
549 | 569 | await client.RequestConfigurationDone(new ConfigurationDoneArguments());
|
550 | 570 |
|
551 |
| - StartDebuggingAttachRequestArguments attachRequest = await startDebuggingAttachRequest; |
| 571 | + StartDebuggingAttachRequestArguments attachRequest = await startDebuggingAttachRequestTcs.Task; |
552 | 572 | Assert.Equal("attach", attachRequest.Request);
|
553 | 573 | Assert.Equal(expectedComputerName, attachRequest.Configuration.ComputerName);
|
554 | 574 | Assert.Equal(expectedPipeName, attachRequest.Configuration.CustomPipeName);
|
555 | 575 | Assert.Equal(expectedProcessId, attachRequest.Configuration.ProcessId);
|
556 | 576 | Assert.Equal(expectedRunspaceId, attachRequest.Configuration.RunspaceId);
|
557 | 577 | Assert.Equal(expectedRunspaceName, attachRequest.Configuration.RunspaceName);
|
| 578 | + |
| 579 | + await terminatedTcs.Task; |
| 580 | + } |
| 581 | + |
| 582 | + [SkippableFact] |
| 583 | + public async Task CanLaunchScriptWithNewChildAttachSessionAsJob() |
| 584 | + { |
| 585 | + Skip.If(PsesStdioLanguageServerProcessHost.RunningInConstrainedLanguageMode, |
| 586 | + "PowerShellEditorServices.Command is not signed to run FLM in Constrained Language Mode."); |
| 587 | + Skip.If(PsesStdioLanguageServerProcessHost.IsWindowsPowerShell, |
| 588 | + "WinPS does not have ThreadJob, needed by -AsJob, present by default."); |
| 589 | + |
| 590 | + string script = NewTestFile("Start-DebugAttachSession -AsJob | Receive-Job -Wait -AutoRemoveJob"); |
| 591 | + |
| 592 | + using CancellationTokenSource timeoutCts = new(30000); |
| 593 | + using CancellationTokenRegistration _1 = timeoutCts.Token.Register(() => |
| 594 | + { |
| 595 | + startDebuggingAttachRequestTcs.TrySetCanceled(); |
| 596 | + }); |
| 597 | + using CancellationTokenRegistration _2 = timeoutCts.Token.Register(() => |
| 598 | + { |
| 599 | + terminatedTcs.TrySetCanceled(); |
| 600 | + }); |
| 601 | + |
| 602 | + await client.LaunchScript(script); |
| 603 | + await client.RequestConfigurationDone(new ConfigurationDoneArguments()); |
| 604 | + |
| 605 | + StartDebuggingAttachRequestArguments attachRequest = await startDebuggingAttachRequestTcs.Task; |
| 606 | + Assert.Equal("attach", attachRequest.Request); |
| 607 | + Assert.Null(attachRequest.Configuration.ComputerName); |
| 608 | + Assert.Null(attachRequest.Configuration.CustomPipeName); |
| 609 | + Assert.Equal(0, attachRequest.Configuration.ProcessId); |
| 610 | + Assert.Equal(0, attachRequest.Configuration.RunspaceId); |
| 611 | + Assert.Null(attachRequest.Configuration.RunspaceName); |
| 612 | + |
| 613 | + await terminatedTcs.Task; |
558 | 614 | }
|
559 | 615 |
|
560 | 616 | private record StartDebuggingAttachRequestArguments(PsesAttachRequestArguments Configuration, string Request);
|
|
0 commit comments