public void NuGetFrameworkEquals_WithAssetTargetFallback_Succeeds(string shortFrameworkName, string atfRootFrameworkName, bool equals) { var nugetFramework = NuGetFramework.Parse(shortFrameworkName); var assetTargetFallback = new AssetTargetFallbackFramework(NuGetFramework.Parse(atfRootFrameworkName), fallbackFrameworks: SampleFrameworkList); nugetFramework.Equals(assetTargetFallback).Should().Be(equals); }
public void AssetTargetFrameworkEquals_WithNonAssetTargetFallbackFramework_Succeeds(string shortFrameworkName) { var nugetFramework = NuGetFramework.Parse(shortFrameworkName); var assetTargetFallback = new AssetTargetFallbackFramework(nugetFramework, fallbackFrameworks: SampleFrameworkList); Assert.False(assetTargetFallback.Equals((object)nugetFramework)); }
public void GivenAssetTargetFallbackEqualityIsTransitive() { var A1 = new AssetTargetFallbackFramework(NuGetFramework.Parse("netcoreapp2.0"), new[] { NuGetFramework.Parse("net461") }); var A2 = new AssetTargetFallbackFramework(NuGetFramework.Parse("netcoreapp2.0"), new[] { NuGetFramework.Parse("net461") }); var B1 = new AssetTargetFallbackFramework(NuGetFramework.Parse("netcoreapp2.0"), new[] { NuGetFramework.Parse("net462") }); var B2 = new AssetTargetFallbackFramework(NuGetFramework.Parse("netcoreapp2.0"), new[] { NuGetFramework.Parse("net462") }); var C1 = new AssetTargetFallbackFramework(NuGetFramework.Parse("netcoreapp1.0"), new[] { NuGetFramework.Parse("net462") }); var C2 = new AssetTargetFallbackFramework(NuGetFramework.Parse("netcoreapp1.0"), new[] { NuGetFramework.Parse("net462") }); // Check equivalents A1.Should().Be(A2); B1.Should().Be(B2); C1.Should().Be(C2); // Rest of the A1 -> B1,B2,C1,C2 A1.Should().NotBe(B1); A1.Should().NotBe(B2); A1.Should().NotBe(C1); A1.Should().NotBe(C2); // Rest of the A2 -> B1,B2,C1,C2 A2.Should().NotBe(B1); A2.Should().NotBe(B2); A2.Should().NotBe(C1); A2.Should().NotBe(C2); // B1 -> C1, C2 B1.Should().NotBe(C1); B1.Should().NotBe(C2); // B2 -> C1, C2 B2.Should().NotBe(C1); B2.Should().NotBe(C2); }
public void GetSpecDependencies_WithAssetTargetFallback_AndDependencyResolutionVariableSpecified_ReturnsCorrectDependencies(string assetTargetFallbackEnvironmentVariableValue, int dependencyCount) { // Arrange var net60Framework = FrameworkConstants.CommonFrameworks.Net60; var net472Framework = FrameworkConstants.CommonFrameworks.Net472; var packageSpec = ProjectTestHelpers.GetPackageSpec(rootPath: "C:\\", projectName: "A", framework: net472Framework.GetShortFolderName(), dependencyName: "x"); var envVarWrapper = new TestEnvironmentVariableReader(new Dictionary <string, string> { { "NUGET_USE_LEGACY_ASSET_TARGET_FALLBACK_DEPENDENCY_RESOLUTION", assetTargetFallbackEnvironmentVariableValue } }); var dependencyProvider = new PackageSpecReferenceDependencyProvider(new List <ExternalProjectReference>(), NullLogger.Instance, envVarWrapper); var assetTargetFallback = new AssetTargetFallbackFramework(net60Framework, new List <NuGetFramework> { net472Framework }); // Act var dependencies = dependencyProvider.GetSpecDependencies(packageSpec, assetTargetFallback); // Assert dependencies.Should().HaveCount(dependencyCount); if (dependencyCount > 0) { dependencies[0].Name.Should().Be("x"); } }
public void NuGetFrameworkFullComparer_WithAssetTargetFallback_Succeeds(string shortFrameworkName) { var nugetFramework = NuGetFramework.Parse(shortFrameworkName); var assetTargetFallback = new AssetTargetFallbackFramework(nugetFramework, fallbackFrameworks: SampleFrameworkList); var comparer = new NuGetFrameworkFullComparer(); Assert.True(comparer.Equals(nugetFramework, assetTargetFallback)); }
private static bool BuildTargetFrameworkNode(PackageSpec packageSpec, KeyValuePair <string, JToken> targetFramework, string filePath) { var frameworkName = GetFramework(targetFramework.Key); var properties = targetFramework.Value.Value <JObject>(); var assetTargetFallback = GetBoolOrFalse(properties, "assetTargetFallback", filePath); var importFrameworks = GetImports(properties, packageSpec); // If a fallback framework exists, update the framework to contain both. var updatedFramework = frameworkName; if (importFrameworks.Count != 0) { if (assetTargetFallback) { updatedFramework = new AssetTargetFallbackFramework(frameworkName, importFrameworks); } else { updatedFramework = new FallbackFramework(frameworkName, importFrameworks); } } var targetFrameworkInformation = new TargetFrameworkInformation { FrameworkName = updatedFramework, Dependencies = new List <LibraryDependency>(), Imports = importFrameworks, Warn = GetWarnSetting(properties), AssetTargetFallback = assetTargetFallback }; PopulateDependencies( packageSpec.FilePath, targetFrameworkInformation.Dependencies, properties, "dependencies", isGacOrFrameworkReference: false); var frameworkAssemblies = new List <LibraryDependency>(); PopulateDependencies( packageSpec.FilePath, frameworkAssemblies, properties, "frameworkAssemblies", isGacOrFrameworkReference: true); frameworkAssemblies.ForEach(d => targetFrameworkInformation.Dependencies.Add(d)); packageSpec.TargetFrameworks.Add(targetFrameworkInformation); return(true); }
public CriteriaKey(string targetGraphName, NuGetFramework frameworkOverride) { TargetGraphName = targetGraphName; if (frameworkOverride is AssetTargetFallbackFramework assetTargetFallbackFramework) { Framework = null; AssetTargetFallbackFramework = assetTargetFallbackFramework; } else { Framework = frameworkOverride; AssetTargetFallbackFramework = null; } }
public void GetAllByQuerry_WithIsbn_CallsGetAllByTitleOrAuthor() { var bookRepositoryStub = new Mock <IBookRepository>(); bookRepositoryStub.Setup(x => x.GetAllByTitleOrAuthor(It.IsAny <string>())) .Returns(new[] { new Book(1, "", "", "") }); bookRepositoryStub.Setup(x => x.GetAllByTitleOrAuthor(It.IsAny <string>())) .Returns(new[] { new Book(2, "", "", "") }); var bookService = new BookService(bookRepositoryStub.Object); var invalid = "ISBN 12345-67890"; var actual = bookService.GetAllByQuery(invalid); Assert.Collection(actual, book => AssetTargetFallbackFramework.Equals(2, book.Id)); }
public void WarningPropertiesCollection_PackagePropertiesWithATFFrameworkAndWarningWithFramework(string frameworkString) { // Arrange var libraryId = "test_library"; var targetFramework = new AssetTargetFallbackFramework(NuGetFramework.Parse(frameworkString), new List <NuGetFramework>() { NuGetFramework.AnyFramework }); var packageSpecificWarningProperties = new PackageSpecificWarningProperties(); packageSpecificWarningProperties.Add(NuGetLogCode.NU1500, libraryId, targetFramework); var warningPropertiesCollection = new WarningPropertiesCollection(null, packageSpecificWarningProperties, null); var suppressedMessage = RestoreLogMessage.CreateWarning(NuGetLogCode.NU1500, "Warning", libraryId, frameworkString); // Act && Assert Assert.True(warningPropertiesCollection.ApplyWarningProperties(suppressedMessage)); }
public override async Task <IReadOnlyList <PackageSpec> > GetPackageSpecsAsync(DependencyGraphCacheContext context) { PackageSpec packageSpec = null; if (context == null || !context.PackageSpecCache.TryGetValue(MSBuildProjectPath, out packageSpec)) { packageSpec = JsonPackageSpecReader.GetPackageSpec(ProjectName, JsonConfigPath); if (packageSpec == null) { throw new InvalidOperationException( string.Format(Strings.ProjectNotLoaded_RestoreFailed, ProjectName)); } var metadata = new ProjectRestoreMetadata(); packageSpec.RestoreMetadata = metadata; metadata.ProjectStyle = ProjectStyle.ProjectJson; metadata.OutputPath = await GetMSBuildProjectExtensionsPathAsync(); metadata.ProjectPath = MSBuildProjectPath; metadata.ProjectJsonPath = packageSpec.FilePath; metadata.ProjectName = packageSpec.Name; metadata.ProjectUniqueName = MSBuildProjectPath; metadata.CacheFilePath = await GetCacheFilePathAsync(); // Reload the target framework from csproj and update the target framework in packageSpec for restore await UpdateInternalTargetFrameworkAsync(); if (TryGetInternalFramework(out var targetFramework)) { var nuGetFramework = targetFramework as NuGetFramework; if (IsUAPFramework(nuGetFramework)) { // Ensure the project json has only one target framework if (packageSpec.TargetFrameworks != null && packageSpec.TargetFrameworks.Count == 1) { var tfi = packageSpec.TargetFrameworks.First(); if (tfi.Imports.Count > 0) { if (tfi.AssetTargetFallback) { nuGetFramework = new AssetTargetFallbackFramework(nuGetFramework, tfi.Imports.AsList()); } else { nuGetFramework = new FallbackFramework(nuGetFramework, tfi.Imports.AsList()); } } tfi.FrameworkName = nuGetFramework; } } } var references = (await ProjectServices .ReferencesReader .GetProjectReferencesAsync(context.Logger, CancellationToken.None)) .ToList(); if (references != null && references.Count > 0) { // Add msbuild reference groups for each TFM in the project foreach (var framework in packageSpec.TargetFrameworks.Select(e => e.FrameworkName)) { metadata.TargetFrameworks.Add(new ProjectRestoreMetadataFrameworkInfo(framework)); } foreach (var reference in references) { // This reference applies to all frameworks // Include/exclude flags may be applied later when merged with project.json // Add the reference for all TFM groups, there are no conditional project // references in UWP. There should also be just one TFM. foreach (var frameworkInfo in metadata.TargetFrameworks) { frameworkInfo.ProjectReferences.Add(reference); } } } // Write restore settings to the package spec. // For project.json these properties may not come from the project file. var settings = context?.Settings ?? NullSettings.Instance; packageSpec.RestoreMetadata.PackagesPath = SettingsUtility.GetGlobalPackagesFolder(settings); packageSpec.RestoreMetadata.Sources = SettingsUtility.GetEnabledSources(settings).AsList(); packageSpec.RestoreMetadata.FallbackFolders = SettingsUtility.GetFallbackPackageFolders(settings).AsList(); packageSpec.RestoreMetadata.ConfigFilePaths = SettingsUtility.GetConfigFilePaths(settings).AsList(); context?.PackageSpecCache.Add(MSBuildProjectPath, packageSpec); } return(new[] { packageSpec }); }
public void GetTargetFrameworkInfos_WithCustomAliases_InfersCorrectTargetFramework() { // Arrange string latestNet = "latestNet"; string latestCore = "latestCore"; var atf = "net472"; var runtimeIdentifierGraphPath = Path.Combine(Path.GetTempPath(), "runtime.json"); var innerNodes = new Dictionary <string, IMSBuildProject> { [latestCore] = new MockMSBuildProject("Project-core", new Dictionary <string, string> { { "AssetTargetFallback", atf }, { "PackageTargetFallback", "" }, { "TargetFramework", latestCore }, { "TargetFrameworkIdentifier", FrameworkConstants.FrameworkIdentifiers.NetCoreApp }, { "TargetFrameworkVersion", "v5.0" }, { "TargetFrameworkMoniker", $"{FrameworkConstants.FrameworkIdentifiers.NetCoreApp},Version=5.0" }, { "TargetPlatformIdentifier", "android" }, { "TargetPlatformVersion", "21.0" }, { "TargetPlatformMoniker", "android,Version=21.0" }, { "RuntimeIdentifierGraphPath", runtimeIdentifierGraphPath } }, new Dictionary <string, IList <IMSBuildItem> > { ["PackageReference"] = new List <IMSBuildItem> { new MSBuildItem("PackageA", new Dictionary <string, string> { ["Version"] = "2.0.0" }), } }), [latestNet] = new MockMSBuildProject("Project-net", new Dictionary <string, string> { { "AssetTargetFallback", "" }, { "PackageTargetFallback", "" }, { "TargetFramework", latestNet }, { "TargetFrameworkIdentifier", FrameworkConstants.FrameworkIdentifiers.Net }, { "TargetFrameworkVersion", "v4.6.1" }, { "TargetFrameworkMoniker", $"{FrameworkConstants.FrameworkIdentifiers.Net},Version=4.6.1" }, { "TargetPlatformIdentifier", "" }, { "TargetPlatformVersion", "" }, { "TargetPlatformMoniker", "" }, { "RuntimeIdentifierGraphPath", runtimeIdentifierGraphPath } }, new Dictionary <string, IList <IMSBuildItem> > { ["PackageReference"] = new List <IMSBuildItem> { new MSBuildItem("PackageB", new Dictionary <string, string> { ["Version"] = "2.1.0" }), }, }), }; // Act List <TargetFrameworkInformation> targetFrameworkInfos = MSBuildStaticGraphRestore.GetTargetFrameworkInfos(innerNodes, isCpvmEnabled: false); // Assert targetFrameworkInfos.Should().HaveCount(2); TargetFrameworkInformation coreTFI = targetFrameworkInfos.Single(f => f.TargetAlias == latestCore); TargetFrameworkInformation netTFI = targetFrameworkInfos.Single(f => f.TargetAlias == latestNet); coreTFI.Dependencies.Should().HaveCount(1); coreTFI.Dependencies.Single().Name.Should().Be("PackageA"); coreTFI.Dependencies.Single().LibraryRange.VersionRange.OriginalString.Should().Be("2.0.0"); coreTFI.RuntimeIdentifierGraphPath.Should().Be(runtimeIdentifierGraphPath); coreTFI.FrameworkName.GetShortFolderName().Should().Be("net5.0-android21.0"); coreTFI.AssetTargetFallback.Should().BeTrue(); AssetTargetFallbackFramework assetTargetFallbackFramework = (AssetTargetFallbackFramework)coreTFI.FrameworkName; assetTargetFallbackFramework.Fallback.Should().HaveCount(1); assetTargetFallbackFramework.Fallback.Single().GetShortFolderName().Should().Be("net472"); netTFI.Dependencies.Should().HaveCount(1); netTFI.Dependencies.Single().Name.Should().Be("PackageB"); netTFI.Dependencies.Single().LibraryRange.VersionRange.OriginalString.Should().Be("2.1.0"); netTFI.RuntimeIdentifierGraphPath.Should().Be(runtimeIdentifierGraphPath); netTFI.FrameworkName.Should().Be(FrameworkConstants.CommonFrameworks.Net461); netTFI.AssetTargetFallback.Should().BeFalse(); }
public async Task GetDependenciesAsync_WhenPackageIsSelectedWithAssetTargetFallback_AndLegacyDependencyResolutionVariableIsSpecified_CorrectDependenciesAreSelected(string envValue, bool areDependenciesSelected) { // Arrange var testLogger = new TestLogger(); var cacheContext = new SourceCacheContext(); var findResource = new Mock <FindPackageByIdResource>(); var wrapper = new TestEnvironmentVariableReader(new Dictionary <string, string> { { "NUGET_USE_LEGACY_ASSET_TARGET_FALLBACK_DEPENDENCY_RESOLUTION", envValue } }); var net472 = FrameworkConstants.CommonFrameworks.Net472; var net60 = FrameworkConstants.CommonFrameworks.Net60; var inputFramework = new AssetTargetFallbackFramework(net60, new List <NuGetFramework> { net472 }); var packageDependencyGroups = new List <PackageDependencyGroup>(); var net472Group = new PackageDependencyGroup(net472, new PackageDependency[] { new PackageDependency("full.framework", VersionRange.Parse("1.0.0")) }); packageDependencyGroups.Add(net472Group); findResource.Setup(s => s.GetDependencyInfoAsync( It.IsAny <string>(), It.IsAny <NuGetVersion>(), It.IsAny <SourceCacheContext>(), It.IsAny <ILogger>(), It.IsAny <CancellationToken>())) .ReturnsAsync(new FindPackageByIdDependencyInfo( new PackageIdentity("x", NuGetVersion.Parse("1.0.0-beta")), packageDependencyGroups, Enumerable.Empty <FrameworkSpecificGroup>())); var source = new Mock <SourceRepository>(); source.Setup(s => s.GetResourceAsync <FindPackageByIdResource>()) .ReturnsAsync(findResource.Object); source.SetupGet(s => s.PackageSource) .Returns(new PackageSource("http://test/index.json")); var provider = new SourceRepositoryDependencyProvider( source.Object, testLogger, cacheContext, ignoreFailedSources: true, ignoreWarning: true, fileCache: null, isFallbackFolderSource: false, wrapper); // Act var library = await provider.GetDependenciesAsync( new LibraryIdentity("x", NuGetVersion.Parse("1.0.0-beta"), LibraryType.Package), inputFramework, cacheContext, testLogger, CancellationToken.None); // Assert if (areDependenciesSelected) { library.Dependencies.Should().HaveCount(1); var dependencies = library.Dependencies.Single(); dependencies.Name.Should().Be("full.framework"); } else { library.Dependencies.Should().HaveCount(0); } }