From cded17380bdf596835663bd9b0837f9892155d5c Mon Sep 17 00:00:00 2001 From: Andy Zivkovic Date: Tue, 30 Jan 2024 05:03:01 +0100 Subject: [PATCH 1/6] Add audit sources to ConfigurationDefaults --- .../NuGet.Configuration/PublicAPI.Shipped.txt | 8 +- .../PublicAPI.Unshipped.txt | 3 + .../Settings/ConfigurationDefaults.cs | 61 +++++++++----- .../Settings/SettingElementType.cs | 4 +- .../Settings/SettingFactory.cs | 1 + .../Utility/ConfigurationContants.cs | 2 + .../ConfigurationDefaultsTests.cs | 79 ++++++++++++++++++- 7 files changed, 132 insertions(+), 26 deletions(-) diff --git a/src/NuGet.Core/NuGet.Configuration/PublicAPI.Shipped.txt b/src/NuGet.Core/NuGet.Configuration/PublicAPI.Shipped.txt index 332293bee5b..127d96cb960 100644 --- a/src/NuGet.Core/NuGet.Configuration/PublicAPI.Shipped.txt +++ b/src/NuGet.Core/NuGet.Configuration/PublicAPI.Shipped.txt @@ -29,9 +29,9 @@ NuGet.Configuration.ClientCertificateProvider ~NuGet.Configuration.ClientCertificateProvider.Remove(System.Collections.Generic.IReadOnlyList items) -> void NuGet.Configuration.ConfigurationConstants NuGet.Configuration.ConfigurationDefaults -~NuGet.Configuration.ConfigurationDefaults.DefaultPackageRestoreConsent.get -> string -~NuGet.Configuration.ConfigurationDefaults.DefaultPackageSources.get -> System.Collections.Generic.IEnumerable -~NuGet.Configuration.ConfigurationDefaults.DefaultPushSource.get -> string +NuGet.Configuration.ConfigurationDefaults.DefaultPackageRestoreConsent.get -> string? +NuGet.Configuration.ConfigurationDefaults.DefaultPackageSources.get -> System.Collections.Generic.IEnumerable! +NuGet.Configuration.ConfigurationDefaults.DefaultPushSource.get -> string? NuGet.Configuration.CredentialRequestType NuGet.Configuration.CredentialRequestType.Forbidden = 2 -> NuGet.Configuration.CredentialRequestType NuGet.Configuration.CredentialRequestType.Proxy = 0 -> NuGet.Configuration.CredentialRequestType @@ -401,7 +401,7 @@ override NuGet.Configuration.UnknownItem.IsEmpty() -> bool ~override NuGet.Configuration.VirtualSettingSection.Clone() -> NuGet.Configuration.SettingBase ~override sealed NuGet.Configuration.AddItem.Equals(object other) -> bool override sealed NuGet.Configuration.AddItem.GetHashCode() -> int -~static NuGet.Configuration.ConfigurationDefaults.Instance.get -> NuGet.Configuration.ConfigurationDefaults +static NuGet.Configuration.ConfigurationDefaults.Instance.get -> NuGet.Configuration.ConfigurationDefaults! ~static NuGet.Configuration.EncryptionUtility.DecryptString(string encryptedString) -> string ~static NuGet.Configuration.EncryptionUtility.EncryptString(string value) -> string ~static NuGet.Configuration.NuGetPathContext.Create(NuGet.Configuration.ISettings settings) -> NuGet.Configuration.NuGetPathContext diff --git a/src/NuGet.Core/NuGet.Configuration/PublicAPI.Unshipped.txt b/src/NuGet.Core/NuGet.Configuration/PublicAPI.Unshipped.txt index f49e3134859..416f69d6a05 100644 --- a/src/NuGet.Core/NuGet.Configuration/PublicAPI.Unshipped.txt +++ b/src/NuGet.Core/NuGet.Configuration/PublicAPI.Unshipped.txt @@ -1,5 +1,8 @@ #nullable enable +NuGet.Configuration.ConfigurationDefaults.DefaultAuditSources.get -> System.Collections.Generic.IReadOnlyList! +NuGet.Configuration.SettingElementType.AuditSources = 20 -> NuGet.Configuration.SettingElementType ~NuGet.Configuration.SettingElement.ConfigPath.get -> string ~NuGet.Configuration.SettingItem.GetAttributes() -> System.Collections.Generic.IReadOnlyDictionary ~NuGet.Configuration.Settings.GetAllSettingSections() -> System.Collections.Generic.IEnumerable ~static NuGet.Configuration.ConfigurationConstants.GetConfigKeys() -> System.Collections.Generic.IReadOnlyList +~static readonly NuGet.Configuration.ConfigurationConstants.AuditSources -> string diff --git a/src/NuGet.Core/NuGet.Configuration/Settings/ConfigurationDefaults.cs b/src/NuGet.Core/NuGet.Configuration/Settings/ConfigurationDefaults.cs index 2480db8aafe..42ff6c671f7 100644 --- a/src/NuGet.Core/NuGet.Configuration/Settings/ConfigurationDefaults.cs +++ b/src/NuGet.Core/NuGet.Configuration/Settings/ConfigurationDefaults.cs @@ -1,6 +1,8 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +#nullable enable + using System; using System.Collections.Generic; using System.IO; @@ -13,8 +15,9 @@ public class ConfigurationDefaults { private ISettings _settingsManager = NullSettings.Instance; private bool _defaultPackageSourceInitialized; - private List _defaultPackageSources; - private string _defaultPushSource; + private IReadOnlyList? _defaultPackageSources; + private IReadOnlyList? _defaultAuditSources; + private string? _defaultPushSource; private static ConfigurationDefaults InitializeInstance() { @@ -49,32 +52,54 @@ internal ConfigurationDefaults(string directory, string configFile) public static ConfigurationDefaults Instance { get; } = InitializeInstance(); + private IReadOnlyList GetSourceItems(string sectionName) + { + IEnumerable? sourceItems = _settingsManager.GetSection(sectionName)?.Items.OfType(); + if (sourceItems == null) + { + return Array.Empty(); + } + + var disabledPackageSources = _settingsManager.GetSection(ConfigurationConstants.DisabledPackageSources)?.Items.OfType() ?? Enumerable.Empty(); + + List sources = new(); + foreach (var source in sourceItems) + { + // In a SettingValue representing a package source, the Key represents the name of the package source and the Value its source + sources.Add(new PackageSource(source.GetValueAsPath(), + source.Key, + isEnabled: !disabledPackageSources.Any(p => p.Key.Equals(source.Key, StringComparison.OrdinalIgnoreCase)), + isOfficial: true)); + } + + return sources; + } + public IEnumerable DefaultPackageSources { get { if (_defaultPackageSources == null) { - List defaultPackageSources = new(); - var disabledPackageSources = _settingsManager.GetSection(ConfigurationConstants.DisabledPackageSources)?.Items.OfType() ?? Enumerable.Empty(); - var packageSources = _settingsManager.GetSection(ConfigurationConstants.PackageSources)?.Items.OfType() ?? Enumerable.Empty(); - - foreach (var source in packageSources) - { - // In a SettingValue representing a package source, the Key represents the name of the package source and the Value its source - defaultPackageSources.Add(new PackageSource(source.GetValueAsPath(), - source.Key, - isEnabled: !disabledPackageSources.Any(p => p.Key.Equals(source.Key, StringComparison.OrdinalIgnoreCase)), - isOfficial: true)); - } - - _defaultPackageSources = defaultPackageSources; + _defaultPackageSources = GetSourceItems(ConfigurationConstants.PackageSources); } return _defaultPackageSources; } } - public string DefaultPushSource + public IReadOnlyList DefaultAuditSources + { + get + { + if (_defaultAuditSources is null) + { + _defaultAuditSources = GetSourceItems(ConfigurationConstants.AuditSources); + } + return _defaultAuditSources; + } + } + + public string? DefaultPushSource { get { @@ -89,6 +114,6 @@ public string DefaultPushSource } } - public string DefaultPackageRestoreConsent => SettingsUtility.GetValueForAddItem(_settingsManager, ConfigurationConstants.PackageRestore, ConfigurationConstants.Enabled); + public string? DefaultPackageRestoreConsent => SettingsUtility.GetValueForAddItem(_settingsManager, ConfigurationConstants.PackageRestore, ConfigurationConstants.Enabled); } } diff --git a/src/NuGet.Core/NuGet.Configuration/Settings/SettingElementType.cs b/src/NuGet.Core/NuGet.Configuration/Settings/SettingElementType.cs index ecfe23b441a..312f5f095a6 100644 --- a/src/NuGet.Core/NuGet.Configuration/Settings/SettingElementType.cs +++ b/src/NuGet.Core/NuGet.Configuration/Settings/SettingElementType.cs @@ -43,12 +43,12 @@ public enum SettingElementType StoreCert, - /** Package Source Mapping **/ - PackageSourceMapping, PackageSource, Package, + + AuditSources, } } diff --git a/src/NuGet.Core/NuGet.Configuration/Settings/SettingFactory.cs b/src/NuGet.Core/NuGet.Configuration/Settings/SettingFactory.cs index eecf230e527..195b3b36d02 100644 --- a/src/NuGet.Core/NuGet.Configuration/Settings/SettingFactory.cs +++ b/src/NuGet.Core/NuGet.Configuration/Settings/SettingFactory.cs @@ -43,6 +43,7 @@ internal static SettingBase Parse(XNode node, SettingsFile origin) return new CredentialsItem(element, origin); case SettingElementType.PackageSources: + case SettingElementType.AuditSources: if (elementType == SettingElementType.Add) { return new SourceItem(element, origin); diff --git a/src/NuGet.Core/NuGet.Configuration/Utility/ConfigurationContants.cs b/src/NuGet.Core/NuGet.Configuration/Utility/ConfigurationContants.cs index 004fdad400a..d82b381b523 100644 --- a/src/NuGet.Core/NuGet.Configuration/Utility/ConfigurationContants.cs +++ b/src/NuGet.Core/NuGet.Configuration/Utility/ConfigurationContants.cs @@ -17,6 +17,8 @@ public static class ConfigurationConstants public static readonly string ApiKeys = "apikeys"; + public static readonly string AuditSources = "auditSources"; + public static readonly string Author = "author"; public static readonly string BeginIgnoreMarker = "NUGET: BEGIN LICENSE TEXT"; diff --git a/test/NuGet.Core.Tests/NuGet.Configuration.Test/ConfigurationDefaultsTests.cs b/test/NuGet.Core.Tests/NuGet.Configuration.Test/ConfigurationDefaultsTests.cs index cdbb29e0544..bfc788c85ed 100644 --- a/test/NuGet.Core.Tests/NuGet.Configuration.Test/ConfigurationDefaultsTests.cs +++ b/test/NuGet.Core.Tests/NuGet.Configuration.Test/ConfigurationDefaultsTests.cs @@ -1,10 +1,13 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +#nullable enable + using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; +using FluentAssertions; using NuGet.Test.Utility; using Xunit; @@ -49,12 +52,13 @@ public void ConfigDefaultsAreProperlyReadFromConfigDefaultsFile() //Act ConfigurationDefaults configDefaults = new ConfigurationDefaults(nugetConfigFileFolder, nugetConfigFile); IEnumerable defaultSourcesFromConfigFile = configDefaults.DefaultPackageSources; - string packageRestore = configDefaults.DefaultPackageRestoreConsent; - string packagePushSource = configDefaults.DefaultPushSource; + string? packageRestore = configDefaults.DefaultPackageRestoreConsent; + string? packagePushSource = configDefaults.DefaultPushSource; //Assert VerifyPackageSource(defaultSourcesFromConfigFile, 2, new string[] { name1, name2 }, new string[] { feed1, feed2 }); Assert.Equal(feed2, packagePushSource); + Assert.NotNull(packageRestore); Assert.Equal("true", packageRestore.ToLowerInvariant()); } } @@ -343,6 +347,77 @@ public void GetDefaultSameSourcePackageSourcesFromSourceProvider() } } + [Fact] + public void DefaultAuditSources_ConfigWithoutAuditSources_ReturnsEmptyList() + { + // Arrange + using (var mockBaseDirectory = TestDirectory.CreateInTemp()) + { + const string configurationDefaultsContent = @""; + ConfigurationDefaults configurationDefaults = GetConfigurationDefaults(configurationDefaultsContent, mockBaseDirectory); + + // Act + var defaultAuditSources = configurationDefaults.DefaultAuditSources; + + // Assert + Assert.NotNull(defaultAuditSources); + Assert.Empty(defaultAuditSources); + } + } + + [Fact] + public void DefaultAuditSources_ConfigWithAuditSources_ReturnsNonEmptyList() + { + // Arrange + using (var mockBaseDirectory = TestDirectory.CreateInTemp()) + { + const string configurationDefaultsContent = @" + + + +"; + ConfigurationDefaults configurationDefaults = GetConfigurationDefaults(configurationDefaultsContent, mockBaseDirectory); + + // Act + var defaultAuditSources = configurationDefaults.DefaultAuditSources; + + // Assert + Assert.NotNull(defaultAuditSources); + var auditSource = Assert.Single(defaultAuditSources); + auditSource.Source.Should().Be("https://contoso.text/nuget/v3/index.json"); + auditSource.Name.Should().Be("contoso"); + auditSource.IsEnabled.Should().BeTrue(); + } + } + + [Fact] + public void DefaultAuditSources_ConfigWithDisabledAuditSources_ReturnsEmptyList() + { + // Arrange + using (var mockBaseDirectory = TestDirectory.CreateInTemp()) + { + const string configurationDefaultsContent = @" + + + + + + +"; + ConfigurationDefaults configurationDefaults = GetConfigurationDefaults(configurationDefaultsContent, mockBaseDirectory); + + // Act + var defaultAuditSources = configurationDefaults.DefaultAuditSources; + + // Assert + Assert.NotNull(defaultAuditSources); + var auditSource = Assert.Single(defaultAuditSources); + auditSource.Source.Should().Be("https://contoso.text/nuget/v3/index.json"); + auditSource.Name.Should().Be("contoso"); + auditSource.IsEnabled.Should().BeFalse(); + } + } + private string CreateNuGetConfigContent(string enabledReplacement = "", string disabledReplacement = "", string defaultPushSource = "") { var nugetConfigBaseString = new StringBuilder(); From e5f0f4b34998b4d823c666872ffc65ab7ad4e8de Mon Sep 17 00:00:00 2001 From: Andy Zivkovic Date: Tue, 30 Jan 2024 07:03:22 +0100 Subject: [PATCH 2/6] Add LoadAuditSources to PackageSourceProvider --- NuGet.Config | 17 +-- .../PackageSource/IPackageSourceProvider.cs | 18 ++- .../PackageSource/PackageSourceProvider.cs | 119 +++++++++++------- .../NuGet.Configuration/PublicAPI.Shipped.txt | 74 +++++------ .../PublicAPI.Unshipped.txt | 4 + .../TestPackageSourceProvider.cs | 2 + .../PackageSourceProviderTests.cs | 84 +++++++++++++ .../TestSourceRepositoryUtility.cs | 2 + 8 files changed, 228 insertions(+), 92 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index 8410ee494bf..879fb15bd09 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,4 +1,4 @@ - + @@ -8,10 +8,11 @@ + - + @@ -40,14 +41,14 @@ - + - + - + @@ -72,13 +73,13 @@ - + - + - + diff --git a/src/NuGet.Core/NuGet.Configuration/PackageSource/IPackageSourceProvider.cs b/src/NuGet.Core/NuGet.Configuration/PackageSource/IPackageSourceProvider.cs index b9edf3eab00..174a0917d86 100644 --- a/src/NuGet.Core/NuGet.Configuration/PackageSource/IPackageSourceProvider.cs +++ b/src/NuGet.Core/NuGet.Configuration/PackageSource/IPackageSourceProvider.cs @@ -1,6 +1,8 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +#nullable enable + using System; using System.Collections.Generic; @@ -14,13 +16,19 @@ public interface IPackageSourceProvider /// Enumerable of all of the package sources IEnumerable LoadPackageSources(); + /// + /// Gets a list of all of the audit sources + /// + /// Read only list of all of the audit sources + IReadOnlyList LoadAuditSources(); + /// /// Gets the source that matches a given name. /// /// Name of source to be searched for /// PackageSource that matches the given name. Null if none was found /// ArgumentException when is null or empty. - PackageSource GetPackageSourceByName(string name); + PackageSource? GetPackageSourceByName(string name); /// /// Gets the source that matches a given source url. @@ -29,12 +37,12 @@ public interface IPackageSourceProvider /// PackageSource that matches the given source. Null if none was found /// ArgumentException when is null or empty. /// There may be multiple sources that match a given url. This method will return the first. - PackageSource GetPackageSourceBySource(string source); + PackageSource? GetPackageSourceBySource(string source); /// /// Event raised when the package sources have been changed. /// - event EventHandler PackageSourcesChanged; + event EventHandler? PackageSourcesChanged; /// /// Removes the package source that matches the given name @@ -86,12 +94,12 @@ public interface IPackageSourceProvider /// /// Gets the name of the active PackageSource /// - string ActivePackageSourceName { get; } + string? ActivePackageSourceName { get; } /// /// Gets the Default push source /// - string DefaultPushSource { get; } + string? DefaultPushSource { get; } /// /// Updates the active package source with the given source. diff --git a/src/NuGet.Core/NuGet.Configuration/PackageSource/PackageSourceProvider.cs b/src/NuGet.Core/NuGet.Configuration/PackageSource/PackageSourceProvider.cs index 4c166c01022..be82a63462e 100644 --- a/src/NuGet.Core/NuGet.Configuration/PackageSource/PackageSourceProvider.cs +++ b/src/NuGet.Core/NuGet.Configuration/PackageSource/PackageSourceProvider.cs @@ -1,6 +1,8 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +#nullable enable + using System; using System.Collections.Generic; using System.Globalization; @@ -15,12 +17,10 @@ public class PackageSourceProvider : IPackageSourceProvider internal const int MaxSupportedProtocolVersion = 3; private readonly IReadOnlyList _configurationDefaultSources; + private readonly IReadOnlyList _configurationDefaultAuditSources; public PackageSourceProvider( - ISettings settings) -#pragma warning disable CS0618 // Type or member is obsolete - : this(settings, ConfigurationDefaults.Instance.DefaultPackageSources, enablePackageSourcesChangedEvent: true) -#pragma warning restore CS0618 // Type or member is obsolete + ISettings settings) : this(settings, ConfigurationDefaults.Instance.DefaultPackageSources, ConfigurationDefaults.Instance.DefaultAuditSources, enablePackageSourcesChangedEvent: true) { } @@ -28,23 +28,46 @@ public PackageSourceProvider( public PackageSourceProvider( ISettings settings, bool enablePackageSourcesChangedEvent) - : this(settings, ConfigurationDefaults.Instance.DefaultPackageSources, enablePackageSourcesChangedEvent) + : this(settings, ConfigurationDefaults.Instance.DefaultPackageSources, ConfigurationDefaults.Instance.DefaultAuditSources, enablePackageSourcesChangedEvent) { } public PackageSourceProvider( ISettings settings, IEnumerable configurationDefaultSources) -#pragma warning disable CS0618 // Type or member is obsolete - : this(settings, configurationDefaultSources, enablePackageSourcesChangedEvent: true) -#pragma warning restore CS0618 // Type or member is obsolete + : this(settings, configurationDefaultSources, ConfigurationDefaults.Instance.DefaultAuditSources, enablePackageSourcesChangedEvent: true) + { + } + + [Obsolete("https://github.com/NuGet/Home/issues/8479")] + public PackageSourceProvider( + ISettings settings, + IEnumerable configurationDefaultSources, + bool enablePackageSourcesChangedEvent) + : this(settings, configurationDefaultSources, ConfigurationDefaults.Instance.DefaultAuditSources, enablePackageSourcesChangedEvent) + { + } + + public PackageSourceProvider( + ISettings settings, + ConfigurationDefaults configurationDefaults) + : this(settings, configurationDefaults.DefaultPackageSources, configurationDefaults.DefaultAuditSources, enablePackageSourcesChangedEvent: true) { } [Obsolete("https://github.com/NuGet/Home/issues/8479")] public PackageSourceProvider( + ISettings settings, + ConfigurationDefaults configurationDefaults, + bool enablePackageSourcesChangedEvent) + : this(settings, configurationDefaults.DefaultPackageSources, configurationDefaults.DefaultAuditSources, enablePackageSourcesChangedEvent) + { + } + + private PackageSourceProvider( ISettings settings, IEnumerable configurationDefaultSources, + IReadOnlyList configurationDefaultAuditSources, bool enablePackageSourcesChangedEvent) { Settings = settings ?? throw new ArgumentNullException(nameof(settings)); @@ -57,6 +80,11 @@ public PackageSourceProvider( throw new ArgumentNullException(nameof(configurationDefaultSources)); } _configurationDefaultSources = LoadConfigurationDefaultSources(configurationDefaultSources); + if (configurationDefaultAuditSources is null) + { + throw new ArgumentNullException(nameof(configurationDefaultAuditSources)); + } + _configurationDefaultAuditSources = LoadConfigurationDefaultSources(configurationDefaultAuditSources); } private static IReadOnlyList LoadConfigurationDefaultSources(IEnumerable configurationDefaultSources) @@ -84,14 +112,17 @@ private static IReadOnlyList LoadConfigurationDefaultSources(IEnu return defaultSources.AsReadOnly(); } - private static List GetPackageSourceFromSettings(ISettings settings) + private static List GetPackageSourceFromSettings(ISettings settings, string sectionName) { - var packageSourcesSection = settings.GetSection(ConfigurationConstants.PackageSources); + var packageSourcesSection = settings.GetSection(sectionName); var sourcesItems = packageSourcesSection?.Items.OfType(); // Order the list so that the closer to the user appear first IList configFilePaths = settings.GetConfigFilePaths(); +#pragma warning disable CS8604 // Possible null reference argument. + // netfx and netstandard BCLs are missing nullability annotations. var sources = sourcesItems?.OrderBy(i => configFilePaths.IndexOf(i.Origin?.ConfigFilePath)); //lower index => higher priority => closer to user. +#pragma warning restore CS8604 // Possible null reference argument. List packageSources; @@ -133,7 +164,12 @@ private static List GetPackageSourceFromSettings(ISettings settin /// public IEnumerable LoadPackageSources() { - return LoadPackageSources(Settings, _configurationDefaultSources); + return LoadPackageSources(Settings, ConfigurationConstants.PackageSources, _configurationDefaultSources); + } + + public IReadOnlyList LoadAuditSources() + { + return LoadPackageSources(Settings, ConfigurationConstants.AuditSources, _configurationDefaultAuditSources); } /// @@ -141,16 +177,16 @@ public IEnumerable LoadPackageSources() /// public static IEnumerable LoadPackageSources(ISettings settings) { - return LoadPackageSources(settings, ConfigurationDefaults.Instance.DefaultPackageSources); + return LoadPackageSources(settings, ConfigurationConstants.PackageSources, ConfigurationDefaults.Instance.DefaultPackageSources); } - private static List LoadPackageSources(ISettings settings, IEnumerable defaultPackageSources) + private static List LoadPackageSources(ISettings settings, string sectionName, IEnumerable defaultSources) { - List loadedPackageSources = GetPackageSourceFromSettings(settings); + List loadedPackageSources = GetPackageSourceFromSettings(settings, sectionName); - if (defaultPackageSources != null && defaultPackageSources.Any()) + if (defaultSources != null && defaultSources.Any()) { - AddDefaultPackageSources(loadedPackageSources, defaultPackageSources); + AddDefaultPackageSources(loadedPackageSources, defaultSources); } return loadedPackageSources; @@ -254,7 +290,7 @@ private static void AddOrUpdateIndexedSource( } } - private static PackageSourceCredential ReadCredential(string sourceName, ISettings settings) + private static PackageSourceCredential? ReadCredential(string sourceName, ISettings settings) { var environmentCredentials = ReadCredentialFromEnvironment(sourceName); @@ -279,7 +315,7 @@ private static PackageSourceCredential ReadCredential(string sourceName, ISettin return null; } - private static PackageSourceCredential ReadCredentialFromEnvironment(string sourceName) + private static PackageSourceCredential? ReadCredentialFromEnvironment(string sourceName) { var rawCredentials = Environment.GetEnvironmentVariable("NuGetPackageSourceCredentials_" + sourceName); if (string.IsNullOrEmpty(rawCredentials)) @@ -301,14 +337,14 @@ private static PackageSourceCredential ReadCredentialFromEnvironment(string sour validAuthenticationTypesText: match.Groups["authTypes"].Value); } - public PackageSource GetPackageSourceByName(string name) + public PackageSource? GetPackageSourceByName(string name) { if (string.IsNullOrEmpty(name)) { throw new ArgumentException(Resources.Argument_Cannot_Be_Null_Or_Empty, nameof(name)); } - List packageSources = LoadPackageSources(Settings, _configurationDefaultSources); + List packageSources = LoadPackageSources(Settings, ConfigurationConstants.PackageSources, _configurationDefaultSources); foreach (var packageSource in packageSources) { @@ -325,7 +361,7 @@ public HashSet GetPackageSourceNamesMatchingNamePrefix(string namePrefix { var names = new HashSet(); - List packageSources = LoadPackageSources(Settings, _configurationDefaultSources); + List packageSources = LoadPackageSources(Settings, ConfigurationConstants.PackageSources, _configurationDefaultSources); foreach (PackageSource packageSource in packageSources) { if (packageSource.Name.StartsWith(namePrefix, StringComparison.OrdinalIgnoreCase)) @@ -337,14 +373,14 @@ public HashSet GetPackageSourceNamesMatchingNamePrefix(string namePrefix return names; } - public PackageSource GetPackageSourceBySource(string source) + public PackageSource? GetPackageSourceBySource(string source) { if (string.IsNullOrEmpty(source)) { throw new ArgumentException(Resources.Argument_Cannot_Be_Null_Or_Empty, nameof(source)); } - List packageSources = LoadPackageSources(Settings, _configurationDefaultSources); + List packageSources = LoadPackageSources(Settings, ConfigurationConstants.PackageSources, _configurationDefaultSources); foreach (var packageSource in packageSources) { @@ -449,9 +485,9 @@ private void AddDisabledSource(string name, bool shouldSkipSave, ref bool isDirt { try { - if (sourceSetting.Origin != null) + if (sourceSetting.Origin != null && Settings is Settings castSettings) { - (Settings as Settings).AddOrUpdate(sourceSetting.Origin, ConfigurationConstants.DisabledPackageSources, new AddItem(name, "true")); + castSettings.AddOrUpdate(sourceSetting.Origin, ConfigurationConstants.DisabledPackageSources, new AddItem(name, "true")); isDirty = true; addedInSameFileAsCurrentSource = true; } @@ -522,8 +558,8 @@ public void UpdatePackageSource(PackageSource source, bool updateCredentials, bo if (sourceToUpdate != null) { - AddItem disabledSourceItem = null; - CredentialsItem credentialsSettingsItem = null; + AddItem? disabledSourceItem = null; + CredentialsItem? credentialsSettingsItem = null; if (updateEnabled) { @@ -557,8 +593,8 @@ public void UpdatePackageSource(PackageSource source, bool updateCredentials, bo private void UpdatePackageSource( PackageSource newSource, PackageSource existingSource, - AddItem existingDisabledSourceItem, - CredentialsItem existingCredentialsItem, + AddItem? existingDisabledSourceItem, + CredentialsItem? existingCredentialsItem, bool updateEnabled, bool updateCredentials, bool shouldSkipSave, @@ -672,7 +708,7 @@ public void SavePackageSources(IEnumerable sources) var disabledSourcesSection = Settings.GetSection(ConfigurationConstants.DisabledPackageSources); var existingDisabledSources = disabledSourcesSection?.Items.OfType(); - Dictionary existingDisabledSourcesLookup = null; + Dictionary? existingDisabledSourcesLookup = null; try { @@ -694,14 +730,13 @@ public void SavePackageSources(IEnumerable sources) foreach (var source in sources) { - AddItem existingDisabledSourceItem = null; - SourceItem existingSourceItem = null; - CredentialsItem existingCredentialsItem = null; + AddItem? existingDisabledSourceItem = null; + SourceItem? existingSourceItem = null; + CredentialsItem? existingCredentialsItem = null; var existingSourceIsEnabled = existingDisabledSourcesLookup == null || existingDisabledSourcesLookup.TryGetValue(source.Name, out existingDisabledSourceItem); - if (existingSettingsLookup != null && - existingSettingsLookup.TryGetValue(source.Name, out existingSourceItem)) + if (existingSettingsLookup.TryGetValue(source.Name, out existingSourceItem)) { var oldPackageSource = ReadPackageSource(existingSourceItem, existingSourceIsEnabled, Settings); @@ -764,8 +799,8 @@ public void SavePackageSources(IEnumerable sources) private Dictionary GetExistingSettingsLookup() { - var sourcesSection = Settings.GetSection(ConfigurationConstants.PackageSources); - var existingSettings = sourcesSection?.Items.OfType().Where( + SettingSection? sourcesSection = Settings.GetSection(ConfigurationConstants.PackageSources); + List? existingSettings = sourcesSection?.Items.OfType().Where( c => !(c.Origin == null || c.Origin.IsReadOnly || c.Origin.IsMachineWide)) .ToList(); @@ -796,7 +831,7 @@ private void OnPackageSourcesChanged() PackageSourcesChanged?.Invoke(this, EventArgs.Empty); } - public string DefaultPushSource + public string? DefaultPushSource { get { @@ -840,7 +875,7 @@ public bool IsPackageSourceEnabled(PackageSource source) /// /// Gets the name of the ActivePackageSource from NuGet.Config /// - public string ActivePackageSourceName + public string? ActivePackageSourceName { get { @@ -885,11 +920,11 @@ public void SaveActivePackageSource(PackageSource source) private class IndexedPackageSource { - public int Index { get; set; } + public required int Index { get; init; } - public PackageSource PackageSource { get; set; } + public required PackageSource PackageSource { get; set; } } - public event EventHandler PackageSourcesChanged; + public event EventHandler? PackageSourcesChanged; } } diff --git a/src/NuGet.Core/NuGet.Configuration/PublicAPI.Shipped.txt b/src/NuGet.Core/NuGet.Configuration/PublicAPI.Shipped.txt index 127d96cb960..230bc932429 100644 --- a/src/NuGet.Core/NuGet.Configuration/PublicAPI.Shipped.txt +++ b/src/NuGet.Core/NuGet.Configuration/PublicAPI.Shipped.txt @@ -69,20 +69,20 @@ NuGet.Configuration.IExtensionLocator NuGet.Configuration.IMachineWideSettings ~NuGet.Configuration.IMachineWideSettings.Settings.get -> NuGet.Configuration.ISettings NuGet.Configuration.IPackageSourceProvider -~NuGet.Configuration.IPackageSourceProvider.ActivePackageSourceName.get -> string -~NuGet.Configuration.IPackageSourceProvider.AddPackageSource(NuGet.Configuration.PackageSource source) -> void -~NuGet.Configuration.IPackageSourceProvider.DefaultPushSource.get -> string -~NuGet.Configuration.IPackageSourceProvider.DisablePackageSource(string name) -> void -~NuGet.Configuration.IPackageSourceProvider.EnablePackageSource(string name) -> void -~NuGet.Configuration.IPackageSourceProvider.GetPackageSourceByName(string name) -> NuGet.Configuration.PackageSource -~NuGet.Configuration.IPackageSourceProvider.GetPackageSourceBySource(string source) -> NuGet.Configuration.PackageSource -~NuGet.Configuration.IPackageSourceProvider.IsPackageSourceEnabled(string name) -> bool -~NuGet.Configuration.IPackageSourceProvider.LoadPackageSources() -> System.Collections.Generic.IEnumerable -NuGet.Configuration.IPackageSourceProvider.PackageSourcesChanged -> System.EventHandler -~NuGet.Configuration.IPackageSourceProvider.RemovePackageSource(string name) -> void -~NuGet.Configuration.IPackageSourceProvider.SaveActivePackageSource(NuGet.Configuration.PackageSource source) -> void -~NuGet.Configuration.IPackageSourceProvider.SavePackageSources(System.Collections.Generic.IEnumerable sources) -> void -~NuGet.Configuration.IPackageSourceProvider.UpdatePackageSource(NuGet.Configuration.PackageSource source, bool updateCredentials, bool updateEnabled) -> void +NuGet.Configuration.IPackageSourceProvider.ActivePackageSourceName.get -> string? +NuGet.Configuration.IPackageSourceProvider.AddPackageSource(NuGet.Configuration.PackageSource! source) -> void +NuGet.Configuration.IPackageSourceProvider.DefaultPushSource.get -> string? +NuGet.Configuration.IPackageSourceProvider.DisablePackageSource(string! name) -> void +NuGet.Configuration.IPackageSourceProvider.EnablePackageSource(string! name) -> void +NuGet.Configuration.IPackageSourceProvider.GetPackageSourceByName(string! name) -> NuGet.Configuration.PackageSource? +NuGet.Configuration.IPackageSourceProvider.GetPackageSourceBySource(string! source) -> NuGet.Configuration.PackageSource? +NuGet.Configuration.IPackageSourceProvider.IsPackageSourceEnabled(string! name) -> bool +NuGet.Configuration.IPackageSourceProvider.LoadPackageSources() -> System.Collections.Generic.IEnumerable! +NuGet.Configuration.IPackageSourceProvider.PackageSourcesChanged -> System.EventHandler? +NuGet.Configuration.IPackageSourceProvider.RemovePackageSource(string! name) -> void +NuGet.Configuration.IPackageSourceProvider.SaveActivePackageSource(NuGet.Configuration.PackageSource! source) -> void +NuGet.Configuration.IPackageSourceProvider.SavePackageSources(System.Collections.Generic.IEnumerable! sources) -> void +NuGet.Configuration.IPackageSourceProvider.UpdatePackageSource(NuGet.Configuration.PackageSource! source, bool updateCredentials, bool updateEnabled) -> void NuGet.Configuration.IProxyCache ~NuGet.Configuration.IProxyCache.Add(System.Net.IWebProxy proxy) -> void ~NuGet.Configuration.IProxyCache.GetProxy(System.Uri uri) -> System.Net.IWebProxy @@ -186,28 +186,28 @@ NuGet.Configuration.PackageSourceMappingSourceItem ~NuGet.Configuration.PackageSourceMappingSourceItem.Patterns.get -> System.Collections.Generic.IList ~NuGet.Configuration.PackageSourceMappingSourceItem.SetKey(string value) -> void NuGet.Configuration.PackageSourceProvider -~NuGet.Configuration.PackageSourceProvider.ActivePackageSourceName.get -> string -~NuGet.Configuration.PackageSourceProvider.AddPackageSource(NuGet.Configuration.PackageSource source) -> void -~NuGet.Configuration.PackageSourceProvider.DefaultPushSource.get -> string -~NuGet.Configuration.PackageSourceProvider.DisablePackageSource(NuGet.Configuration.PackageSource source) -> void -~NuGet.Configuration.PackageSourceProvider.DisablePackageSource(string name) -> void -~NuGet.Configuration.PackageSourceProvider.EnablePackageSource(string name) -> void -~NuGet.Configuration.PackageSourceProvider.GetPackageSourceByName(string name) -> NuGet.Configuration.PackageSource -~NuGet.Configuration.PackageSourceProvider.GetPackageSourceBySource(string source) -> NuGet.Configuration.PackageSource -~NuGet.Configuration.PackageSourceProvider.GetPackageSourceNamesMatchingNamePrefix(string namePrefix) -> System.Collections.Generic.HashSet -~NuGet.Configuration.PackageSourceProvider.IsPackageSourceEnabled(NuGet.Configuration.PackageSource source) -> bool -~NuGet.Configuration.PackageSourceProvider.IsPackageSourceEnabled(string name) -> bool -~NuGet.Configuration.PackageSourceProvider.LoadPackageSources() -> System.Collections.Generic.IEnumerable -~NuGet.Configuration.PackageSourceProvider.PackageSourceProvider(NuGet.Configuration.ISettings settings) -> void -~NuGet.Configuration.PackageSourceProvider.PackageSourceProvider(NuGet.Configuration.ISettings settings, System.Collections.Generic.IEnumerable configurationDefaultSources) -> void -~NuGet.Configuration.PackageSourceProvider.PackageSourceProvider(NuGet.Configuration.ISettings settings, System.Collections.Generic.IEnumerable configurationDefaultSources, bool enablePackageSourcesChangedEvent) -> void -~NuGet.Configuration.PackageSourceProvider.PackageSourceProvider(NuGet.Configuration.ISettings settings, bool enablePackageSourcesChangedEvent) -> void -NuGet.Configuration.PackageSourceProvider.PackageSourcesChanged -> System.EventHandler -~NuGet.Configuration.PackageSourceProvider.RemovePackageSource(string name) -> void -~NuGet.Configuration.PackageSourceProvider.SaveActivePackageSource(NuGet.Configuration.PackageSource source) -> void -~NuGet.Configuration.PackageSourceProvider.SavePackageSources(System.Collections.Generic.IEnumerable sources) -> void -~NuGet.Configuration.PackageSourceProvider.Settings.get -> NuGet.Configuration.ISettings -~NuGet.Configuration.PackageSourceProvider.UpdatePackageSource(NuGet.Configuration.PackageSource source, bool updateCredentials, bool updateEnabled) -> void +NuGet.Configuration.PackageSourceProvider.ActivePackageSourceName.get -> string? +NuGet.Configuration.PackageSourceProvider.AddPackageSource(NuGet.Configuration.PackageSource! source) -> void +NuGet.Configuration.PackageSourceProvider.DefaultPushSource.get -> string? +NuGet.Configuration.PackageSourceProvider.DisablePackageSource(NuGet.Configuration.PackageSource! source) -> void +NuGet.Configuration.PackageSourceProvider.DisablePackageSource(string! name) -> void +NuGet.Configuration.PackageSourceProvider.EnablePackageSource(string! name) -> void +NuGet.Configuration.PackageSourceProvider.GetPackageSourceByName(string! name) -> NuGet.Configuration.PackageSource? +NuGet.Configuration.PackageSourceProvider.GetPackageSourceBySource(string! source) -> NuGet.Configuration.PackageSource? +NuGet.Configuration.PackageSourceProvider.GetPackageSourceNamesMatchingNamePrefix(string! namePrefix) -> System.Collections.Generic.HashSet! +NuGet.Configuration.PackageSourceProvider.IsPackageSourceEnabled(NuGet.Configuration.PackageSource! source) -> bool +NuGet.Configuration.PackageSourceProvider.IsPackageSourceEnabled(string! name) -> bool +NuGet.Configuration.PackageSourceProvider.LoadPackageSources() -> System.Collections.Generic.IEnumerable! +NuGet.Configuration.PackageSourceProvider.PackageSourceProvider(NuGet.Configuration.ISettings! settings) -> void +NuGet.Configuration.PackageSourceProvider.PackageSourceProvider(NuGet.Configuration.ISettings! settings, System.Collections.Generic.IEnumerable! configurationDefaultSources) -> void +NuGet.Configuration.PackageSourceProvider.PackageSourceProvider(NuGet.Configuration.ISettings! settings, System.Collections.Generic.IEnumerable! configurationDefaultSources, bool enablePackageSourcesChangedEvent) -> void +NuGet.Configuration.PackageSourceProvider.PackageSourceProvider(NuGet.Configuration.ISettings! settings, bool enablePackageSourcesChangedEvent) -> void +NuGet.Configuration.PackageSourceProvider.PackageSourcesChanged -> System.EventHandler? +NuGet.Configuration.PackageSourceProvider.RemovePackageSource(string! name) -> void +NuGet.Configuration.PackageSourceProvider.SaveActivePackageSource(NuGet.Configuration.PackageSource! source) -> void +NuGet.Configuration.PackageSourceProvider.SavePackageSources(System.Collections.Generic.IEnumerable! sources) -> void +NuGet.Configuration.PackageSourceProvider.Settings.get -> NuGet.Configuration.ISettings! +NuGet.Configuration.PackageSourceProvider.UpdatePackageSource(NuGet.Configuration.PackageSource! source, bool updateCredentials, bool updateEnabled) -> void NuGet.Configuration.ProxyCache ~NuGet.Configuration.ProxyCache.Add(System.Net.IWebProxy proxy) -> void ~NuGet.Configuration.ProxyCache.GetCredential(System.Uri proxyAddress, string authType) -> System.Net.NetworkCredential @@ -409,7 +409,7 @@ static NuGet.Configuration.ConfigurationDefaults.Instance.get -> NuGet.Configura ~static NuGet.Configuration.NullSettings.Instance.get -> NuGet.Configuration.NullSettings ~static NuGet.Configuration.PackageSourceCredential.FromUserInput(string source, string username, string password, bool storePasswordInClearText, string validAuthenticationTypesText) -> NuGet.Configuration.PackageSourceCredential static NuGet.Configuration.PackageSourceMapping.GetPackageSourceMapping(NuGet.Configuration.ISettings! settings) -> NuGet.Configuration.PackageSourceMapping! -~static NuGet.Configuration.PackageSourceProvider.LoadPackageSources(NuGet.Configuration.ISettings settings) -> System.Collections.Generic.IEnumerable +static NuGet.Configuration.PackageSourceProvider.LoadPackageSources(NuGet.Configuration.ISettings! settings) -> System.Collections.Generic.IEnumerable! ~static NuGet.Configuration.ProxyCache.Instance.get -> NuGet.Configuration.ProxyCache ~static NuGet.Configuration.Settings.ApplyEnvironmentTransform(string value) -> string ~static NuGet.Configuration.Settings.GetFileNameAndItsRoot(string root, string settingsPath) -> System.Tuple diff --git a/src/NuGet.Core/NuGet.Configuration/PublicAPI.Unshipped.txt b/src/NuGet.Core/NuGet.Configuration/PublicAPI.Unshipped.txt index 416f69d6a05..0ac59d624a2 100644 --- a/src/NuGet.Core/NuGet.Configuration/PublicAPI.Unshipped.txt +++ b/src/NuGet.Core/NuGet.Configuration/PublicAPI.Unshipped.txt @@ -1,5 +1,9 @@ #nullable enable NuGet.Configuration.ConfigurationDefaults.DefaultAuditSources.get -> System.Collections.Generic.IReadOnlyList! +NuGet.Configuration.IPackageSourceProvider.LoadAuditSources() -> System.Collections.Generic.IReadOnlyList! +NuGet.Configuration.PackageSourceProvider.LoadAuditSources() -> System.Collections.Generic.IReadOnlyList! +NuGet.Configuration.PackageSourceProvider.PackageSourceProvider(NuGet.Configuration.ISettings! settings, NuGet.Configuration.ConfigurationDefaults! configurationDefaults) -> void +NuGet.Configuration.PackageSourceProvider.PackageSourceProvider(NuGet.Configuration.ISettings! settings, NuGet.Configuration.ConfigurationDefaults! configurationDefaults, bool enablePackageSourcesChangedEvent) -> void NuGet.Configuration.SettingElementType.AuditSources = 20 -> NuGet.Configuration.SettingElementType ~NuGet.Configuration.SettingElement.ConfigPath.get -> string ~NuGet.Configuration.SettingItem.GetAttributes() -> System.Collections.Generic.IReadOnlyDictionary diff --git a/test/NuGet.Core.Tests/NuGet.Commands.Test/TestPackageSourceProvider.cs b/test/NuGet.Core.Tests/NuGet.Commands.Test/TestPackageSourceProvider.cs index abd4a984fbe..1c34d5f7e87 100644 --- a/test/NuGet.Core.Tests/NuGet.Commands.Test/TestPackageSourceProvider.cs +++ b/test/NuGet.Core.Tests/NuGet.Commands.Test/TestPackageSourceProvider.cs @@ -21,6 +21,8 @@ public TestPackageSourceProvider(IEnumerable packageSources) public IEnumerable LoadPackageSources() => PackageSources; + public IReadOnlyList LoadAuditSources() => Array.Empty(); + public event EventHandler PackageSourcesChanged; public void SavePackageSources(IEnumerable sources) diff --git a/test/NuGet.Core.Tests/NuGet.Configuration.Test/PackageSourceProviderTests.cs b/test/NuGet.Core.Tests/NuGet.Configuration.Test/PackageSourceProviderTests.cs index 82440682c48..a795b969cf3 100644 --- a/test/NuGet.Core.Tests/NuGet.Configuration.Test/PackageSourceProviderTests.cs +++ b/test/NuGet.Core.Tests/NuGet.Configuration.Test/PackageSourceProviderTests.cs @@ -2299,6 +2299,90 @@ public void GetPackageSourceBySource_TwoSourcesWithSameUrl_ReturnsFirstSource() source.Name.Should().Be("s1"); } + [Fact] + public void LoadAuditSources_ConfigWithoutAuditSources_ReturnsEmptyList() + { + // Arrange + using TestDirectory testDirectory = TestDirectory.Create(); + + const string contents = @""; + var path = Path.Combine(testDirectory.Path, Settings.DefaultSettingsFileName); + File.WriteAllText(path, contents); + + Settings settings = new Settings(testDirectory.Path); + var machineDefaultSources = Array.Empty(); + + // Act + PackageSourceProvider psp = new PackageSourceProvider(settings, machineDefaultSources); + IReadOnlyList auditSources = psp.LoadAuditSources(); + + // Assert + auditSources.Should().BeEmpty(); + } + + [Fact] + public void LoadAuditSources_ConfigWithAuditSources_ReturnsAuditSources() + { + // Arrange + using TestDirectory testDirectory = TestDirectory.Create(); + + const string contents = @" + + + +"; + var path = Path.Combine(testDirectory.Path, Settings.DefaultSettingsFileName); + File.WriteAllText(path, contents); + + Settings settings = new Settings(testDirectory.Path); + var machineDefaultSources = Array.Empty(); + + // Act + PackageSourceProvider psp = new PackageSourceProvider(settings, machineDefaultSources); + IReadOnlyList auditSources = psp.LoadAuditSources(); + + // Assert + auditSources.Should().NotBeEmpty(); + var auditSource = auditSources.Should().ContainSingle(); + auditSource.Subject.Name.Should().Be("contoso"); + auditSource.Subject.Source.Should().Be("https://contoso.test/nuget/v3/index.json"); + auditSource.Subject.ProtocolVersion.Should().Be(3); + auditSource.Subject.IsEnabled.Should().BeTrue(); + } + + [Fact] + public void LoadAuditSources_ConfigWithDisabledAuditSources_ReturnsDisabledAuditSources() + { + // Arrange + using TestDirectory testDirectory = TestDirectory.Create(); + + const string contents = @" + + + + + + +"; + var path = Path.Combine(testDirectory.Path, Settings.DefaultSettingsFileName); + File.WriteAllText(path, contents); + + Settings settings = new Settings(testDirectory.Path); + var machineDefaultSources = Array.Empty(); + + // Act + PackageSourceProvider psp = new PackageSourceProvider(settings, machineDefaultSources); + IReadOnlyList auditSources = psp.LoadAuditSources(); + + // Assert + auditSources.Should().NotBeEmpty(); + var auditSource = auditSources.Should().ContainSingle(); + auditSource.Subject.Name.Should().Be("contoso"); + auditSource.Subject.Source.Should().Be("https://contoso.test/nuget/v3/index.json"); + auditSource.Subject.ProtocolVersion.Should().Be(3); + auditSource.Subject.IsEnabled.Should().BeFalse(); + } + private string CreateNuGetConfigContent(string enabledReplacement = "", string disabledReplacement = "", string activeSourceReplacement = "") { var nugetConfigBaseString = new StringBuilder(); diff --git a/test/TestUtilities/Test.Utility/SourceRepository/TestSourceRepositoryUtility.cs b/test/TestUtilities/Test.Utility/SourceRepository/TestSourceRepositoryUtility.cs index c53e23b8a23..63f3bf45111 100644 --- a/test/TestUtilities/Test.Utility/SourceRepository/TestSourceRepositoryUtility.cs +++ b/test/TestUtilities/Test.Utility/SourceRepository/TestSourceRepositoryUtility.cs @@ -96,6 +96,8 @@ public TestPackageSourceProvider(IEnumerable packageSources) public IEnumerable LoadPackageSources() => PackageSources; + public IReadOnlyList LoadAuditSources() => Array.Empty(); + public event EventHandler PackageSourcesChanged; public void SavePackageSources(IEnumerable sources) From 0665129dc6daf4d816c912f1db81aefc5c01c66e Mon Sep 17 00:00:00 2001 From: Andy Zivkovic Date: Tue, 30 Jan 2024 07:50:17 +0100 Subject: [PATCH 3/6] Fix PackageSourceProviderTests when machine has NuGetDefaults.config file --- .../Settings/ConfigurationDefaults.cs | 5 + .../ClientCertificateProviderTests.cs | 4 +- .../PackageSourceProviderTests.cs | 250 +++++++----------- .../TestConfigurationDefaults.cs | 10 + 4 files changed, 118 insertions(+), 151 deletions(-) create mode 100644 test/NuGet.Core.Tests/NuGet.Configuration.Test/TestConfigurationDefaults.cs diff --git a/src/NuGet.Core/NuGet.Configuration/Settings/ConfigurationDefaults.cs b/src/NuGet.Core/NuGet.Configuration/Settings/ConfigurationDefaults.cs index 42ff6c671f7..74cef84bc13 100644 --- a/src/NuGet.Core/NuGet.Configuration/Settings/ConfigurationDefaults.cs +++ b/src/NuGet.Core/NuGet.Configuration/Settings/ConfigurationDefaults.cs @@ -50,6 +50,11 @@ internal ConfigurationDefaults(string directory, string configFile) // This way, administrator will become aware of the failures when the ConfigurationDefaults file is not valid or permissions are not set properly } + internal ConfigurationDefaults(ISettings settingsManager) + { + _settingsManager = settingsManager ?? throw new ArgumentNullException(nameof(settingsManager)); + } + public static ConfigurationDefaults Instance { get; } = InitializeInstance(); private IReadOnlyList GetSourceItems(string sectionName) diff --git a/test/NuGet.Core.Tests/NuGet.Configuration.Test/ClientCertificateProviderTests.cs b/test/NuGet.Core.Tests/NuGet.Configuration.Test/ClientCertificateProviderTests.cs index e2e4d4a208f..f84f195ef8f 100644 --- a/test/NuGet.Core.Tests/NuGet.Configuration.Test/ClientCertificateProviderTests.cs +++ b/test/NuGet.Core.Tests/NuGet.Configuration.Test/ClientCertificateProviderTests.cs @@ -31,7 +31,7 @@ public void CertificateFromFile_Success_ParsedAndAddedToAssociatedPackageSource( testInfo.ConfigFile)); // Assert - var packageSourceProvider = new PackageSourceProvider(settings); + var packageSourceProvider = new PackageSourceProvider(settings, TestConfigurationDefaults.NullInstance); var packageSourceList = packageSourceProvider.LoadPackageSources().ToList(); Assert.Equal(1, packageSourceList.Count); Assert.Equal(1, packageSourceList[0].ClientCertificates.Count); @@ -57,7 +57,7 @@ public void CertificateFromStore_Success_ParsedAndAddedToAssociatedPackageSource testInfo.CertificateFindBy)); // Assert - var packageSourceProvider = new PackageSourceProvider(settings); + var packageSourceProvider = new PackageSourceProvider(settings, TestConfigurationDefaults.NullInstance); var packageSourceList = packageSourceProvider.LoadPackageSources().ToList(); Assert.Equal(1, packageSourceList.Count); Assert.Equal(1, packageSourceList[0].ClientCertificates.Count); diff --git a/test/NuGet.Core.Tests/NuGet.Configuration.Test/PackageSourceProviderTests.cs b/test/NuGet.Core.Tests/NuGet.Configuration.Test/PackageSourceProviderTests.cs index a795b969cf3..ca1a5ac82bf 100644 --- a/test/NuGet.Core.Tests/NuGet.Configuration.Test/PackageSourceProviderTests.cs +++ b/test/NuGet.Core.Tests/NuGet.Configuration.Test/PackageSourceProviderTests.cs @@ -31,7 +31,7 @@ public void ActivePackageSourceCanBeReadAndWrittenInNuGetConfig() var settings = new Settings(directory, "nuget.Config"); - var before = new PackageSourceProvider(settings); + var before = new PackageSourceProvider(settings, TestConfigurationDefaults.NullInstance); Assert.Equal(NuGetConstants.FeedName, before.ActivePackageSourceName); before.SaveActivePackageSource(new PackageSource(NuGetConstants.V3FeedUrl, NuGetConstants.FeedName)); @@ -53,7 +53,7 @@ public void ActivePackageSourceReturnsNullIfNotSetInNuGetConfig() File.WriteAllText(nugetConfigFilePath, text); var settings = new Settings(directory, "nuget.config"); - var before = new PackageSourceProvider(settings); + var before = new PackageSourceProvider(settings, TestConfigurationDefaults.NullInstance); Assert.Null(before.ActivePackageSourceName); before.SaveActivePackageSource(new PackageSource(NuGetConstants.V3FeedUrl, NuGetConstants.FeedName)); @@ -77,7 +77,7 @@ public void ActivePackageSourceReturnsNullIfNotPresentInNuGetConfig() File.WriteAllText(nugetConfigFilePath, fileContents); var settings = new Settings(directory, "nuget.Config"); - var before = new PackageSourceProvider(settings); + var before = new PackageSourceProvider(settings, TestConfigurationDefaults.NullInstance); Assert.Null(before.ActivePackageSourceName); before.SaveActivePackageSource(new PackageSource(NuGetConstants.V3FeedUrl, NuGetConstants.FeedName)); @@ -85,10 +85,8 @@ public void ActivePackageSourceReturnsNullIfNotPresentInNuGetConfig() } } - [Theory] - [InlineData(true)] - [InlineData(false)] - public void LoadPackageSources_LoadsCredentials(bool useStaticMethod) + [Fact] + public void LoadPackageSources_LoadsCredentials() { // Arrange var nugetConfigFilePath = "NuGet.Config"; @@ -152,7 +150,7 @@ public void LoadPackageSources_LoadsCredentials(bool useStaticMethod) var settings = new Settings(directory); // Act - List sources = LoadPackageSources(useStaticMethod, settings); + List sources = LoadPackageSources(settings); // Assert sources.Count.Should().Be(6); @@ -161,16 +159,14 @@ public void LoadPackageSources_LoadsCredentials(bool useStaticMethod) } } - [Theory] - [InlineData(true)] - [InlineData(false)] - public void TestNoPackageSourcesAreReturnedIfUserSettingsIsEmpty(bool useStaticMethod) + [Fact] + public void TestNoPackageSourcesAreReturnedIfUserSettingsIsEmpty() { // Arrange var settings = new Mock(); // Act - List values = LoadPackageSources(useStaticMethod, settings.Object); + List values = LoadPackageSources(settings.Object); // Assert Assert.Equal(0, values.Count); @@ -189,7 +185,7 @@ public void SavePackageSourcesTest() { SettingsTestUtils.CreateConfigurationFile(nugetConfigFilePath, directory, configContent); var settings = new Settings(directory); - var provider = new PackageSourceProvider(settings); + var provider = new PackageSourceProvider(settings, TestConfigurationDefaults.NullInstance); // Act provider.SavePackageSources( @@ -254,7 +250,7 @@ public void SavePackageSourcesWithRelativePath() machineWideSettings: null, loadUserWideSettings: false, useTestingGlobalPath: false); - var packageSourceProvider = new PackageSourceProvider(settings); + var packageSourceProvider = new PackageSourceProvider(settings, TestConfigurationDefaults.NullInstance); var packageSourceList = packageSourceProvider.LoadPackageSources().ToList(); // Act @@ -298,7 +294,7 @@ public void SavePackageSourcesWithRelativePathAndAddNewSource() machineWideSettings: null, loadUserWideSettings: false, useTestingGlobalPath: false); - var packageSourceProvider = new PackageSourceProvider(settings); + var packageSourceProvider = new PackageSourceProvider(settings, TestConfigurationDefaults.NullInstance); var packageSourceList = packageSourceProvider.LoadPackageSources().ToList(); // Act @@ -347,7 +343,7 @@ public void SavePackageSourcesWithOneClear() machineWideSettings: null, loadUserWideSettings: false, useTestingGlobalPath: false); - var packageSourceProvider = new PackageSourceProvider(settings); + var packageSourceProvider = new PackageSourceProvider(settings, TestConfigurationDefaults.NullInstance); var packageSourceList = packageSourceProvider.LoadPackageSources().ToList(); // act @@ -400,7 +396,7 @@ public void SavePackageSourcesWithMoreClear() machineWideSettings: null, loadUserWideSettings: false, useTestingGlobalPath: false); - var packageSourceProvider = new PackageSourceProvider(settings); + var packageSourceProvider = new PackageSourceProvider(settings, TestConfigurationDefaults.NullInstance); var packageSourceList = packageSourceProvider.LoadPackageSources().ToList(); // act @@ -452,7 +448,7 @@ public void SavePackageSourcesWithOnlyClear() machineWideSettings: null, loadUserWideSettings: false, useTestingGlobalPath: false); - var packageSourceProvider = new PackageSourceProvider(settings); + var packageSourceProvider = new PackageSourceProvider(settings, TestConfigurationDefaults.NullInstance); var packageSourceList = packageSourceProvider.LoadPackageSources().ToList(); // act @@ -508,7 +504,7 @@ public void SavePackageSourcesWithHierarchyClear() loadUserWideSettings: false, useTestingGlobalPath: false); - var packageSourceProvider = new PackageSourceProvider(settings); + var packageSourceProvider = new PackageSourceProvider(settings, TestConfigurationDefaults.NullInstance); var packageSourceList = packageSourceProvider.LoadPackageSources().ToList(); // act @@ -574,7 +570,7 @@ public void SavePackageSources_RetainUnavailableDisabledSources() var expectedDisabledSources = disabledPackagesSection?.Items.ToList(); - var packageSourceProvider = new PackageSourceProvider(settings); + var packageSourceProvider = new PackageSourceProvider(settings, TestConfigurationDefaults.NullInstance); var packageSourceList = packageSourceProvider.LoadPackageSources().ToList(); // Act @@ -638,7 +634,7 @@ public void SavePackageSources_EnablesDisabledSources() Assert.Equal("Microsoft and .NET", disabledSources[0].Key); Assert.Equal("b", disabledSources[1].Key); - var packageSourceProvider = new PackageSourceProvider(settings); + var packageSourceProvider = new PackageSourceProvider(settings, TestConfigurationDefaults.NullInstance); var packageSourceList = packageSourceProvider.LoadPackageSources().ToList(); Assert.Equal(2, packageSourceList.Count); @@ -666,7 +662,7 @@ public void SavePackageSources_EnablesDisabledSources() Assert.Equal(1, disabledSources.Count); Assert.Equal("Microsoft and .NET", disabledSources[0].Key); - packageSourceList = PackageSourceProvider.LoadPackageSources(newSettings).ToList(); + packageSourceList = new PackageSourceProvider(newSettings, TestConfigurationDefaults.NullInstance).LoadPackageSources().ToList(); Assert.Equal(2, packageSourceList.Count); Assert.Equal("a", packageSourceList[0].Name); @@ -676,10 +672,8 @@ public void SavePackageSources_EnablesDisabledSources() } } - [Theory] - [InlineData(true)] - [InlineData(false)] - public void LoadPackageSourcesReturnCorrectDataFromSettings(bool useStaticMethod) + [Fact] + public void LoadPackageSourcesReturnCorrectDataFromSettings() { // Arrange var settings = new Mock(MockBehavior.Strict); @@ -704,7 +698,7 @@ public void LoadPackageSourcesReturnCorrectDataFromSettings(bool useStaticMethod .Returns(new VirtualSettingSection("clientCertificates")); // Act - List values = LoadPackageSources(useStaticMethod, settings.Object); + List values = LoadPackageSources(settings.Object); // Assert Assert.Equal(3, values.Count); @@ -713,10 +707,8 @@ public void LoadPackageSourcesReturnCorrectDataFromSettings(bool useStaticMethod AssertPackageSource(values[2], "three", "threesource", isEnabled: true); } - [Theory] - [InlineData(true)] - [InlineData(false)] - public void LoadPackageSourcesReturnCorrectDataFromSettingsWhenSomePackageSourceIsDisabled(bool useStaticMethod) + [Fact] + public void LoadPackageSourcesReturnCorrectDataFromSettingsWhenSomePackageSourceIsDisabled() { // Arrange var settings = new Mock(MockBehavior.Strict); @@ -744,7 +736,7 @@ public void LoadPackageSourcesReturnCorrectDataFromSettingsWhenSomePackageSource .Returns(new VirtualSettingSection("clientCertificates")); // Act - List values = LoadPackageSources(useStaticMethod, settings.Object); + List values = LoadPackageSources(settings.Object); // Assert Assert.Equal(3, values.Count); @@ -753,10 +745,8 @@ public void LoadPackageSourcesReturnCorrectDataFromSettingsWhenSomePackageSource AssertPackageSource(values[2], "three", "threesource", isEnabled: true); } - [Theory] - [InlineData(true)] - [InlineData(false)] - public void LoadPackageSources_ReadsSourcesWithProtocolVersionFromPackageSourceSections(bool useStaticMethod) + [Fact] + public void LoadPackageSources_ReadsSourcesWithProtocolVersionFromPackageSourceSections() { // Arrange var settings = new Mock(); @@ -784,7 +774,7 @@ public void LoadPackageSources_ReadsSourcesWithProtocolVersionFromPackageSourceS settings.Setup(s => s.GetConfigFilePaths()) .Returns(new List()); // Act - List values = LoadPackageSources(useStaticMethod, settings.Object); + List values = LoadPackageSources(settings.Object); // Assert Assert.Collection(values, @@ -822,10 +812,8 @@ public void LoadPackageSources_ReadsSourcesWithProtocolVersionFromPackageSourceS }); } - [Theory] - [InlineData(true)] - [InlineData(false)] - public void LoadPackageSources_ReadsSourcesWithNullAllowInsecureConnectionsFromPackageSourceSections_LoadsDefault(bool useStaticMethod) + [Fact] + public void LoadPackageSources_ReadsSourcesWithNullAllowInsecureConnectionsFromPackageSourceSections_LoadsDefault() { // Arrange var settings = new Mock(); @@ -839,7 +827,7 @@ public void LoadPackageSources_ReadsSourcesWithNullAllowInsecureConnectionsFromP .Returns(new List()); // Act - List values = LoadPackageSources(useStaticMethod, settings.Object); + List values = LoadPackageSources(settings.Object); // Assert var loadedSource = values.Single(); @@ -848,10 +836,8 @@ public void LoadPackageSources_ReadsSourcesWithNullAllowInsecureConnectionsFromP Assert.Equal(PackageSource.DefaultAllowInsecureConnections, loadedSource.AllowInsecureConnections); } - [Theory] - [InlineData(true)] - [InlineData(false)] - public void LoadPackageSources_ReadsSourcesWithInvalidAllowInsecureConnectionsFromPackageSourceSections_LoadsDefault(bool useStaticMethod) + [Fact] + public void LoadPackageSources_ReadsSourcesWithInvalidAllowInsecureConnectionsFromPackageSourceSections_LoadsDefault() { // Arrange var settings = new Mock(); @@ -865,7 +851,7 @@ public void LoadPackageSources_ReadsSourcesWithInvalidAllowInsecureConnectionsFr .Returns(new List()); // Act - List values = LoadPackageSources(useStaticMethod, settings.Object); + List values = LoadPackageSources(settings.Object); // Assert var loadedSource = values.Single(); @@ -875,13 +861,11 @@ public void LoadPackageSources_ReadsSourcesWithInvalidAllowInsecureConnectionsFr } [Theory] - [InlineData(true, "true")] - [InlineData(true, "TRUE")] - [InlineData(true, "false")] - [InlineData(false, "false")] - [InlineData(false, "fALSE")] - [InlineData(false, "true")] - public void LoadPackageSources_ReadsSourcesWithNotNullAllowInsecureConnectionsFromPackageSourceSections_LoadsValue(bool useStaticMethod, string allowInsecureConnections) + [InlineData("true")] + [InlineData("TRUE")] + [InlineData("false")] + [InlineData("fALSE")] + public void LoadPackageSources_ReadsSourcesWithNotNullAllowInsecureConnectionsFromPackageSourceSections_LoadsValue(string allowInsecureConnections) { // Arrange var settings = new Mock(); @@ -895,7 +879,7 @@ public void LoadPackageSources_ReadsSourcesWithNotNullAllowInsecureConnectionsFr .Returns(new List()); // Act - List values = LoadPackageSources(useStaticMethod, settings.Object); + List values = LoadPackageSources(settings.Object); // Assert var loadedSource = values.Single(); @@ -940,10 +924,8 @@ public void IsPackageSourceEnabledReturnsFalseIfTheSourceIsDisabled() Assert.False(isEnabled); } - [Theory] - [InlineData(true)] - [InlineData(false)] - public void LoadPackageSources_ReadsCredentialPairsFromSettings(bool useStaticMethod) + [Fact] + public void LoadPackageSources_ReadsCredentialPairsFromSettings() { // Arrange var encryptedPassword = Guid.NewGuid().ToString(); @@ -965,7 +947,7 @@ public void LoadPackageSources_ReadsCredentialPairsFromSettings(bool useStaticMe )); // Act - List values = LoadPackageSources(useStaticMethod, settings.Object); + List values = LoadPackageSources(settings.Object); // Assert Assert.Equal(3, values.Count); @@ -973,10 +955,8 @@ public void LoadPackageSources_ReadsCredentialPairsFromSettings(bool useStaticMe AssertCredentials(values[1].Credentials, "two", "user1", encryptedPassword, isPasswordClearText: false); } - [Theory] - [InlineData(true)] - [InlineData(false)] - public void LoadPackageSources_WithSpaceInName_ReadsCredentialPairsFromSettings(bool useStaticMethod) + [Fact] + public void LoadPackageSources_WithSpaceInName_ReadsCredentialPairsFromSettings() { // Arrange var encryptedPassword = Guid.NewGuid().ToString(); @@ -998,7 +978,7 @@ public void LoadPackageSources_WithSpaceInName_ReadsCredentialPairsFromSettings( settings.Setup(s => s.GetConfigFilePaths()) .Returns(new List()); // Act - List values = LoadPackageSources(useStaticMethod, settings.Object); + List values = LoadPackageSources(settings.Object); // Assert Assert.Equal(3, values.Count); @@ -1006,10 +986,8 @@ public void LoadPackageSources_WithSpaceInName_ReadsCredentialPairsFromSettings( AssertCredentials(values[1].Credentials, "two source", "user1", encryptedPassword, isPasswordClearText: false); } - [Theory] - [InlineData(true)] - [InlineData(false)] - public void LoadPackageSources_ReadsClearTextCredentialPairsFromSettings(bool useStaticMethod) + [Fact] + public void LoadPackageSources_ReadsClearTextCredentialPairsFromSettings() { // Arrange const string clearTextPassword = "topsecret"; @@ -1031,7 +1009,7 @@ public void LoadPackageSources_ReadsClearTextCredentialPairsFromSettings(bool us settings.Setup(s => s.GetConfigFilePaths()) .Returns(new List()); // Act - List values = LoadPackageSources(useStaticMethod, settings.Object); + List values = LoadPackageSources(settings.Object); // Assert Assert.Equal(3, values.Count); @@ -1039,10 +1017,8 @@ public void LoadPackageSources_ReadsClearTextCredentialPairsFromSettings(bool us AssertCredentials(values[1].Credentials, "two", "user1", clearTextPassword); } - [Theory] - [InlineData(true)] - [InlineData(false)] - public void LoadPackageSources_WhenEnvironmentCredentialsAreMalformed_FallsbackToSettingsCredentials(bool useStaticMethod) + [Fact] + public void LoadPackageSources_WhenEnvironmentCredentialsAreMalformed_FallsbackToSettingsCredentials() { // Arrange var settings = new Mock(); @@ -1062,7 +1038,7 @@ public void LoadPackageSources_WhenEnvironmentCredentialsAreMalformed_FallsbackT settings.Setup(s => s.GetConfigFilePaths()) .Returns(new List()); // Act - List values = LoadPackageSources(useStaticMethod, settings.Object); + List values = LoadPackageSources(settings.Object); // Assert Assert.Equal(3, values.Count); @@ -1082,7 +1058,7 @@ public void SavePackageSourcesSaveCorrectDataToSettings() File.WriteAllText(Path.Combine(directory.Path, "NuGet.Config"), configContents); var settings = new Settings(directory); - var packageSourceProvider = new PackageSourceProvider(settings); + var packageSourceProvider = new PackageSourceProvider(settings, TestConfigurationDefaults.NullInstance); var sources = new[] { new PackageSource("one"), new PackageSource("two"), new PackageSource("three") }; // Act @@ -1122,7 +1098,7 @@ public void SavePackage_KeepsBothNewAndOldSources() File.WriteAllText(Path.Combine(directory.Path, "NuGet.Config"), configContents); var settings = new Settings(directory); - var packageSourceProvider = new PackageSourceProvider(settings); + var packageSourceProvider = new PackageSourceProvider(settings, TestConfigurationDefaults.NullInstance); var sources = new[] { new PackageSource("Source1", "Source1-Name"), @@ -1161,7 +1137,7 @@ public void SavePackageSourcesSaveCorrectDataToSettingsWhenSomePackageSourceIsDi File.WriteAllText(Path.Combine(directory.Path, "NuGet.Config"), configContents); var settings = new Settings(directory); - var packageSourceProvider = new PackageSourceProvider(settings); + var packageSourceProvider = new PackageSourceProvider(settings, TestConfigurationDefaults.NullInstance); var sources = new[] { new PackageSource("one"), new PackageSource("two", "two", isEnabled: false), new PackageSource("three") }; // Act @@ -1204,7 +1180,7 @@ public void SavePackageSources_SavesEncryptedCredentials() File.WriteAllText(Path.Combine(directory.Path, "NuGet.Config"), configContents); var settings = new Settings(directory); - var packageSourceProvider = new PackageSourceProvider(settings); + var packageSourceProvider = new PackageSourceProvider(settings, TestConfigurationDefaults.NullInstance); var encryptedPassword = Guid.NewGuid().ToString(); var credentials = new PackageSourceCredential("twoname", "User", encryptedPassword, isPasswordClearText: false, validAuthenticationTypesText: null); @@ -1260,7 +1236,7 @@ public void SavePackageSources_SavesClearTextCredentials() File.WriteAllText(Path.Combine(directory.Path, "NuGet.Config"), configContents); var settings = new Settings(directory); - var packageSourceProvider = new PackageSourceProvider(settings); + var packageSourceProvider = new PackageSourceProvider(settings, TestConfigurationDefaults.NullInstance); var credentials = new PackageSourceCredential("twoname", "User", "password", isPasswordClearText: true, validAuthenticationTypesText: null); var sources = new[] @@ -1303,10 +1279,8 @@ public void SavePackageSources_SavesClearTextCredentials() } } - [Theory] - [InlineData(true)] - [InlineData(false)] - public void LoadPackageSourcesWithDisabledPackageSourceIsUpperCase(bool useStaticMethod) + [Fact] + public void LoadPackageSourcesWithDisabledPackageSourceIsUpperCase() { // Arrange var settings = new Mock(MockBehavior.Strict); @@ -1329,7 +1303,7 @@ public void LoadPackageSourcesWithDisabledPackageSourceIsUpperCase(bool useStati settings.Setup(s => s.GetSection("clientCertificates")) .Returns(new VirtualSettingSection("clientCertificates")); // Act - List values = LoadPackageSources(useStaticMethod, settings.Object); + List values = LoadPackageSources(settings.Object); // Assert Assert.Equal(3, values.Count); @@ -1340,10 +1314,8 @@ public void LoadPackageSourcesWithDisabledPackageSourceIsUpperCase(bool useStati // Test that a source added in a high priority config file is not // disabled by in a low priority file. - [Theory] - [InlineData(true)] - [InlineData(false)] - public void HighPrioritySourceDisabled(bool useStaticMethod) + [Fact] + public void HighPrioritySourceDisabled() { // Arrange using (var directory = TestDirectory.Create()) @@ -1368,7 +1340,7 @@ public void HighPrioritySourceDisabled(bool useStaticMethod) useTestingGlobalPath: false); // Act - List values = LoadPackageSources(useStaticMethod, settings); + List values = LoadPackageSources(settings); // Assert Assert.Equal(1, values.Count); @@ -1380,10 +1352,8 @@ public void HighPrioritySourceDisabled(bool useStaticMethod) // Test that a source added in a low priority config file is disabled // if it's listed in in a high priority file. - [Theory] - [InlineData(true)] - [InlineData(false)] - public void LowPrioritySourceDisabled(bool useStaticMethod) + [Fact] + public void LowPrioritySourceDisabled() { // Arrange using (var directory = TestDirectory.Create()) @@ -1408,7 +1378,7 @@ public void LowPrioritySourceDisabled(bool useStaticMethod) useTestingGlobalPath: false); // Act - List values = LoadPackageSources(useStaticMethod, settings); + List values = LoadPackageSources(settings); // Assert Assert.Equal(1, values.Count); @@ -1418,10 +1388,8 @@ public void LowPrioritySourceDisabled(bool useStaticMethod) } } - [Theory] - [InlineData(true)] - [InlineData(false)] - public void V2NotDisabled(bool useStaticMethod) + [Fact] + public void V2NotDisabled() { // Arrange using (var directory = TestDirectory.Create()) @@ -1441,7 +1409,7 @@ public void V2NotDisabled(bool useStaticMethod) useTestingGlobalPath: false); // Act - List values = LoadPackageSources(useStaticMethod, settings); + List values = LoadPackageSources(settings); // Assert Assert.True(values.Single(p => p.Name.Equals("nuget.org", StringComparison.OrdinalIgnoreCase)).IsEnabled); @@ -1470,7 +1438,7 @@ public void AddPackageSourcesWithConfigFile() machineWideSettings: null, loadUserWideSettings: true, useTestingGlobalPath: false); - var packageSourceProvider = new PackageSourceProvider(settings); + var packageSourceProvider = new PackageSourceProvider(settings, TestConfigurationDefaults.NullInstance); // Act var sources = packageSourceProvider.LoadPackageSources().ToList(); @@ -1519,7 +1487,7 @@ public void SavePackageSources_AddDisabledSourceToTheConfigContainingSource() machineWideSettings: null, loadUserWideSettings: false, useTestingGlobalPath: false); - var packageSourceProvider = new PackageSourceProvider(settings); + var packageSourceProvider = new PackageSourceProvider(settings, TestConfigurationDefaults.NullInstance); // Act - 1 var sources = packageSourceProvider.LoadPackageSources(); @@ -1585,7 +1553,7 @@ public void SavePackageSources_WritesToTheSettingsFileWithTheNearestPriority() machineWideSettings: null, loadUserWideSettings: false, useTestingGlobalPath: false); - var packageSourceProvider = new PackageSourceProvider(settings); + var packageSourceProvider = new PackageSourceProvider(settings, TestConfigurationDefaults.NullInstance); // Act - 1 var sources = packageSourceProvider.LoadPackageSources(); @@ -1656,7 +1624,7 @@ public void SavePackageSources_AddsNewSourcesToTheSettingWithLowestPriority() machineWideSettings: null, loadUserWideSettings: false, useTestingGlobalPath: false); - var packageSourceProvider = new PackageSourceProvider(settings); + var packageSourceProvider = new PackageSourceProvider(settings, TestConfigurationDefaults.NullInstance); // Act - 1 var sources = packageSourceProvider.LoadPackageSources().ToList(); @@ -1723,7 +1691,7 @@ public void SavePackageSources_AddsOrderingForCollapsedFeeds() machineWideSettings: null, loadUserWideSettings: false, useTestingGlobalPath: false); - var packageSourceProvider = new PackageSourceProvider(settings); + var packageSourceProvider = new PackageSourceProvider(settings, TestConfigurationDefaults.NullInstance); // Act - 1 var sources = packageSourceProvider.LoadPackageSources().ToList(); @@ -1799,7 +1767,7 @@ public void SavePackageSources_DisabledOnMachineWideSource() machineWideSettings: m.Object, loadUserWideSettings: true, useTestingGlobalPath: true); - var packageSourceProvider = new PackageSourceProvider(settings); + var packageSourceProvider = new PackageSourceProvider(settings, TestConfigurationDefaults.NullInstance); var sources = packageSourceProvider.LoadPackageSources().ToList(); // Act @@ -1854,7 +1822,7 @@ public void SavePackageSources_WhenDisablingASourceFromReadOnlyConfig_DisablesIn machineWideSettings: m.Object, loadUserWideSettings: true, useTestingGlobalPath: true); - var packageSourceProvider = new PackageSourceProvider(settings); + var packageSourceProvider = new PackageSourceProvider(settings, TestConfigurationDefaults.NullInstance); var sources = packageSourceProvider.LoadPackageSources().ToList(); @@ -1872,10 +1840,8 @@ public void SavePackageSources_WhenDisablingASourceFromReadOnlyConfig_DisablesIn } } - [Theory] - [InlineData(true)] - [InlineData(false)] - public void DisabledMachineWideSourceByDefaultWithNull(bool useStaticMethod) + [Fact] + public void DisabledMachineWideSourceByDefaultWithNull() { using (var directory = TestDirectory.Create()) { @@ -1889,17 +1855,15 @@ public void DisabledMachineWideSourceByDefaultWithNull(bool useStaticMethod) useTestingGlobalPath: true); // Act - List sources = LoadPackageSources(useStaticMethod, settings); + List sources = LoadPackageSources(settings); // Assert Assert.Equal(0, sources.Count); } } - [Theory] - [InlineData(true)] - [InlineData(false)] - public void LoadPackageSourceEmptyConfigFileOnUserMachine(bool useStaticMethod) + [Fact] + public void LoadPackageSourceEmptyConfigFileOnUserMachine() { using (var directory = TestDirectory.Create()) { @@ -1920,17 +1884,15 @@ public void LoadPackageSourceEmptyConfigFileOnUserMachine(bool useStaticMethod) useTestingGlobalPath: true); // Act - List sources = LoadPackageSources(useStaticMethod, settings); + List sources = LoadPackageSources(settings); // Assert Assert.Equal(0, sources.Count); } } - [Theory] - [InlineData(true)] - [InlineData(false)] - public void LoadPackageSourceLocalConfigFileOnUserMachine(bool useStaticMethod) + [Fact] + public void LoadPackageSourceLocalConfigFileOnUserMachine() { using (var directory = TestDirectory.Create()) { @@ -1952,7 +1914,7 @@ public void LoadPackageSourceLocalConfigFileOnUserMachine(bool useStaticMethod) useTestingGlobalPath: true); // Act - List sources = LoadPackageSources(useStaticMethod, settings); + List sources = LoadPackageSources(settings); // Assert Assert.Equal(1, sources.Count); @@ -1983,7 +1945,7 @@ public void SavePackageSources_IgnoreSettingBeforeClear() machineWideSettings: null, loadUserWideSettings: true, useTestingGlobalPath: true); - var packageSourceProvider = new PackageSourceProvider(settings); + var packageSourceProvider = new PackageSourceProvider(settings, TestConfigurationDefaults.NullInstance); // Act var sources = packageSourceProvider.LoadPackageSources().ToList(); @@ -2028,7 +1990,7 @@ public void SavePackageSources_ThrowWhenConfigReadOnly() machineWideSettings: null, loadUserWideSettings: true, useTestingGlobalPath: true); - var packageSourceProvider = new PackageSourceProvider(settings); + var packageSourceProvider = new PackageSourceProvider(settings, TestConfigurationDefaults.NullInstance); // Act var sources = packageSourceProvider.LoadPackageSources().ToList(); @@ -2081,8 +2043,8 @@ public void DefaultPushSourceInNuGetConfig() loadUserWideSettings: true, useTestingGlobalPath: false); - var packageSourceProviderWithDefault = new PackageSourceProvider(settingsWithDefault); - var packageSourceProviderWithoutDefault = new PackageSourceProvider(settingsWithoutDefault); + var packageSourceProviderWithDefault = new PackageSourceProvider(settingsWithDefault, TestConfigurationDefaults.NullInstance); + var packageSourceProviderWithoutDefault = new PackageSourceProvider(settingsWithoutDefault, TestConfigurationDefaults.NullInstance); // Act var defaultPushSourceWithDefault = packageSourceProviderWithDefault.DefaultPushSource; @@ -2120,7 +2082,7 @@ public void LoadPackageSources_DoesNotDecryptPassword() machineWideSettings: null, loadUserWideSettings: false, useTestingGlobalPath: false); - var packageSourceProvider = new PackageSourceProvider(settings); + var packageSourceProvider = new PackageSourceProvider(settings, TestConfigurationDefaults.NullInstance); // Act var sources = packageSourceProvider.LoadPackageSources().ToList(); @@ -2171,7 +2133,7 @@ public void LoadPackageSources_DoesNotLoadClearedSource() machineWideSettings: null, loadUserWideSettings: true, useTestingGlobalPath: true); - var packageSourceProvider = new PackageSourceProvider(settings); + var packageSourceProvider = new PackageSourceProvider(settings, TestConfigurationDefaults.NullInstance); // Act var sources = packageSourceProvider.LoadPackageSources().ToList(); @@ -2209,7 +2171,7 @@ public void LoadPackageSources_SetMaxHttpRequest() loadUserWideSettings: true, useTestingGlobalPath: false); - var packageSourceProvider = new PackageSourceProvider(settings); + var packageSourceProvider = new PackageSourceProvider(settings, TestConfigurationDefaults.NullInstance); // Act var packageSources = packageSourceProvider.LoadPackageSources(); @@ -2241,7 +2203,7 @@ public void LoadPackageSources_NoMaxHttpRequest() loadUserWideSettings: true, useTestingGlobalPath: false); - var packageSourceProvider = new PackageSourceProvider(settings); + var packageSourceProvider = new PackageSourceProvider(settings, TestConfigurationDefaults.NullInstance); // Act var packageSources = packageSourceProvider.LoadPackageSources(); @@ -2289,10 +2251,9 @@ public void GetPackageSourceBySource_TwoSourcesWithSameUrl_ReturnsFirstSource() File.WriteAllText(path, contents); Settings settings = new Settings(testDirectory.Path); - var machineDefaultSources = Array.Empty(); // Act - PackageSourceProvider psp = new PackageSourceProvider(settings, machineDefaultSources); + PackageSourceProvider psp = new PackageSourceProvider(settings, TestConfigurationDefaults.NullInstance); PackageSource source = psp.GetPackageSourceBySource(sourceUrl); // Assert @@ -2310,10 +2271,9 @@ public void LoadAuditSources_ConfigWithoutAuditSources_ReturnsEmptyList() File.WriteAllText(path, contents); Settings settings = new Settings(testDirectory.Path); - var machineDefaultSources = Array.Empty(); // Act - PackageSourceProvider psp = new PackageSourceProvider(settings, machineDefaultSources); + PackageSourceProvider psp = new PackageSourceProvider(settings, TestConfigurationDefaults.NullInstance); IReadOnlyList auditSources = psp.LoadAuditSources(); // Assert @@ -2335,10 +2295,9 @@ public void LoadAuditSources_ConfigWithAuditSources_ReturnsAuditSources() File.WriteAllText(path, contents); Settings settings = new Settings(testDirectory.Path); - var machineDefaultSources = Array.Empty(); // Act - PackageSourceProvider psp = new PackageSourceProvider(settings, machineDefaultSources); + PackageSourceProvider psp = new PackageSourceProvider(settings, TestConfigurationDefaults.NullInstance); IReadOnlyList auditSources = psp.LoadAuditSources(); // Assert @@ -2368,10 +2327,9 @@ public void LoadAuditSources_ConfigWithDisabledAuditSources_ReturnsDisabledAudit File.WriteAllText(path, contents); Settings settings = new Settings(testDirectory.Path); - var machineDefaultSources = Array.Empty(); // Act - PackageSourceProvider psp = new PackageSourceProvider(settings, machineDefaultSources); + PackageSourceProvider psp = new PackageSourceProvider(settings, TestConfigurationDefaults.NullInstance); IReadOnlyList auditSources = psp.LoadAuditSources(); // Assert @@ -2410,17 +2368,11 @@ private string CreateNuGetConfigContent(string enabledReplacement = "", string d return nugetConfig; } - private List LoadPackageSources(bool useStaticMethod, ISettings settings) + private List LoadPackageSources(ISettings settings) { - if (useStaticMethod) - { - return PackageSourceProvider.LoadPackageSources(settings).ToList(); - } - else - { - var provider = new PackageSourceProvider(settings); - return provider.LoadPackageSources().ToList(); - } + var configurationDefaults = TestConfigurationDefaults.NullInstance; + var provider = new PackageSourceProvider(settings, configurationDefaults); + return provider.LoadPackageSources().ToList(); } private void AssertPackageSource(PackageSource ps, string name, string source, bool isEnabled, bool isMachineWide = false, bool isOfficial = false) diff --git a/test/NuGet.Core.Tests/NuGet.Configuration.Test/TestConfigurationDefaults.cs b/test/NuGet.Core.Tests/NuGet.Configuration.Test/TestConfigurationDefaults.cs new file mode 100644 index 00000000000..d68dd107635 --- /dev/null +++ b/test/NuGet.Core.Tests/NuGet.Configuration.Test/TestConfigurationDefaults.cs @@ -0,0 +1,10 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace NuGet.Configuration.Test +{ + internal static class TestConfigurationDefaults + { + public static ConfigurationDefaults NullInstance { get; } = new ConfigurationDefaults(NullSettings.Instance); + } +} From 0f528866874d2d685d3fb1c10c719e2c3a820bf0 Mon Sep 17 00:00:00 2001 From: Andy Zivkovic Date: Fri, 2 Feb 2024 01:54:33 +0100 Subject: [PATCH 4/6] Add tests to validate default audit sources with PackageSourceProvider --- .../PackageSource/PackageSourceProvider.cs | 2 +- .../Settings/ConfigurationDefaults.cs | 9 ++- .../PackageSourceProviderTests.cs | 63 +++++++++++++++++++ 3 files changed, 68 insertions(+), 6 deletions(-) diff --git a/src/NuGet.Core/NuGet.Configuration/PackageSource/PackageSourceProvider.cs b/src/NuGet.Core/NuGet.Configuration/PackageSource/PackageSourceProvider.cs index be82a63462e..18d5657dcd0 100644 --- a/src/NuGet.Core/NuGet.Configuration/PackageSource/PackageSourceProvider.cs +++ b/src/NuGet.Core/NuGet.Configuration/PackageSource/PackageSourceProvider.cs @@ -220,7 +220,7 @@ private static void AddDefaultPackageSources(List loadedPackageSo loadedPackageSources.InsertRange(defaultSourcesInsertIndex, defaultPackageSourcesToBeAdded); } - private static PackageSource ReadPackageSource(SourceItem setting, bool isEnabled, ISettings settings) + internal static PackageSource ReadPackageSource(SourceItem setting, bool isEnabled, ISettings settings) { var name = setting.Key; var packageSource = new PackageSource(setting.GetValueAsPath(), name, isEnabled) diff --git a/src/NuGet.Core/NuGet.Configuration/Settings/ConfigurationDefaults.cs b/src/NuGet.Core/NuGet.Configuration/Settings/ConfigurationDefaults.cs index 74cef84bc13..60ca0321d7e 100644 --- a/src/NuGet.Core/NuGet.Configuration/Settings/ConfigurationDefaults.cs +++ b/src/NuGet.Core/NuGet.Configuration/Settings/ConfigurationDefaults.cs @@ -70,11 +70,10 @@ private IReadOnlyList GetSourceItems(string sectionName) List sources = new(); foreach (var source in sourceItems) { - // In a SettingValue representing a package source, the Key represents the name of the package source and the Value its source - sources.Add(new PackageSource(source.GetValueAsPath(), - source.Key, - isEnabled: !disabledPackageSources.Any(p => p.Key.Equals(source.Key, StringComparison.OrdinalIgnoreCase)), - isOfficial: true)); + bool isEnabled = !disabledPackageSources.Any(p => p.Key.Equals(source.Key, StringComparison.OrdinalIgnoreCase)); + PackageSource packageSource = PackageSourceProvider.ReadPackageSource(source, isEnabled, _settingsManager); + packageSource.IsOfficial = true; + sources.Add(packageSource); } return sources; diff --git a/test/NuGet.Core.Tests/NuGet.Configuration.Test/PackageSourceProviderTests.cs b/test/NuGet.Core.Tests/NuGet.Configuration.Test/PackageSourceProviderTests.cs index ca1a5ac82bf..ed4ab766cd2 100644 --- a/test/NuGet.Core.Tests/NuGet.Configuration.Test/PackageSourceProviderTests.cs +++ b/test/NuGet.Core.Tests/NuGet.Configuration.Test/PackageSourceProviderTests.cs @@ -2341,6 +2341,69 @@ public void LoadAuditSources_ConfigWithDisabledAuditSources_ReturnsDisabledAudit auditSource.Subject.IsEnabled.Should().BeFalse(); } + [Fact] + public void LoadAuditSources_DefaultConfigWithAuditSources_ReturnsAuditSources() + { + // Arrange + Mock defaultSettings = new Mock(); + defaultSettings.Setup(s => s.GetSection("auditSources")) + .Returns(new VirtualSettingSection("auditSources", + new SourceItem("contoso", "https://contoso.test/nuget/v3/index.json", "3"))); + ConfigurationDefaults configurationDefaults = new ConfigurationDefaults(defaultSettings.Object); + + Mock solutionConfig = new Mock(); + + // Act + PackageSourceProvider psp = new PackageSourceProvider(solutionConfig.Object, configurationDefaults); + IReadOnlyList auditSources = psp.LoadAuditSources(); + + // Assert + auditSources.Should().NotBeEmpty(); + var auditSource = auditSources.Should().ContainSingle(); + auditSource.Subject.Name.Should().Be("contoso"); + auditSource.Subject.Source.Should().Be("https://contoso.test/nuget/v3/index.json"); + auditSource.Subject.ProtocolVersion.Should().Be(3); + auditSource.Subject.IsEnabled.Should().BeTrue(); + } + + [Fact] + public void LoadAuditSources_LocalConfigDisablesDefaultAuditSource_DefaultSourceCannotBeDisabled() + { + // Arrange + using TestDirectory testDirectory = TestDirectory.Create(); + + Mock defaultSettings = new Mock(); + defaultSettings.Setup(s => s.GetSection("auditSources")) + .Returns(new VirtualSettingSection("auditSources", + new SourceItem("contoso", "https://contoso.test/nuget/v3/index.json", "3"))); + ConfigurationDefaults configurationDefaults = new ConfigurationDefaults(defaultSettings.Object); + + const string contents = @" + + + + + + +"; + var path = Path.Combine(testDirectory.Path, Settings.DefaultSettingsFileName); + File.WriteAllText(path, contents); + + Settings settings = new Settings(testDirectory.Path); + + // Act + PackageSourceProvider psp = new PackageSourceProvider(settings, configurationDefaults); + IReadOnlyList auditSources = psp.LoadAuditSources(); + + // Assert + auditSources.Should().NotBeEmpty(); + var auditSource = auditSources.Should().ContainSingle(); + auditSource.Subject.Name.Should().Be("contoso"); + auditSource.Subject.Source.Should().Be("https://contoso.test/nuget/v3/index.json"); + auditSource.Subject.ProtocolVersion.Should().Be(3); + auditSource.Subject.IsEnabled.Should().BeTrue(); + } + private string CreateNuGetConfigContent(string enabledReplacement = "", string disabledReplacement = "", string activeSourceReplacement = "") { var nugetConfigBaseString = new StringBuilder(); From a9f96c0f42c07f2acef1a3a64f96519b37de4da2 Mon Sep 17 00:00:00 2001 From: Andy Zivkovic Date: Fri, 2 Feb 2024 02:01:42 +0100 Subject: [PATCH 5/6] undo changes to nuget.config --- NuGet.Config | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index 879fb15bd09..8410ee494bf 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,4 +1,4 @@ - + @@ -8,11 +8,10 @@ - - + @@ -41,14 +40,14 @@ - + - + - + @@ -73,13 +72,13 @@ - + - + - + From 9003b0f280e86b51560196f5888e34a78c3ef79d Mon Sep 17 00:00:00 2001 From: Andy Zivkovic Date: Fri, 2 Feb 2024 10:36:25 +0100 Subject: [PATCH 6/6] Fix nullable warning --- .../NuGet.Configuration/PackageSource/PackageSourceProvider.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NuGet.Core/NuGet.Configuration/PackageSource/PackageSourceProvider.cs b/src/NuGet.Core/NuGet.Configuration/PackageSource/PackageSourceProvider.cs index 18d5657dcd0..2787c4398cb 100644 --- a/src/NuGet.Core/NuGet.Configuration/PackageSource/PackageSourceProvider.cs +++ b/src/NuGet.Core/NuGet.Configuration/PackageSource/PackageSourceProvider.cs @@ -716,7 +716,7 @@ public void SavePackageSources(IEnumerable sources) } catch (ArgumentException e) { - AddItem duplicatedKey = existingDisabledSources + AddItem duplicatedKey = existingDisabledSources! .GroupBy(s => s.Key, StringComparer.OrdinalIgnoreCase) .Where(g => g.Count() > 1) .Select(g => g.First())