зеркало из https://github.com/dotnet/sdk.git
263 строки
10 KiB
C#
263 строки
10 KiB
C#
// Licensed to the .NET Foundation under one or more agreements.
|
|
// The .NET Foundation licenses this file to you under the MIT license.
|
|
|
|
using System.Text.RegularExpressions;
|
|
|
|
namespace Microsoft.NET.Build.Tests
|
|
{
|
|
public class GivenThatWeWantToResolveConflicts : SdkTest
|
|
{
|
|
public GivenThatWeWantToResolveConflicts(ITestOutputHelper log) : base(log)
|
|
{
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData("netcoreapp2.0")]
|
|
[InlineData("netstandard2.0")]
|
|
public void The_same_references_are_used_with_or_without_DisableDefaultPackageConflictOverrides(string targetFramework)
|
|
{
|
|
var defaultProject = new TestProject()
|
|
{
|
|
Name = "DefaultProject",
|
|
TargetFrameworks = targetFramework,
|
|
};
|
|
AddConflictReferences(defaultProject);
|
|
GetReferences(
|
|
defaultProject,
|
|
expectConflicts: false,
|
|
references: out List<string> defaultReferences,
|
|
referenceCopyLocalPaths: out List<string> defaultReferenceCopyLocalPaths,
|
|
targetFramework);
|
|
|
|
var disableProject = new TestProject()
|
|
{
|
|
Name = "DisableProject",
|
|
TargetFrameworks = targetFramework,
|
|
};
|
|
disableProject.AdditionalProperties.Add("DisableDefaultPackageConflictOverrides", "true");
|
|
AddConflictReferences(disableProject);
|
|
GetReferences(
|
|
disableProject,
|
|
expectConflicts: true,
|
|
references: out List<string> disableReferences,
|
|
referenceCopyLocalPaths: out List<string> disableReferenceCopyLocalPaths,
|
|
targetFramework);
|
|
|
|
Assert.Equal(defaultReferences, disableReferences);
|
|
Assert.Equal(defaultReferenceCopyLocalPaths, disableReferenceCopyLocalPaths);
|
|
}
|
|
|
|
private void AddConflictReferences(TestProject testProject)
|
|
{
|
|
foreach (var dependency in ConflictResolutionAssets.ConflictResolutionDependencies)
|
|
{
|
|
testProject.PackageReferences.Add(new TestPackageReference(dependency.Item1, dependency.Item2));
|
|
}
|
|
}
|
|
|
|
private void GetReferences(TestProject testProject, bool expectConflicts, out List<string> references, out List<string> referenceCopyLocalPaths, string identifier)
|
|
{
|
|
string targetFramework = testProject.TargetFrameworks;
|
|
TestAsset tempTestAsset = _testAssetsManager.CreateTestProject(testProject, identifier: identifier);
|
|
|
|
string projectFolder = Path.Combine(tempTestAsset.TestRoot, testProject.Name);
|
|
|
|
var getReferenceCommand = new GetValuesCommand(
|
|
Log,
|
|
projectFolder,
|
|
targetFramework,
|
|
"Reference",
|
|
GetValuesCommand.ValueType.Item)
|
|
{
|
|
DependsOnTargets = "Build"
|
|
};
|
|
var result = getReferenceCommand.Execute("/v:detailed").Should().Pass();
|
|
if (expectConflicts)
|
|
{
|
|
result.And.HaveStdOutMatching("Encountered conflict", RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);
|
|
}
|
|
else
|
|
{
|
|
result.And.NotHaveStdOutMatching("Encountered conflict", RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);
|
|
}
|
|
|
|
references = getReferenceCommand.GetValues();
|
|
|
|
var getReferenceCopyLocalPathsCommand = new GetValuesCommand(
|
|
Log,
|
|
projectFolder,
|
|
targetFramework,
|
|
"ReferenceCopyLocalPaths",
|
|
GetValuesCommand.ValueType.Item)
|
|
{
|
|
DependsOnTargets = "Build"
|
|
};
|
|
getReferenceCopyLocalPathsCommand.Execute().Should().Pass();
|
|
|
|
referenceCopyLocalPaths = getReferenceCopyLocalPathsCommand.GetValues();
|
|
}
|
|
|
|
[Fact]
|
|
public void CompileConflictsAreNotRemovedFromRuntimeDepsAssets()
|
|
{
|
|
TestProject testProject = new()
|
|
{
|
|
Name = "NetStandard2Library",
|
|
TargetFrameworks = "netstandard2.0",
|
|
// In deps file, assets are under the ".NETStandard,Version=v2.0/" target (ie with empty RID) for some reason
|
|
RuntimeIdentifier = string.Empty
|
|
};
|
|
|
|
testProject.PackageReferences.Add(new TestPackageReference("Microsoft.AspNetCore.Mvc.Razor", "2.1.0"));
|
|
|
|
var testAsset = _testAssetsManager.CreateTestProject(testProject);
|
|
|
|
var buildCommand = new BuildCommand(testAsset);
|
|
|
|
buildCommand
|
|
.Execute()
|
|
.Should()
|
|
.Pass();
|
|
|
|
string outputFolder = buildCommand.GetOutputDirectory(testProject.TargetFrameworks,
|
|
runtimeIdentifier: testProject.RuntimeIdentifier).FullName;
|
|
|
|
string depsJsonPath = Path.Combine(outputFolder, $"{testProject.Name}.deps.json");
|
|
|
|
var assets = DepsFileSkipTests.GetDepsJsonAssets(depsJsonPath, testProject, "runtime")
|
|
.Select(DepsFileSkipTests.GetDepsJsonFilename)
|
|
.ToList();
|
|
|
|
assets.Should().Contain("System.ValueTuple.dll");
|
|
|
|
}
|
|
|
|
[Fact]
|
|
public void AProjectCanReferenceADllInAPackageDirectly()
|
|
{
|
|
TestProject testProject = new()
|
|
{
|
|
Name = "ReferencePackageDllDirectly",
|
|
TargetFrameworks = ToolsetInfo.CurrentTargetFramework,
|
|
IsExe = true
|
|
};
|
|
|
|
testProject.PackageReferences.Add(new TestPackageReference("Microsoft.VisualStudio.Composition", "15.8.112"));
|
|
|
|
var testAsset = _testAssetsManager.CreateTestProject(testProject)
|
|
.WithProjectChanges(p =>
|
|
{
|
|
var ns = p.Root.Name.Namespace;
|
|
|
|
var itemGroup = p.Root.Element(ns + "ItemGroup");
|
|
itemGroup.Add(new XElement(ns + "Reference",
|
|
new XAttribute("Include", @"$(NuGetPackageRoot)/microsoft.visualstudio.composition/15.8.112/lib/net45/Microsoft.VisualStudio.Composition.dll"),
|
|
new XAttribute("Private", "true")));
|
|
});
|
|
|
|
var buildCommand = new BuildCommand(testAsset);
|
|
|
|
buildCommand
|
|
.Execute()
|
|
.Should()
|
|
.Pass();
|
|
}
|
|
|
|
[Fact]
|
|
public void DuplicateFrameworkAssembly()
|
|
{
|
|
TestProject testProject = new()
|
|
{
|
|
Name = "DuplicateFrameworkAssembly",
|
|
TargetFrameworks = "net472",
|
|
IsExe = true
|
|
};
|
|
testProject.References.Add("System.Runtime");
|
|
testProject.References.Add("System.Runtime");
|
|
testProject.PackageReferences.Add(new TestPackageReference("System.Runtime", "4.3.0"));
|
|
|
|
var testAsset = _testAssetsManager.CreateTestProject(testProject);
|
|
|
|
var buildCommand = new BuildCommand(testAsset);
|
|
|
|
buildCommand
|
|
.Execute()
|
|
.Should()
|
|
.Pass();
|
|
}
|
|
|
|
[Fact]
|
|
public void FilesFromAspNetCoreSharedFrameworkAreNotIncluded()
|
|
{
|
|
var testProject = new TestProject()
|
|
{
|
|
Name = "AspNetCoreProject",
|
|
TargetFrameworks = ToolsetInfo.CurrentTargetFramework,
|
|
IsExe = true
|
|
};
|
|
|
|
testProject.PackageReferences.Add(new TestPackageReference("Microsoft.Extensions.DependencyInjection.Abstractions", "2.2.0"));
|
|
|
|
var testAsset = _testAssetsManager.CreateTestProject(testProject)
|
|
.WithProjectChanges(project =>
|
|
{
|
|
var ns = project.Root.Name.Namespace;
|
|
var itemGroup = new XElement(ns + "ItemGroup");
|
|
project.Root.Add(itemGroup);
|
|
itemGroup.Add(new XElement(ns + "FrameworkReference",
|
|
new XAttribute("Include", "Microsoft.AspNetCore.App")));
|
|
});
|
|
|
|
var buildCommand = new BuildCommand(testAsset);
|
|
|
|
buildCommand
|
|
.Execute()
|
|
.Should()
|
|
.Pass();
|
|
|
|
var outputDirectory = buildCommand.GetOutputDirectory(testProject.TargetFrameworks);
|
|
|
|
outputDirectory.Should().NotHaveFile("Microsoft.Extensions.DependencyInjection.Abstractions.dll");
|
|
}
|
|
|
|
[CoreMSBuildOnlyFact]
|
|
public void AnalyzersAreConflictResolved()
|
|
{
|
|
var testProject = new TestProject()
|
|
{
|
|
Name = nameof(AnalyzersAreConflictResolved),
|
|
TargetFrameworks = ToolsetInfo.CurrentTargetFramework
|
|
};
|
|
|
|
// add the package referenced analyzers
|
|
testProject.PackageReferences.Add(new TestPackageReference("Microsoft.CodeAnalysis.NetAnalyzers", "5.0.3"));
|
|
|
|
// enable inbox analyzers too
|
|
var testAsset = _testAssetsManager.CreateTestProject(testProject)
|
|
.WithProjectChanges(project =>
|
|
{
|
|
var ns = project.Root.Name.Namespace;
|
|
var itemGroup = new XElement(ns + "PropertyGroup");
|
|
project.Root.Add(itemGroup);
|
|
itemGroup.Add(new XElement(ns + "EnableNETAnalyzers", "true"));
|
|
itemGroup.Add(new XElement(ns + "TreatWarningsAsErrors", "true"));
|
|
|
|
// Don't error when generators/analyzers can't be loaded.
|
|
// This can occur when running tests against FullFramework MSBuild
|
|
// if the build machine has an MSBuild install with an older version of Roslyn
|
|
// than the generators in the SDK reference. We aren't testing the generators here
|
|
// and this failure will occur more clearly in other places when it's
|
|
// actually an important failure, so don't error out here.
|
|
itemGroup.Add(new XElement(ns + "WarningsNotAsErrors", "CS9057"));
|
|
});
|
|
|
|
var buildCommand = new BuildCommand(testAsset);
|
|
|
|
buildCommand
|
|
.Execute()
|
|
.Should()
|
|
.Pass();
|
|
}
|
|
}
|
|
}
|