Skip to content

Commit f6e4255

Browse files
Pass CancellationToken to RazorFileChangeDetectorManager.InitializedAsync(...)
1 parent 46968ad commit f6e4255

File tree

3 files changed

+50
-51
lines changed

3 files changed

+50
-51
lines changed

src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/RazorFileChangeDetectorManager.cs

Lines changed: 8 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3,47 +3,30 @@
33

44
using System;
55
using System.Collections.Generic;
6+
using System.Collections.Immutable;
67
using System.Linq;
78
using System.Threading;
89
using System.Threading.Tasks;
910

1011
namespace Microsoft.AspNetCore.Razor.LanguageServer;
1112

12-
internal class RazorFileChangeDetectorManager : IDisposable
13+
internal class RazorFileChangeDetectorManager(
14+
WorkspaceDirectoryPathResolver workspaceDirectoryPathResolver,
15+
IEnumerable<IFileChangeDetector> fileChangeDetectors) : IDisposable
1316
{
14-
private readonly WorkspaceDirectoryPathResolver _workspaceDirectoryPathResolver;
15-
private readonly IReadOnlyList<IFileChangeDetector> _fileChangeDetectors;
16-
private readonly object _disposeLock = new object();
17+
private readonly WorkspaceDirectoryPathResolver _workspaceDirectoryPathResolver = workspaceDirectoryPathResolver;
18+
private readonly ImmutableArray<IFileChangeDetector> _fileChangeDetectors = fileChangeDetectors.ToImmutableArray();
19+
private readonly object _disposeLock = new();
1720
private bool _disposed;
1821

19-
public RazorFileChangeDetectorManager(
20-
WorkspaceDirectoryPathResolver workspaceDirectoryPathResolver,
21-
IEnumerable<IFileChangeDetector> fileChangeDetectors)
22-
{
23-
if (workspaceDirectoryPathResolver is null)
24-
{
25-
throw new ArgumentNullException(nameof(workspaceDirectoryPathResolver));
26-
}
27-
28-
if (fileChangeDetectors is null)
29-
{
30-
throw new ArgumentNullException(nameof(fileChangeDetectors));
31-
}
32-
33-
_workspaceDirectoryPathResolver = workspaceDirectoryPathResolver;
34-
_fileChangeDetectors = fileChangeDetectors.ToArray();
35-
}
36-
37-
public async Task InitializedAsync()
22+
public async Task InitializedAsync(CancellationToken cancellationToken)
3823
{
3924
// Initialized request, this occurs once the server and client have agreed on what sort of features they both support. It only happens once.
4025

4126
var workspaceDirectoryPath = _workspaceDirectoryPathResolver.Resolve();
4227

4328
foreach (var fileChangeDetector in _fileChangeDetectors)
4429
{
45-
// We create a dummy cancellation token for now. Have an issue to pass through the cancellation token in the O# lib: https://github.com/OmniSharp/csharp-language-server-protocol/issues/200
46-
var cancellationToken = CancellationToken.None;
4730
await fileChangeDetector.StartAsync(workspaceDirectoryPath, cancellationToken).ConfigureAwait(false);
4831
}
4932

src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/RazorInitializedEndpoint.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public async Task HandleNotificationAsync(InitializedParams request, RazorReques
2121
var capabilitiesService = requestContext.GetRequiredService<IClientCapabilitiesService>();
2222

2323
var fileChangeDetectorManager = requestContext.LspServices.GetRequiredService<RazorFileChangeDetectorManager>();
24-
await fileChangeDetectorManager.InitializedAsync().ConfigureAwait(false);
24+
await fileChangeDetectorManager.InitializedAsync(cancellationToken).ConfigureAwait(false);
2525

2626
foreach (var onStartedItem in onStartedItems)
2727
{
Lines changed: 41 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
// Copyright (c) .NET Foundation. All rights reserved.
22
// Licensed under the MIT license. See License.txt in the project root for license information.
33

4-
#nullable disable
5-
64
using System;
75
using System.Threading;
86
using System.Threading.Tasks;
7+
using Microsoft.AspNetCore.Razor.Test.Common;
98
using Microsoft.CommonLanguageServerProtocol.Framework;
109
using Microsoft.VisualStudio.LanguageServer.Protocol;
1110
using Moq;
1211
using Xunit;
12+
using Xunit.Abstractions;
1313

1414
namespace Microsoft.AspNetCore.Razor.LanguageServer;
1515

16-
public class RazorFileChangeDetectorManagerTest
16+
public class RazorFileChangeDetectorManagerTest(ITestOutputHelper testOutput) : ToolingTestBase(testOutput)
1717
{
1818
[Fact]
1919
public async Task InitializedAsync_StartsFileChangeDetectors()
@@ -32,30 +32,41 @@ public async Task InitializedAsync_StartsFileChangeDetectors()
3232
{
3333
RootUri = uriBuilder.Uri,
3434
};
35-
var languageServer = new Mock<IInitializeManager<InitializeParams, InitializeResult>>(MockBehavior.Strict);
36-
languageServer.Setup(s => s.GetInitializeParams())
35+
36+
var languageServerMock = new StrictMock<IInitializeManager<InitializeParams, InitializeResult>>();
37+
languageServerMock
38+
.Setup(s => s.GetInitializeParams())
3739
.Returns(clientSettings);
38-
var detector1 = new Mock<IFileChangeDetector>(MockBehavior.Strict);
40+
3941
var expectedWorkspaceDirectory = $"\\\\{initialWorkspaceDirectory}";
40-
detector1
42+
43+
var detectorMock1 = new StrictMock<IFileChangeDetector>();
44+
detectorMock1
4145
.Setup(detector => detector.StartAsync(expectedWorkspaceDirectory, It.IsAny<CancellationToken>()))
4246
.Returns(Task.CompletedTask)
4347
.Verifiable();
44-
var detector2 = new Mock<IFileChangeDetector>(MockBehavior.Strict);
45-
detector2
48+
49+
detectorMock1.Setup(x => x.Stop());
50+
51+
var detectorMock2 = new StrictMock<IFileChangeDetector>();
52+
detectorMock2
4653
.Setup(detector => detector.StartAsync(expectedWorkspaceDirectory, It.IsAny<CancellationToken>()))
4754
.Returns(Task.CompletedTask)
4855
.Verifiable();
49-
var workspaceDirectoryPathResolver = new DefaultWorkspaceDirectoryPathResolver(languageServer.Object);
50-
var detectorManager = new RazorFileChangeDetectorManager(workspaceDirectoryPathResolver, new[] { detector1.Object, detector2.Object });
5156

52-
// Act
53-
await detectorManager.InitializedAsync();
57+
detectorMock2.Setup(x => x.Stop());
58+
59+
var workspaceDirectoryPathResolver = new DefaultWorkspaceDirectoryPathResolver(languageServerMock.Object);
60+
using (var detectorManager = new RazorFileChangeDetectorManager(workspaceDirectoryPathResolver, [detectorMock1.Object, detectorMock2.Object]))
61+
{
62+
// Act
63+
await detectorManager.InitializedAsync(DisposalToken);
64+
}
5465

5566
// Assert
56-
detector1.VerifyAll();
57-
detector2.VerifyAll();
58-
languageServer.VerifyAll();
67+
detectorMock1.VerifyAll();
68+
detectorMock2.VerifyAll();
69+
languageServerMock.VerifyAll();
5970
}
6071

6172
[Fact]
@@ -67,22 +78,27 @@ public async Task InitializedAsync_Disposed_ReStopsFileChangeDetectors()
6778
{
6879
RootUri = new Uri(expectedWorkspaceDirectory),
6980
};
70-
var languageServer = new Mock<IInitializeManager<InitializeParams, InitializeResult>>(MockBehavior.Strict);
71-
languageServer
81+
82+
var languageServerMock = new StrictMock<IInitializeManager<InitializeParams, InitializeResult>>();
83+
languageServerMock
7284
.Setup(s => s.GetInitializeParams())
7385
.Returns(clientSettings);
7486

75-
var detector = new Mock<IFileChangeDetector>(MockBehavior.Strict);
87+
var detectorMock = new StrictMock<IFileChangeDetector>();
7688
var cts = new TaskCompletionSource<bool>();
77-
detector.Setup(d => d.StartAsync(It.IsAny<string>(), It.IsAny<CancellationToken>()))
89+
detectorMock
90+
.Setup(d => d.StartAsync(It.IsAny<string>(), It.IsAny<CancellationToken>()))
7891
.Returns(cts.Task);
7992
var stopCount = 0;
80-
detector.Setup(d => d.Stop()).Callback(() => stopCount++);
81-
var workspaceDirectoryPathResolver = new DefaultWorkspaceDirectoryPathResolver(languageServer.Object);
82-
var detectorManager = new RazorFileChangeDetectorManager(workspaceDirectoryPathResolver, new[] { detector.Object });
93+
detectorMock
94+
.Setup(d => d.Stop())
95+
.Callback(() => stopCount++);
96+
97+
var workspaceDirectoryPathResolver = new DefaultWorkspaceDirectoryPathResolver(languageServerMock.Object);
98+
using var detectorManager = new RazorFileChangeDetectorManager(workspaceDirectoryPathResolver, [detectorMock.Object]);
8399

84100
// Act
85-
var initializeTask = detectorManager.InitializedAsync();
101+
var initializeTask = detectorManager.InitializedAsync(DisposalToken);
86102
detectorManager.Dispose();
87103

88104
// Unblock the detector start
@@ -92,6 +108,6 @@ public async Task InitializedAsync_Disposed_ReStopsFileChangeDetectors()
92108
// Assert
93109
Assert.Equal(2, stopCount);
94110

95-
languageServer.VerifyAll();
111+
languageServerMock.VerifyAll();
96112
}
97113
}

0 commit comments

Comments
 (0)