Skip to content

Commit f75ecdb

Browse files
authored
Merge pull request #18570 from hvitved/csharp/dotnet3-integration-test
C#: Verify that downloaded .NET CLIs are executable
2 parents eaeeafe + ac4f82c commit f75ecdb

File tree

10 files changed

+60
-9
lines changed

10 files changed

+60
-9
lines changed

csharp/autobuilder/Semmle.Autobuild.CSharp/DotNetRule.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,9 @@ public BuildScript Analyse(IAutobuilder<CSharpAutobuildOptions> builder, bool au
4646

4747
return WithDotNet(builder, ensureDotNetAvailable: false, (dotNetPath, environment) =>
4848
{
49-
var ret = GetInfoCommand(builder.Actions, dotNetPath, environment);
49+
// When a custom .NET CLI has been installed, `dotnet --info` has already been executed
50+
// to verify the installation.
51+
var ret = dotNetPath is null ? GetInfoCommand(builder.Actions, dotNetPath, environment) : BuildScript.Success;
5052
foreach (var projectOrSolution in builder.ProjectsOrSolutionsToBuild)
5153
{
5254
var cleanCommand = GetCleanCommand(builder.Actions, dotNetPath, environment);

csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ public sealed partial class DependencyManager : IDisposable, ICompilationInfoCon
4141
private int conflictedReferences = 0;
4242
private readonly DirectoryInfo sourceDir;
4343
private string? dotnetPath;
44-
4544
private readonly TemporaryDirectory tempWorkingDirectory;
4645
private readonly bool cleanupTempWorkingDirectory;
4746

csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,20 @@ public partial class DotNet : IDotNet
1919
private readonly ILogger logger;
2020
private readonly TemporaryDirectory? tempWorkingDirectory;
2121

22-
private DotNet(IDotNetCliInvoker dotnetCliInvoker, ILogger logger, TemporaryDirectory? tempWorkingDirectory = null)
22+
private DotNet(IDotNetCliInvoker dotnetCliInvoker, ILogger logger, bool runDotnetInfo, TemporaryDirectory? tempWorkingDirectory = null)
2323
{
2424
this.tempWorkingDirectory = tempWorkingDirectory;
2525
this.dotnetCliInvoker = dotnetCliInvoker;
2626
this.logger = logger;
27-
Info();
27+
if (runDotnetInfo)
28+
{
29+
Info();
30+
}
2831
}
2932

30-
private DotNet(ILogger logger, string? dotNetPath, TemporaryDirectory tempWorkingDirectory, DependabotProxy? dependabotProxy) : this(new DotNetCliInvoker(logger, Path.Combine(dotNetPath ?? string.Empty, "dotnet"), dependabotProxy), logger, tempWorkingDirectory) { }
33+
private DotNet(ILogger logger, string? dotNetPath, TemporaryDirectory tempWorkingDirectory, DependabotProxy? dependabotProxy) : this(new DotNetCliInvoker(logger, Path.Combine(dotNetPath ?? string.Empty, "dotnet"), dependabotProxy), logger, dotNetPath is null, tempWorkingDirectory) { }
3134

32-
internal static IDotNet Make(IDotNetCliInvoker dotnetCliInvoker, ILogger logger) => new DotNet(dotnetCliInvoker, logger);
35+
internal static IDotNet Make(IDotNetCliInvoker dotnetCliInvoker, ILogger logger, bool runDotnetInfo) => new DotNet(dotnetCliInvoker, logger, runDotnetInfo);
3336

3437
public static IDotNet Make(ILogger logger, string? dotNetPath, TemporaryDirectory tempWorkingDirectory, DependabotProxy? dependabotProxy) => new DotNet(logger, dotNetPath, tempWorkingDirectory, dependabotProxy);
3538

@@ -169,7 +172,10 @@ private static BuildScript DownloadDotNet(IBuildActions actions, ILogger logger,
169172

170173
if (versions.Count > 0)
171174
{
172-
return DownloadDotNetVersion(actions, logger, tempWorkingDirectory, shouldCleanUp, installDir, versions);
175+
return
176+
DownloadDotNetVersion(actions, logger, tempWorkingDirectory, shouldCleanUp, installDir, versions) |
177+
// if neither of the versions succeed, try the latest version
178+
DownloadDotNetVersion(actions, logger, tempWorkingDirectory, shouldCleanUp, installDir, [LatestDotNetSdkVersion], needExactVersion: false);
173179
}
174180

175181
if (ensureDotNetAvailable)
@@ -269,6 +275,14 @@ BuildScript GetInstall(string pwsh) =>
269275
Argument(path).Script;
270276
}
271277

278+
var dotnetInfo = new CommandBuilder(actions).
279+
RunCommand(actions.PathCombine(path, "dotnet")).
280+
Argument("--info").Script;
281+
282+
Func<string, BuildScript> getInstallAndVerify = version =>
283+
// run `dotnet --info` after install, to check that it executes successfully
284+
getInstall(version) & dotnetInfo;
285+
272286
var installScript = prelude & BuildScript.Failure;
273287

274288
var attempted = new HashSet<string>();
@@ -283,7 +297,7 @@ BuildScript GetInstall(string pwsh) =>
283297

284298
// When there are multiple versions requested, we want to try to fetch them all, reporting
285299
// a successful exit code when at least one of them succeeds
286-
return combinedExit != 0 ? getInstall(version) : BuildScript.Bind(getInstall(version), _ => BuildScript.Success);
300+
return combinedExit != 0 ? getInstallAndVerify(version) : BuildScript.Bind(getInstallAndVerify(version), _ => BuildScript.Success);
287301
});
288302
}
289303

csharp/extractor/Semmle.Extraction.Tests/DotNet.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public bool RunCommand(string args, string? workingDirectory, out IList<string>
4545
public class DotNetTests
4646
{
4747
private static IDotNet MakeDotnet(IDotNetCliInvoker dotnetCliInvoker) =>
48-
DotNet.Make(dotnetCliInvoker, new LoggerStub());
48+
DotNet.Make(dotnetCliInvoker, new LoggerStub(), true);
4949

5050
private static IList<string> MakeDotnetRestoreOutput() =>
5151
new List<string> {
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
| Program.cs:0:0:0:0 | Program.cs |
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import csharp
2+
3+
from File f
4+
where f.fromSource()
5+
select f
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using System;
2+
3+
namespace standalone_dotnet3
4+
{
5+
class Program
6+
{
7+
static void Main(string[] args)
8+
{
9+
Console.WriteLine("Hello World!");
10+
}
11+
}
12+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"sdk": {
3+
"version": "3.1.403",
4+
"rollForward": "latestFeature"
5+
}
6+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<OutputType>Exe</OutputType>
5+
<TargetFramework>netcoreapp3.1</TargetFramework>
6+
</PropertyGroup>
7+
8+
</Project>
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import os
2+
3+
def test(codeql, csharp):
4+
codeql.database.create(build_mode="none")

0 commit comments

Comments
 (0)