Skip to content

Commit c630200

Browse files
authored
fix: test target handling (#11)
* test: unfinished run test target tests * test: try fix tests * fix: tests * fix(windows-runners): increase test cancellation time
1 parent 734275b commit c630200

10 files changed

+336
-202
lines changed

src/bsp-server/BuildHelper.cs

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
using BaseProtocol;
2+
using bsp4csharp.Protocol;
3+
using dotnet_bsp.Logging;
4+
using Microsoft.Build.Construction;
5+
using Microsoft.Build.Evaluation;
6+
using Microsoft.Build.Graph;
7+
8+
namespace dotnet_bsp;
9+
10+
internal static class BuildHelper
11+
{
12+
internal static IEnumerable<BuildTargetIdentifier> FilterProjectsOutIfPartOfAnSolutionTarget(BuildTargetIdentifier[] targets)
13+
{
14+
var filteredTargets = targets.ToList();
15+
var slnList = targets
16+
.Where(x => Path.GetExtension(x.ToString()) == ".sln");
17+
var projList = targets
18+
.Where(x => Path.GetExtension(x.ToString()) == ".csproj")
19+
.Select(x => x.Uri.AbsolutePath)
20+
.ToList();
21+
foreach (var target in slnList)
22+
{
23+
var slnFile = SolutionFile.Parse(target.ToString());
24+
if (slnFile is not null)
25+
{
26+
var projectFilesInSln = slnFile.ProjectsInOrder
27+
.Select(x => x.AbsolutePath);
28+
29+
var includedProj = projectFilesInSln
30+
.Intersect(projList);
31+
32+
filteredTargets
33+
.RemoveAll(x => includedProj.Contains(x.Uri.AbsolutePath));
34+
}
35+
}
36+
37+
return filteredTargets;
38+
}
39+
40+
internal static bool RestoreTestTargets(
41+
IEnumerable<string> targetFiles,
42+
ProjectCollection projects,
43+
IBpLogger logger,
44+
MSBuildLogger msBuildLogger)
45+
{
46+
bool restoreResult = true;
47+
var graph = new ProjectGraph(targetFiles, projects);
48+
var testProjects = graph.ProjectNodesTopologicallySorted
49+
.Where(x => x.ProjectInstance.IsTestProject());
50+
foreach (var proj in testProjects)
51+
{
52+
var globalProps = proj.ProjectInstance.GlobalProperties
53+
.Select(x => string.Format("{0}={1}", x.Key, x.Value))
54+
.ToArray();
55+
logger.LogInformation("Global Properties: {}", string.Join("\n", globalProps));
56+
logger.LogInformation("Start restore target: {}", proj.ProjectInstance.FullPath);
57+
var result = proj.ProjectInstance.Build(["Restore"], [msBuildLogger]);
58+
logger.LogInformation($"{proj.ProjectInstance.FullPath} restore result: {result}");
59+
restoreResult &= result;
60+
}
61+
62+
return restoreResult;
63+
}
64+
65+
internal static bool BuildTestTargets(
66+
IEnumerable<string> targetFiles,
67+
ProjectCollection projects,
68+
IBpLogger logger,
69+
MSBuildLogger msBuildLogger)
70+
{
71+
bool buildResult = true;
72+
var graph = new ProjectGraph(targetFiles, projects);
73+
var testProjects = graph.ProjectNodesTopologicallySorted
74+
.Where(x => x.ProjectInstance.IsTestProject());
75+
foreach (var projNode in testProjects)
76+
{
77+
logger.LogInformation("Start building target: {}", projNode.ProjectInstance.FullPath);
78+
var result = projNode.ProjectInstance.Build(["Build"], [msBuildLogger]);
79+
logger.LogInformation($"{projNode.ProjectInstance.FullPath} build result: {result}");
80+
buildResult &= result;
81+
}
82+
83+
return buildResult;
84+
}
85+
}

src/bsp-server/EventHandlers/TestRunEventHandler.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -200,11 +200,11 @@ private void WriteTestRunProgress(TestRunChangedEventArgs? testRunChangedArgs)
200200
DisplayName = testResult.TestCase.FullyQualifiedName,
201201
Location = location,
202202
},
203-
Message = $"Run Test: {testResult.TestCase.FullyQualifiedName}",
203+
Message = $"Test started: {testResult.TestCase.FullyQualifiedName}",
204204
EventTime = testResult.StartTime.ToUnixTimeMilliseconds(),
205205
};
206206
_ = _baseProtocolClientManager.SendNotificationAsync(
207-
Methods.BuildTaskFinish, taskTestStart, CancellationToken.None);
207+
Methods.BuildTaskStart, taskTestStart, CancellationToken.None);
208208
var taskTestFinish = new TaskFinishParams
209209
{
210210
TaskId = testTaskId,
@@ -220,7 +220,7 @@ private void WriteTestRunProgress(TestRunChangedEventArgs? testRunChangedArgs)
220220
Status = ConvertTestOutcome(testResult.Outcome),
221221
Location = location
222222
},
223-
Message = $"Test run finished: {testResult.TestCase.FullyQualifiedName}",
223+
Message = $"Test finished: {testResult.TestCase.FullyQualifiedName}",
224224
EventTime = testResult.EndTime.ToUnixTimeMilliseconds(),
225225
};
226226
_ = _baseProtocolClientManager.SendNotificationAsync(

src/bsp-server/Handlers/BuildTargetCleanCacheHandler.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public Task<CleanCacheResult> HandleRequestAsync(CleanCacheParams cleanCachePara
5555
context.Logger.LogInformation("GetLoadedProjects from {}", workspacePath);
5656
foreach (var proj in projects.LoadedProjects)
5757
{
58-
var msBuildLogger = new MSBuildLogger(_baseProtocolClientManager, null, workspacePath, proj.FullPath);
58+
var msBuildLogger = new MSBuildLogger(_baseProtocolClientManager, null, workspacePath);
5959
context.Logger.LogInformation("Start clean for target: {}", proj.FullPath);
6060
cleanResult |= proj.Build("Clean", new [] { msBuildLogger });
6161
}

src/bsp-server/Handlers/BuildTargetCompileHandler.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public Task<CompileResult> HandleRequestAsync(CompileParams compileParams, Reque
3939
.ToArray();
4040
context.Logger.LogInformation("Global Properties: {}", string.Join("\n", globalProps));
4141
context.Logger.LogInformation("Start restore target: {}", proj.ProjectInstance.FullPath);
42-
var msBuildLogger = new MSBuildLogger(_baseProtocolClientManager, compileParams.OriginId, workspacePath, proj.ProjectInstance.FullPath);
42+
var msBuildLogger = new MSBuildLogger(_baseProtocolClientManager, compileParams.OriginId, workspacePath);
4343
var result = proj.ProjectInstance.Build(["Restore"], [msBuildLogger]);
4444
context.Logger.LogInformation($"{proj.ProjectInstance.FullPath} restore result: {result}");
4545
buildResult &= result;
@@ -48,7 +48,7 @@ public Task<CompileResult> HandleRequestAsync(CompileParams compileParams, Reque
4848
foreach (var proj in graph.ProjectNodesTopologicallySorted)
4949
{
5050
context.Logger.LogInformation("Start building target: {}", proj.ProjectInstance.FullPath);
51-
var msBuildLogger = new MSBuildLogger(_baseProtocolClientManager, compileParams.OriginId, workspacePath, proj.ProjectInstance.FullPath);
51+
var msBuildLogger = new MSBuildLogger(_baseProtocolClientManager, compileParams.OriginId, workspacePath);
5252
var result = proj.ProjectInstance.Build(["Build"], [msBuildLogger]);
5353
context.Logger.LogInformation($"{proj.ProjectInstance.FullPath} build result: {result}");
5454
buildResult &= result;

src/bsp-server/Handlers/BuildTargetRunHandler.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ private async Task RunTargetAsync(string target, string? originId, RequestContex
7979
var initParams = _initializeManager.GetInitializeParams();
8080
var workspacePath = initParams.RootUri.LocalPath;
8181

82-
var msBuildLogger = new MSBuildLogger(_baseProtocolClientManager, originId, workspacePath, projectFile);
82+
var msBuildLogger = new MSBuildLogger(_baseProtocolClientManager, originId, workspacePath);
8383
proj.Build(["Restore", "Build"], [msBuildLogger]);
8484

8585
var command = proj.GetPropertyValue("RunCommand");

src/bsp-server/Handlers/BuildTargetTestCaseDiscoveryHandler.cs

Lines changed: 15 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public Task<TestCaseDiscoveryResult> HandleRequestAsync(TestCaseDiscoveryParams
3636
var buildResult = true;
3737
var testCaseDiscoveryResult = true;
3838

39-
var targetFiles = FilterProjectsOutIfPartOfAnSolutionTarget(testCaseDiscoveryParams.Targets)
39+
var targetFiles = BuildHelper.FilterProjectsOutIfPartOfAnSolutionTarget(testCaseDiscoveryParams.Targets)
4040
.Select(x => x.ToString());
4141
var initParams = _initializeManager.GetInitializeParams();
4242
if (initParams.RootUri.IsFile)
@@ -45,41 +45,27 @@ public Task<TestCaseDiscoveryResult> HandleRequestAsync(TestCaseDiscoveryParams
4545
context.Logger.LogInformation("GetLoadedProjects from {}", workspacePath);
4646
_baseProtocolClientManager.SendClearDiagnosticsMessage();
4747

48-
var graph = new ProjectGraph(targetFiles, projects);
49-
var testProjects = graph.ProjectNodesTopologicallySorted
50-
.Where(x => x.ProjectInstance.IsTestProject());
51-
foreach (var proj in testProjects)
52-
{
53-
var globalProps = proj.ProjectInstance.GlobalProperties
54-
.Select(x => string.Format("{0}={1}", x.Key, x.Value))
55-
.ToArray();
56-
context.Logger.LogInformation("Global Properties: {}", string.Join("\n", globalProps));
57-
context.Logger.LogInformation("Start restore target: {}", proj.ProjectInstance.FullPath);
58-
var msBuildLogger = new MSBuildLogger(_baseProtocolClientManager, testCaseDiscoveryParams.OriginId, workspacePath, proj.ProjectInstance.FullPath);
59-
var result = proj.ProjectInstance.Build(["Restore"], [msBuildLogger]);
60-
context.Logger.LogInformation($"{proj.ProjectInstance.FullPath} restore result: {result}");
61-
buildResult &= result;
62-
}
48+
var msBuildLogger = new MSBuildLogger(_baseProtocolClientManager, testCaseDiscoveryParams.OriginId, workspacePath);
49+
buildResult &= BuildHelper.RestoreTestTargets(
50+
targetFiles,
51+
projects,
52+
context.Logger,
53+
msBuildLogger);
6354

6455
if (buildResult)
6556
{
66-
graph = new ProjectGraph(targetFiles, projects);
67-
testProjects = graph.ProjectNodesTopologicallySorted
68-
.Where(x => x.ProjectInstance.IsTestProject());
69-
foreach (var projNode in testProjects)
70-
{
71-
context.Logger.LogInformation("Start building target: {}", projNode.ProjectInstance.FullPath);
72-
var msBuildLogger = new MSBuildLogger(_baseProtocolClientManager, testCaseDiscoveryParams.OriginId, workspacePath, projNode.ProjectInstance.FullPath);
73-
var result = projNode.ProjectInstance.Build(["Build"], [msBuildLogger]);
74-
context.Logger.LogInformation($"{projNode.ProjectInstance.FullPath} build result: {result}");
75-
buildResult &= result;
76-
}
57+
msBuildLogger = new MSBuildLogger(_baseProtocolClientManager, testCaseDiscoveryParams.OriginId, workspacePath);
58+
buildResult &= BuildHelper.BuildTestTargets(
59+
targetFiles,
60+
projects,
61+
context.Logger,
62+
msBuildLogger);
7763
}
7864

7965
if (buildResult)
8066
{
81-
graph = new ProjectGraph(targetFiles, projects);
82-
testProjects = graph.ProjectNodesTopologicallySorted
67+
var graph = new ProjectGraph(targetFiles, projects);
68+
var testProjects = graph.ProjectNodesTopologicallySorted
8369
.Where(x => x.ProjectInstance.IsTestProject());
8470
foreach (var proj in testProjects)
8571
{
@@ -104,34 +90,6 @@ public Task<TestCaseDiscoveryResult> HandleRequestAsync(TestCaseDiscoveryParams
10490
});
10591
}
10692

107-
private IEnumerable<BuildTargetIdentifier> FilterProjectsOutIfPartOfAnSolutionTarget(BuildTargetIdentifier[] targets)
108-
{
109-
var filteredTargets = targets.ToList();
110-
var slnList = targets
111-
.Where(x => Path.GetExtension(x.ToString()) == ".sln");
112-
var projList = targets
113-
.Where(x => Path.GetExtension(x.ToString()) == ".csproj")
114-
.Select(x => x.Uri.AbsolutePath)
115-
.ToList();
116-
foreach (var target in slnList)
117-
{
118-
var slnFile = SolutionFile.Parse(target.ToString());
119-
if (slnFile is not null)
120-
{
121-
var projectFilesInSln = slnFile.ProjectsInOrder
122-
.Select(x => x.AbsolutePath);
123-
124-
var includedProj = projectFilesInSln
125-
.Intersect(projList);
126-
127-
filteredTargets
128-
.RemoveAll(x => includedProj.Contains(x.Uri.AbsolutePath));
129-
}
130-
}
131-
132-
return filteredTargets;
133-
}
134-
13593
private bool RunTestDiscovery(string? originId, ProjectInstance proj, IEnumerable<string> targets, RequestContext context)
13694
{
13795
var outputPath = proj.Properties.First(x => x.Name == "OutputPath").EvaluatedValue;

0 commit comments

Comments
 (0)