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));
        }
Exemplo n.º 6
0
        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;
     }
 }
Exemplo n.º 8
0
        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));
        }
Exemplo n.º 10
0
        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();
        }
Exemplo n.º 12
0
        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);
            }
        }