dependabot-nuget 0.285.0 → 0.287.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/helpers/lib/NuGetUpdater/NuGetProjects/Directory.Build.props +5 -1
- data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.CommandLine/NuGet.CommandLine.csproj +1 -0
- data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.Configuration/NuGet.Configuration.csproj +1 -0
- data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.LibraryModel/NuGet.LibraryModel.csproj +1 -0
- data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.Packaging/NuGet.Packaging.csproj +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/RunCommand.cs +8 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/UpdateCommand.cs +7 -3
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Update.cs +11 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/AnalyzeWorker.cs +2 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/CompatabilityChecker.cs +24 -5
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/NuGetContext.cs +15 -4
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/VersionFinder.cs +9 -38
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/DiscoveryWorker.cs +10 -8
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/ExperimentsManager.cs +52 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Files/ProjectBuildFile.cs +15 -8
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/IAnalyzeWorker.cs +9 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/IDiscoveryWorker.cs +8 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/IUpdaterWorker.cs +9 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/RunWorker.cs +78 -61
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/PackageReferenceUpdater.cs +21 -10
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/PackagesConfigUpdater.cs +37 -5
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/UpdaterWorker.cs +5 -3
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/MSBuildHelper.cs +5 -6
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/PathHelper.cs +51 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Analyze/AnalyzeWorkerTests.cs +302 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.cs +269 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/RunWorkerTests.cs +577 -43
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/SerializationTests.cs +168 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/TestAnalyzeWorker.cs +37 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/TestDiscoveryWorker.cs +35 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/TestUpdaterWorker.cs +39 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/PackagesConfigUpdaterTests.cs +104 -3
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTestBase.cs +51 -13
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.DirsProj.cs +4 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackageReference.cs +62 -18
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackagesConfig.cs +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/PathHelperTests.cs +14 -0
- data/helpers/lib/NuGetUpdater/global.json +1 -1
- data/lib/dependabot/nuget/file_updater.rb +8 -3
- data/lib/dependabot/nuget/native_helpers.rb +11 -12
- metadata +12 -6
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/DependencySolverEnvironment.cs +0 -12
@@ -729,6 +729,191 @@ public partial class AnalyzeWorkerTests : AnalyzeWorkerTestBase
|
|
729
729
|
);
|
730
730
|
}
|
731
731
|
|
732
|
+
[Fact]
|
733
|
+
public async Task AnalysisCanContineWhenRegistrationJSONIsMalformed()
|
734
|
+
{
|
735
|
+
// from a case seen in the wild; a transitive dependency's registration JSON has an invalid `range` property
|
736
|
+
// analysis should continue
|
737
|
+
var aspNetCoreAppRefPackage = MockNuGetPackage.WellKnownReferencePackage("Microsoft.AspNetCore.App", "net8.0");
|
738
|
+
var desktopAppRefPackage = MockNuGetPackage.WellKnownReferencePackage("Microsoft.WindowsDesktop.App", "net8.0");
|
739
|
+
var netCoreAppRefPackage = MockNuGetPackage.WellKnownReferencePackage("Microsoft.NETCore.App", "net8.0",
|
740
|
+
[
|
741
|
+
("data/FrameworkList.xml", Encoding.UTF8.GetBytes("""
|
742
|
+
<FileList TargetFrameworkIdentifier=".NETCoreApp" TargetFrameworkVersion="8.0" FrameworkName="Microsoft.NETCore.App" Name=".NET Runtime">
|
743
|
+
</FileList>
|
744
|
+
"""))
|
745
|
+
]);
|
746
|
+
(int, byte[]) TestHttpHandler(string uriString)
|
747
|
+
{
|
748
|
+
var uri = new Uri(uriString, UriKind.Absolute);
|
749
|
+
var baseUrl = $"{uri.Scheme}://{uri.Host}:{uri.Port}";
|
750
|
+
switch (uri.PathAndQuery)
|
751
|
+
{
|
752
|
+
// initial request is good
|
753
|
+
case "/index.json":
|
754
|
+
return (200, Encoding.UTF8.GetBytes($$"""
|
755
|
+
{
|
756
|
+
"version": "3.0.0",
|
757
|
+
"resources": [
|
758
|
+
{
|
759
|
+
"@id": "{{baseUrl}}/download",
|
760
|
+
"@type": "PackageBaseAddress/3.0.0"
|
761
|
+
},
|
762
|
+
{
|
763
|
+
"@id": "{{baseUrl}}/query",
|
764
|
+
"@type": "SearchQueryService"
|
765
|
+
},
|
766
|
+
{
|
767
|
+
"@id": "{{baseUrl}}/registrations",
|
768
|
+
"@type": "RegistrationsBaseUrl"
|
769
|
+
}
|
770
|
+
]
|
771
|
+
}
|
772
|
+
"""));
|
773
|
+
case "/registrations/some.package/index.json":
|
774
|
+
return (200, Encoding.UTF8.GetBytes("""
|
775
|
+
{
|
776
|
+
"count": 1,
|
777
|
+
"items": [
|
778
|
+
{
|
779
|
+
"lower": "1.0.0",
|
780
|
+
"upper": "1.1.0",
|
781
|
+
"items": [
|
782
|
+
{
|
783
|
+
"catalogEntry": {
|
784
|
+
"listed": true,
|
785
|
+
"version": "1.0.0"
|
786
|
+
}
|
787
|
+
},
|
788
|
+
{
|
789
|
+
"catalogEntry": {
|
790
|
+
"listed": true,
|
791
|
+
"version": "1.1.0",
|
792
|
+
"dependencyGroups": [
|
793
|
+
{
|
794
|
+
"dependencies": [
|
795
|
+
{
|
796
|
+
"id": "Some.Transitive.Dependency",
|
797
|
+
"range": "",
|
798
|
+
"comment": "The above range is invalid and fails the JSON parse"
|
799
|
+
}
|
800
|
+
]
|
801
|
+
}
|
802
|
+
]
|
803
|
+
}
|
804
|
+
}
|
805
|
+
]
|
806
|
+
}
|
807
|
+
]
|
808
|
+
}
|
809
|
+
"""));
|
810
|
+
case "/download/some.package/index.json":
|
811
|
+
return (200, Encoding.UTF8.GetBytes("""
|
812
|
+
{
|
813
|
+
"versions": [
|
814
|
+
"1.0.0",
|
815
|
+
"1.1.0"
|
816
|
+
]
|
817
|
+
}
|
818
|
+
"""));
|
819
|
+
case "/download/some.package/1.0.0/some.package.1.0.0.nupkg":
|
820
|
+
return (200, MockNuGetPackage.CreateSimplePackage("Some.Package", "1.0.0", "net8.0").GetZipStream().ReadAllBytes());
|
821
|
+
case "/download/some.package/1.1.0/some.package.1.1.0.nupkg":
|
822
|
+
return (200, MockNuGetPackage.CreateSimplePackage("Some.Package", "1.1.0", "net8.0").GetZipStream().ReadAllBytes());
|
823
|
+
case "/download/microsoft.aspnetcore.app.ref/index.json":
|
824
|
+
return (200, Encoding.UTF8.GetBytes($$"""
|
825
|
+
{
|
826
|
+
"versions": [
|
827
|
+
"{{aspNetCoreAppRefPackage.Version}}"
|
828
|
+
]
|
829
|
+
}
|
830
|
+
"""));
|
831
|
+
case "/download/microsoft.netcore.app.ref/index.json":
|
832
|
+
return (200, Encoding.UTF8.GetBytes($$"""
|
833
|
+
{
|
834
|
+
"versions": [
|
835
|
+
"{{netCoreAppRefPackage.Version}}"
|
836
|
+
]
|
837
|
+
}
|
838
|
+
"""));
|
839
|
+
case "/download/microsoft.windowsdesktop.app.ref/index.json":
|
840
|
+
return (200, Encoding.UTF8.GetBytes($$"""
|
841
|
+
{
|
842
|
+
"versions": [
|
843
|
+
"{{desktopAppRefPackage.Version}}"
|
844
|
+
]
|
845
|
+
}
|
846
|
+
"""));
|
847
|
+
default:
|
848
|
+
if (uri.PathAndQuery == $"/download/microsoft.aspnetcore.app.ref/{aspNetCoreAppRefPackage.Version}/microsoft.aspnetcore.app.ref.{aspNetCoreAppRefPackage.Version}.nupkg")
|
849
|
+
{
|
850
|
+
return (200, aspNetCoreAppRefPackage.GetZipStream().ReadAllBytes());
|
851
|
+
}
|
852
|
+
|
853
|
+
if (uri.PathAndQuery == $"/download/microsoft.netcore.app.ref/{netCoreAppRefPackage.Version}/microsoft.netcore.app.ref.{netCoreAppRefPackage.Version}.nupkg")
|
854
|
+
{
|
855
|
+
return (200, netCoreAppRefPackage.GetZipStream().ReadAllBytes());
|
856
|
+
}
|
857
|
+
|
858
|
+
if (uri.PathAndQuery == $"/download/microsoft.windowsdesktop.app.ref/{desktopAppRefPackage.Version}/microsoft.windowsdesktop.app.ref.{desktopAppRefPackage.Version}.nupkg")
|
859
|
+
{
|
860
|
+
return (200, desktopAppRefPackage.GetZipStream().ReadAllBytes());
|
861
|
+
}
|
862
|
+
|
863
|
+
// nothing else is found
|
864
|
+
return (404, Encoding.UTF8.GetBytes("{}"));
|
865
|
+
};
|
866
|
+
}
|
867
|
+
using var http = TestHttpServer.CreateTestServer(TestHttpHandler);
|
868
|
+
await TestAnalyzeAsync(
|
869
|
+
extraFiles:
|
870
|
+
[
|
871
|
+
("NuGet.Config", $"""
|
872
|
+
<configuration>
|
873
|
+
<packageSources>
|
874
|
+
<clear />
|
875
|
+
<add key="package_feed" value="{http.BaseUrl.TrimEnd('/')}/index.json" allowInsecureConnections="true" />
|
876
|
+
</packageSources>
|
877
|
+
</configuration>
|
878
|
+
""")
|
879
|
+
],
|
880
|
+
discovery: new()
|
881
|
+
{
|
882
|
+
Path = "/",
|
883
|
+
Projects =
|
884
|
+
[
|
885
|
+
new()
|
886
|
+
{
|
887
|
+
FilePath = "./project.csproj",
|
888
|
+
TargetFrameworks = ["net8.0"],
|
889
|
+
Dependencies =
|
890
|
+
[
|
891
|
+
new("Some.Package", "1.0.0", DependencyType.PackageReference),
|
892
|
+
]
|
893
|
+
}
|
894
|
+
]
|
895
|
+
},
|
896
|
+
dependencyInfo: new()
|
897
|
+
{
|
898
|
+
Name = "Some.Package",
|
899
|
+
Version = "1.0.0",
|
900
|
+
IgnoredVersions = [],
|
901
|
+
IsVulnerable = false,
|
902
|
+
Vulnerabilities = [],
|
903
|
+
},
|
904
|
+
expectedResult: new()
|
905
|
+
{
|
906
|
+
CanUpdate = true,
|
907
|
+
UpdatedVersion = "1.1.0",
|
908
|
+
VersionComesFromMultiDependencyProperty = false,
|
909
|
+
UpdatedDependencies =
|
910
|
+
[
|
911
|
+
new("Some.Package", "1.1.0", DependencyType.Unknown, TargetFrameworks: ["net8.0"]),
|
912
|
+
],
|
913
|
+
}
|
914
|
+
);
|
915
|
+
}
|
916
|
+
|
732
917
|
[Fact]
|
733
918
|
public async Task ResultFileHasCorrectShapeForAuthenticationFailure()
|
734
919
|
{
|
@@ -835,4 +1020,121 @@ public partial class AnalyzeWorkerTests : AnalyzeWorkerTestBase
|
|
835
1020
|
}
|
836
1021
|
);
|
837
1022
|
}
|
1023
|
+
|
1024
|
+
[Fact]
|
1025
|
+
public async Task AnalysisFailsWhenNewerPackageDownloadIsDenied()
|
1026
|
+
{
|
1027
|
+
static (int, byte[]) TestHttpHandler(string uriString)
|
1028
|
+
{
|
1029
|
+
var uri = new Uri(uriString, UriKind.Absolute);
|
1030
|
+
var baseUrl = $"{uri.Scheme}://{uri.Host}:{uri.Port}";
|
1031
|
+
return uri.PathAndQuery switch
|
1032
|
+
{
|
1033
|
+
// initial request is good
|
1034
|
+
"/index.json" => (200, Encoding.UTF8.GetBytes($$"""
|
1035
|
+
{
|
1036
|
+
"version": "3.0.0",
|
1037
|
+
"resources": [
|
1038
|
+
{
|
1039
|
+
"@id": "{{baseUrl}}/download",
|
1040
|
+
"@type": "PackageBaseAddress/3.0.0"
|
1041
|
+
},
|
1042
|
+
{
|
1043
|
+
"@id": "{{baseUrl}}/query",
|
1044
|
+
"@type": "SearchQueryService"
|
1045
|
+
},
|
1046
|
+
{
|
1047
|
+
"@id": "{{baseUrl}}/registrations",
|
1048
|
+
"@type": "RegistrationsBaseUrl"
|
1049
|
+
}
|
1050
|
+
]
|
1051
|
+
}
|
1052
|
+
""")),
|
1053
|
+
// request for package index is good
|
1054
|
+
"/registrations/some.package/index.json" => (200, Encoding.UTF8.GetBytes("""
|
1055
|
+
{
|
1056
|
+
"count": 1,
|
1057
|
+
"items": [
|
1058
|
+
{
|
1059
|
+
"lower": "1.0.0",
|
1060
|
+
"upper": "1.1.0",
|
1061
|
+
"items": [
|
1062
|
+
{
|
1063
|
+
"catalogEntry": {
|
1064
|
+
"listed": true,
|
1065
|
+
"version": "1.0.0"
|
1066
|
+
}
|
1067
|
+
},
|
1068
|
+
{
|
1069
|
+
"catalogEntry": {
|
1070
|
+
"listed": true,
|
1071
|
+
"version": "1.1.0"
|
1072
|
+
}
|
1073
|
+
}
|
1074
|
+
]
|
1075
|
+
}
|
1076
|
+
]
|
1077
|
+
}
|
1078
|
+
""")),
|
1079
|
+
// request for versions is good
|
1080
|
+
"/download/some.package/index.json" => (200, Encoding.UTF8.GetBytes("""
|
1081
|
+
{
|
1082
|
+
"versions": [
|
1083
|
+
"1.0.0",
|
1084
|
+
"1.1.0"
|
1085
|
+
]
|
1086
|
+
}
|
1087
|
+
""")),
|
1088
|
+
// download of old package is good
|
1089
|
+
"/download/some.package/1.0.0/some.package.1.0.0.nupkg" => (200, MockNuGetPackage.CreateSimplePackage("Some.Package", "1.0.0", "net9.0").GetZipStream().ReadAllBytes()),
|
1090
|
+
// download of new package is denied
|
1091
|
+
"/download/some.package/1.1.0/some.package.1.1.0.nupkg" => (401, Array.Empty<byte>()),
|
1092
|
+
// all other requests are not found
|
1093
|
+
_ => (404, Encoding.UTF8.GetBytes("{}")),
|
1094
|
+
};
|
1095
|
+
}
|
1096
|
+
using var http = TestHttpServer.CreateTestServer(TestHttpHandler);
|
1097
|
+
await TestAnalyzeAsync(
|
1098
|
+
extraFiles:
|
1099
|
+
[
|
1100
|
+
("NuGet.Config", $"""
|
1101
|
+
<configuration>
|
1102
|
+
<packageSources>
|
1103
|
+
<clear />
|
1104
|
+
<add key="private_feed" value="{http.BaseUrl.TrimEnd('/')}/index.json" allowInsecureConnections="true" />
|
1105
|
+
</packageSources>
|
1106
|
+
</configuration>
|
1107
|
+
""")
|
1108
|
+
],
|
1109
|
+
discovery: new()
|
1110
|
+
{
|
1111
|
+
Path = "/",
|
1112
|
+
Projects = [
|
1113
|
+
new()
|
1114
|
+
{
|
1115
|
+
FilePath = "./project.csproj",
|
1116
|
+
TargetFrameworks = ["net9.0"],
|
1117
|
+
Dependencies = [
|
1118
|
+
new("Some.Package", "1.0.0", DependencyType.PackageReference),
|
1119
|
+
],
|
1120
|
+
}
|
1121
|
+
]
|
1122
|
+
},
|
1123
|
+
dependencyInfo: new()
|
1124
|
+
{
|
1125
|
+
Name = "Some.Package",
|
1126
|
+
Version = "1.0.0",
|
1127
|
+
IgnoredVersions = [],
|
1128
|
+
IsVulnerable = false,
|
1129
|
+
Vulnerabilities = [],
|
1130
|
+
},
|
1131
|
+
expectedResult: new()
|
1132
|
+
{
|
1133
|
+
UpdatedVersion = "1.0.0",
|
1134
|
+
CanUpdate = false,
|
1135
|
+
VersionComesFromMultiDependencyProperty = false,
|
1136
|
+
UpdatedDependencies = [],
|
1137
|
+
}
|
1138
|
+
);
|
1139
|
+
}
|
838
1140
|
}
|
@@ -107,6 +107,106 @@ public partial class DiscoveryWorkerTests : DiscoveryWorkerTestBase
|
|
107
107
|
);
|
108
108
|
}
|
109
109
|
|
110
|
+
[Fact]
|
111
|
+
public async Task TestDependenciesSeparatedBySemicolon()
|
112
|
+
{
|
113
|
+
await TestDiscoveryAsync(
|
114
|
+
packages:
|
115
|
+
[
|
116
|
+
MockNuGetPackage.CreateSimplePackage("Some.Package", "9.0.1", "net8.0"),
|
117
|
+
MockNuGetPackage.CreateSimplePackage("Some.Package2", "9.0.1", "net8.0"),
|
118
|
+
],
|
119
|
+
workspacePath: "src",
|
120
|
+
files: new[]
|
121
|
+
{
|
122
|
+
("src/project.csproj", """
|
123
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
124
|
+
<PropertyGroup>
|
125
|
+
<TargetFramework>net8.0</TargetFramework>
|
126
|
+
<SomePackageVersion>9.0.1</SomePackageVersion>
|
127
|
+
</PropertyGroup>
|
128
|
+
|
129
|
+
<ItemGroup>
|
130
|
+
<PackageReference Include="Some.Package;Some.Package2" Version="$(SomePackageVersion)" />
|
131
|
+
</ItemGroup>
|
132
|
+
</Project>
|
133
|
+
""")
|
134
|
+
},
|
135
|
+
expectedResult: new()
|
136
|
+
{
|
137
|
+
Path = "src",
|
138
|
+
Projects = [
|
139
|
+
new()
|
140
|
+
{
|
141
|
+
FilePath = "project.csproj",
|
142
|
+
TargetFrameworks = ["net8.0"],
|
143
|
+
ReferencedProjectPaths = [],
|
144
|
+
ExpectedDependencyCount = 3,
|
145
|
+
Dependencies = [
|
146
|
+
new("Microsoft.NET.Sdk", null, DependencyType.MSBuildSdk),
|
147
|
+
new("Some.Package", "9.0.1", DependencyType.PackageReference, TargetFrameworks: ["net8.0"], IsDirect: true),
|
148
|
+
new("Some.Package2", "9.0.1", DependencyType.PackageReference, TargetFrameworks: ["net8.0"], IsDirect: true),
|
149
|
+
],
|
150
|
+
Properties = [
|
151
|
+
new("SomePackageVersion", "9.0.1", "src/project.csproj"),
|
152
|
+
new("TargetFramework", "net8.0", "src/project.csproj"),
|
153
|
+
]
|
154
|
+
}
|
155
|
+
]
|
156
|
+
}
|
157
|
+
);
|
158
|
+
}
|
159
|
+
|
160
|
+
[Fact]
|
161
|
+
public async Task TestDependenciesSeparatedBySemicolonWithWhitespace()
|
162
|
+
{
|
163
|
+
await TestDiscoveryAsync(
|
164
|
+
packages:
|
165
|
+
[
|
166
|
+
MockNuGetPackage.CreateSimplePackage("Some.Package", "9.0.1", "net8.0"),
|
167
|
+
MockNuGetPackage.CreateSimplePackage("Some.Package2", "9.0.1", "net8.0"),
|
168
|
+
],
|
169
|
+
workspacePath: "src",
|
170
|
+
files: new[]
|
171
|
+
{
|
172
|
+
("src/project.csproj", """
|
173
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
174
|
+
<PropertyGroup>
|
175
|
+
<TargetFramework>net8.0</TargetFramework>
|
176
|
+
<SomePackageVersion>9.0.1</SomePackageVersion>
|
177
|
+
</PropertyGroup>
|
178
|
+
|
179
|
+
<ItemGroup>
|
180
|
+
<PackageReference Include=" Some.Package ; Some.Package2 " Version="$(SomePackageVersion)" />
|
181
|
+
</ItemGroup>
|
182
|
+
</Project>
|
183
|
+
""")
|
184
|
+
},
|
185
|
+
expectedResult: new()
|
186
|
+
{
|
187
|
+
Path = "src",
|
188
|
+
Projects = [
|
189
|
+
new()
|
190
|
+
{
|
191
|
+
FilePath = "project.csproj",
|
192
|
+
TargetFrameworks = ["net8.0"],
|
193
|
+
ReferencedProjectPaths = [],
|
194
|
+
ExpectedDependencyCount = 3,
|
195
|
+
Dependencies = [
|
196
|
+
new("Microsoft.NET.Sdk", null, DependencyType.MSBuildSdk),
|
197
|
+
new("Some.Package", "9.0.1", DependencyType.PackageReference, TargetFrameworks: ["net8.0"], IsDirect: true),
|
198
|
+
new("Some.Package2", "9.0.1", DependencyType.PackageReference, TargetFrameworks: ["net8.0"], IsDirect: true),
|
199
|
+
],
|
200
|
+
Properties = [
|
201
|
+
new("SomePackageVersion", "9.0.1", "src/project.csproj"),
|
202
|
+
new("TargetFramework", "net8.0", "src/project.csproj"),
|
203
|
+
]
|
204
|
+
}
|
205
|
+
]
|
206
|
+
}
|
207
|
+
);
|
208
|
+
}
|
209
|
+
|
110
210
|
[Fact]
|
111
211
|
public async Task TestPackageConfig()
|
112
212
|
{
|
@@ -375,6 +475,175 @@ public partial class DiscoveryWorkerTests : DiscoveryWorkerTestBase
|
|
375
475
|
);
|
376
476
|
}
|
377
477
|
|
478
|
+
[Fact]
|
479
|
+
public async Task TestRepo_SolutionFileCasingMismatchIsResolved()
|
480
|
+
{
|
481
|
+
var solutionPath = "solution.sln";
|
482
|
+
await TestDiscoveryAsync(
|
483
|
+
packages:
|
484
|
+
[
|
485
|
+
MockNuGetPackage.CreateSimplePackage("Some.Package", "9.0.1", "net8.0"),
|
486
|
+
],
|
487
|
+
workspacePath: "",
|
488
|
+
files: new[]
|
489
|
+
{
|
490
|
+
("src/project.csproj", """
|
491
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
492
|
+
<PropertyGroup>
|
493
|
+
<TargetFrameworks>net7.0;net8.0</TargetFrameworks>
|
494
|
+
</PropertyGroup>
|
495
|
+
|
496
|
+
<ItemGroup>
|
497
|
+
<PackageReference Include="Some.Package" />
|
498
|
+
</ItemGroup>
|
499
|
+
</Project>
|
500
|
+
"""),
|
501
|
+
("Directory.Build.props", "<Project />"),
|
502
|
+
("Directory.Packages.props", """
|
503
|
+
<Project>
|
504
|
+
<PropertyGroup>
|
505
|
+
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
|
506
|
+
<SomePackageVersion>9.0.1</SomePackageVersion>
|
507
|
+
</PropertyGroup>
|
508
|
+
|
509
|
+
<ItemGroup>
|
510
|
+
<PackageVersion Include="Some.Package" Version="$(SomePackageVersion)" />
|
511
|
+
</ItemGroup>
|
512
|
+
</Project>
|
513
|
+
"""),
|
514
|
+
(solutionPath, """
|
515
|
+
Microsoft Visual Studio Solution File, Format Version 12.00
|
516
|
+
# Visual Studio 14
|
517
|
+
VisualStudioVersion = 14.0.22705.0
|
518
|
+
MinimumVisualStudioVersion = 10.0.40219.1
|
519
|
+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProJect", ".\src\ProJect.csproj", "{782E0C0A-10D3-444D-9640-263D03D2B20C}"
|
520
|
+
EndProject
|
521
|
+
Global
|
522
|
+
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
523
|
+
Debug|Any CPU = Debug|Any CPU
|
524
|
+
Release|Any CPU = Release|Any CPU
|
525
|
+
EndGlobalSection
|
526
|
+
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
527
|
+
{782E0C0A-10D3-444D-9640-263D03D2B20C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
528
|
+
{782E0C0A-10D3-444D-9640-263D03D2B20C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
529
|
+
{782E0C0A-10D3-444D-9640-263D03D2B20C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
530
|
+
{782E0C0A-10D3-444D-9640-263D03D2B20C}.Release|Any CPU.Build.0 = Release|Any CPU
|
531
|
+
EndGlobalSection
|
532
|
+
GlobalSection(SolutionProperties) = preSolution
|
533
|
+
HideSolutionNode = FALSE
|
534
|
+
EndGlobalSection
|
535
|
+
EndGlobal
|
536
|
+
"""),
|
537
|
+
},
|
538
|
+
expectedResult: new()
|
539
|
+
{
|
540
|
+
Path = "",
|
541
|
+
ExpectedProjectCount = 2,
|
542
|
+
Projects = [
|
543
|
+
new()
|
544
|
+
{
|
545
|
+
FilePath = "src/project.csproj",
|
546
|
+
TargetFrameworks = ["net7.0", "net8.0"],
|
547
|
+
ExpectedDependencyCount = 2,
|
548
|
+
Dependencies = [
|
549
|
+
new("Microsoft.NET.Sdk", null, DependencyType.MSBuildSdk),
|
550
|
+
new("Some.Package", "9.0.1", DependencyType.PackageReference, TargetFrameworks: ["net7.0", "net8.0"], IsDirect: true)
|
551
|
+
],
|
552
|
+
Properties = [
|
553
|
+
new("ManagePackageVersionsCentrally", "true", "Directory.Packages.props"),
|
554
|
+
new("SomePackageVersion", "9.0.1", "Directory.Packages.props"),
|
555
|
+
new("TargetFrameworks", "net7.0;net8.0", "src/project.csproj"),
|
556
|
+
]
|
557
|
+
}
|
558
|
+
],
|
559
|
+
DirectoryPackagesProps = new()
|
560
|
+
{
|
561
|
+
FilePath = "Directory.Packages.props",
|
562
|
+
Dependencies = [
|
563
|
+
new("Some.Package", "9.0.1", DependencyType.PackageVersion, IsDirect: true)
|
564
|
+
],
|
565
|
+
},
|
566
|
+
}
|
567
|
+
);
|
568
|
+
}
|
569
|
+
|
570
|
+
[Fact]
|
571
|
+
public async Task TestDirsProj_CasingMismatchIsResolved()
|
572
|
+
{
|
573
|
+
var dirsProjPath = "dirs.proj";
|
574
|
+
await TestDiscoveryAsync(
|
575
|
+
packages:
|
576
|
+
[
|
577
|
+
MockNuGetPackage.CreateSimplePackage("Some.Package", "9.0.1", "net8.0"),
|
578
|
+
],
|
579
|
+
workspacePath: "",
|
580
|
+
files: new[]
|
581
|
+
{
|
582
|
+
("src/project.csproj", """
|
583
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
584
|
+
<PropertyGroup>
|
585
|
+
<TargetFrameworks>net7.0;net8.0</TargetFrameworks>
|
586
|
+
</PropertyGroup>
|
587
|
+
|
588
|
+
<ItemGroup>
|
589
|
+
<PackageReference Include="Some.Package" />
|
590
|
+
</ItemGroup>
|
591
|
+
</Project>
|
592
|
+
"""),
|
593
|
+
("Directory.Build.props", "<Project />"),
|
594
|
+
("Directory.Packages.props", """
|
595
|
+
<Project>
|
596
|
+
<PropertyGroup>
|
597
|
+
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
|
598
|
+
<SomePackageVersion>9.0.1</SomePackageVersion>
|
599
|
+
</PropertyGroup>
|
600
|
+
|
601
|
+
<ItemGroup>
|
602
|
+
<PackageVersion Include="Some.Package" Version="$(SomePackageVersion)" />
|
603
|
+
</ItemGroup>
|
604
|
+
</Project>
|
605
|
+
"""),
|
606
|
+
// Introduce a casing difference in the project reference
|
607
|
+
(dirsProjPath, """
|
608
|
+
<Project>
|
609
|
+
<ItemGroup>
|
610
|
+
<ProjectReference Include="SRC/PROJECT.CSPROJ" />
|
611
|
+
</ItemGroup>
|
612
|
+
</Project>
|
613
|
+
""")
|
614
|
+
},
|
615
|
+
expectedResult: new()
|
616
|
+
{
|
617
|
+
Path = "",
|
618
|
+
ExpectedProjectCount = 2,
|
619
|
+
Projects = [
|
620
|
+
new()
|
621
|
+
{
|
622
|
+
FilePath = "src/project.csproj",
|
623
|
+
TargetFrameworks = ["net7.0", "net8.0"],
|
624
|
+
ExpectedDependencyCount = 2,
|
625
|
+
Dependencies = [
|
626
|
+
new("Microsoft.NET.Sdk", null, DependencyType.MSBuildSdk),
|
627
|
+
new("Some.Package", "9.0.1", DependencyType.PackageReference, TargetFrameworks: ["net7.0", "net8.0"], IsDirect: true)
|
628
|
+
],
|
629
|
+
Properties = [
|
630
|
+
new("ManagePackageVersionsCentrally", "true", "Directory.Packages.props"),
|
631
|
+
new("SomePackageVersion", "9.0.1", "Directory.Packages.props"),
|
632
|
+
new("TargetFrameworks", "net7.0;net8.0", "src/project.csproj"),
|
633
|
+
]
|
634
|
+
}
|
635
|
+
],
|
636
|
+
DirectoryPackagesProps = new()
|
637
|
+
{
|
638
|
+
FilePath = "Directory.Packages.props",
|
639
|
+
Dependencies = [
|
640
|
+
new("Some.Package", "9.0.1", DependencyType.PackageVersion, IsDirect: true)
|
641
|
+
],
|
642
|
+
},
|
643
|
+
}
|
644
|
+
);
|
645
|
+
}
|
646
|
+
|
378
647
|
[Fact]
|
379
648
|
public async Task NonSupportedProjectExtensionsAreSkipped()
|
380
649
|
{
|