|
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