From a57aabf49932842f0e28aa7cb416f83bdba00d6b Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Wed, 20 Dec 2023 12:04:33 -0800 Subject: [PATCH 01/43] Copied initial files over and addressred some PR comments --- .../NuGet.ProjectModel/JsonUtility.cs | 6 + .../LockFile/LockFileFormat.cs | 58 ++++- ...Utf8JsonStreamAssetsLogMessageConverter.cs | 131 +++++++++++ .../Utf8JsonStreamLockFileConverter.cs | 120 +++++++++++ .../Utf8JsonStreamLockFileItemConverter.cs | 51 +++++ .../Utf8JsonStreamLockFileLibraryConverter.cs | 89 ++++++++ .../Utf8JsonStreamLockFileTargetConverter.cs | 37 ++++ ...sonStreamLockFileTargetLibraryConverter.cs | 203 ++++++++++++++++++ .../Utf8JsonReaderExtensions.cs | 11 + ...reamProjectFileDependencyGroupConverter.cs | 28 +++ .../Utf8JsonStreamReader.cs | 46 ++++ .../Utf8JsonStreamReaderConverter.cs | 4 +- 12 files changed, 772 insertions(+), 12 deletions(-) create mode 100644 src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamAssetsLogMessageConverter.cs create mode 100644 src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileConverter.cs create mode 100644 src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileItemConverter.cs create mode 100644 src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileLibraryConverter.cs create mode 100644 src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetConverter.cs create mode 100644 src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs create mode 100644 src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamProjectFileDependencyGroupConverter.cs diff --git a/src/NuGet.Core/NuGet.ProjectModel/JsonUtility.cs b/src/NuGet.Core/NuGet.ProjectModel/JsonUtility.cs index 742629ad4b5..7996bff6da1 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/JsonUtility.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/JsonUtility.cs @@ -43,6 +43,12 @@ internal static JObject LoadJson(TextReader reader) } } + internal static T LoadJson(Stream stream, IUtf8JsonStreamReaderConverter converter) + { + var streamingJsonReader = new Utf8JsonStreamReader(stream); + return converter.Read(ref streamingJsonReader); + } + internal static PackageDependency ReadPackageDependency(string property, JToken json) { var versionStr = json.Value(); diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/LockFileFormat.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/LockFileFormat.cs index f40c498518b..45dd782fbb0 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LockFile/LockFileFormat.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/LockFileFormat.cs @@ -6,6 +6,7 @@ using System.Globalization; using System.IO; using System.Linq; +using System.Text; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using NuGet.Common; @@ -53,18 +54,19 @@ public class LockFileFormat private const string FrameworkReferencesProperty = "frameworkReferences"; private const string CentralTransitiveDependencyGroupsProperty = "centralTransitiveDependencyGroups"; + [Obsolete] public LockFile Parse(string lockFileContent, string path) { return Parse(lockFileContent, NullLogger.Instance, path); } + [Obsolete] public LockFile Parse(string lockFileContent, ILogger log, string path) { - using (var reader = new StringReader(lockFileContent)) + byte[] byteArray = Encoding.UTF8.GetBytes(lockFileContent); + using (var stream = new MemoryStream(byteArray)) { -#pragma warning disable CS0612 // Type or member is obsolete - return Read(reader, log, path); -#pragma warning restore CS0612 // Type or member is obsolete + return Read(stream, log, path); } } @@ -88,21 +90,34 @@ public LockFile Read(Stream stream, string path) public LockFile Read(Stream stream, ILogger log, string path) { - using (var textReader = new StreamReader(stream)) + return Read(stream, log, path, EnvironmentVariableWrapper.Instance); + } + + internal LockFile Read(Stream stream, ILogger log, string path, IEnvironmentVariableReader environmentVariableReader) + { + var useNj = environmentVariableReader.GetEnvironmentVariable("NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"); + if (string.IsNullOrEmpty(useNj) || useNj.Equals("false", StringComparison.OrdinalIgnoreCase)) + { + return Uf8JsonRead(stream, log, path); + } + else { -#pragma warning disable CS0612 // Type or member is obsolete - return Read(textReader, log, path); -#pragma warning restore CS0612 // Type or member is obsolete + using (var reader = new StreamReader(stream)) + { +#pragma warning disable CS0618 // Type or member is obsolete + return Read(reader, log, path); +#pragma warning restore CS0618 // Type or member is obsolete + } } } - [Obsolete] + [Obsolete("This method is deprecated. Use Read(Stream, string) instead.")] public LockFile Read(TextReader reader, string path) { return Read(reader, NullLogger.Instance, path); } - [Obsolete] + [Obsolete("This method is deprecated. Use Read(Stream, ILogger, string) instead.")] public LockFile Read(TextReader reader, ILogger log, string path) { try @@ -167,6 +182,29 @@ public string Render(LockFile lockFile) } } + private LockFile Uf8JsonRead(Stream stream, ILogger log, string path) + { + try + { + var lockFile = JsonUtility.LoadJson(stream, Utf8JsonReaderExtensions.LockFileConverter); + lockFile.Path = path; + return lockFile; + } + catch (Exception ex) + { + log.LogInformation(string.Format(CultureInfo.CurrentCulture, + Strings.Log_ErrorReadingLockFile, + path, ex.Message)); + + // Ran into parsing errors, mark it as unlocked and out-of-date + return new LockFile + { + Version = int.MinValue, + Path = path + }; + } + } + [Obsolete] private static LockFile ReadLockFile(JObject cursor, string path) { diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamAssetsLogMessageConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamAssetsLogMessageConverter.cs new file mode 100644 index 00000000000..e9aaeb0b85c --- /dev/null +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamAssetsLogMessageConverter.cs @@ -0,0 +1,131 @@ +// 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. + +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.Json; +using NuGet.Common; + +namespace NuGet.ProjectModel +{ + /// + /// A to allow read JSON into + /// + internal class Utf8JsonStreamAssetsLogMessageConverter : IUtf8JsonStreamReaderConverter + { + private static readonly byte[] LevelPropertyName = Encoding.UTF8.GetBytes(LogMessageProperties.LEVEL); + private static readonly byte[] CodePropertyName = Encoding.UTF8.GetBytes(LogMessageProperties.CODE); + private static readonly byte[] WarningLevelPropertyName = Encoding.UTF8.GetBytes(LogMessageProperties.WARNING_LEVEL); + private static readonly byte[] FilePathPropertyName = Encoding.UTF8.GetBytes(LogMessageProperties.FILE_PATH); + private static readonly byte[] StartLineNumberPropertyName = Encoding.UTF8.GetBytes(LogMessageProperties.START_LINE_NUMBER); + private static readonly byte[] StartColumnNumberPropertyName = Encoding.UTF8.GetBytes(LogMessageProperties.START_COLUMN_NUMBER); + private static readonly byte[] EndLineNumberPropertyName = Encoding.UTF8.GetBytes(LogMessageProperties.END_LINE_NUMBER); + private static readonly byte[] EndColumnNumberPropertyName = Encoding.UTF8.GetBytes(LogMessageProperties.END_COLUMN_NUMBER); + private static readonly byte[] MessagePropertyName = Encoding.UTF8.GetBytes(LogMessageProperties.MESSAGE); + private static readonly byte[] LibraryIdPropertyName = Encoding.UTF8.GetBytes(LogMessageProperties.LIBRARY_ID); + private static readonly byte[] TargetGraphsPropertyName = Encoding.UTF8.GetBytes(LogMessageProperties.TARGET_GRAPHS); + + public AssetsLogMessage Read(ref Utf8JsonStreamReader reader) + { + if (reader.TokenType != JsonTokenType.StartObject) + { + throw new JsonException("Expected StartObject, found " + reader.TokenType); + } + + var isValid = true; + LogLevel level = default; + NuGetLogCode code = default; + //matching default warning level when AssetLogMessage object is created + WarningLevel warningLevel = WarningLevel.Severe; + string message = default; + string filePath = default; + int startLineNumber = default; + int startColNumber = default; + int endLineNumber = default; + int endColNumber = default; + string libraryId = default; + IReadOnlyList targetGraphs = null; + + while (reader.Read() && reader.TokenType == JsonTokenType.PropertyName) + { + if (!isValid) + { + reader.Skip(); + } + if (reader.ValueTextEquals(LevelPropertyName)) + { + var levelString = reader.ReadNextTokenAsString(); + isValid &= Enum.TryParse(levelString, out level); + } + else if (reader.ValueTextEquals(CodePropertyName)) + { + var codeString = reader.ReadNextTokenAsString(); + isValid &= Enum.TryParse(codeString, out code); + } + else if (reader.ValueTextEquals(WarningLevelPropertyName)) + { + reader.Read(); + warningLevel = (WarningLevel)Enum.ToObject(typeof(WarningLevel), reader.GetInt32()); + } + else if (reader.ValueTextEquals(FilePathPropertyName)) + { + filePath = reader.ReadNextTokenAsString(); + } + else if (reader.ValueTextEquals(StartLineNumberPropertyName)) + { + reader.Read(); + startLineNumber = reader.GetInt32(); + } + else if (reader.ValueTextEquals(StartColumnNumberPropertyName)) + { + reader.Read(); + startColNumber = reader.GetInt32(); + } + else if (reader.ValueTextEquals(EndLineNumberPropertyName)) + { + reader.Read(); + endLineNumber = reader.GetInt32(); + } + else if (reader.ValueTextEquals(EndColumnNumberPropertyName)) + { + reader.Read(); + endColNumber = reader.GetInt32(); + } + else if (reader.ValueTextEquals(MessagePropertyName)) + { + message = reader.ReadNextTokenAsString(); + } + else if (reader.ValueTextEquals(LibraryIdPropertyName)) + { + libraryId = reader.ReadNextTokenAsString(); + } + else if (reader.ValueTextEquals(TargetGraphsPropertyName)) + { + reader.Read(); + targetGraphs = (List)reader.ReadStringArrayAsIList(); + } + else + { + reader.Skip(); + } + } + if (isValid) + { + var assetLogMessage = new AssetsLogMessage(level, code, message) + { + TargetGraphs = targetGraphs ?? Array.Empty(), + FilePath = filePath, + EndColumnNumber = endColNumber, + EndLineNumber = endLineNumber, + LibraryId = libraryId, + StartColumnNumber = startColNumber, + StartLineNumber = startLineNumber, + WarningLevel = warningLevel + }; + return assetLogMessage; + } + return null; + } + } +} diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileConverter.cs new file mode 100644 index 00000000000..fb2004f1829 --- /dev/null +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileConverter.cs @@ -0,0 +1,120 @@ +// 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. + +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.Json; +using NuGet.Frameworks; +using NuGet.LibraryModel; + +namespace NuGet.ProjectModel +{ + /// + /// A to allow read JSON into + /// + internal class Utf8JsonStreamLockFileConverter : IUtf8JsonStreamReaderConverter + { + private static readonly byte[] VersionPropertyName = Encoding.UTF8.GetBytes("version"); + private static readonly byte[] LibrariesPropertyName = Encoding.UTF8.GetBytes("libraries"); + private static readonly byte[] TargetsPropertyName = Encoding.UTF8.GetBytes("targets"); + private static readonly byte[] ProjectFileDependencyGroupsPropertyName = Encoding.UTF8.GetBytes("projectFileDependencyGroups"); + private static readonly byte[] PackageFoldersPropertyName = Encoding.UTF8.GetBytes("packageFolders"); + private static readonly byte[] ProjectPropertyName = Encoding.UTF8.GetBytes("project"); + private static readonly byte[] CentralTransitiveDependencyGroupsPropertyName = Encoding.UTF8.GetBytes("centralTransitiveDependencyGroups"); + private static readonly byte[] LogsPropertyName = Encoding.UTF8.GetBytes("logs"); + + public LockFile Read(ref Utf8JsonStreamReader reader) + { + if (reader.TokenType != JsonTokenType.StartObject) + { + throw new JsonException("Expected StartObject, found " + reader.TokenType); + } + + var lockFile = new LockFile(); + + while (reader.Read() && reader.TokenType == JsonTokenType.PropertyName) + { + if (reader.ValueTextEquals(VersionPropertyName)) + { + reader.Read(); + if (reader.TryGetInt32(out int version)) + { + lockFile.Version = version; + } + else + { + lockFile.Version = int.MinValue; + } + } + else if (reader.ValueTextEquals(LibrariesPropertyName)) + { + reader.Read(); + lockFile.Libraries = reader.ReadObjectAsList(Utf8JsonReaderExtensions.LockFileLibraryConverter); + } + else if (reader.ValueTextEquals(TargetsPropertyName)) + { + reader.Read(); + lockFile.Targets = reader.ReadObjectAsList(Utf8JsonReaderExtensions.LockFileTargetConverter); + } + else if (reader.ValueTextEquals(ProjectFileDependencyGroupsPropertyName)) + { + reader.Read(); + lockFile.ProjectFileDependencyGroups = reader.ReadObjectAsList(Utf8JsonReaderExtensions.ProjectFileDepencencyGroupConverter); + } + else if (reader.ValueTextEquals(PackageFoldersPropertyName)) + { + reader.Read(); + lockFile.PackageFolders = reader.ReadObjectAsList(Utf8JsonReaderExtensions.LockFileItemConverter); + } + else if (reader.ValueTextEquals(ProjectPropertyName)) + { + reader.Read(); + lockFile.PackageSpec = JsonPackageSpecReader.GetPackageSpec( + ref reader, + name: null, + packageSpecPath: null, + snapshotValue: null); + } + else if (reader.ValueTextEquals(CentralTransitiveDependencyGroupsPropertyName)) + { + var results = new List(); + if (reader.Read() && reader.TokenType == JsonTokenType.StartObject) + { + while (reader.Read() && reader.TokenType == JsonTokenType.PropertyName) + { + var frameworkPropertyName = reader.GetString(); + NuGetFramework framework = NuGetFramework.Parse(frameworkPropertyName); + var dependencies = new List(); + + JsonPackageSpecReader.ReadCentralTransitiveDependencyGroup( + jsonReader: ref reader, + results: dependencies, + packageSpecPath: string.Empty); + results.Add(new CentralTransitiveDependencyGroup(framework, dependencies)); + } + } + lockFile.CentralTransitiveDependencyGroups = results; + } + else if (reader.ValueTextEquals(LogsPropertyName)) + { + reader.ReadArrayOfObjects(lockFile.LogMessages, Utf8JsonReaderExtensions.AssetsLogMessageConverter); + } + else + { + reader.Skip(); + } + } + + if (!string.IsNullOrEmpty(lockFile.PackageSpec?.RestoreMetadata?.ProjectPath) && lockFile.LogMessages.Count > 0) + { + foreach (AssetsLogMessage message in lockFile.LogMessages.Where(x => string.IsNullOrEmpty(x.ProjectPath))) + { + message.FilePath = lockFile.PackageSpec.RestoreMetadata.ProjectPath; + } + } + + return lockFile; + } + } +} diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileItemConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileItemConverter.cs new file mode 100644 index 00000000000..d81a928e87c --- /dev/null +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileItemConverter.cs @@ -0,0 +1,51 @@ +// 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. + +using System.Text.Json; + +namespace NuGet.ProjectModel +{ + /// + /// A to allow read JSON into + /// + internal class Utf8JsonStreamLockFileItemConverter : IUtf8JsonStreamReaderConverter where T : LockFileItem + { + public T Read(ref Utf8JsonStreamReader reader) + { + var genericType = typeof(T); + + if (reader.TokenType != JsonTokenType.PropertyName) + { + throw new JsonException("Expected PropertyName, found " + reader.TokenType); + } + + //We want to read the property name right away + var lockItemPath = reader.GetString(); + LockFileItem lockFileItem; + if (genericType == typeof(LockFileContentFile)) + { + lockFileItem = new LockFileContentFile(lockItemPath); + } + else if (genericType == typeof(LockFileRuntimeTarget)) + { + lockFileItem = new LockFileRuntimeTarget(lockItemPath); + } + else + { + lockFileItem = new LockFileItem(lockItemPath); + } + + reader.Read(); + if (reader.TokenType == JsonTokenType.StartObject) + { + while (reader.Read() && reader.TokenType == JsonTokenType.PropertyName) + { + var propertyName = reader.GetString(); + lockFileItem.Properties[propertyName] = reader.ReadNextTokenAsString(); + } + } + + return lockFileItem as T; + } + } +} diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileLibraryConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileLibraryConverter.cs new file mode 100644 index 00000000000..99bae073fe8 --- /dev/null +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileLibraryConverter.cs @@ -0,0 +1,89 @@ +// 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. + +using System.Text; +using System.Text.Json; +using NuGet.Versioning; + +namespace NuGet.ProjectModel +{ + /// + /// A to allow read JSON into + /// + internal class Utf8JsonStreamLockFileLibraryConverter : IUtf8JsonStreamReaderConverter + { + private static readonly byte[] Sha512PropertyName = Encoding.UTF8.GetBytes("sha512"); + private static readonly byte[] TypePropertyName = Encoding.UTF8.GetBytes("type"); + private static readonly byte[] PathPropertyName = Encoding.UTF8.GetBytes("path"); + private static readonly byte[] MsbuildProjectPropertyName = Encoding.UTF8.GetBytes("msbuildProject"); + private static readonly byte[] ServicablePropertyName = Encoding.UTF8.GetBytes("servicable"); + private static readonly byte[] HasToolsPropertyName = Encoding.UTF8.GetBytes("hasTools"); + private static readonly byte[] FilesPropertyName = Encoding.UTF8.GetBytes("files"); + private static readonly char[] Separators = new[] { '/' }; + + public LockFileLibrary Read(ref Utf8JsonStreamReader reader) + { + + if (reader.TokenType != JsonTokenType.PropertyName) + { + throw new JsonException("Expected PropertyName, found " + reader.TokenType); + } + + var lockFileLibrary = new LockFileLibrary(); + //We want to read the property name right away + var propertyName = reader.GetString(); + var parts = propertyName.Split(Separators, 2); + lockFileLibrary.Name = parts[0]; + if (parts.Length == 2) + { + lockFileLibrary.Version = NuGetVersion.Parse(parts[1]); + } + + reader.Read(); + if (reader.TokenType != JsonTokenType.StartObject) + { + throw new JsonException("Expected StartObject, found " + reader.TokenType); + } + + while (reader.Read() && reader.TokenType == JsonTokenType.PropertyName) + { + if (reader.ValueTextEquals(TypePropertyName)) + { + lockFileLibrary.Type = reader.ReadNextTokenAsString(); + } + else if (reader.ValueTextEquals(PathPropertyName)) + { + lockFileLibrary.Path = reader.ReadNextTokenAsString(); + } + else if (reader.ValueTextEquals(MsbuildProjectPropertyName)) + { + lockFileLibrary.MSBuildProject = reader.ReadNextTokenAsString(); + } + else if (reader.ValueTextEquals(Sha512PropertyName)) + { + lockFileLibrary.Sha512 = reader.ReadNextTokenAsString(); + } + else if (reader.ValueTextEquals(ServicablePropertyName)) + { + reader.Read(); + lockFileLibrary.IsServiceable = reader.GetBoolean(); + } + else if (reader.ValueTextEquals(HasToolsPropertyName)) + { + reader.Read(); + lockFileLibrary.HasTools = reader.GetBoolean(); + } + else if (reader.ValueTextEquals(FilesPropertyName)) + { + reader.Read(); + reader.ReadStringArrayAsIList(lockFileLibrary.Files); + } + else + { + reader.Skip(); + } + } + return lockFileLibrary; + } + } +} diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetConverter.cs new file mode 100644 index 00000000000..94e1b778a13 --- /dev/null +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetConverter.cs @@ -0,0 +1,37 @@ +// 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. + +using System.Text.Json; +using NuGet.Frameworks; + +namespace NuGet.ProjectModel +{ + /// + /// A to allow read JSON into + /// + internal class Utf8JsonStreamLockFileTargetConverter : IUtf8JsonStreamReaderConverter + { + public LockFileTarget Read(ref Utf8JsonStreamReader reader) + { + if (reader.TokenType != JsonTokenType.PropertyName) + { + throw new JsonException("Expected PropertyName, found " + reader.TokenType); + } + + var lockFileTarget = new LockFileTarget(); + //We want to read the property name right away + var propertyName = reader.GetString(); + var parts = propertyName.Split(JsonUtility.PathSplitChars, 2); + lockFileTarget.TargetFramework = NuGetFramework.Parse(parts[0]); + if (parts.Length == 2) + { + lockFileTarget.RuntimeIdentifier = parts[1]; + } + + reader.Read(); + lockFileTarget.Libraries = reader.ReadObjectAsList(Utf8JsonReaderExtensions.LockFileTargetLibraryConverter); + + return lockFileTarget; + } + } +} diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs new file mode 100644 index 00000000000..6c89c6afc2e --- /dev/null +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs @@ -0,0 +1,203 @@ +// 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. + +using System.Collections.Generic; +using System.Text; +using System.Text.Json; +using NuGet.Packaging.Core; +using NuGet.Versioning; + +namespace NuGet.ProjectModel +{ + /// + /// A to allow read JSON into + /// + internal class Utf8JsonStreamLockFileTargetLibraryConverter : IUtf8JsonStreamReaderConverter + { + private static readonly byte[] TypePropertyName = Encoding.UTF8.GetBytes("type"); + private static readonly byte[] FrameworkPropertyName = Encoding.UTF8.GetBytes("framework"); + private static readonly byte[] DependenciesPropertyName = Encoding.UTF8.GetBytes("dependencies"); + private static readonly byte[] FrameworkAssembliesPropertyName = Encoding.UTF8.GetBytes("frameworkAssemblies"); + private static readonly byte[] RuntimePropertyName = Encoding.UTF8.GetBytes("runtime"); + private static readonly byte[] CompilePropertyName = Encoding.UTF8.GetBytes("compile"); + private static readonly byte[] ResourcePropertyName = Encoding.UTF8.GetBytes("resource"); + private static readonly byte[] NativePropertyName = Encoding.UTF8.GetBytes("native"); + private static readonly byte[] BuildPropertyName = Encoding.UTF8.GetBytes("build"); + private static readonly byte[] BuildMultiTargetingPropertyName = Encoding.UTF8.GetBytes("buildMultiTargeting"); + private static readonly byte[] ContentFilesPropertyName = Encoding.UTF8.GetBytes("contentFiles"); + private static readonly byte[] RuntimeTargetsPropertyName = Encoding.UTF8.GetBytes("runtimeTargets"); + private static readonly byte[] ToolsPropertyName = Encoding.UTF8.GetBytes("tools"); + private static readonly byte[] EmbedPropertyName = Encoding.UTF8.GetBytes("embed"); + private static readonly byte[] FrameworkReferencesPropertyName = Encoding.UTF8.GetBytes("frameworkReferences"); + + private IList ReadPackageDependencyList(ref Utf8JsonStreamReader reader) + { + if (reader.TokenType != JsonTokenType.StartObject) + { + return new List(0); + } + + var packageDependencies = new List(); + while (reader.Read() && reader.TokenType == JsonTokenType.PropertyName) + { + string propertyName = reader.GetString(); + string versionString = reader.ReadNextTokenAsString(); + + packageDependencies.Add(new PackageDependency( + propertyName, + versionString == null ? null : VersionRange.Parse(versionString))); + } + return packageDependencies; + } + + public LockFileTargetLibrary Read(ref Utf8JsonStreamReader reader) + { + if (reader.TokenType != JsonTokenType.PropertyName) + { + throw new JsonException("Expected PropertyName, found " + reader.TokenType); + } + + var lockFileTargetLibrary = new LockFileTargetLibrary(); + + //We want to read the property name right away + var propertyName = reader.GetString(); +#pragma warning disable CA1307 // Specify StringComparison + int slashIndex = propertyName.IndexOf('/'); +#pragma warning restore CA1307 // Specify StringComparison + if (slashIndex == -1) + { + lockFileTargetLibrary.Name = propertyName; + } + else + { + lockFileTargetLibrary.Name = propertyName.Substring(0, slashIndex); + lockFileTargetLibrary.Version = NuGetVersion.Parse(propertyName.Substring(slashIndex + 1)); + } + + reader.Read(); + if (reader.TokenType != JsonTokenType.StartObject) + { + throw new JsonException("Expected StartObject, found " + reader.TokenType); + } + + while (reader.Read() && reader.TokenType == JsonTokenType.PropertyName) + { + if (reader.ValueTextEquals(TypePropertyName)) + { + lockFileTargetLibrary.Type = reader.ReadNextTokenAsString(); + } + else if (reader.ValueTextEquals(FrameworkPropertyName)) + { + lockFileTargetLibrary.Framework = reader.ReadNextTokenAsString(); + } + else if (reader.ValueTextEquals(DependenciesPropertyName)) + { + reader.Read(); + if (ReadPackageDependencyList(ref reader) is { Count: not 0 } packageDependencies) + { + lockFileTargetLibrary.Dependencies = packageDependencies; + } + } + else if (reader.ValueTextEquals(FrameworkAssembliesPropertyName)) + { + reader.Read(); + lockFileTargetLibrary.FrameworkAssemblies = reader.ReadStringArrayAsIList(new List()); + } + else if (reader.ValueTextEquals(RuntimePropertyName)) + { + reader.Read(); + if (reader.ReadObjectAsList(Utf8JsonReaderExtensions.LockFileItemConverter) is { Count: not 0 } runtimeAssemblies) + { + lockFileTargetLibrary.RuntimeAssemblies = runtimeAssemblies; + } + } + else if (reader.ValueTextEquals(CompilePropertyName)) + { + reader.Read(); + if (reader.ReadObjectAsList(Utf8JsonReaderExtensions.LockFileItemConverter) is { Count: not 0 } compileTimeAssemblies) + { + lockFileTargetLibrary.CompileTimeAssemblies = compileTimeAssemblies; + } + } + else if (reader.ValueTextEquals(ResourcePropertyName)) + { + reader.Read(); + if (reader.ReadObjectAsList(Utf8JsonReaderExtensions.LockFileItemConverter) is { Count: not 0 } resourceAssemblies) + { + lockFileTargetLibrary.ResourceAssemblies = resourceAssemblies; + } + } + else if (reader.ValueTextEquals(NativePropertyName)) + { + reader.Read(); + if (reader.ReadObjectAsList(Utf8JsonReaderExtensions.LockFileItemConverter) is { Count: not 0 } nativeLibraries) + { + lockFileTargetLibrary.NativeLibraries = nativeLibraries; + } + } + else if (reader.ValueTextEquals(BuildPropertyName)) + { + reader.Read(); + if (reader.ReadObjectAsList(Utf8JsonReaderExtensions.LockFileItemConverter) is { Count: not 0 } build) + { + lockFileTargetLibrary.Build = build; + } + } + else if (reader.ValueTextEquals(BuildMultiTargetingPropertyName)) + { + reader.Read(); + if (reader.ReadObjectAsList(Utf8JsonReaderExtensions.LockFileItemConverter) is { Count: not 0 } buildMultiTargeting) + { + lockFileTargetLibrary.BuildMultiTargeting = buildMultiTargeting; + } + } + else if (reader.ValueTextEquals(ContentFilesPropertyName)) + { + reader.Read(); + if (reader.ReadObjectAsList(Utf8JsonReaderExtensions.LockFileContentFileConverter) is { Count: not 0 } contentFiles) + { + lockFileTargetLibrary.ContentFiles = contentFiles; + } + } + else if (reader.ValueTextEquals(RuntimeTargetsPropertyName)) + { + reader.Read(); + if (reader.ReadObjectAsList(Utf8JsonReaderExtensions.LockFileRuntimeTargetConverter) is { Count: not 0 } runtimeTargets) + { + lockFileTargetLibrary.RuntimeTargets = runtimeTargets; + } + } + else if (reader.ValueTextEquals(ToolsPropertyName)) + { + reader.Read(); + if (reader.ReadObjectAsList(Utf8JsonReaderExtensions.LockFileItemConverter) is { Count: not 0 } toolsAssemblies) + { + lockFileTargetLibrary.ToolsAssemblies = toolsAssemblies; + } + } + else if (reader.ValueTextEquals(EmbedPropertyName)) + { + reader.Read(); + if (reader.ReadObjectAsList(Utf8JsonReaderExtensions.LockFileItemConverter) is { Count: not 0 } embedAssemblies) + { + lockFileTargetLibrary.EmbedAssemblies = embedAssemblies; + } + } + else if (reader.ValueTextEquals(FrameworkReferencesPropertyName)) + { + reader.Read(); + if (reader.ReadStringArrayAsIList(new List()) is { Count: not 0 } frameworkReferences) + { + lockFileTargetLibrary.FrameworkReferences = frameworkReferences; + } + } + else + { + reader.Skip(); + } + } + lockFileTargetLibrary.Freeze(); + return lockFileTargetLibrary; + } + } +} diff --git a/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonReaderExtensions.cs b/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonReaderExtensions.cs index 7b40b3f1b30..fe5e5c7bb1a 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonReaderExtensions.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonReaderExtensions.cs @@ -8,6 +8,17 @@ namespace NuGet.ProjectModel { internal static class Utf8JsonReaderExtensions { + internal static readonly Utf8JsonStreamLockFileConverter LockFileConverter = new Utf8JsonStreamLockFileConverter(); + internal static readonly Utf8JsonStreamLockFileItemConverter LockFileItemConverter = new Utf8JsonStreamLockFileItemConverter(); + internal static readonly Utf8JsonStreamLockFileItemConverter LockFileContentFileConverter = new Utf8JsonStreamLockFileItemConverter(); + internal static readonly Utf8JsonStreamLockFileItemConverter LockFileRuntimeTargetConverter = new Utf8JsonStreamLockFileItemConverter(); + internal static readonly Utf8JsonStreamLockFileTargetLibraryConverter LockFileTargetLibraryConverter = new Utf8JsonStreamLockFileTargetLibraryConverter(); + internal static readonly Utf8JsonStreamLockFileLibraryConverter LockFileLibraryConverter = new Utf8JsonStreamLockFileLibraryConverter(); + internal static readonly Utf8JsonStreamLockFileTargetConverter LockFileTargetConverter = new Utf8JsonStreamLockFileTargetConverter(); + internal static readonly Utf8JsonStreamProjectFileDependencyGroupConverter ProjectFileDepencencyGroupConverter = new Utf8JsonStreamProjectFileDependencyGroupConverter(); + internal static readonly Utf8JsonStreamAssetsLogMessageConverter AssetsLogMessageConverter = new Utf8JsonStreamAssetsLogMessageConverter(); + + internal static string ReadTokenAsString(this ref Utf8JsonReader reader) { switch (reader.TokenType) diff --git a/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamProjectFileDependencyGroupConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamProjectFileDependencyGroupConverter.cs new file mode 100644 index 00000000000..41684b75747 --- /dev/null +++ b/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamProjectFileDependencyGroupConverter.cs @@ -0,0 +1,28 @@ +// 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. + +using System.Collections.Generic; +using System.Text.Json; + +namespace NuGet.ProjectModel +{ + /// + /// A to allow read JSON into + /// + internal class Utf8JsonStreamProjectFileDependencyGroupConverter : IUtf8JsonStreamReaderConverter + { + public ProjectFileDependencyGroup Read(ref Utf8JsonStreamReader reader) + { + if (reader.TokenType != JsonTokenType.PropertyName) + { + throw new JsonException("Expected PropertyName, found " + reader.TokenType); + } + + var frameworkName = reader.GetString(); + reader.Read(); + var dependencies = reader.ReadStringArrayAsIList(new List()); + + return new ProjectFileDependencyGroup(frameworkName, dependencies); + } + } +} diff --git a/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamReader.cs b/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamReader.cs index 96b6c1f4c69..f6c126ece0f 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamReader.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamReader.cs @@ -104,6 +104,52 @@ internal void Skip() } } + internal IList ReadObjectAsList(IUtf8JsonStreamReaderConverter streamReaderConverter) + { + if (TokenType != JsonTokenType.StartObject) + { + return new List(0); + + } + //We use JsonObjects for the arrays so we advance to the first property in the object which is the name/ver of the first library + Read(); + + if (TokenType == JsonTokenType.EndObject) + { + return new List(0); + } + + var listObjects = new List(); + do + { + listObjects.Add(streamReaderConverter.Read(ref this)); + //At this point we're looking at the EndObject token for the object, need to advance. + Read(); + } + while (TokenType != JsonTokenType.EndObject); + return listObjects; + } + + internal void ReadArrayOfObjects(IList objectList, IUtf8JsonStreamReaderConverter streamReaderConverter) where T1 : T2 + { + if (objectList is null) + { + return; + } + + if (Read() && TokenType == JsonTokenType.StartArray) + { + while (Read() && TokenType != JsonTokenType.EndArray) + { + var convertedObject = streamReaderConverter.Read(ref this); + if (convertedObject != null) + { + objectList.Add(convertedObject); + } + } + } + } + internal string ReadNextTokenAsString() { ThrowExceptionIfDisposed(); diff --git a/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamReaderConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamReaderConverter.cs index 167750c3828..730560501c7 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamReaderConverter.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamReaderConverter.cs @@ -6,8 +6,8 @@ namespace NuGet.ProjectModel /// An abstract class that defines a function for reading a into a /// /// - internal abstract class Utf8JsonStreamReaderConverter + internal interface IUtf8JsonStreamReaderConverter { - public abstract T Read(ref Utf8JsonStreamReader reader); + T Read(ref Utf8JsonStreamReader reader); } } From 05ed3db8bd2c8c2bd16f5ca400ae11f20b38081e Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Thu, 21 Dec 2023 12:15:28 -0800 Subject: [PATCH 02/43] Test updates --- .../Models/AssetsFileDependenciesSnapshotTests.cs | 3 +++ .../NuGet.Commands.FuncTest/RestoreCommandTests.cs | 1 + .../NuGet.Commands.FuncTest/UWPRestoreTests.cs | 2 ++ .../NuGet.ProjectModel.Test/LockFileFormatTests.cs | 8 ++++++++ .../NuGet.ProjectModel.Test/LockFileTests.cs | 2 ++ .../NuGet.Tests.Apex/Utility/CommonUtility.cs | 2 ++ 6 files changed, 18 insertions(+) diff --git a/test/NuGet.Clients.Tests/NuGet.VisualStudio.Implementation.Test/SolutionExplorer/Models/AssetsFileDependenciesSnapshotTests.cs b/test/NuGet.Clients.Tests/NuGet.VisualStudio.Implementation.Test/SolutionExplorer/Models/AssetsFileDependenciesSnapshotTests.cs index c08ef5984d9..9e45e78d43c 100644 --- a/test/NuGet.Clients.Tests/NuGet.VisualStudio.Implementation.Test/SolutionExplorer/Models/AssetsFileDependenciesSnapshotTests.cs +++ b/test/NuGet.Clients.Tests/NuGet.VisualStudio.Implementation.Test/SolutionExplorer/Models/AssetsFileDependenciesSnapshotTests.cs @@ -14,6 +14,7 @@ namespace NuGet.VisualStudio.Implementation.Test.SolutionExplorer.Models public class AssetsFileDependenciesSnapshotTests { [Fact] + [Obsolete] public void ParseLibraries_IgnoreCaseInDependenciesTree_Succeeds() { var lockFileContent = """ @@ -68,6 +69,7 @@ public void ParseLibraries_IgnoreCaseInDependenciesTree_Succeeds() } [Fact] + [Obsolete] public void ParseLibraries_LogForUnknownLibrary_AddsUnknownLibraryType() { var lockFileContent = """ @@ -118,6 +120,7 @@ public void ParseLibraries_LogForUnknownLibrary_AddsUnknownLibraryType() } [Fact] + [Obsolete] public void ParseLibraries_LogForUnknownLibrary_WithAbsolutePath_AddsUnknownLibraryType() { var lockFileContent = """ diff --git a/test/NuGet.Core.FuncTests/NuGet.Commands.FuncTest/RestoreCommandTests.cs b/test/NuGet.Core.FuncTests/NuGet.Commands.FuncTest/RestoreCommandTests.cs index ba9f416afa6..1c2a034bfa3 100644 --- a/test/NuGet.Core.FuncTests/NuGet.Commands.FuncTest/RestoreCommandTests.cs +++ b/test/NuGet.Core.FuncTests/NuGet.Commands.FuncTest/RestoreCommandTests.cs @@ -1848,6 +1848,7 @@ public async Task RestoreCommand_UnmatchedRefAndLibAssembliesAsync() } [Fact(Skip = "https://github.com/NuGet/Home/issues/8765")] + [Obsolete] public async Task RestoreCommand_LockedLockFileWithOutOfDateProjectAsync() { const string project = @" diff --git a/test/NuGet.Core.FuncTests/NuGet.Commands.FuncTest/UWPRestoreTests.cs b/test/NuGet.Core.FuncTests/NuGet.Commands.FuncTest/UWPRestoreTests.cs index bb47d8b7fe4..b1f84e8e6ce 100644 --- a/test/NuGet.Core.FuncTests/NuGet.Commands.FuncTest/UWPRestoreTests.cs +++ b/test/NuGet.Core.FuncTests/NuGet.Commands.FuncTest/UWPRestoreTests.cs @@ -23,6 +23,7 @@ public class UWPRestoreTests { // Verify that a v1 lock file can be parsed without crashing. [Fact] + [System.Obsolete] public void UWPRestore_ReadV1LockFile() { // Arrange @@ -43,6 +44,7 @@ public void UWPRestore_ReadV1LockFile() } [Fact] + [System.Obsolete] public void UWPRestore_ReadLockFileRoundTrip() { using (var workingDir = TestDirectory.Create()) diff --git a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileFormatTests.cs b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileFormatTests.cs index 310781aa194..04109f4276b 100644 --- a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileFormatTests.cs +++ b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileFormatTests.cs @@ -148,9 +148,11 @@ public void LockFileFormat_LockedPropertyIsIgnored() var lockFileFormat = new LockFileFormat(); // Act +#pragma warning disable CS0612 // Type or member is obsolete var lockFileTrue = lockFileFormat.Parse(lockFileContentTrue, "In Memory"); var lockFileFalse = lockFileFormat.Parse(lockFileContentFalse, "In Memory"); var lockFileMissing = lockFileFormat.Parse(lockFileContentMissing, "In Memory"); +#pragma warning restore CS0612 // Type or member is obsolete var lockFileTrueString = lockFileFormat.Render(lockFileTrue); var lockFileFalseString = lockFileFormat.Render(lockFileFalse); @@ -207,7 +209,9 @@ public void LockFileFormat_ReadsLockFileWithNoTools() } }"; var lockFileFormat = new LockFileFormat(); +#pragma warning disable CS0612 // Type or member is obsolete var lockFile = lockFileFormat.Parse(lockFileContent, "In Memory"); +#pragma warning restore CS0612 // Type or member is obsolete Assert.Equal(1, lockFile.Version); @@ -2018,7 +2022,9 @@ public void LockFileFormat_ReadsLockFileWithTools() } }"; var lockFileFormat = new LockFileFormat(); +#pragma warning disable CS0612 // Type or member is obsolete var lockFile = lockFileFormat.Parse(lockFileContent, "In Memory"); +#pragma warning restore CS0612 // Type or member is obsolete Assert.Equal(1, lockFile.Version); @@ -2094,7 +2100,9 @@ public void LockFileFormat_ReadsLockFileWithEmbedAssemblies() }"; var lockFileFormat = new LockFileFormat(); +#pragma warning disable CS0612 // Type or member is obsolete var lockFile = lockFileFormat.Parse(lockFileContent, "In Memory"); +#pragma warning restore CS0612 // Type or member is obsolete Assert.Equal(1, lockFile.Version); diff --git a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileTests.cs b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileTests.cs index 8131591068f..f6874628ac5 100644 --- a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileTests.cs +++ b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileTests.cs @@ -855,6 +855,7 @@ public void LockFile_ConsiderCentralTransitiveDependencyGroupsForEquality() } [Fact] + [Obsolete] public void LockFile_GetTarget_WithNuGetFramework_ReturnsCorrectLockFileTarget() { // Arrange @@ -870,6 +871,7 @@ public void LockFile_GetTarget_WithNuGetFramework_ReturnsCorrectLockFileTarget() } [Fact] + [Obsolete] public void LockFile_GetTarget_WithAlias_ReturnsCorrectLockFileTarget() { // Arrange diff --git a/test/NuGet.Tests.Apex/NuGet.Tests.Apex/Utility/CommonUtility.cs b/test/NuGet.Tests.Apex/NuGet.Tests.Apex/Utility/CommonUtility.cs index 9872e9ea643..1342e0907d6 100644 --- a/test/NuGet.Tests.Apex/NuGet.Tests.Apex/Utility/CommonUtility.cs +++ b/test/NuGet.Tests.Apex/NuGet.Tests.Apex/Utility/CommonUtility.cs @@ -407,7 +407,9 @@ private static LockFile GetAssetsFileWithRetry(string path) { content = File.ReadAllText(path); var format = new LockFileFormat(); +#pragma warning disable CS0612 // Type or member is obsolete return format.Parse(content, path); +#pragma warning restore CS0612 // Type or member is obsolete } catch { From c285f0ff8c07d98241f65b4961458e3c083fd67b Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Thu, 21 Dec 2023 13:13:03 -0800 Subject: [PATCH 03/43] optimized string split --- .../Utf8JsonStreamLockFileTargetConverter.cs | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetConverter.cs index 94e1b778a13..bab3eccf5c8 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetConverter.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetConverter.cs @@ -1,6 +1,7 @@ // 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. +using System; using System.Text.Json; using NuGet.Frameworks; @@ -21,17 +22,27 @@ public LockFileTarget Read(ref Utf8JsonStreamReader reader) var lockFileTarget = new LockFileTarget(); //We want to read the property name right away var propertyName = reader.GetString(); - var parts = propertyName.Split(JsonUtility.PathSplitChars, 2); - lockFileTarget.TargetFramework = NuGetFramework.Parse(parts[0]); - if (parts.Length == 2) - { - lockFileTarget.RuntimeIdentifier = parts[1]; - } + var parts = GetFrameworkAndIdentifier(propertyName, LockFile.DirectorySeparatorChar); + lockFileTarget.TargetFramework = NuGetFramework.Parse(parts.targetFramework); + lockFileTarget.RuntimeIdentifier = parts.runtimeIdentifier; reader.Read(); lockFileTarget.Libraries = reader.ReadObjectAsList(Utf8JsonReaderExtensions.LockFileTargetLibraryConverter); return lockFileTarget; } + + + public static (string targetFramework, string runtimeIdentifier) GetFrameworkAndIdentifier(string input, char separator) + { + int firstIndex = input.IndexOf(separator); + int lastIndex = input.LastIndexOf(separator); + + if (firstIndex == -1) + return (input, null); + + return (input.Substring(0, firstIndex), + firstIndex >= input.Length - 1 || firstIndex != lastIndex ? null : input.Substring(firstIndex + 1)); + } } } From c06e3f503a7192e07737c407687ff996c90b4f3b Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Thu, 21 Dec 2023 13:29:59 -0800 Subject: [PATCH 04/43] cleanup --- .../LockFile/Utf8JsonStreamLockFileTargetConverter.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetConverter.cs index bab3eccf5c8..dd81a6917fc 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetConverter.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetConverter.cs @@ -1,7 +1,6 @@ // 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. -using System; using System.Text.Json; using NuGet.Frameworks; From ef90a51c62b6f7e3b3142d2896a0f99e97c13738 Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Thu, 21 Dec 2023 13:34:59 -0800 Subject: [PATCH 05/43] switch to stream --- .../NuGet.Tests.Apex/Utility/CommonUtility.cs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/test/NuGet.Tests.Apex/NuGet.Tests.Apex/Utility/CommonUtility.cs b/test/NuGet.Tests.Apex/NuGet.Tests.Apex/Utility/CommonUtility.cs index 1342e0907d6..32e88b4c9e9 100644 --- a/test/NuGet.Tests.Apex/NuGet.Tests.Apex/Utility/CommonUtility.cs +++ b/test/NuGet.Tests.Apex/NuGet.Tests.Apex/Utility/CommonUtility.cs @@ -396,7 +396,6 @@ private static LockFile GetAssetsFileWithRetry(string path) { var timeout = TimeSpan.FromSeconds(20); var timer = Stopwatch.StartNew(); - string content = null; do { @@ -405,11 +404,8 @@ private static LockFile GetAssetsFileWithRetry(string path) { try { - content = File.ReadAllText(path); var format = new LockFileFormat(); -#pragma warning disable CS0612 // Type or member is obsolete - return format.Parse(content, path); -#pragma warning restore CS0612 // Type or member is obsolete + return format.Read(path); } catch { From 4c31cbfdb40d75b1e0e67867e819b3be2cbd89df Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Thu, 21 Dec 2023 13:37:48 -0800 Subject: [PATCH 06/43] fix typo --- .../Utf8JsonStreamProjectFileDependencyGroupConverter.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamProjectFileDependencyGroupConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamProjectFileDependencyGroupConverter.cs index 41684b75747..91104b87793 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamProjectFileDependencyGroupConverter.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamProjectFileDependencyGroupConverter.cs @@ -7,7 +7,7 @@ namespace NuGet.ProjectModel { /// - /// A to allow read JSON into + /// A to allow reading JSON into /// internal class Utf8JsonStreamProjectFileDependencyGroupConverter : IUtf8JsonStreamReaderConverter { From b787826d2622ca104d38e2224a6c9e4e9bd08978 Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Thu, 21 Dec 2023 14:03:12 -0800 Subject: [PATCH 07/43] fix typo --- src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamReader.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamReader.cs b/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamReader.cs index f6c126ece0f..bbd249f263d 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamReader.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamReader.cs @@ -53,13 +53,13 @@ internal Utf8JsonStreamReader(Stream stream, int bufferSize = BufferSizeDefault, _bufferUsed = 3; } - var iniialJsonReaderState = new JsonReaderState(new JsonReaderOptions + var initialJsonReaderState = new JsonReaderState(new JsonReaderOptions { AllowTrailingCommas = true, CommentHandling = JsonCommentHandling.Skip, }); - ReadStreamIntoBuffer(iniialJsonReaderState); + ReadStreamIntoBuffer(initialJsonReaderState); _reader.Read(); } From c627b2595e6571b84e9bddd29968a86077219a63 Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Thu, 21 Dec 2023 14:36:09 -0800 Subject: [PATCH 08/43] create static json reader state --- .../NuGet.ProjectModel/Utf8JsonStreamReader.cs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamReader.cs b/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamReader.cs index bbd249f263d..88bb1d7a8ba 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamReader.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamReader.cs @@ -18,6 +18,11 @@ internal ref struct Utf8JsonStreamReader { private static readonly char[] DelimitedStringDelimiters = [' ', ',']; private static readonly byte[] Utf8Bom = [0xEF, 0xBB, 0xBF]; + private static readonly JsonReaderOptions DefaultJsonReaderOptions = new JsonReaderOptions + { + AllowTrailingCommas = true, + CommentHandling = JsonCommentHandling.Skip, + }; private const int BufferSizeDefault = 16 * 1024; private const int MinBufferSize = 1024; @@ -53,11 +58,7 @@ internal Utf8JsonStreamReader(Stream stream, int bufferSize = BufferSizeDefault, _bufferUsed = 3; } - var initialJsonReaderState = new JsonReaderState(new JsonReaderOptions - { - AllowTrailingCommas = true, - CommentHandling = JsonCommentHandling.Skip, - }); + var initialJsonReaderState = new JsonReaderState(DefaultJsonReaderOptions); ReadStreamIntoBuffer(initialJsonReaderState); _reader.Read(); From ef35381cf06de96d04bb7d61cdd7b44aa6b590d5 Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Thu, 21 Dec 2023 14:37:02 -0800 Subject: [PATCH 09/43] typo --- .../NuGet.ProjectModel.Test/Utf8JsonStreamReaderTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/Utf8JsonStreamReaderTests.cs b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/Utf8JsonStreamReaderTests.cs index 3d2afa67010..00e84393470 100644 --- a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/Utf8JsonStreamReaderTests.cs +++ b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/Utf8JsonStreamReaderTests.cs @@ -82,7 +82,7 @@ public void Utf8JsonStreamReaderCtr_WhenReadingWithOverflow_FinalBlockFalse() } [Fact] - public void Read_WhenReadingMalfornedJsonString_Throws() + public void Read_WhenReadingMalformedJsonString_Throws() { var json = Encoding.UTF8.GetBytes("{\"a\":\"string}"); From 084986d5707203ad8ce34e499e14ff650968923c Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Thu, 21 Dec 2023 15:03:17 -0800 Subject: [PATCH 10/43] typo --- .../NuGet.ProjectModel.Test/Utf8JsonStreamReaderTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/Utf8JsonStreamReaderTests.cs b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/Utf8JsonStreamReaderTests.cs index 00e84393470..1f76c427607 100644 --- a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/Utf8JsonStreamReaderTests.cs +++ b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/Utf8JsonStreamReaderTests.cs @@ -101,7 +101,7 @@ public void Read_WhenReadingMalformedJsonString_Throws() } [Fact] - public void Read_WhenReadingMalfornedJson_Throws() + public void Read_WhenReadingMalformedJson_Throws() { var json = Encoding.UTF8.GetBytes("{\"a\":\"string\"}ohno"); Assert.ThrowsAny(() => From 58507544f589ba9a32ba5429548b5b4e2bcfedcb Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Thu, 21 Dec 2023 16:03:39 -0800 Subject: [PATCH 11/43] added lazy string split --- .../NuGet.ProjectModel/LazyStringSplit.cs | 138 ++++++++++++++++++ .../Utf8JsonStreamLockFileTargetConverter.cs | 26 ++-- 2 files changed, 148 insertions(+), 16 deletions(-) create mode 100644 src/NuGet.Core/NuGet.ProjectModel/LazyStringSplit.cs diff --git a/src/NuGet.Core/NuGet.ProjectModel/LazyStringSplit.cs b/src/NuGet.Core/NuGet.ProjectModel/LazyStringSplit.cs new file mode 100644 index 00000000000..d3d4c5e6e9d --- /dev/null +++ b/src/NuGet.Core/NuGet.ProjectModel/LazyStringSplit.cs @@ -0,0 +1,138 @@ +// 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; +using System.Collections.Generic; +using System.Linq; + +namespace NuGet.ProjectModel +{ + /// + /// Splits a string by a delimiter, producing substrings lazily during enumeration. + /// Skips empty items, behaving equivalently to with + /// . + /// + /// + /// Unlike and overloads, + /// does not allocate an array for the return, and allocates strings on demand during + /// enumeration. A custom enumerator type is used so that the only allocations made are + /// the substrings themselves. We also avoid the large internal arrays assigned by the + /// methods on . + /// + internal readonly struct LazyStringSplit : IEnumerable + { + private readonly string _input; + private readonly char _delimiter; + + public LazyStringSplit(string input, char delimiter) + { + if (string.IsNullOrEmpty(input)) + { + throw new ArgumentNullException(nameof(input)); + } + + _input = input; + _delimiter = delimiter; + } + + public Enumerator GetEnumerator() => new(this); + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + + public IEnumerable Select(Func func) + { + foreach (string value in this) + { + yield return func(value); + } + } + + public string First() + { + return FirstOrDefault() ?? throw new InvalidOperationException("Sequence is empty."); + } + + public string? FirstOrDefault() + { + var enumerator = new Enumerator(this); + return enumerator.MoveNext() ? enumerator.Current : null; + } + + public struct Enumerator : IEnumerator + { + private readonly string _input; + private readonly char _delimiter; + private int _index; + + internal Enumerator(in LazyStringSplit split) + { + _index = 0; + _input = split._input; + _delimiter = split._delimiter; + Current = null!; + } + + public string Current { get; private set; } + + public bool MoveNext() + { + while (_index != _input.Length) + { + int delimiterIndex = _input.IndexOf(_delimiter, _index); + + if (delimiterIndex == -1) + { + Current = _input.Substring(_index); + _index = _input.Length; + return true; + } + + int length = delimiterIndex - _index; + + if (length == 0) + { + _index++; + continue; + } + + Current = _input.Substring(_index, length); + _index = delimiterIndex + 1; + return true; + } + + return false; + } + + object IEnumerator.Current => Current; + + void IEnumerator.Reset() + { + _index = 0; + Current = null!; + } + + void IDisposable.Dispose() { } + } + } + + internal static class LazyStringSplitExtensions + { + /// + /// This extension method has special knowledge of the type and + /// can compute its result without allocation. + /// + /// + public static string? FirstOrDefault(this LazyStringSplit lazyStringSplit) + { + LazyStringSplit.Enumerator enumerator = lazyStringSplit.GetEnumerator(); + + return enumerator.MoveNext() + ? enumerator.Current + : null; + } + } +} diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetConverter.cs index dd81a6917fc..d84ea8d5107 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetConverter.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetConverter.cs @@ -1,6 +1,7 @@ // 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. +using System; using System.Text.Json; using NuGet.Frameworks; @@ -21,27 +22,20 @@ public LockFileTarget Read(ref Utf8JsonStreamReader reader) var lockFileTarget = new LockFileTarget(); //We want to read the property name right away var propertyName = reader.GetString(); - var parts = GetFrameworkAndIdentifier(propertyName, LockFile.DirectorySeparatorChar); - lockFileTarget.TargetFramework = NuGetFramework.Parse(parts.targetFramework); - lockFileTarget.RuntimeIdentifier = parts.runtimeIdentifier; + var lazySplitter = new LazyStringSplit(propertyName, LockFile.DirectorySeparatorChar); + var targetFramework = lazySplitter.FirstOrDefault(); + var runtetimeIdentifier = lazySplitter.FirstOrDefault(); + var leftover = lazySplitter.FirstOrDefault(); + lockFileTarget.TargetFramework = NuGetFramework.Parse(targetFramework); + if (!string.IsNullOrEmpty(runtetimeIdentifier) && string.IsNullOrEmpty(leftover)) + { + lockFileTarget.RuntimeIdentifier = runtetimeIdentifier; + } reader.Read(); lockFileTarget.Libraries = reader.ReadObjectAsList(Utf8JsonReaderExtensions.LockFileTargetLibraryConverter); return lockFileTarget; } - - - public static (string targetFramework, string runtimeIdentifier) GetFrameworkAndIdentifier(string input, char separator) - { - int firstIndex = input.IndexOf(separator); - int lastIndex = input.LastIndexOf(separator); - - if (firstIndex == -1) - return (input, null); - - return (input.Substring(0, firstIndex), - firstIndex >= input.Length - 1 || firstIndex != lastIndex ? null : input.Substring(firstIndex + 1)); - } } } From 014739f9776c5fa02f344a6f16112682c9cc6ca5 Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Thu, 21 Dec 2023 16:38:45 -0800 Subject: [PATCH 12/43] using --- .../LockFile/Utf8JsonStreamLockFileTargetConverter.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetConverter.cs index d84ea8d5107..a55155c8bcb 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetConverter.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetConverter.cs @@ -1,7 +1,6 @@ // 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. -using System; using System.Text.Json; using NuGet.Frameworks; From d28a4820637d29ddf7d9574113b398640ef06336 Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Fri, 22 Dec 2023 12:31:12 -0800 Subject: [PATCH 13/43] Update unit tests --- .../LockFile/LockFileFormat.cs | 19 ++- .../LockFileFormatTests.cs | 129 ++++++++++++------ 2 files changed, 104 insertions(+), 44 deletions(-) diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/LockFileFormat.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/LockFileFormat.cs index 45dd782fbb0..f3f6a4210b4 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LockFile/LockFileFormat.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/LockFileFormat.cs @@ -54,13 +54,11 @@ public class LockFileFormat private const string FrameworkReferencesProperty = "frameworkReferences"; private const string CentralTransitiveDependencyGroupsProperty = "centralTransitiveDependencyGroups"; - [Obsolete] public LockFile Parse(string lockFileContent, string path) { return Parse(lockFileContent, NullLogger.Instance, path); } - [Obsolete] public LockFile Parse(string lockFileContent, ILogger log, string path) { byte[] byteArray = Encoding.UTF8.GetBytes(lockFileContent); @@ -93,6 +91,23 @@ public LockFile Read(Stream stream, ILogger log, string path) return Read(stream, log, path, EnvironmentVariableWrapper.Instance); } + internal LockFile Read(string filePath, IEnvironmentVariableReader environmentVariableReader) + { + using (var stream = File.OpenRead(filePath)) + { + return Read(stream, NullLogger.Instance, filePath, environmentVariableReader); + } + } + + internal LockFile Parse(string lockFileContent, string path, IEnvironmentVariableReader environmentVariableReader) + { + byte[] byteArray = Encoding.UTF8.GetBytes(lockFileContent); + using (var stream = new MemoryStream(byteArray)) + { + return Read(stream, NullLogger.Instance, path, environmentVariableReader); + } + } + internal LockFile Read(Stream stream, ILogger log, string path, IEnvironmentVariableReader environmentVariableReader) { var useNj = environmentVariableReader.GetEnvironmentVariable("NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"); diff --git a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileFormatTests.cs b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileFormatTests.cs index 04109f4276b..e5c4180f8e4 100644 --- a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileFormatTests.cs +++ b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileFormatTests.cs @@ -11,6 +11,7 @@ using NuGet.LibraryModel; using NuGet.Packaging.Core; using NuGet.Versioning; +using Test.Utility; using Xunit; using static NuGet.Test.Utility.TestPackagesCore; @@ -19,8 +20,10 @@ namespace NuGet.ProjectModel.Test public class LockFileFormatTests { // Verify the value of locked has no impact on the parsed lock file - [Fact] - public void LockFileFormat_LockedPropertyIsIgnored() + [Theory] + [MemberData(nameof(TestEnvironmentVariableReader))] + + public void LockFileFormat_LockedPropertyIsIgnored(IEnvironmentVariableReader environmentVariableReader) { // Arrange var lockFileContentTrue = @"{ @@ -149,9 +152,9 @@ public void LockFileFormat_LockedPropertyIsIgnored() // Act #pragma warning disable CS0612 // Type or member is obsolete - var lockFileTrue = lockFileFormat.Parse(lockFileContentTrue, "In Memory"); - var lockFileFalse = lockFileFormat.Parse(lockFileContentFalse, "In Memory"); - var lockFileMissing = lockFileFormat.Parse(lockFileContentMissing, "In Memory"); + var lockFileTrue = lockFileFormat.Parse(lockFileContentTrue, "In Memory", environmentVariableReader); + var lockFileFalse = lockFileFormat.Parse(lockFileContentFalse, "In Memory", environmentVariableReader); + var lockFileMissing = lockFileFormat.Parse(lockFileContentMissing, "In Memory", environmentVariableReader); #pragma warning restore CS0612 // Type or member is obsolete var lockFileTrueString = lockFileFormat.Render(lockFileTrue); @@ -166,8 +169,9 @@ public void LockFileFormat_LockedPropertyIsIgnored() Assert.Equal(lockFileTrueString, lockFileMissingString); } - [Fact] - public void LockFileFormat_ReadsLockFileWithNoTools() + [Theory] + [MemberData(nameof(TestEnvironmentVariableReader))] + public void LockFileFormat_ReadsLockFileWithNoTools(IEnvironmentVariableReader environmentVariableReader) { var lockFileContent = @"{ ""version"": 1, @@ -210,7 +214,7 @@ public void LockFileFormat_ReadsLockFileWithNoTools() }"; var lockFileFormat = new LockFileFormat(); #pragma warning disable CS0612 // Type or member is obsolete - var lockFile = lockFileFormat.Parse(lockFileContent, "In Memory"); + var lockFile = lockFileFormat.Parse(lockFileContent, "In Memory", environmentVariableReader); #pragma warning restore CS0612 // Type or member is obsolete Assert.Equal(1, lockFile.Version); @@ -1331,8 +1335,9 @@ public void LockFileFormat_WritesMinimalWarningMessageWithWarningLevel() Assert.Equal(expected, output); } - [Fact] - public void LockFileFormat_ReadsMinimalErrorMessage() + [Theory] + [MemberData(nameof(TestEnvironmentVariableReader))] + public void LockFileFormat_ReadsMinimalErrorMessage(IEnvironmentVariableReader environmentVariableReader) { // Arrange var lockFileContent = @"{ @@ -1382,7 +1387,7 @@ public void LockFileFormat_ReadsMinimalErrorMessage() // Act var reader = new LockFileFormat(); - lockFileObj = reader.Read(lockFile); + lockFileObj = reader.Read(lockFile, environmentVariableReader); logMessage = lockFileObj?.LogMessages?.First(); } @@ -1403,8 +1408,9 @@ public void LockFileFormat_ReadsMinimalErrorMessage() Assert.Equal("test log message", logMessage.Message); } - [Fact] - public void LockFileFormat_ReadsFullErrorMessage() + [Theory] + [MemberData(nameof(TestEnvironmentVariableReader))] + public void LockFileFormat_ReadsFullErrorMessage(IEnvironmentVariableReader environmentVariableReader) { // Arrange var lockFileContent = @"{ @@ -1464,7 +1470,7 @@ public void LockFileFormat_ReadsFullErrorMessage() // Act var reader = new LockFileFormat(); - lockFileObj = reader.Read(lockFile); + lockFileObj = reader.Read(lockFile, environmentVariableReader); logMessage = lockFileObj?.LogMessages?.First(); } @@ -1485,8 +1491,9 @@ public void LockFileFormat_ReadsFullErrorMessage() Assert.Equal("test log message", logMessage.Message); } - [Fact] - public void LockFileFormat_SafeRead() + [Theory] + [MemberData(nameof(TestEnvironmentVariableReader))] + public void LockFileFormat_SafeRead(IEnvironmentVariableReader environmentVariableReader) { // Arrange var lockFileContent = @"{ @@ -1547,7 +1554,7 @@ public void LockFileFormat_SafeRead() // Act var reader = new LockFileFormat(); - lockFileObj = FileUtility.SafeRead(lockFile, (stream, path) => reader.Read(stream, NullLogger.Instance, path)); + lockFileObj = FileUtility.SafeRead(lockFile, (stream, path) => reader.Read(stream, NullLogger.Instance, path, environmentVariableReader)); logMessage = lockFileObj?.LogMessages?.First(); } @@ -1570,8 +1577,9 @@ public void LockFileFormat_SafeRead() } - [Fact] - public void LockFileFormat_ReadsWarningMessage() + [Theory] + [MemberData(nameof(TestEnvironmentVariableReader))] + public void LockFileFormat_ReadsWarningMessage(IEnvironmentVariableReader environmentVariableReader) { // Arrange @@ -1633,7 +1641,7 @@ public void LockFileFormat_ReadsWarningMessage() // Act var reader = new LockFileFormat(); - lockFileObj = reader.Read(lockFile); + lockFileObj = reader.Read(lockFile, environmentVariableReader); logMessage = lockFileObj?.LogMessages?.First(); } @@ -1655,8 +1663,9 @@ public void LockFileFormat_ReadsWarningMessage() Assert.Equal("test log message", logMessage.Message); } - [Fact] - public void LockFileFormat_ReadsWarningMessageWithoutWarningLevel() + [Theory] + [MemberData(nameof(TestEnvironmentVariableReader))] + public void LockFileFormat_ReadsWarningMessageWithoutWarningLevel(IEnvironmentVariableReader environmentVariableReader) { // Arrange var lockFileContent = @"{ @@ -1716,7 +1725,7 @@ public void LockFileFormat_ReadsWarningMessageWithoutWarningLevel() // Act var reader = new LockFileFormat(); - lockFileObj = reader.Read(lockFile); + lockFileObj = reader.Read(lockFile, environmentVariableReader); logMessage = lockFileObj?.LogMessages?.First(); } @@ -1739,8 +1748,9 @@ public void LockFileFormat_ReadsWarningMessageWithoutWarningLevel() } - [Fact] - public void LockFileFormat_ReadsMultipleMessages() + [Theory] + [MemberData(nameof(TestEnvironmentVariableReader))] + public void LockFileFormat_ReadsMultipleMessages(IEnvironmentVariableReader environmentVariableReader) { // Arrange var lockFileContent = @"{ @@ -1811,7 +1821,7 @@ public void LockFileFormat_ReadsMultipleMessages() // Act var reader = new LockFileFormat(); - lockFileObj = reader.Read(lockFile); + lockFileObj = reader.Read(lockFile, environmentVariableReader); } @@ -1828,8 +1838,9 @@ public void LockFileFormat_ReadsMultipleMessages() Assert.Equal(1, lockFileObj.LogMessages.Where(m => m.Code == NuGetLogCode.NU1001).Count()); } - [Fact] - public void LockFileFormat_ReadsLogMessageWithSameFilePathAndProjectPath() + [Theory] + [MemberData(nameof(TestEnvironmentVariableReader))] + public void LockFileFormat_ReadsLogMessageWithSameFilePathAndProjectPath(IEnvironmentVariableReader environmentVariableReader) { // Arrange var lockFileContent = @"{ @@ -1885,7 +1896,7 @@ public void LockFileFormat_ReadsLogMessageWithSameFilePathAndProjectPath() // Act var reader = new LockFileFormat(); - lockFileObj = reader.Read(lockFile); + lockFileObj = reader.Read(lockFile, environmentVariableReader); logMessage = lockFileObj?.LogMessages?.First(); } @@ -1907,8 +1918,9 @@ public void LockFileFormat_ReadsLogMessageWithSameFilePathAndProjectPath() Assert.Equal("test log message", logMessage.Message); } - [Fact] - public void LockFileFormat_ReadsLogMessageWithNoFilePath() + [Theory] + [MemberData(nameof(TestEnvironmentVariableReader))] + public void LockFileFormat_ReadsLogMessageWithNoFilePath(IEnvironmentVariableReader environmentVariableReader) { // Arrange var lockFileContent = @"{ @@ -1963,7 +1975,7 @@ public void LockFileFormat_ReadsLogMessageWithNoFilePath() // Act var reader = new LockFileFormat(); - lockFileObj = reader.Read(lockFile); + lockFileObj = reader.Read(lockFile, environmentVariableReader); logMessage = lockFileObj?.LogMessages?.First(); } @@ -1985,8 +1997,9 @@ public void LockFileFormat_ReadsLogMessageWithNoFilePath() Assert.Equal("test log message", logMessage.Message); } - [Fact] - public void LockFileFormat_ReadsLockFileWithTools() + [Theory] + [MemberData(nameof(TestEnvironmentVariableReader))] + public void LockFileFormat_ReadsLockFileWithTools(IEnvironmentVariableReader environmentVariableReader) { var lockFileContent = @"{ ""version"": 1, @@ -2022,9 +2035,7 @@ public void LockFileFormat_ReadsLockFileWithTools() } }"; var lockFileFormat = new LockFileFormat(); -#pragma warning disable CS0612 // Type or member is obsolete - var lockFile = lockFileFormat.Parse(lockFileContent, "In Memory"); -#pragma warning restore CS0612 // Type or member is obsolete + var lockFile = lockFileFormat.Parse(lockFileContent, "In Memory", environmentVariableReader); Assert.Equal(1, lockFile.Version); @@ -2057,8 +2068,9 @@ public void LockFileFormat_ReadsLockFileWithTools() Assert.Empty(netPlatDepGroup.Dependencies); } - [Fact] - public void LockFileFormat_ReadsLockFileWithEmbedAssemblies() + [Theory] + [MemberData(nameof(TestEnvironmentVariableReader))] + public void LockFileFormat_ReadsLockFileWithEmbedAssemblies(IEnvironmentVariableReader environmentVariableReader) { var lockFileContent = @"{ ""version"": 1, @@ -2100,9 +2112,7 @@ public void LockFileFormat_ReadsLockFileWithEmbedAssemblies() }"; var lockFileFormat = new LockFileFormat(); -#pragma warning disable CS0612 // Type or member is obsolete - var lockFile = lockFileFormat.Parse(lockFileContent, "In Memory"); -#pragma warning restore CS0612 // Type or member is obsolete + var lockFile = lockFileFormat.Parse(lockFileContent, "In Memory", environmentVariableReader); Assert.Equal(1, lockFile.Version); @@ -2302,5 +2312,40 @@ public void LockFileFormat_WritesCentralTransitiveDependencyGroups() // Assert Assert.Equal(expected.ToString(), output.ToString()); } + + public static IEnumerable TestEnvironmentVariableReader() + { + return GetTestEnvironmentVariableReader(); + } + + private static IEnumerable GetTestEnvironmentVariableReader(params object[] objects) + { + var UseNjForFileTrue = new List { + new TestEnvironmentVariableReader( + new Dictionary() + { + ["NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"] = bool.TrueString + }, "NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING: true") + }; + var UseNjForFileFalse = new List { + new TestEnvironmentVariableReader( + new Dictionary() + { + ["NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"] = bool.FalseString + }, "NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING: false") + }; + + if (objects != null) + { + UseNjForFileFalse.AddRange(objects); + UseNjForFileTrue.AddRange(objects); + } + + return new List + { + UseNjForFileTrue.ToArray(), + UseNjForFileFalse.ToArray() + }; + } } } From c9cb53f9ca4c70f14af780bb292ec01fdc549ca9 Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Fri, 22 Dec 2023 13:19:26 -0800 Subject: [PATCH 14/43] unit tests --- .../AssetsFileDependenciesSnapshotTests.cs | 3 - .../RestoreCommandTests.cs | 1 - .../UWPRestoreTests.cs | 2 - .../JsonPackageSpecReaderTests.cs | 806 ++++++++---------- .../LockFileFormatTests.cs | 60 +- .../LockFileParsingEnvironmentVariable.cs | 61 ++ .../NuGet.ProjectModel.Test/LockFileTests.cs | 16 +- 7 files changed, 459 insertions(+), 490 deletions(-) create mode 100644 test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileParsingEnvironmentVariable.cs diff --git a/test/NuGet.Clients.Tests/NuGet.VisualStudio.Implementation.Test/SolutionExplorer/Models/AssetsFileDependenciesSnapshotTests.cs b/test/NuGet.Clients.Tests/NuGet.VisualStudio.Implementation.Test/SolutionExplorer/Models/AssetsFileDependenciesSnapshotTests.cs index 9e45e78d43c..c08ef5984d9 100644 --- a/test/NuGet.Clients.Tests/NuGet.VisualStudio.Implementation.Test/SolutionExplorer/Models/AssetsFileDependenciesSnapshotTests.cs +++ b/test/NuGet.Clients.Tests/NuGet.VisualStudio.Implementation.Test/SolutionExplorer/Models/AssetsFileDependenciesSnapshotTests.cs @@ -14,7 +14,6 @@ namespace NuGet.VisualStudio.Implementation.Test.SolutionExplorer.Models public class AssetsFileDependenciesSnapshotTests { [Fact] - [Obsolete] public void ParseLibraries_IgnoreCaseInDependenciesTree_Succeeds() { var lockFileContent = """ @@ -69,7 +68,6 @@ public void ParseLibraries_IgnoreCaseInDependenciesTree_Succeeds() } [Fact] - [Obsolete] public void ParseLibraries_LogForUnknownLibrary_AddsUnknownLibraryType() { var lockFileContent = """ @@ -120,7 +118,6 @@ public void ParseLibraries_LogForUnknownLibrary_AddsUnknownLibraryType() } [Fact] - [Obsolete] public void ParseLibraries_LogForUnknownLibrary_WithAbsolutePath_AddsUnknownLibraryType() { var lockFileContent = """ diff --git a/test/NuGet.Core.FuncTests/NuGet.Commands.FuncTest/RestoreCommandTests.cs b/test/NuGet.Core.FuncTests/NuGet.Commands.FuncTest/RestoreCommandTests.cs index 1c2a034bfa3..ba9f416afa6 100644 --- a/test/NuGet.Core.FuncTests/NuGet.Commands.FuncTest/RestoreCommandTests.cs +++ b/test/NuGet.Core.FuncTests/NuGet.Commands.FuncTest/RestoreCommandTests.cs @@ -1848,7 +1848,6 @@ public async Task RestoreCommand_UnmatchedRefAndLibAssembliesAsync() } [Fact(Skip = "https://github.com/NuGet/Home/issues/8765")] - [Obsolete] public async Task RestoreCommand_LockedLockFileWithOutOfDateProjectAsync() { const string project = @" diff --git a/test/NuGet.Core.FuncTests/NuGet.Commands.FuncTest/UWPRestoreTests.cs b/test/NuGet.Core.FuncTests/NuGet.Commands.FuncTest/UWPRestoreTests.cs index b1f84e8e6ce..bb47d8b7fe4 100644 --- a/test/NuGet.Core.FuncTests/NuGet.Commands.FuncTest/UWPRestoreTests.cs +++ b/test/NuGet.Core.FuncTests/NuGet.Commands.FuncTest/UWPRestoreTests.cs @@ -23,7 +23,6 @@ public class UWPRestoreTests { // Verify that a v1 lock file can be parsed without crashing. [Fact] - [System.Obsolete] public void UWPRestore_ReadV1LockFile() { // Arrange @@ -44,7 +43,6 @@ public void UWPRestore_ReadV1LockFile() } [Fact] - [System.Obsolete] public void UWPRestore_ReadLockFileRoundTrip() { using (var workingDir = TestDirectory.Create()) diff --git a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/JsonPackageSpecReaderTests.cs b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/JsonPackageSpecReaderTests.cs index ee0288bb3b9..cda00225cbd 100644 --- a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/JsonPackageSpecReaderTests.cs +++ b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/JsonPackageSpecReaderTests.cs @@ -26,7 +26,7 @@ namespace NuGet.ProjectModel.Test public class JsonPackageSpecReaderTests { [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void PackageSpecReader_PackageMissingVersion(IEnvironmentVariableReader environmentVariableReader) { // Arrange @@ -58,7 +58,7 @@ public void PackageSpecReader_PackageMissingVersion(IEnvironmentVariableReader e } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void PackageSpecReader_ProjectMissingVersion(IEnvironmentVariableReader environmentVariableReader) { // Arrange @@ -83,7 +83,7 @@ public void PackageSpecReader_ProjectMissingVersion(IEnvironmentVariableReader e } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void PackageSpecReader_PackageEmptyVersion(IEnvironmentVariableReader environmentVariableReader) { // Arrange @@ -115,7 +115,7 @@ public void PackageSpecReader_PackageEmptyVersion(IEnvironmentVariableReader env } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void PackageSpecReader_PackageWhitespaceVersion(IEnvironmentVariableReader environmentVariableReader) { // Arrange @@ -147,7 +147,7 @@ public void PackageSpecReader_PackageWhitespaceVersion(IEnvironmentVariableReade } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void PackageSpecReader_FrameworkAssemblyEmptyVersion(IEnvironmentVariableReader environmentVariableReader) { // Arrange @@ -170,7 +170,7 @@ public void PackageSpecReader_FrameworkAssemblyEmptyVersion(IEnvironmentVariable } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void PackageSpecReader_ExplicitIncludesOverrideTypePlatform(IEnvironmentVariableReader environmentVariableReader) { // Arrange @@ -196,26 +196,26 @@ public void PackageSpecReader_ExplicitIncludesOverrideTypePlatform(IEnvironmentV } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), "{}")] - [MemberData(nameof(TestEnvironmentVariableReader), "{}")] + [MemberData(nameof(TestEnvironmentVariableReader), "{}", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "{}", MemberType = typeof(LockFileParsingEnvironmentVariable))] [MemberData(nameof(TestEnvironmentVariableReader), @"{ ""packOptions"": {} - }")] + }", MemberType = typeof(LockFileParsingEnvironmentVariable))] [MemberData(nameof(TestEnvironmentVariableReader), @"{ ""packOptions"": { ""foo"": [1, 2] } - }")] + }", MemberType = typeof(LockFileParsingEnvironmentVariable))] [MemberData(nameof(TestEnvironmentVariableReader), @"{ ""packOptions"": { ""packageType"": null } - }")] + }", MemberType = typeof(LockFileParsingEnvironmentVariable))] [MemberData(nameof(TestEnvironmentVariableReader), @"{ ""packOptions"": { ""packageType"": [] } - }")] + }", MemberType = typeof(LockFileParsingEnvironmentVariable))] #pragma warning disable CS0612 // Type or member is obsolete public void PackageSpecReader_PackOptions_Default(IEnvironmentVariableReader environmentVariableReader, string json) { @@ -234,7 +234,7 @@ public void PackageSpecReader_PackOptions_Default(IEnvironmentVariableReader env ""packOptions"": { ""packageType"": ""foo"" } - }")] + }", MemberType = typeof(LockFileParsingEnvironmentVariable))] public void PackageSpecReader_Malformed_Default(IEnvironmentVariableReader environmentVariableReader, string json) { // Arrange & Act @@ -251,27 +251,27 @@ public void PackageSpecReader_Malformed_Default(IEnvironmentVariableReader envir ""packOptions"": { ""packageType"": ""foo"" } - }", new[] { "foo" })] + }", new[] { "foo" }, MemberType = typeof(LockFileParsingEnvironmentVariable))] [MemberData(nameof(TestEnvironmentVariableReader), @"{ ""packOptions"": { ""packageType"": ""foo, bar"" } - }", new[] { "foo, bar" })] + }", new[] { "foo, bar" }, MemberType = typeof(LockFileParsingEnvironmentVariable))] [MemberData(nameof(TestEnvironmentVariableReader), @"{ ""packOptions"": { ""packageType"": [ ""foo"" ] } - }", new[] { "foo" })] + }", new[] { "foo" }, MemberType = typeof(LockFileParsingEnvironmentVariable))] [MemberData(nameof(TestEnvironmentVariableReader), @"{ ""packOptions"": { ""packageType"": [ ""foo, bar"" ] } - }", new[] { "foo, bar" })] + }", new[] { "foo, bar" }, MemberType = typeof(LockFileParsingEnvironmentVariable))] [MemberData(nameof(TestEnvironmentVariableReader), @"{ ""packOptions"": { ""packageType"": [ ""foo"", ""bar"" ] } - }", new[] { "foo", "bar" })] + }", new[] { "foo", "bar" }, MemberType = typeof(LockFileParsingEnvironmentVariable))] public void PackageSpecReader_PackOptions_ValidPackageType(IEnvironmentVariableReader environmentVariableReader, string json, string[] expectedNames) { // Arrange @@ -294,29 +294,29 @@ public void PackageSpecReader_PackOptions_ValidPackageType(IEnvironmentVariableR ""packOptions"": { ""packageType"": 1 } - }")] + }", MemberType = typeof(LockFileParsingEnvironmentVariable))] [MemberData(nameof(TestEnvironmentVariableReader), @"{ ""packOptions"": { ""packageType"": false } - }")] + }", MemberType = typeof(LockFileParsingEnvironmentVariable))] [MemberData(nameof(TestEnvironmentVariableReader), @"{ ""packOptions"": { ""packageType"": 1.0 } - }")] + }", MemberType = typeof(LockFileParsingEnvironmentVariable))] [MemberData(nameof(TestEnvironmentVariableReader), @"{ ""packOptions"": { ""packageType"": {} } - }")] + }", MemberType = typeof(LockFileParsingEnvironmentVariable))] [MemberData(nameof(TestEnvironmentVariableReader), @"{ ""packOptions"": { ""packageType"": { ""name"": ""foo"" } } - }")] + }", MemberType = typeof(LockFileParsingEnvironmentVariable))] [MemberData(nameof(TestEnvironmentVariableReader), @"{ ""packOptions"": { ""packageType"": [ @@ -324,7 +324,7 @@ public void PackageSpecReader_PackOptions_ValidPackageType(IEnvironmentVariableR { ""name"": ""bar"" } ] } - }")] + }", MemberType = typeof(LockFileParsingEnvironmentVariable))] [MemberData(nameof(TestEnvironmentVariableReader), @"{ ""packOptions"": { ""packageType"": [ @@ -332,7 +332,7 @@ public void PackageSpecReader_PackOptions_ValidPackageType(IEnvironmentVariableR null ] } - }")] + }", MemberType = typeof(LockFileParsingEnvironmentVariable))] [MemberData(nameof(TestEnvironmentVariableReader), @"{ ""packOptions"": { ""packageType"": [ @@ -340,7 +340,7 @@ public void PackageSpecReader_PackOptions_ValidPackageType(IEnvironmentVariableR true ] } - }")] + }", MemberType = typeof(LockFileParsingEnvironmentVariable))] public void PackageSpecReader_PackOptions_InvalidPackageType(IEnvironmentVariableReader environmentVariableReader, string json) { // Arrange & Act & Assert @@ -351,7 +351,7 @@ public void PackageSpecReader_PackOptions_InvalidPackageType(IEnvironmentVariabl } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void PackageSpecReader_PackOptions_Files1(IEnvironmentVariableReader environmentVariableReader) { // Arrange & Act @@ -391,7 +391,7 @@ public void PackageSpecReader_PackOptions_Files1(IEnvironmentVariableReader envi } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void PackageSpecReader_PackOptions_Files2(IEnvironmentVariableReader environmentVariableReader) { // Arrange & Act @@ -445,26 +445,26 @@ public void PackageSpecReader_PackOptions_Files2(IEnvironmentVariableReader envi } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), "{}", null, true)] + [MemberData(nameof(TestEnvironmentVariableReader), "{}", null, true, MemberType = typeof(LockFileParsingEnvironmentVariable))] [MemberData(nameof(TestEnvironmentVariableReader), @"{ ""buildOptions"": {} - }", null, false)] + }", null, false, MemberType = typeof(LockFileParsingEnvironmentVariable))] [MemberData(nameof(TestEnvironmentVariableReader), @"{ ""buildOptions"": { ""outputName"": ""dllName"" } - }", "dllName", false)] + }", "dllName", false, MemberType = typeof(LockFileParsingEnvironmentVariable))] [MemberData(nameof(TestEnvironmentVariableReader), @"{ ""buildOptions"": { ""outputName"": ""dllName2"", ""emitEntryPoint"": true } - }", "dllName2", false)] + }", "dllName2", false, MemberType = typeof(LockFileParsingEnvironmentVariable))] [MemberData(nameof(TestEnvironmentVariableReader), @"{ ""buildOptions"": { ""outputName"": null } - }", null, false)] + }", null, false, MemberType = typeof(LockFileParsingEnvironmentVariable))] public void PackageSpecReader_BuildOptions(IEnvironmentVariableReader environmentVariableReader, string json, string expectedValue, bool nullBuildOptions) { // Arrange & Act @@ -484,7 +484,7 @@ public void PackageSpecReader_BuildOptions(IEnvironmentVariableReader environmen #pragma warning restore CS0612 // Type or member is obsolete [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void PackageSpecReader_ReadsWithoutRestoreSettings(IEnvironmentVariableReader environmentVariableReader) { // Arrange @@ -509,7 +509,7 @@ public void PackageSpecReader_ReadsWithoutRestoreSettings(IEnvironmentVariableRe } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void PackageSpecReader_ReadsDependencyWithMultipleNoWarn(IEnvironmentVariableReader environmentVariableReader) { // Arrange @@ -541,7 +541,7 @@ public void PackageSpecReader_ReadsDependencyWithMultipleNoWarn(IEnvironmentVari } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void PackageSpecReader_ReadsDependencyWithSingleNoWarn(IEnvironmentVariableReader environmentVariableReader) { // Arrange @@ -571,7 +571,7 @@ public void PackageSpecReader_ReadsDependencyWithSingleNoWarn(IEnvironmentVariab } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void PackageSpecReader_ReadsDependencyWithSingleEmptyNoWarn(IEnvironmentVariableReader environmentVariableReader) { // Arrange @@ -599,7 +599,7 @@ public void PackageSpecReader_ReadsDependencyWithSingleEmptyNoWarn(IEnvironmentV } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void PackageSpecReader_ReadsRestoreMetadataWithWarningProperties(IEnvironmentVariableReader environmentVariableReader) { // Arrange @@ -673,7 +673,7 @@ public void PackageSpecReader_ReadsRestoreMetadataWithWarningProperties(IEnviron } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void PackageSpecReader_ReadsRestoreMetadataWithWarningPropertiesAndNo_NoWarn(IEnvironmentVariableReader environmentVariableReader) { // Arrange @@ -736,7 +736,7 @@ public void PackageSpecReader_ReadsRestoreMetadataWithWarningPropertiesAndNo_NoW } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void PackageSpecReader_ReadsRestoreMetadataWithWarningPropertiesAndNo_WarnAsError(IEnvironmentVariableReader environmentVariableReader) { // Arrange @@ -797,7 +797,7 @@ public void PackageSpecReader_ReadsRestoreMetadataWithWarningPropertiesAndNo_War } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void PackageSpecReader_ReadsRestoreMetadataWithWarningPropertiesAndNo_AllWarningsAsErrors(IEnvironmentVariableReader environmentVariableReader) { // Arrange @@ -863,7 +863,7 @@ public void PackageSpecReader_ReadsRestoreMetadataWithWarningPropertiesAndNo_All } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void PackageSpecReader_ReadsRestoreMetadataWithEmptyWarningPropertiesAnd(IEnvironmentVariableReader environmentVariableReader) { // Arrange @@ -919,7 +919,7 @@ public void PackageSpecReader_ReadsRestoreMetadataWithEmptyWarningPropertiesAnd( } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void PackageSpecReader_ReadsRestoreMetadataWithNoWarningProperties(IEnvironmentVariableReader environmentVariableReader) { // Arrange @@ -970,7 +970,7 @@ public void PackageSpecReader_ReadsRestoreMetadataWithNoWarningProperties(IEnvir } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void PackageSpecReader_RuntimeIdentifierPathNullIfEmpty(IEnvironmentVariableReader environmentVariableReader) { // Arrange @@ -999,7 +999,7 @@ public void PackageSpecReader_RuntimeIdentifierPathNullIfEmpty(IEnvironmentVaria #pragma warning disable CS0612 // Type or member is obsolete [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenAuthorsPropertyIsAbsent_ReturnsEmptyAuthors(IEnvironmentVariableReader environmentVariableReader) { PackageSpec packageSpec = GetPackageSpec("{}", environmentVariableReader); @@ -1008,7 +1008,7 @@ public void GetPackageSpec_WhenAuthorsPropertyIsAbsent_ReturnsEmptyAuthors(IEnvi } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenAuthorsValueIsNull_ReturnsEmptyAuthors(IEnvironmentVariableReader environmentVariableReader) { PackageSpec packageSpec = GetPackageSpec("{\"authors\":null}", environmentVariableReader); @@ -1017,7 +1017,7 @@ public void GetPackageSpec_WhenAuthorsValueIsNull_ReturnsEmptyAuthors(IEnvironme } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenAuthorsValueIsString_ReturnsEmptyAuthors(IEnvironmentVariableReader environmentVariableReader) { PackageSpec packageSpec = GetPackageSpec("{\"authors\":\"b\"}", environmentVariableReader); @@ -1026,8 +1026,8 @@ public void GetPackageSpec_WhenAuthorsValueIsString_ReturnsEmptyAuthors(IEnviron } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), "")] - [MemberData(nameof(TestEnvironmentVariableReader), "/**/")] + [MemberData(nameof(TestEnvironmentVariableReader), "", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "/**/", MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenAuthorsValueIsEmptyArray_ReturnsEmptyAuthors(IEnvironmentVariableReader environmentVariableReader, string value) { PackageSpec packageSpec = GetPackageSpec($"{{\"authors\":[{value}]}}", environmentVariableReader); @@ -1036,8 +1036,8 @@ public void GetPackageSpec_WhenAuthorsValueIsEmptyArray_ReturnsEmptyAuthors(IEnv } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), "{}")] - [MemberData(nameof(TestEnvironmentVariableReader), "[]")] + [MemberData(nameof(TestEnvironmentVariableReader), "{}", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "[]", MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenAuthorsValueElementIsNotConvertibleToString_Throws(IEnvironmentVariableReader environmentVariableReader, string value) { var json = $"{{\"authors\":[{value}]}}"; @@ -1046,10 +1046,10 @@ public void GetPackageSpec_WhenAuthorsValueElementIsNotConvertibleToString_Throw } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), "\"a\"", "a")] - [MemberData(nameof(TestEnvironmentVariableReader), "true", "True")] - [MemberData(nameof(TestEnvironmentVariableReader), "-2", "-2")] - [MemberData(nameof(TestEnvironmentVariableReader), "3.14", "3.14")] + [MemberData(nameof(TestEnvironmentVariableReader), "\"a\"", "a", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "true", "True", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "-2", "-2", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "3.14", "3.14", MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenAuthorsValueElementIsConvertibleToString_ReturnsAuthor(IEnvironmentVariableReader environmentVariableReader, string value, string expectedValue) { PackageSpec packageSpec = GetPackageSpec($"{{\"authors\":[{value}]}}", environmentVariableReader); @@ -1058,7 +1058,7 @@ public void GetPackageSpec_WhenAuthorsValueElementIsConvertibleToString_ReturnsA } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenBuildOptionsPropertyIsAbsent_ReturnsNullBuildOptions(IEnvironmentVariableReader environmentVariableReader) { PackageSpec packageSpec = GetPackageSpec("{}", environmentVariableReader); @@ -1067,7 +1067,7 @@ public void GetPackageSpec_WhenBuildOptionsPropertyIsAbsent_ReturnsNullBuildOpti } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenBuildOptionsValueIsEmptyObject_ReturnsBuildOptions(IEnvironmentVariableReader environmentVariableReader) { PackageSpec packageSpec = GetPackageSpec("{\"buildOptions\":{}}", environmentVariableReader); @@ -1077,7 +1077,7 @@ public void GetPackageSpec_WhenBuildOptionsValueIsEmptyObject_ReturnsBuildOption } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenBuildOptionsValueOutputNameIsNull_ReturnsNullOutputName(IEnvironmentVariableReader environmentVariableReader) { PackageSpec packageSpec = GetPackageSpec("{\"buildOptions\":{\"outputName\":null}}", environmentVariableReader); @@ -1086,7 +1086,7 @@ public void GetPackageSpec_WhenBuildOptionsValueOutputNameIsNull_ReturnsNullOutp } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenBuildOptionsValueOutputNameIsValid_ReturnsOutputName(IEnvironmentVariableReader environmentVariableReader) { const string expectedResult = "a"; @@ -1099,9 +1099,9 @@ public void GetPackageSpec_WhenBuildOptionsValueOutputNameIsValid_ReturnsOutputN } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), "-2", "-2")] - [MemberData(nameof(TestEnvironmentVariableReader), "3.14", "3.14")] - [MemberData(nameof(TestEnvironmentVariableReader), "true", "True")] + [MemberData(nameof(TestEnvironmentVariableReader), "-2", "-2", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "3.14", "3.14", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "true", "True", MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenBuildOptionsValueOutputNameIsConvertibleToString_ReturnsOutputName(IEnvironmentVariableReader environmentVariableReader, string outputName, string expectedValue) { PackageSpec packageSpec = GetPackageSpec($"{{\"buildOptions\":{{\"outputName\":{outputName}}}}}", environmentVariableReader); @@ -1110,7 +1110,7 @@ public void GetPackageSpec_WhenBuildOptionsValueOutputNameIsConvertibleToString_ } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenContentFilesPropertyIsAbsent_ReturnsEmptyContentFiles(IEnvironmentVariableReader environmentVariableReader) { PackageSpec packageSpec = GetPackageSpec("{}", environmentVariableReader); @@ -1119,7 +1119,7 @@ public void GetPackageSpec_WhenContentFilesPropertyIsAbsent_ReturnsEmptyContentF } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenContentFilesValueIsNull_ReturnsEmptyContentFiles(IEnvironmentVariableReader environmentVariableReader) { PackageSpec packageSpec = GetPackageSpec("{\"contentFiles\":null}", environmentVariableReader); @@ -1128,7 +1128,7 @@ public void GetPackageSpec_WhenContentFilesValueIsNull_ReturnsEmptyContentFiles( } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenContentFilesValueIsString_ReturnsEmptyContentFiles(IEnvironmentVariableReader environmentVariableReader) { PackageSpec packageSpec = GetPackageSpec("{\"contentFiles\":\"a\"}", environmentVariableReader); @@ -1137,8 +1137,8 @@ public void GetPackageSpec_WhenContentFilesValueIsString_ReturnsEmptyContentFile } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), "")] - [MemberData(nameof(TestEnvironmentVariableReader), "/**/")] + [MemberData(nameof(TestEnvironmentVariableReader), "", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "/**/", MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenContentFilesValueIsEmptyArray_ReturnsEmptyContentFiles(IEnvironmentVariableReader environmentVariableReader, string value) { PackageSpec packageSpec = GetPackageSpec($"{{\"contentFiles\":[{value}]}}", environmentVariableReader); @@ -1147,8 +1147,8 @@ public void GetPackageSpec_WhenContentFilesValueIsEmptyArray_ReturnsEmptyContent } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), "{}")] - [MemberData(nameof(TestEnvironmentVariableReader), "[]")] + [MemberData(nameof(TestEnvironmentVariableReader), "{}", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "[]", MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenContentFilesValueElementIsNotConvertibleToString_Throws(IEnvironmentVariableReader environmentVariableReader, string value) { var json = $"{{\"contentFiles\":[{value}]}}"; @@ -1157,10 +1157,10 @@ public void GetPackageSpec_WhenContentFilesValueElementIsNotConvertibleToString_ } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), "\"a\"", "a")] - [MemberData(nameof(TestEnvironmentVariableReader), "true", "True")] - [MemberData(nameof(TestEnvironmentVariableReader), "-2", "-2")] - [MemberData(nameof(TestEnvironmentVariableReader), "3.14", "3.14")] + [MemberData(nameof(TestEnvironmentVariableReader), "\"a\"", "a", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "true", "True", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "-2", "-2", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "3.14", "3.14", MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenContentFilesValueElementIsConvertibleToString_ReturnsContentFile(IEnvironmentVariableReader environmentVariableReader, string value, string expectedValue) { PackageSpec packageSpec = GetPackageSpec($"{{\"contentFiles\":[{value}]}}", environmentVariableReader); @@ -1169,7 +1169,7 @@ public void GetPackageSpec_WhenContentFilesValueElementIsConvertibleToString_Ret } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenCopyrightPropertyIsAbsent_ReturnsNullCopyright(IEnvironmentVariableReader environmentVariableReader) { PackageSpec packageSpec = GetPackageSpec("{}", environmentVariableReader); @@ -1178,7 +1178,7 @@ public void GetPackageSpec_WhenCopyrightPropertyIsAbsent_ReturnsNullCopyright(IE } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenCopyrightValueIsNull_ReturnsNullCopyright(IEnvironmentVariableReader environmentVariableReader) { PackageSpec packageSpec = GetPackageSpec("{\"copyright\":null}", environmentVariableReader); @@ -1187,7 +1187,7 @@ public void GetPackageSpec_WhenCopyrightValueIsNull_ReturnsNullCopyright(IEnviro } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenCopyrightValueIsString_ReturnsCopyright(IEnvironmentVariableReader environmentVariableReader) { const string expectedResult = "a"; @@ -1198,10 +1198,10 @@ public void GetPackageSpec_WhenCopyrightValueIsString_ReturnsCopyright(IEnvironm } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), "\"a\"", "a")] - [MemberData(nameof(TestEnvironmentVariableReader), "true", "True")] - [MemberData(nameof(TestEnvironmentVariableReader), "-2", "-2")] - [MemberData(nameof(TestEnvironmentVariableReader), "3.14", "3.14")] + [MemberData(nameof(TestEnvironmentVariableReader), "\"a\"", "a", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "true", "True", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "-2", "-2", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "3.14", "3.14", MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenCopyrightValueIsConvertibleToString_ReturnsCopyright(IEnvironmentVariableReader environmentVariableReader, string value, string expectedValue) { PackageSpec packageSpec = GetPackageSpec($"{{\"copyright\":{value}}}", environmentVariableReader); @@ -1211,7 +1211,7 @@ public void GetPackageSpec_WhenCopyrightValueIsConvertibleToString_ReturnsCopyri #pragma warning restore CS0612 // Type or member is obsolete [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenDependenciesPropertyIsAbsent_ReturnsEmptyDependencies(IEnvironmentVariableReader environmentVariableReader) { PackageSpec packageSpec = GetPackageSpec("{}", environmentVariableReader); @@ -1220,7 +1220,7 @@ public void GetPackageSpec_WhenDependenciesPropertyIsAbsent_ReturnsEmptyDependen } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenDependenciesValueIsNull_ReturnsEmptyDependencies(IEnvironmentVariableReader environmentVariableReader) { PackageSpec packageSpec = GetPackageSpec("{\"dependencies\":null}", environmentVariableReader); @@ -1229,7 +1229,7 @@ public void GetPackageSpec_WhenDependenciesValueIsNull_ReturnsEmptyDependencies( } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenDependenciesDependencyNameIsEmptyString_Throws(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"dependencies\":{\"\":{}}}"; @@ -1246,7 +1246,7 @@ public void GetPackageSpec_WhenDependenciesDependencyNameIsEmptyString_Throws(IE } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenDependenciesDependencyValueIsVersionString_ReturnsDependencyVersionRange(IEnvironmentVariableReader environmentVariableReader) { var expectedResult = new LibraryRange( @@ -1261,7 +1261,7 @@ public void GetPackageSpec_WhenDependenciesDependencyValueIsVersionString_Return } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenDependenciesDependencyValueIsVersionRangeString_ReturnsDependencyVersionRange(IEnvironmentVariableReader environmentVariableReader) { var expectedResult = new LibraryRange( @@ -1276,12 +1276,12 @@ public void GetPackageSpec_WhenDependenciesDependencyValueIsVersionRangeString_R } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), LibraryDependencyTarget.None)] - [MemberData(nameof(TestEnvironmentVariableReader), LibraryDependencyTarget.Assembly)] - [MemberData(nameof(TestEnvironmentVariableReader), LibraryDependencyTarget.Reference)] - [MemberData(nameof(TestEnvironmentVariableReader), LibraryDependencyTarget.WinMD)] - [MemberData(nameof(TestEnvironmentVariableReader), LibraryDependencyTarget.All)] - [MemberData(nameof(TestEnvironmentVariableReader), LibraryDependencyTarget.PackageProjectExternal)] + [MemberData(nameof(TestEnvironmentVariableReader), LibraryDependencyTarget.None, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), LibraryDependencyTarget.Assembly, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), LibraryDependencyTarget.Reference, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), LibraryDependencyTarget.WinMD, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), LibraryDependencyTarget.All, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), LibraryDependencyTarget.PackageProjectExternal, MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenDependenciesDependencyTargetIsUnsupported_Throws(IEnvironmentVariableReader environmentVariableReader, LibraryDependencyTarget target) { var json = $"{{\"dependencies\":{{\"a\":{{\"version\":\"1.2.3\",\"target\":\"{target}\"}}}}}}"; @@ -1300,7 +1300,7 @@ public void GetPackageSpec_WhenDependenciesDependencyTargetIsUnsupported_Throws( } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenDependenciesDependencyAutoreferencedPropertyIsAbsent_ReturnsFalseAutoreferenced(IEnvironmentVariableReader environmentVariableReader) { LibraryDependency dependency = GetDependency($"{{\"dependencies\":{{\"a\":{{\"target\":\"Project\"}}}}}}", environmentVariableReader); @@ -1309,8 +1309,8 @@ public void GetPackageSpec_WhenDependenciesDependencyAutoreferencedPropertyIsAbs } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), true)] - [MemberData(nameof(TestEnvironmentVariableReader), false)] + [MemberData(nameof(TestEnvironmentVariableReader), true, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), false, MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenDependenciesDependencyAutoreferencedValueIsBool_ReturnsBoolAutoreferenced(IEnvironmentVariableReader environmentVariableReader, bool expectedValue) { var json = $"{{\"dependencies\":{{\"a\":{{\"autoReferenced\":{expectedValue.ToString().ToLower()},\"target\":\"Project\"}}}}}}"; @@ -1321,9 +1321,9 @@ public void GetPackageSpec_WhenDependenciesDependencyAutoreferencedValueIsBool_R } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), "exclude")] - [MemberData(nameof(TestEnvironmentVariableReader), "include")] - [MemberData(nameof(TestEnvironmentVariableReader), "suppressParent")] + [MemberData(nameof(TestEnvironmentVariableReader), "exclude", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "include", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "suppressParent", MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenDependenciesDependencyValueIsArray_Throws(IEnvironmentVariableReader environmentVariableReader, string propertyName) { var json = $"{{\"dependencies\":{{\"a\":{{\"{propertyName}\":[\"b\"]}}}}}}"; @@ -1332,7 +1332,7 @@ public void GetPackageSpec_WhenDependenciesDependencyValueIsArray_Throws(IEnviro } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenDependenciesDependencyIncludeAndExcludePropertiesAreAbsent_ReturnsAllIncludeType(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"dependencies\":{\"a\":{\"version\":\"1.0.0\"}}}"; @@ -1343,8 +1343,8 @@ public void GetPackageSpec_WhenDependenciesDependencyIncludeAndExcludeProperties } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), "\"Native\"", LibraryIncludeFlags.Native)] - [MemberData(nameof(TestEnvironmentVariableReader), "\"Analyzers, Native\"", LibraryIncludeFlags.Analyzers | LibraryIncludeFlags.Native)] + [MemberData(nameof(TestEnvironmentVariableReader), "\"Native\"", LibraryIncludeFlags.Native, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "\"Analyzers, Native\"", LibraryIncludeFlags.Analyzers | LibraryIncludeFlags.Native, MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenDependenciesDependencyExcludeValueIsValid_ReturnsIncludeType( IEnvironmentVariableReader environmentVariableReader, string value, @@ -1358,8 +1358,8 @@ public void GetPackageSpec_WhenDependenciesDependencyExcludeValueIsValid_Returns } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), "\"Native\"", LibraryIncludeFlags.Native)] - [MemberData(nameof(TestEnvironmentVariableReader), "\"Analyzers, Native\"", LibraryIncludeFlags.Analyzers | LibraryIncludeFlags.Native)] + [MemberData(nameof(TestEnvironmentVariableReader), "\"Native\"", LibraryIncludeFlags.Native, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "\"Analyzers, Native\"", LibraryIncludeFlags.Analyzers | LibraryIncludeFlags.Native, MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenDependenciesDependencyIncludeValueIsValid_ReturnsIncludeType( IEnvironmentVariableReader environmentVariableReader, string value, @@ -1373,7 +1373,7 @@ public void GetPackageSpec_WhenDependenciesDependencyIncludeValueIsValid_Returns } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenDependenciesDependencyIncludeValueOverridesTypeValue_ReturnsIncludeType(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"dependencies\":{\"a\":{\"include\":\"ContentFiles\",\"type\":\"BecomesNupkgDependency, SharedFramework\",\"version\":\"1.0.0\"}}}"; @@ -1384,7 +1384,7 @@ public void GetPackageSpec_WhenDependenciesDependencyIncludeValueOverridesTypeVa } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenDependenciesDependencySuppressParentValueOverridesTypeValue_ReturnsSuppressParent(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"dependencies\":{\"a\":{\"suppressParent\":\"ContentFiles\",\"type\":\"SharedFramework\",\"version\":\"1.0.0\"}}}"; @@ -1395,7 +1395,7 @@ public void GetPackageSpec_WhenDependenciesDependencySuppressParentValueOverride } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenDependenciesDependencySuppressParentPropertyIsAbsent_ReturnsSuppressParent(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"dependencies\":{\"a\":{\"version\":\"1.0.0\"}}}"; @@ -1406,8 +1406,8 @@ public void GetPackageSpec_WhenDependenciesDependencySuppressParentPropertyIsAbs } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), "\"Compile\"", LibraryIncludeFlags.Compile)] - [MemberData(nameof(TestEnvironmentVariableReader), "\"Analyzers, Compile\"", LibraryIncludeFlags.Analyzers | LibraryIncludeFlags.Compile)] + [MemberData(nameof(TestEnvironmentVariableReader), "\"Compile\"", LibraryIncludeFlags.Compile, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "\"Analyzers, Compile\"", LibraryIncludeFlags.Analyzers | LibraryIncludeFlags.Compile, MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenDependenciesDependencySuppressParentValueIsValid_ReturnsSuppressParent( IEnvironmentVariableReader environmentVariableReader, string value, @@ -1422,7 +1422,7 @@ LibraryIncludeFlags expectedResult } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenDependenciesDependencyVersionValueIsInvalid_Throws(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"dependencies\":{\"a\":{\"version\":\"b\"}}}"; @@ -1442,7 +1442,7 @@ public void GetPackageSpec_WhenDependenciesDependencyVersionValueIsInvalid_Throw } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenDependenciesDependencyTargetPropertyIsAbsent_ReturnsTarget(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"dependencies\":{\"a\":{\"version\":\"1.0.0\"}}}"; @@ -1453,7 +1453,7 @@ public void GetPackageSpec_WhenDependenciesDependencyTargetPropertyIsAbsent_Retu } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenDependenciesDependencyTargetValueIsPackageAndVersionPropertyIsAbsent_Throws(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"dependencies\":{\"a\":{\"target\":\"Package\"}}}"; @@ -1475,7 +1475,7 @@ public void GetPackageSpec_WhenDependenciesDependencyTargetValueIsPackageAndVers } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenDependenciesDependencyTargetValueIsProjectAndVersionPropertyIsAbsent_ReturnsAllVersionRange(IEnvironmentVariableReader environmentVariableReader) { LibraryDependency dependency = GetDependency("{\"dependencies\":{\"a\":{\"target\":\"Project\"}}}", environmentVariableReader); @@ -1484,7 +1484,7 @@ public void GetPackageSpec_WhenDependenciesDependencyTargetValueIsProjectAndVers } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenDependenciesDependencyNoWarnPropertyIsAbsent_ReturnsEmptyNoWarns(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"dependencies\":{\"a\":{\"version\":\"1.0.0\"}}}"; @@ -1495,7 +1495,7 @@ public void GetPackageSpec_WhenDependenciesDependencyNoWarnPropertyIsAbsent_Retu } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenDependenciesDependencyNoWarnValueIsValid_ReturnsNoWarns(IEnvironmentVariableReader environmentVariableReader) { NuGetLogCode[] expectedResults = { NuGetLogCode.NU1000, NuGetLogCode.NU3000 }; @@ -1510,7 +1510,7 @@ public void GetPackageSpec_WhenDependenciesDependencyNoWarnValueIsValid_ReturnsN } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenDependenciesDependencyGeneratePathPropertyPropertyIsAbsent_ReturnsFalseGeneratePathProperty(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"dependencies\":{\"a\":{\"version\":\"1.0.0\"}}}"; @@ -1521,8 +1521,8 @@ public void GetPackageSpec_WhenDependenciesDependencyGeneratePathPropertyPropert } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), true)] - [MemberData(nameof(TestEnvironmentVariableReader), false)] + [MemberData(nameof(TestEnvironmentVariableReader), true, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), false, MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenDependenciesDependencyGeneratePathPropertyValueIsValid_ReturnsGeneratePathProperty(IEnvironmentVariableReader environmentVariableReader, bool expectedResult) { var json = $"{{\"dependencies\":{{\"a\":{{\"generatePathProperty\":{expectedResult.ToString().ToLowerInvariant()},\"version\":\"1.0.0\"}}}}}}"; @@ -1533,7 +1533,7 @@ public void GetPackageSpec_WhenDependenciesDependencyGeneratePathPropertyValueIs } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenDependenciesDependencyTypePropertyIsAbsent_ReturnsDefaultTypeConstraint(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"dependencies\":{\"a\":{\"version\":\"1.0.0\"}}}"; @@ -1546,7 +1546,7 @@ public void GetPackageSpec_WhenDependenciesDependencyTypePropertyIsAbsent_Return } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenDependenciesDependencyVersionCentrallyManagedPropertyIsAbsent_ReturnsFalseVersionCentrallyManaged(IEnvironmentVariableReader environmentVariableReader) { LibraryDependency dependency = GetDependency($"{{\"dependencies\":{{\"a\":{{\"target\":\"Package\",\"version\":\"1.0.0\"}}}}}}", environmentVariableReader); @@ -1555,8 +1555,8 @@ public void GetPackageSpec_WhenDependenciesDependencyVersionCentrallyManagedProp } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), true)] - [MemberData(nameof(TestEnvironmentVariableReader), false)] + [MemberData(nameof(TestEnvironmentVariableReader), true, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), false, MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenDependenciesDependencyVersionCentrallyManagedValueIsBool_ReturnsBoolVersionCentrallyManaged(IEnvironmentVariableReader environmentVariableReader, bool expectedValue) { var json = $"{{\"dependencies\":{{\"a\":{{\"versionCentrallyManaged\":{expectedValue.ToString().ToLower()},\"target\":\"Package\",\"version\":\"1.0.0\"}}}}}}"; @@ -1568,7 +1568,7 @@ public void GetPackageSpec_WhenDependenciesDependencyVersionCentrallyManagedValu #pragma warning disable CS0612 // Type or member is obsolete [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenDescriptionPropertyIsAbsent_ReturnsNullDescription(IEnvironmentVariableReader environmentVariableReader) { PackageSpec packageSpec = GetPackageSpec("{}", environmentVariableReader); @@ -1577,9 +1577,9 @@ public void GetPackageSpec_WhenDescriptionPropertyIsAbsent_ReturnsNullDescriptio } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), null)] - [MemberData(nameof(TestEnvironmentVariableReader), "")] - [MemberData(nameof(TestEnvironmentVariableReader), "b")] + [MemberData(nameof(TestEnvironmentVariableReader), null, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "b", MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenDescriptionValueIsValid_ReturnsDescription(IEnvironmentVariableReader environmentVariableReader, string expectedResult) { string description = expectedResult == null ? "null" : $"\"{expectedResult}\""; @@ -1589,7 +1589,7 @@ public void GetPackageSpec_WhenDescriptionValueIsValid_ReturnsDescription(IEnvir } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenLanguagePropertyIsAbsent_ReturnsNullLanguage(IEnvironmentVariableReader environmentVariableReader) { PackageSpec packageSpec = GetPackageSpec("{}", environmentVariableReader); @@ -1598,9 +1598,9 @@ public void GetPackageSpec_WhenLanguagePropertyIsAbsent_ReturnsNullLanguage(IEnv } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), null)] - [MemberData(nameof(TestEnvironmentVariableReader), "")] - [MemberData(nameof(TestEnvironmentVariableReader), "b")] + [MemberData(nameof(TestEnvironmentVariableReader), null, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "b", MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenLanguageValueIsValid_ReturnsLanguage(IEnvironmentVariableReader environmentVariableReader, string expectedResult) { string language = expectedResult == null ? "null" : $"\"{expectedResult}\""; @@ -1611,7 +1611,7 @@ public void GetPackageSpec_WhenLanguageValueIsValid_ReturnsLanguage(IEnvironment #pragma warning restore CS0612 // Type or member is obsolete [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksPropertyIsAbsent_ReturnsEmptyFrameworks(IEnvironmentVariableReader environmentVariableReader) { PackageSpec packageSpec = GetPackageSpec("{}", environmentVariableReader); @@ -1620,7 +1620,7 @@ public void GetPackageSpec_WhenFrameworksPropertyIsAbsent_ReturnsEmptyFrameworks } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksValueIsEmptyObject_ReturnsEmptyFrameworks(IEnvironmentVariableReader environmentVariableReader) { PackageSpec packageSpec = GetPackageSpec("{\"frameworks\":{}}", environmentVariableReader); @@ -1629,7 +1629,7 @@ public void GetPackageSpec_WhenFrameworksValueIsEmptyObject_ReturnsEmptyFramewor } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksAssetTargetFallbackPropertyIsAbsent_ReturnsFalseAssetTargetFallback(IEnvironmentVariableReader environmentVariableReader) { TargetFrameworkInformation framework = GetFramework("{\"frameworks\":{\"a\":{}}}", environmentVariableReader); @@ -1638,8 +1638,8 @@ public void GetPackageSpec_WhenFrameworksAssetTargetFallbackPropertyIsAbsent_Ret } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), true)] - [MemberData(nameof(TestEnvironmentVariableReader), false)] + [MemberData(nameof(TestEnvironmentVariableReader), true, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), false, MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksAssetTargetFallbackValueIsValid_ReturnsAssetTargetFallback(IEnvironmentVariableReader environmentVariableReader, bool expectedValue) { var json = $"{{\"frameworks\":{{\"a\":{{\"assetTargetFallback\":{expectedValue.ToString().ToLowerInvariant()}}}}}}}"; @@ -1650,7 +1650,7 @@ public void GetPackageSpec_WhenFrameworksAssetTargetFallbackValueIsValid_Returns } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WithAssetTargetFallbackAndImportsValues_ReturnsValidAssetTargetFallbackFramework(IEnvironmentVariableReader environmentVariableReader) { var json = $"{{\"frameworks\":{{\"net5.0\":{{\"assetTargetFallback\": true, \"imports\": [\"net472\", \"net471\"]}}}}}}"; @@ -1666,7 +1666,7 @@ public void GetPackageSpec_WithAssetTargetFallbackAndImportsValues_ReturnsValidA } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksCentralPackageVersionsPropertyIsAbsent_ReturnsEmptyCentralPackageVersions(IEnvironmentVariableReader environmentVariableReader) { TargetFrameworkInformation framework = GetFramework("{\"frameworks\":{\"a\":{}}}", environmentVariableReader); @@ -1675,7 +1675,7 @@ public void GetPackageSpec_WhenFrameworksCentralPackageVersionsPropertyIsAbsent_ } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksCentralPackageVersionsValueIsEmptyObject_ReturnsEmptyCentralPackageVersions(IEnvironmentVariableReader environmentVariableReader) { TargetFrameworkInformation framework = GetFramework("{\"frameworks\":{\"a\":{\"centralPackageVersions\":{}}}}", environmentVariableReader); @@ -1684,7 +1684,7 @@ public void GetPackageSpec_WhenFrameworksCentralPackageVersionsValueIsEmptyObjec } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksCentralPackageVersionsVersionPropertyNameIsEmptyString_Throws(IEnvironmentVariableReader environmentVariableReader) { var json = "{\"frameworks\":{\"a\":{\"centralPackageVersions\":{\"\":\"1.0.0\"}}}}"; @@ -1707,8 +1707,8 @@ public void GetPackageSpec_WhenFrameworksCentralPackageVersionsVersionPropertyNa } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), "null")] - [MemberData(nameof(TestEnvironmentVariableReader), "\"\"")] + [MemberData(nameof(TestEnvironmentVariableReader), "null", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "\"\"", MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksCentralPackageVersionsVersionPropertyValueIsNullOrEmptyString_Throws(IEnvironmentVariableReader environmentVariableReader, string value) { var json = $"{{\"frameworks\":{{\"a\":{{\"centralPackageVersions\":{{\"b\":{value}}}}}}}}}"; @@ -1731,7 +1731,7 @@ public void GetPackageSpec_WhenFrameworksCentralPackageVersionsVersionPropertyVa } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksCentralPackageVersionsIsValid_ReturnsCentralPackageVersions(IEnvironmentVariableReader environmentVariableReader) { const string expectedPackageId = "b"; @@ -1751,7 +1751,7 @@ public void GetPackageSpec_WhenFrameworksCentralPackageVersionsIsValid_ReturnsCe } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksCentralPackageVersionsHasDuplicateKey_LastOneWins(IEnvironmentVariableReader environmentVariableReader) { const string expectedPackageId = "b"; @@ -1773,7 +1773,7 @@ public void GetPackageSpec_WhenFrameworksCentralPackageVersionsHasDuplicateKey_L } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksDependenciesPropertyIsAbsent_ReturnsEmptyDependencies(IEnvironmentVariableReader environmentVariableReader) { TargetFrameworkInformation framework = GetFramework("{\"frameworks\":{\"a\":{}}}", environmentVariableReader); @@ -1782,7 +1782,7 @@ public void GetPackageSpec_WhenFrameworksDependenciesPropertyIsAbsent_ReturnsEmp } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksDependenciesValueIsNull_ReturnsEmptyDependencies(IEnvironmentVariableReader environmentVariableReader) { TargetFrameworkInformation framework = GetFramework("{\"frameworks\":{\"a\":{\"dependencies\":null}}}", environmentVariableReader); @@ -1791,7 +1791,7 @@ public void GetPackageSpec_WhenFrameworksDependenciesValueIsNull_ReturnsEmptyDep } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksDependenciesDependencyNameIsEmptyString_Throws(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"frameworks\":{\"a\":{\"dependencies\":{\"\":{}}}}}"; @@ -1813,7 +1813,7 @@ public void GetPackageSpec_WhenFrameworksDependenciesDependencyNameIsEmptyString } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksDependenciesDependencyValueIsVersionString_ReturnsDependencyVersionRange(IEnvironmentVariableReader environmentVariableReader) { var expectedResult = new LibraryRange( @@ -1828,7 +1828,7 @@ public void GetPackageSpec_WhenFrameworksDependenciesDependencyValueIsVersionStr } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksDependenciesDependencyValueIsVersionRangeString_ReturnsDependencyVersionRange(IEnvironmentVariableReader environmentVariableReader) { var expectedResult = new LibraryRange( @@ -1843,12 +1843,12 @@ public void GetPackageSpec_WhenFrameworksDependenciesDependencyValueIsVersionRan } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), LibraryDependencyTarget.None)] - [MemberData(nameof(TestEnvironmentVariableReader), LibraryDependencyTarget.Assembly)] - [MemberData(nameof(TestEnvironmentVariableReader), LibraryDependencyTarget.Reference)] - [MemberData(nameof(TestEnvironmentVariableReader), LibraryDependencyTarget.WinMD)] - [MemberData(nameof(TestEnvironmentVariableReader), LibraryDependencyTarget.All)] - [MemberData(nameof(TestEnvironmentVariableReader), LibraryDependencyTarget.PackageProjectExternal)] + [MemberData(nameof(TestEnvironmentVariableReader), LibraryDependencyTarget.None, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), LibraryDependencyTarget.Assembly, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), LibraryDependencyTarget.Reference, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), LibraryDependencyTarget.WinMD, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), LibraryDependencyTarget.All, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), LibraryDependencyTarget.PackageProjectExternal, MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksDependenciesDependencyTargetValueIsUnsupported_Throws(IEnvironmentVariableReader environmentVariableReader, LibraryDependencyTarget target) { var json = $"{{\"frameworks\":{{\"a\":{{\"dependencies\":{{\"b\":{{\"version\":\"1.2.3\",\"target\":\"{target}\"}}}}}}}}}}"; @@ -1871,7 +1871,7 @@ public void GetPackageSpec_WhenFrameworksDependenciesDependencyTargetValueIsUnsu } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksDependenciesDependencyAutoreferencedPropertyIsAbsent_ReturnsFalseAutoreferenced(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"frameworks\":{\"a\":{\"dependencies\":{\"b\":{\"target\":\"Project\"}}}}}"; @@ -1882,8 +1882,8 @@ public void GetPackageSpec_WhenFrameworksDependenciesDependencyAutoreferencedPro } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), true)] - [MemberData(nameof(TestEnvironmentVariableReader), false)] + [MemberData(nameof(TestEnvironmentVariableReader), true, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), false, MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksDependenciesDependencyAutoreferencedValueIsBool_ReturnsBoolAutoreferenced(IEnvironmentVariableReader environmentVariableReader, bool expectedValue) { var json = $"{{\"frameworks\":{{\"a\":{{\"dependencies\":{{\"b\":{{\"autoReferenced\":{expectedValue.ToString().ToLower()},\"target\":\"Project\"}}}}}}}}}}"; @@ -1894,9 +1894,9 @@ public void GetPackageSpec_WhenFrameworksDependenciesDependencyAutoreferencedVal } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), "exclude")] - [MemberData(nameof(TestEnvironmentVariableReader), "include")] - [MemberData(nameof(TestEnvironmentVariableReader), "suppressParent")] + [MemberData(nameof(TestEnvironmentVariableReader), "exclude", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "include", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "suppressParent", MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksDependenciesDependencyValueIsArray_Throws(IEnvironmentVariableReader environmentVariableReader, string propertyName) { var json = $"{{\"frameworks\":{{\"a\":{{\"dependencies\":{{\"b\":{{\"{propertyName}\":[\"c\"]}}}}}}}}}}"; @@ -1921,7 +1921,7 @@ public void GetPackageSpec_WhenFrameworksDependenciesDependencyValueIsArray_Thro } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksDependenciesDependencyIncludeAndExcludePropertiesAreAbsent_ReturnsAllIncludeType(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"frameworks\":{\"a\":{\"dependencies\":{\"b\":{\"version\":\"1.0.0\"}}}}}"; @@ -1932,7 +1932,7 @@ public void GetPackageSpec_WhenFrameworksDependenciesDependencyIncludeAndExclude } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksDependenciesDependencyExcludeValueIsValid_ReturnsIncludeType(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"frameworks\":{\"a\":{\"dependencies\":{\"b\":{\"exclude\":\"Native\",\"version\":\"1.0.0\"}}}}}"; @@ -1943,7 +1943,7 @@ public void GetPackageSpec_WhenFrameworksDependenciesDependencyExcludeValueIsVal } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksDependenciesDependencyIncludeValueIsValid_ReturnsIncludeType(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"frameworks\":{\"a\":{\"dependencies\":{\"b\":{\"include\":\"ContentFiles\",\"version\":\"1.0.0\"}}}}}"; @@ -1954,7 +1954,7 @@ public void GetPackageSpec_WhenFrameworksDependenciesDependencyIncludeValueIsVal } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksDependenciesDependencyIncludeValueOverridesTypeValue_ReturnsIncludeType(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"frameworks\":{\"a\":{\"dependencies\":{\"b\":{\"include\":\"ContentFiles\",\"type\":\"BecomesNupkgDependency, SharedFramework\",\"version\":\"1.0.0\"}}}}}"; @@ -1965,7 +1965,7 @@ public void GetPackageSpec_WhenFrameworksDependenciesDependencyIncludeValueOverr } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksDependenciesDependencySuppressParentValueOverridesTypeValue_ReturnsSuppressParent(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"frameworks\":{\"a\":{\"dependencies\":{\"b\":{\"suppressParent\":\"ContentFiles\",\"type\":\"SharedFramework\",\"version\":\"1.0.0\"}}}}}"; @@ -1976,7 +1976,7 @@ public void GetPackageSpec_WhenFrameworksDependenciesDependencySuppressParentVal } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksDependenciesDependencySuppressParentPropertyIsAbsent_ReturnsSuppressParent(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"frameworks\":{\"a\":{\"dependencies\":{\"b\":{\"version\":\"1.0.0\"}}}}}"; @@ -1987,7 +1987,7 @@ public void GetPackageSpec_WhenFrameworksDependenciesDependencySuppressParentPro } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksDependenciesDependencySuppressParentValueIsValid_ReturnsSuppressParent(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"frameworks\":{\"a\":{\"dependencies\":{\"b\":{\"suppressParent\":\"Compile\",\"version\":\"1.0.0\"}}}}}"; @@ -1998,7 +1998,7 @@ public void GetPackageSpec_WhenFrameworksDependenciesDependencySuppressParentVal } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksDependenciesDependencyVersionValueIsInvalid_Throws(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"frameworks\":{\"a\":{\"dependencies\":{\"b\":{\"version\":\"c\"}}}}}"; @@ -2022,7 +2022,7 @@ public void GetPackageSpec_WhenFrameworksDependenciesDependencyVersionValueIsInv } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksDependenciesDependencyTargetPropertyIsAbsent_ReturnsTarget(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"frameworks\":{\"a\":{\"dependencies\":{\"b\":{\"version\":\"1.0.0\"}}}}}"; @@ -2035,7 +2035,7 @@ public void GetPackageSpec_WhenFrameworksDependenciesDependencyTargetPropertyIsA } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksDependenciesDependencyTargetValueIsPackageAndVersionPropertyIsAbsent_Throws(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"frameworks\":{\"a\":{\"dependencies\":{\"b\":{\"target\":\"Package\"}}}}}"; @@ -2059,7 +2059,7 @@ public void GetPackageSpec_WhenFrameworksDependenciesDependencyTargetValueIsPack } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksDependenciesDependencyTargetValueIsProjectAndVersionPropertyIsAbsent_ReturnsAllVersionRange(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"frameworks\":{\"a\":{\"dependencies\":{\"b\":{\"target\":\"Project\"}}}}}"; @@ -2070,7 +2070,7 @@ public void GetPackageSpec_WhenFrameworksDependenciesDependencyTargetValueIsProj } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksDependenciesDependencyNoWarnPropertyIsAbsent_ReturnsEmptyNoWarns(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"frameworks\":{\"a\":{\"dependencies\":{\"b\":{\"version\":\"1.0.0\"}}}}}"; @@ -2081,7 +2081,7 @@ public void GetPackageSpec_WhenFrameworksDependenciesDependencyNoWarnPropertyIsA } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksDependenciesDependencyNoWarnValueIsValid_ReturnsNoWarns(IEnvironmentVariableReader environmentVariableReader) { NuGetLogCode[] expectedResults = { NuGetLogCode.NU1000, NuGetLogCode.NU3000 }; @@ -2096,7 +2096,7 @@ public void GetPackageSpec_WhenFrameworksDependenciesDependencyNoWarnValueIsVali } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksDependenciesDependencyGeneratePathPropertyPropertyIsAbsent_ReturnsFalseGeneratePathProperty(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"frameworks\":{\"a\":{\"dependencies\":{\"b\":{\"version\":\"1.0.0\"}}}}}}}"; @@ -2107,8 +2107,8 @@ public void GetPackageSpec_WhenFrameworksDependenciesDependencyGeneratePathPrope } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), true)] - [MemberData(nameof(TestEnvironmentVariableReader), false)] + [MemberData(nameof(TestEnvironmentVariableReader), true, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), false, MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksDependenciesDependencyGeneratePathPropertyValueIsValid_ReturnsGeneratePathProperty(IEnvironmentVariableReader environmentVariableReader, bool expectedResult) { var json = $"{{\"frameworks\":{{\"a\":{{\"dependencies\":{{\"b\":{{\"generatePathProperty\":{expectedResult.ToString().ToLowerInvariant()},\"version\":\"1.0.0\"}}}}}}}}}}"; @@ -2119,7 +2119,7 @@ public void GetPackageSpec_WhenFrameworksDependenciesDependencyGeneratePathPrope } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksDependenciesDependencyTypePropertyIsAbsent_ReturnsDefaultTypeConstraint(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"frameworks\":{\"a\":{\"dependencies\":{\"b\":{\"version\":\"1.0.0\"}}}}}"; @@ -2133,7 +2133,7 @@ public void GetPackageSpec_WhenFrameworksDependenciesDependencyTypePropertyIsAbs [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksDependenciesDependencyVersionCentrallyManagedPropertyIsAbsent_ReturnsFalseVersionCentrallyManaged(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"frameworks\":{\"a\":{\"dependencies\":{\"b\":{\"target\":\"Package\",\"version\":\"1.0.0\"}}}}}"; @@ -2144,8 +2144,8 @@ public void GetPackageSpec_WhenFrameworksDependenciesDependencyVersionCentrallyM } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), true)] - [MemberData(nameof(TestEnvironmentVariableReader), false)] + [MemberData(nameof(TestEnvironmentVariableReader), true, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), false, MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksDependenciesDependencyVersionCentrallyManagedValueIsBool_ReturnsBoolVersionCentrallyManaged(IEnvironmentVariableReader environmentVariableReader, bool expectedValue) { var json = $"{{\"frameworks\":{{\"a\":{{\"dependencies\":{{\"b\":{{\"versionCentrallyManaged\":{expectedValue.ToString().ToLower()},\"target\":\"Package\",\"version\":\"1.0.0\"}}}}}}}}}}"; @@ -2156,7 +2156,7 @@ public void GetPackageSpec_WhenFrameworksDependenciesDependencyVersionCentrallyM } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksDownloadDependenciesPropertyIsAbsent_ReturnsEmptyDownloadDependencies(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"frameworks\":{\"a\":{}}}"; @@ -2167,7 +2167,7 @@ public void GetPackageSpec_WhenFrameworksDownloadDependenciesPropertyIsAbsent_Re } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksDownloadDependenciesValueIsNull_ReturnsEmptyDownloadDependencies(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"frameworks\":{\"a\":{\"downloadDependencies\":null}}}"; @@ -2178,7 +2178,7 @@ public void GetPackageSpec_WhenFrameworksDownloadDependenciesValueIsNull_Returns } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksDownloadDependenciesValueIsNotArray_ReturnsEmptyDownloadDependencies(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"frameworks\":{\"a\":{\"downloadDependencies\":\"b\"}}}"; @@ -2189,7 +2189,7 @@ public void GetPackageSpec_WhenFrameworksDownloadDependenciesValueIsNotArray_Ret } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksDownloadDependenciesValueIsEmptyArray_ReturnsEmptyDownloadDependencies(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"frameworks\":{\"a\":{\"downloadDependencies\":[]}}}"; @@ -2200,7 +2200,7 @@ public void GetPackageSpec_WhenFrameworksDownloadDependenciesValueIsEmptyArray_R } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksDownloadDependenciesDependencyNameIsAbsent_Throws(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"frameworks\":{\"a\":{\"downloadDependencies\":[{\"version\":\"1.2.3\"}]}}}"; @@ -2222,7 +2222,7 @@ public void GetPackageSpec_WhenFrameworksDownloadDependenciesDependencyNameIsAbs } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksDownloadDependenciesDependencyNameIsNull_ReturnsDownloadDependencies(IEnvironmentVariableReader environmentVariableReader) { var expectedResult = new DownloadDependency(name: null, new VersionRange(new NuGetVersion("1.2.3"))); @@ -2237,7 +2237,7 @@ public void GetPackageSpec_WhenFrameworksDownloadDependenciesDependencyNameIsNul } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksDownloadDependenciesDependencyVersionIsAbsent_Throws(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"frameworks\":{\"a\":{\"downloadDependencies\":[{\"name\":\"b\"}]}}}"; @@ -2259,8 +2259,8 @@ public void GetPackageSpec_WhenFrameworksDownloadDependenciesDependencyVersionIs } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), "null")] - [MemberData(nameof(TestEnvironmentVariableReader), "c")] + [MemberData(nameof(TestEnvironmentVariableReader), "null", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "c", MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksDownloadDependenciesDependencyVersionIsInvalid_Throws(IEnvironmentVariableReader environmentVariableReader, string version) { var json = $"{{\"frameworks\":{{\"a\":{{\"downloadDependencies\":[{{\"name\":\"b\",\"version\":\"{version}\"}}]}}}}}}"; @@ -2286,7 +2286,7 @@ public void GetPackageSpec_WhenFrameworksDownloadDependenciesDependencyVersionIs } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksDownloadDependenciesValueIsValid_ReturnsDownloadDependencies(IEnvironmentVariableReader environmentVariableReader) { var expectedResult = new DownloadDependency(name: "b", new VersionRange(new NuGetVersion("1.2.3"))); @@ -2298,7 +2298,7 @@ public void GetPackageSpec_WhenFrameworksDownloadDependenciesValueIsValid_Return } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksDownloadDependenciesValueHasDuplicates_PrefersFirstByName(IEnvironmentVariableReader environmentVariableReader) { var expectedResult = new DownloadDependency(name: "b", new VersionRange(new NuGetVersion("1.2.3"))); @@ -2314,7 +2314,7 @@ public void GetPackageSpec_WhenFrameworksDownloadDependenciesValueHasDuplicates_ } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksFrameworkAssembliesPropertyIsAbsent_ReturnsEmptyDependencies(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"frameworks\":{\"a\":{}}}"; @@ -2325,7 +2325,7 @@ public void GetPackageSpec_WhenFrameworksFrameworkAssembliesPropertyIsAbsent_Ret } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksFrameworkAssembliesValueIsNull_ReturnsEmptyDependencies(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"frameworks\":{\"a\":{\"frameworkAssemblies\":null}}}"; @@ -2336,7 +2336,7 @@ public void GetPackageSpec_WhenFrameworksFrameworkAssembliesValueIsNull_ReturnsE } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksFrameworkAssembliesValueIsEmptyObject_ReturnsEmptyDependencies(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"frameworks\":{\"a\":{\"frameworkAssemblies\":{}}}}"; @@ -2347,7 +2347,7 @@ public void GetPackageSpec_WhenFrameworksFrameworkAssembliesValueIsEmptyObject_R } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksFrameworkAssembliesDependencyTargetPropertyIsAbsent_ReturnsTarget(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"frameworks\":{\"a\":{\"frameworkAssemblies\":{\"b\":{\"version\":\"1.0.0\"}}}}}"; @@ -2358,7 +2358,7 @@ public void GetPackageSpec_WhenFrameworksFrameworkAssembliesDependencyTargetProp } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksFrameworkAssembliesDependencyTargetValueIsPackageAndVersionPropertyIsAbsent_Throws(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"frameworks\":{\"a\":{\"frameworkAssemblies\":{\"b\":{\"target\":\"Package\"}}}}}"; @@ -2382,7 +2382,7 @@ public void GetPackageSpec_WhenFrameworksFrameworkAssembliesDependencyTargetValu } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksFrameworkAssembliesDependencyTargetValueIsProjectAndVersionPropertyIsAbsent_ReturnsAllVersionRange(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"frameworks\":{\"a\":{\"frameworkAssemblies\":{\"b\":{\"target\":\"Project\"}}}}}"; @@ -2393,7 +2393,7 @@ public void GetPackageSpec_WhenFrameworksFrameworkAssembliesDependencyTargetValu } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksFrameworkReferencesPropertyIsAbsent_ReturnsEmptyFrameworkReferences(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"frameworks\":{\"a\":{}}}"; @@ -2404,7 +2404,7 @@ public void GetPackageSpec_WhenFrameworksFrameworkReferencesPropertyIsAbsent_Ret } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksFrameworkReferencesValueIsNull_ReturnsEmptyFrameworkReferences(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"frameworks\":{\"a\":{\"frameworkReferences\":null}}}"; @@ -2415,7 +2415,7 @@ public void GetPackageSpec_WhenFrameworksFrameworkReferencesValueIsNull_ReturnsE } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksFrameworkReferencesValueIsEmptyObject_ReturnsEmptyFrameworkReferences(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"frameworks\":{\"a\":{\"frameworkReferences\":{}}}}"; @@ -2426,7 +2426,7 @@ public void GetPackageSpec_WhenFrameworksFrameworkReferencesValueIsEmptyObject_R } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksFrameworkReferencesFrameworkNameIsEmptyString_Throws(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"frameworks\":{\"a\":{\"frameworkReferences\":{\"\":{}}}}}"; @@ -2449,7 +2449,7 @@ public void GetPackageSpec_WhenFrameworksFrameworkReferencesFrameworkNameIsEmpty } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksFrameworkReferencesPrivateAssetsPropertyIsAbsent_ReturnsNonePrivateAssets(IEnvironmentVariableReader environmentVariableReader) { var expectedResult = new FrameworkDependency(name: "b", FrameworkDependencyFlags.None); @@ -2461,9 +2461,9 @@ public void GetPackageSpec_WhenFrameworksFrameworkReferencesPrivateAssetsPropert } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), "\"null\"")] - [MemberData(nameof(TestEnvironmentVariableReader), "\"\"")] - [MemberData(nameof(TestEnvironmentVariableReader), "\"c\"")] + [MemberData(nameof(TestEnvironmentVariableReader), "\"null\"", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "\"\"", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "\"c\"", MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksFrameworkReferencesPrivateAssetsValueIsInvalidValue_ReturnsNonePrivateAssets(IEnvironmentVariableReader environmentVariableReader, string privateAssets) { var expectedResult = new FrameworkDependency(name: "b", FrameworkDependencyFlags.None); @@ -2475,7 +2475,7 @@ public void GetPackageSpec_WhenFrameworksFrameworkReferencesPrivateAssetsValueIs } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksFrameworkReferencesPrivateAssetsValueIsValidString_ReturnsPrivateAssets(IEnvironmentVariableReader environmentVariableReader) { var expectedResult = new FrameworkDependency(name: "b", FrameworkDependencyFlags.All); @@ -2487,7 +2487,7 @@ public void GetPackageSpec_WhenFrameworksFrameworkReferencesPrivateAssetsValueIs } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksFrameworkReferencesPrivateAssetsValueIsValidDelimitedString_ReturnsPrivateAssets(IEnvironmentVariableReader environmentVariableReader) { var expectedResult = new FrameworkDependency(name: "b", FrameworkDependencyFlags.All); @@ -2499,7 +2499,7 @@ public void GetPackageSpec_WhenFrameworksFrameworkReferencesPrivateAssetsValueIs } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksImportsPropertyIsAbsent_ReturnsEmptyImports(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"frameworks\":{\"a\":{}}}"; @@ -2510,8 +2510,8 @@ public void GetPackageSpec_WhenFrameworksImportsPropertyIsAbsent_ReturnsEmptyImp } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), "null")] - [MemberData(nameof(TestEnvironmentVariableReader), "\"\"")] + [MemberData(nameof(TestEnvironmentVariableReader), "null", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "\"\"", MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksImportsValueIsArrayOfNullOrEmptyString_ImportIsSkipped(IEnvironmentVariableReader environmentVariableReader, string import) { var json = $"{{\"frameworks\":{{\"a\":{{\"imports\":[{import}]}}}}}}"; @@ -2522,7 +2522,7 @@ public void GetPackageSpec_WhenFrameworksImportsValueIsArrayOfNullOrEmptyString_ } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksImportsValueIsNull_ReturnsEmptyList(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"frameworks\":{\"a\":{\"imports\":null}}}"; @@ -2533,10 +2533,10 @@ public void GetPackageSpec_WhenFrameworksImportsValueIsNull_ReturnsEmptyList(IEn } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), "true")] - [MemberData(nameof(TestEnvironmentVariableReader), "-2")] - [MemberData(nameof(TestEnvironmentVariableReader), "3.14")] - [MemberData(nameof(TestEnvironmentVariableReader), "{}")] + [MemberData(nameof(TestEnvironmentVariableReader), "true", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "-2", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "3.14", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "{}", MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksImportsValueIsInvalidValue_ReturnsEmptyList(IEnvironmentVariableReader environmentVariableReader, string value) { var json = $"{{\"frameworks\":{{\"a\":{{\"imports\":{value}}}}}}}"; @@ -2547,7 +2547,7 @@ public void GetPackageSpec_WhenFrameworksImportsValueIsInvalidValue_ReturnsEmpty } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksImportsValueContainsInvalidValue_Throws(IEnvironmentVariableReader environmentVariableReader) { const string expectedImport = "b"; @@ -2576,7 +2576,7 @@ public void GetPackageSpec_WhenFrameworksImportsValueContainsInvalidValue_Throws } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksImportsValueIsString_ReturnsImport(IEnvironmentVariableReader environmentVariableReader) { NuGetFramework expectedResult = NuGetFramework.Parse("net48"); @@ -2590,7 +2590,7 @@ public void GetPackageSpec_WhenFrameworksImportsValueIsString_ReturnsImport(IEnv } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksImportsValueIsArrayOfStrings_ReturnsImports(IEnvironmentVariableReader environmentVariableReader) { NuGetFramework[] expectedResults = { NuGetFramework.Parse("net472"), NuGetFramework.Parse("net48") }; @@ -2605,7 +2605,7 @@ public void GetPackageSpec_WhenFrameworksImportsValueIsArrayOfStrings_ReturnsImp } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksRuntimeIdentifierGraphPathPropertyIsAbsent_ReturnsRuntimeIdentifierGraphPath(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"frameworks\":{\"a\":{}}}}"; @@ -2616,9 +2616,9 @@ public void GetPackageSpec_WhenFrameworksRuntimeIdentifierGraphPathPropertyIsAbs } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), null)] - [MemberData(nameof(TestEnvironmentVariableReader), "")] - [MemberData(nameof(TestEnvironmentVariableReader), "b")] + [MemberData(nameof(TestEnvironmentVariableReader), null, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "b", MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksRuntimeIdentifierGraphPathValueIsString_ReturnsRuntimeIdentifierGraphPath(IEnvironmentVariableReader environmentVariableReader, string expectedResult) { string runtimeIdentifierGraphPath = expectedResult == null ? "null" : $"\"{expectedResult}\""; @@ -2630,7 +2630,7 @@ public void GetPackageSpec_WhenFrameworksRuntimeIdentifierGraphPathValueIsString } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksWarnPropertyIsAbsent_ReturnsWarn(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"frameworks\":{\"a\":{}}}}"; @@ -2641,8 +2641,8 @@ public void GetPackageSpec_WhenFrameworksWarnPropertyIsAbsent_ReturnsWarn(IEnvir } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), true)] - [MemberData(nameof(TestEnvironmentVariableReader), false)] + [MemberData(nameof(TestEnvironmentVariableReader), true, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), false, MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksWarnValueIsValid_ReturnsWarn(IEnvironmentVariableReader environmentVariableReader, bool expectedResult) { var json = $"{{\"frameworks\":{{\"a\":{{\"warn\":{expectedResult.ToString().ToLowerInvariant()}}}}}}}"; @@ -2654,7 +2654,7 @@ public void GetPackageSpec_WhenFrameworksWarnValueIsValid_ReturnsWarn(IEnvironme #pragma warning disable CS0612 // Type or member is obsolete [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenPackIncludePropertyIsAbsent_ReturnsEmptyPackInclude(IEnvironmentVariableReader environmentVariableReader) { PackageSpec packageSpec = GetPackageSpec("{}", environmentVariableReader); @@ -2663,7 +2663,7 @@ public void GetPackageSpec_WhenPackIncludePropertyIsAbsent_ReturnsEmptyPackInclu } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenPackIncludePropertyIsValid_ReturnsPackInclude(IEnvironmentVariableReader environmentVariableReader) { var expectedResults = new List>() { new KeyValuePair("a", "b"), new KeyValuePair("c", "d") }; @@ -2678,8 +2678,8 @@ public void GetPackageSpec_WhenPackIncludePropertyIsValid_ReturnsPackInclude(IEn } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), "{}")] - [MemberData(nameof(TestEnvironmentVariableReader), "{\"packOptions\":null}")] + [MemberData(nameof(TestEnvironmentVariableReader), "{}", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "{\"packOptions\":null}", MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenPackOptionsPropertyIsAbsentOrValueIsNull_ReturnsPackOptions(IEnvironmentVariableReader environmentVariableReader, string json) { PackageSpec packageSpec = GetPackageSpec(json, environmentVariableReader); @@ -2700,7 +2700,7 @@ public void GetPackageSpec_WhenPackOptionsPropertyIsAbsentOrValueIsNull_ReturnsP } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenPackOptionsPropertyIsAbsent_OwnersAndTagsAreEmpty(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"owners\":[\"a\"],\"tags\":[\"b\"]}"; @@ -2712,7 +2712,7 @@ public void GetPackageSpec_WhenPackOptionsPropertyIsAbsent_OwnersAndTagsAreEmpty } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenPackOptionsPropertyIsEmptyObject_ReturnsPackOptions(IEnvironmentVariableReader environmentVariableReader) { string json = "{\"packOptions\":{}}"; @@ -2735,7 +2735,7 @@ public void GetPackageSpec_WhenPackOptionsPropertyIsEmptyObject_ReturnsPackOptio } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenPackOptionsValueIsValid_ReturnsPackOptions(IEnvironmentVariableReader environmentVariableReader) { const string iconUrl = "a"; @@ -2768,7 +2768,7 @@ public void GetPackageSpec_WhenPackOptionsValueIsValid_ReturnsPackOptions(IEnvir } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenPackOptionsPackageTypeValueIsNull_ReturnsEmptyPackageTypes(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"packOptions\":{\"packageType\":null}}"; @@ -2779,16 +2779,16 @@ public void GetPackageSpec_WhenPackOptionsPackageTypeValueIsNull_ReturnsEmptyPac } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), "true", 34)] - [MemberData(nameof(TestEnvironmentVariableReader), "-2", 32)] - [MemberData(nameof(TestEnvironmentVariableReader), "3.14", 34)] - [MemberData(nameof(TestEnvironmentVariableReader), "{}", 31)] - [MemberData(nameof(TestEnvironmentVariableReader), "[true]", 31)] - [MemberData(nameof(TestEnvironmentVariableReader), "[-2]", 31)] - [MemberData(nameof(TestEnvironmentVariableReader), "[3.14]", 31)] - [MemberData(nameof(TestEnvironmentVariableReader), "[null]", 31)] - [MemberData(nameof(TestEnvironmentVariableReader), "[{}]", 31)] - [MemberData(nameof(TestEnvironmentVariableReader), "[[]]", 31)] + [MemberData(nameof(TestEnvironmentVariableReader), "true", 34, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "-2", 32, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "3.14", 34, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "{}", 31, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "[true]", 31, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "[-2]", 31, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "[3.14]", 31, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "[null]", 31, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "[{}]", 31, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "[[]]", 31, MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenPackOptionsPackageTypeIsInvalid_Throws(IEnvironmentVariableReader environmentVariableReader, string value, int expectedColumn) { var json = $"{{\"packOptions\":{{\"packageType\":{value}}}}}"; @@ -2806,10 +2806,10 @@ public void GetPackageSpec_WhenPackOptionsPackageTypeIsInvalid_Throws(IEnvironme } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), "\"a\"", "a")] - [MemberData(nameof(TestEnvironmentVariableReader), "\"a,b\"", "a,b")] - [MemberData(nameof(TestEnvironmentVariableReader), "[\"a\"]", "a")] - [MemberData(nameof(TestEnvironmentVariableReader), "[\"a b\"]", "a b")] + [MemberData(nameof(TestEnvironmentVariableReader), "\"a\"", "a", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "\"a,b\"", "a,b", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "[\"a\"]", "a", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "[\"a b\"]", "a b", MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenPackOptionsPackageTypeValueIsValid_ReturnsPackageTypes(IEnvironmentVariableReader environmentVariableReader, string value, string expectedName) { var expectedResult = new PackageType(expectedName, PackageType.EmptyVersion); @@ -2823,7 +2823,7 @@ public void GetPackageSpec_WhenPackOptionsPackageTypeValueIsValid_ReturnsPackage } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenPackOptionsFilesValueIsNull_ReturnsNullInclude(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"packOptions\":{\"files\":null}}"; @@ -2834,7 +2834,7 @@ public void GetPackageSpec_WhenPackOptionsFilesValueIsNull_ReturnsNullInclude(IE } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenPackOptionsFilesValueIsEmptyObject_ReturnsNullInclude(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"packOptions\":{\"files\":{}}}"; @@ -2845,7 +2845,7 @@ public void GetPackageSpec_WhenPackOptionsFilesValueIsEmptyObject_ReturnsNullInc } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenPackOptionsFilesIncludeValueIsNull_ReturnsNullIncludeExcludeFiles(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"packOptions\":{\"files\":{\"include\":null}}}"; @@ -2856,7 +2856,7 @@ public void GetPackageSpec_WhenPackOptionsFilesIncludeValueIsNull_ReturnsNullInc } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenPackOptionsFilesIncludeValueIsEmptyArray_ReturnsEmptyInclude(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"packOptions\":{\"files\":{\"include\":[]}}}"; @@ -2867,13 +2867,13 @@ public void GetPackageSpec_WhenPackOptionsFilesIncludeValueIsEmptyArray_ReturnsE } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), "\"a\"", "a")] - [MemberData(nameof(TestEnvironmentVariableReader), "\"a, b\"", "a, b")] - [MemberData(nameof(TestEnvironmentVariableReader), "[null]", null)] - [MemberData(nameof(TestEnvironmentVariableReader), "[\"\"]", "")] - [MemberData(nameof(TestEnvironmentVariableReader), "[\"a\"]", "a")] - [MemberData(nameof(TestEnvironmentVariableReader), "[\"a, b\"]", "a, b")] - [MemberData(nameof(TestEnvironmentVariableReader), "[\"a\", \"b\"]", "a", "b")] + [MemberData(nameof(TestEnvironmentVariableReader), "\"a\"", "a", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "\"a, b\"", "a, b", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "[null]", null, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "[\"\"]", "", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "[\"a\"]", "a", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "[\"a, b\"]", "a, b", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "[\"a\", \"b\"]", "a", "b", MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenPackOptionsFilesIncludeValueIsValid_ReturnsInclude(IEnvironmentVariableReader environmentVariableReader, string value, params string[] expectedResults) { expectedResults = expectedResults ?? new string[] { null }; @@ -2886,7 +2886,7 @@ public void GetPackageSpec_WhenPackOptionsFilesIncludeValueIsValid_ReturnsInclud } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenPackOptionsFilesIncludeFilesValueIsNull_ReturnsNullIncludeExcludeFiles(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"packOptions\":{\"files\":{\"includeFiles\":null}}}"; @@ -2897,7 +2897,7 @@ public void GetPackageSpec_WhenPackOptionsFilesIncludeFilesValueIsNull_ReturnsNu } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenPackOptionsFilesIncludeFilesValueIsEmptyArray_ReturnsEmptyIncludeFiles(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"packOptions\":{\"files\":{\"includeFiles\":[]}}}"; @@ -2908,13 +2908,13 @@ public void GetPackageSpec_WhenPackOptionsFilesIncludeFilesValueIsEmptyArray_Ret } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), "\"a\"", "a")] - [MemberData(nameof(TestEnvironmentVariableReader), "\"a, b\"", "a, b")] - [MemberData(nameof(TestEnvironmentVariableReader), "[null]", null)] - [MemberData(nameof(TestEnvironmentVariableReader), "[\"\"]", "")] - [MemberData(nameof(TestEnvironmentVariableReader), "[\"a\"]", "a")] - [MemberData(nameof(TestEnvironmentVariableReader), "[\"a, b\"]", "a, b")] - [MemberData(nameof(TestEnvironmentVariableReader), "[\"a\", \"b\"]", "a", "b")] + [MemberData(nameof(TestEnvironmentVariableReader), "\"a\"", "a", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "\"a, b\"", "a, b", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "[null]", null, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "[\"\"]", "", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "[\"a\"]", "a", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "[\"a, b\"]", "a, b", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "[\"a\", \"b\"]", "a", "b", MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenPackOptionsFilesIncludeFilesValueIsValid_ReturnsIncludeFiles(IEnvironmentVariableReader environmentVariableReader, string value, params string[] expectedResults) { expectedResults = expectedResults ?? new string[] { null }; @@ -2927,7 +2927,7 @@ public void GetPackageSpec_WhenPackOptionsFilesIncludeFilesValueIsValid_ReturnsI } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenPackOptionsFilesExcludeValueIsNull_ReturnsNullIncludeExcludeFiles(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"packOptions\":{\"files\":{\"exclude\":null}}}"; @@ -2938,7 +2938,7 @@ public void GetPackageSpec_WhenPackOptionsFilesExcludeValueIsNull_ReturnsNullInc } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenPackOptionsFilesExcludeValueIsEmptyArray_ReturnsEmptyExclude(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"packOptions\":{\"files\":{\"exclude\":[]}}}"; @@ -2949,13 +2949,13 @@ public void GetPackageSpec_WhenPackOptionsFilesExcludeValueIsEmptyArray_ReturnsE } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), "\"a\"", "a")] - [MemberData(nameof(TestEnvironmentVariableReader), "\"a, b\"", "a, b")] - [MemberData(nameof(TestEnvironmentVariableReader), "[null]", null)] - [MemberData(nameof(TestEnvironmentVariableReader), "[\"\"]", "")] - [MemberData(nameof(TestEnvironmentVariableReader), "[\"a\"]", "a")] - [MemberData(nameof(TestEnvironmentVariableReader), "[\"a, b\"]", "a, b")] - [MemberData(nameof(TestEnvironmentVariableReader), "[\"a\", \"b\"]", "a", "b")] + [MemberData(nameof(TestEnvironmentVariableReader), "\"a\"", "a", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "\"a, b\"", "a, b", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "[null]", null, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "[\"\"]", "", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "[\"a\"]", "a", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "[\"a, b\"]", "a, b", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "[\"a\", \"b\"]", "a", "b", MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenPackOptionsFilesExcludeValueIsValid_ReturnsExclude(IEnvironmentVariableReader environmentVariableReader, string value, params string[] expectedResults) { expectedResults = expectedResults ?? new string[] { null }; @@ -2968,7 +2968,7 @@ public void GetPackageSpec_WhenPackOptionsFilesExcludeValueIsValid_ReturnsExclud } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenPackOptionsFilesExcludeFilesValueIsNull_ReturnsNullIncludeExcludeFiles(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"packOptions\":{\"files\":{\"excludeFiles\":null}}}"; @@ -2979,7 +2979,7 @@ public void GetPackageSpec_WhenPackOptionsFilesExcludeFilesValueIsNull_ReturnsNu } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenPackOptionsFilesExcludeFilesValueIsEmptyArray_ReturnsEmptyExcludeFiles(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"packOptions\":{\"files\":{\"excludeFiles\":[]}}}"; @@ -2990,13 +2990,13 @@ public void GetPackageSpec_WhenPackOptionsFilesExcludeFilesValueIsEmptyArray_Ret } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), "\"a\"", "a")] - [MemberData(nameof(TestEnvironmentVariableReader), "\"a, b\"", "a, b")] - [MemberData(nameof(TestEnvironmentVariableReader), "[null]", null)] - [MemberData(nameof(TestEnvironmentVariableReader), "[\"\"]", "")] - [MemberData(nameof(TestEnvironmentVariableReader), "[\"a\"]", "a")] - [MemberData(nameof(TestEnvironmentVariableReader), "[\"a, b\"]", "a, b")] - [MemberData(nameof(TestEnvironmentVariableReader), "[\"a\", \"b\"]", "a", "b")] + [MemberData(nameof(TestEnvironmentVariableReader), "\"a\"", "a", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "\"a, b\"", "a, b", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "[null]", null, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "[\"\"]", "", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "[\"a\"]", "a", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "[\"a, b\"]", "a, b", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "[\"a\", \"b\"]", "a", "b", MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenPackOptionsFilesExcludeFilesValueIsValid_ReturnsExcludeFiles(IEnvironmentVariableReader environmentVariableReader, string value, params string[] expectedResults) { expectedResults = expectedResults ?? new string[] { null }; @@ -3009,7 +3009,7 @@ public void GetPackageSpec_WhenPackOptionsFilesExcludeFilesValueIsValid_ReturnsE } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenPackOptionsFilesMappingsPropertyIsAbsent_ReturnsNullMappings(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"packOptions\":{\"files\":{}}}"; @@ -3020,7 +3020,7 @@ public void GetPackageSpec_WhenPackOptionsFilesMappingsPropertyIsAbsent_ReturnsN } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenPackOptionsFilesMappingsValueIsNull_ReturnsNullMappings(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"packOptions\":{\"files\":{\"mappings\":null}}}"; @@ -3031,9 +3031,9 @@ public void GetPackageSpec_WhenPackOptionsFilesMappingsValueIsNull_ReturnsNullMa } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), "\"b\"", "b")] - [MemberData(nameof(TestEnvironmentVariableReader), "\"b,c\"", "b,c")] - [MemberData(nameof(TestEnvironmentVariableReader), "[\"b\", \"c\"]", "b", "c")] + [MemberData(nameof(TestEnvironmentVariableReader), "\"b\"", "b", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "\"b,c\"", "b,c", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "[\"b\", \"c\"]", "b", "c", MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenPackOptionsFilesMappingsValueIsValid_ReturnsMappings(IEnvironmentVariableReader environmentVariableReader, string value, params string[] expectedIncludes) { var expectedResults = new Dictionary() @@ -3048,7 +3048,7 @@ public void GetPackageSpec_WhenPackOptionsFilesMappingsValueIsValid_ReturnsMappi } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenPackOptionsFilesMappingsValueHasMultipleMappings_ReturnsMappings(IEnvironmentVariableReader environmentVariableReader) { var expectedResults = new Dictionary() @@ -3064,7 +3064,7 @@ public void GetPackageSpec_WhenPackOptionsFilesMappingsValueHasMultipleMappings_ } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenPackOptionsFilesMappingsValueHasFiles_ReturnsMappings(IEnvironmentVariableReader environmentVariableReader) { var expectedResults = new Dictionary() @@ -3089,7 +3089,7 @@ public void GetPackageSpec_WhenPackOptionsFilesMappingsValueHasFiles_ReturnsMapp #pragma warning restore CS0612 // Type or member is obsolete [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenRestorePropertyIsAbsent_ReturnsNullRestoreMetadata(IEnvironmentVariableReader environmentVariableReader) { const string json = "{}"; @@ -3099,7 +3099,7 @@ public void GetPackageSpec_WhenRestorePropertyIsAbsent_ReturnsNullRestoreMetadat } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenRestoreValueIsEmptyObject_ReturnsRestoreMetadata(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"restore\":{}}"; @@ -3109,9 +3109,9 @@ public void GetPackageSpec_WhenRestoreValueIsEmptyObject_ReturnsRestoreMetadata( } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), "null")] - [MemberData(nameof(TestEnvironmentVariableReader), "\"\"")] - [MemberData(nameof(TestEnvironmentVariableReader), "\"a\"")] + [MemberData(nameof(TestEnvironmentVariableReader), "null", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "\"\"", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "\"a\"", MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenRestoreProjectStyleValueIsInvalid_ReturnsProjectStyle(IEnvironmentVariableReader environmentVariableReader, string value) { var json = $"{{\"restore\":{{\"projectStyle\":{value}}}}}"; @@ -3121,7 +3121,7 @@ public void GetPackageSpec_WhenRestoreProjectStyleValueIsInvalid_ReturnsProjectS } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenRestoreProjectStyleValueIsValid_ReturnsProjectStyle(IEnvironmentVariableReader environmentVariableReader) { const ProjectStyle expectedResult = ProjectStyle.PackageReference; @@ -3133,9 +3133,9 @@ public void GetPackageSpec_WhenRestoreProjectStyleValueIsValid_ReturnsProjectSty } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), "null", null)] - [MemberData(nameof(TestEnvironmentVariableReader), "\"\"", "")] - [MemberData(nameof(TestEnvironmentVariableReader), "\"a\"", "a")] + [MemberData(nameof(TestEnvironmentVariableReader), "null", null, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "\"\"", "", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "\"a\"", "a", MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenRestoreProjectUniqueNameValueIsValid_ReturnsProjectUniqueName( IEnvironmentVariableReader environmentVariableReader, string value, @@ -3148,9 +3148,9 @@ public void GetPackageSpec_WhenRestoreProjectUniqueNameValueIsValid_ReturnsProje } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), "null", null)] - [MemberData(nameof(TestEnvironmentVariableReader), "\"\"", "")] - [MemberData(nameof(TestEnvironmentVariableReader), "\"a\"", "a")] + [MemberData(nameof(TestEnvironmentVariableReader), "null", null, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "\"\"", "", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "\"a\"", "a", MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenRestoreOutputPathValueIsValid_ReturnsOutputPath( IEnvironmentVariableReader environmentVariableReader, string value, @@ -3163,9 +3163,9 @@ public void GetPackageSpec_WhenRestoreOutputPathValueIsValid_ReturnsOutputPath( } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), "null", null)] - [MemberData(nameof(TestEnvironmentVariableReader), "\"\"", "")] - [MemberData(nameof(TestEnvironmentVariableReader), "\"a\"", "a")] + [MemberData(nameof(TestEnvironmentVariableReader), "null", null, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "\"\"", "", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "\"a\"", "a", MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenRestorePackagesPathValueIsValid_ReturnsPackagesPath( IEnvironmentVariableReader environmentVariableReader, string value, @@ -3178,9 +3178,9 @@ public void GetPackageSpec_WhenRestorePackagesPathValueIsValid_ReturnsPackagesPa } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), "null", null)] - [MemberData(nameof(TestEnvironmentVariableReader), "\"\"", "")] - [MemberData(nameof(TestEnvironmentVariableReader), "\"a\"", "a")] + [MemberData(nameof(TestEnvironmentVariableReader), "null", null, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "\"\"", "", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "\"a\"", "a", MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenRestoreProjectJsonPathValueIsValid_ReturnsProjectJsonPath( IEnvironmentVariableReader environmentVariableReader, string value, @@ -3193,9 +3193,9 @@ public void GetPackageSpec_WhenRestoreProjectJsonPathValueIsValid_ReturnsProject } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), "null", null)] - [MemberData(nameof(TestEnvironmentVariableReader), "\"\"", "")] - [MemberData(nameof(TestEnvironmentVariableReader), "\"a\"", "a")] + [MemberData(nameof(TestEnvironmentVariableReader), "null", null, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "\"\"", "", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "\"a\"", "a", MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenRestoreProjectNameValueIsValid_ReturnsProjectName( IEnvironmentVariableReader environmentVariableReader, string value, @@ -3208,9 +3208,9 @@ public void GetPackageSpec_WhenRestoreProjectNameValueIsValid_ReturnsProjectName } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), "null", null)] - [MemberData(nameof(TestEnvironmentVariableReader), "\"\"", "")] - [MemberData(nameof(TestEnvironmentVariableReader), "\"a\"", "a")] + [MemberData(nameof(TestEnvironmentVariableReader), "null", null, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "\"\"", "", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "\"a\"", "a", MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenRestoreProjectPathValueIsValid_ReturnsProjectPath( IEnvironmentVariableReader environmentVariableReader, string value, @@ -3223,9 +3223,9 @@ public void GetPackageSpec_WhenRestoreProjectPathValueIsValid_ReturnsProjectPath } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), null, false)] - [MemberData(nameof(TestEnvironmentVariableReader), true, true)] - [MemberData(nameof(TestEnvironmentVariableReader), false, false)] + [MemberData(nameof(TestEnvironmentVariableReader), null, false, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), true, true, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), false, false, MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenCrossTargetingValueIsValid_ReturnsCrossTargeting( IEnvironmentVariableReader environmentVariableReader, bool? value, @@ -3238,9 +3238,9 @@ public void GetPackageSpec_WhenCrossTargetingValueIsValid_ReturnsCrossTargeting( } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), null, false)] - [MemberData(nameof(TestEnvironmentVariableReader), true, true)] - [MemberData(nameof(TestEnvironmentVariableReader), false, false)] + [MemberData(nameof(TestEnvironmentVariableReader), null, false, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), true, true, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), false, false, MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenLegacyPackagesDirectoryValueIsValid_ReturnsLegacyPackagesDirectory( IEnvironmentVariableReader environmentVariableReader, bool? value, @@ -3253,9 +3253,9 @@ public void GetPackageSpec_WhenLegacyPackagesDirectoryValueIsValid_ReturnsLegacy } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), null, false)] - [MemberData(nameof(TestEnvironmentVariableReader), true, true)] - [MemberData(nameof(TestEnvironmentVariableReader), false, false)] + [MemberData(nameof(TestEnvironmentVariableReader), null, false, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), true, true, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), false, false, MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenValidateRuntimeAssetsValueIsValid_ReturnsValidateRuntimeAssets( IEnvironmentVariableReader environmentVariableReader, bool? value, @@ -3268,9 +3268,9 @@ public void GetPackageSpec_WhenValidateRuntimeAssetsValueIsValid_ReturnsValidate } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), null, false)] - [MemberData(nameof(TestEnvironmentVariableReader), true, true)] - [MemberData(nameof(TestEnvironmentVariableReader), false, false)] + [MemberData(nameof(TestEnvironmentVariableReader), null, false, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), true, true, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), false, false, MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenSkipContentFileWriteValueIsValid_ReturnsSkipContentFileWrite( IEnvironmentVariableReader environmentVariableReader, bool? value, @@ -3283,9 +3283,9 @@ public void GetPackageSpec_WhenSkipContentFileWriteValueIsValid_ReturnsSkipConte } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), null, false)] - [MemberData(nameof(TestEnvironmentVariableReader), true, true)] - [MemberData(nameof(TestEnvironmentVariableReader), false, false)] + [MemberData(nameof(TestEnvironmentVariableReader), null, false, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), true, true, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), false, false, MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenCentralPackageVersionsManagementEnabledValueIsValid_ReturnsCentralPackageVersionsManagementEnabled( IEnvironmentVariableReader environmentVariableReader, bool? value, @@ -3298,7 +3298,7 @@ public void GetPackageSpec_WhenCentralPackageVersionsManagementEnabledValueIsVal } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenSourcesValueIsEmptyObject_ReturnsEmptySources(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"restore\":{\"sources\":{}}}"; @@ -3308,7 +3308,7 @@ public void GetPackageSpec_WhenSourcesValueIsEmptyObject_ReturnsEmptySources(IEn } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenSourcesValueIsValid_ReturnsSources(IEnvironmentVariableReader environmentVariableReader) { PackageSource[] expectedResults = { new PackageSource(source: "a"), new PackageSource(source: "b") }; @@ -3320,7 +3320,7 @@ public void GetPackageSpec_WhenSourcesValueIsValid_ReturnsSources(IEnvironmentVa } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFilesValueIsEmptyObject_ReturnsEmptyFiles(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"restore\":{\"files\":{}}}"; @@ -3330,7 +3330,7 @@ public void GetPackageSpec_WhenFilesValueIsEmptyObject_ReturnsEmptyFiles(IEnviro } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFilesValueIsValid_ReturnsFiles(IEnvironmentVariableReader environmentVariableReader) { ProjectRestoreMetadataFile[] expectedResults = @@ -3346,7 +3346,7 @@ public void GetPackageSpec_WhenFilesValueIsValid_ReturnsFiles(IEnvironmentVariab } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenRestoreFrameworksValueIsEmptyObject_ReturnsEmptyFrameworks(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"restore\":{\"frameworks\":{}}}"; @@ -3356,7 +3356,7 @@ public void GetPackageSpec_WhenRestoreFrameworksValueIsEmptyObject_ReturnsEmptyF } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenRestoreFrameworksFrameworkNameValueIsValid_ReturnsFrameworks(IEnvironmentVariableReader environmentVariableReader) { var expectedResult = new ProjectRestoreMetadataFrameworkInfo(NuGetFramework.ParseFolder("net472")); @@ -3369,7 +3369,7 @@ public void GetPackageSpec_WhenRestoreFrameworksFrameworkNameValueIsValid_Return } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenRestoreFrameworksFrameworkValueHasProjectReferenceWithoutAssets_ReturnsFrameworks(IEnvironmentVariableReader environmentVariableReader) { var projectReference = new ProjectRestoreReference() @@ -3391,7 +3391,7 @@ public void GetPackageSpec_WhenRestoreFrameworksFrameworkValueHasProjectReferenc } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenRestoreFrameworksFrameworkValueHasProjectReferenceWithAssets_ReturnsFrameworks(IEnvironmentVariableReader environmentVariableReader) { var projectReference = new ProjectRestoreReference() @@ -3418,7 +3418,7 @@ public void GetPackageSpec_WhenRestoreFrameworksFrameworkValueHasProjectReferenc } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenRestoreConfigFilePathsValueIsEmptyArray_ReturnsEmptyConfigFilePaths(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"restore\":{\"configFilePaths\":[]}}"; @@ -3428,7 +3428,7 @@ public void GetPackageSpec_WhenRestoreConfigFilePathsValueIsEmptyArray_ReturnsEm } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenRestoreConfigFilePathsValueIsValid_ReturnsConfigFilePaths(IEnvironmentVariableReader environmentVariableReader) { string[] expectedResults = { "a", "b" }; @@ -3440,7 +3440,7 @@ public void GetPackageSpec_WhenRestoreConfigFilePathsValueIsValid_ReturnsConfigF } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenRestoreFallbackFoldersValueIsEmptyArray_ReturnsEmptyFallbackFolders(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"restore\":{\"fallbackFolders\":[]}}"; @@ -3450,7 +3450,7 @@ public void GetPackageSpec_WhenRestoreFallbackFoldersValueIsEmptyArray_ReturnsEm } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenRestoreFallbackFoldersValueIsValid_ReturnsConfigFilePaths(IEnvironmentVariableReader environmentVariableReader) { string[] expectedResults = { "a", "b" }; @@ -3462,7 +3462,7 @@ public void GetPackageSpec_WhenRestoreFallbackFoldersValueIsValid_ReturnsConfigF } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenRestoreOriginalTargetFrameworksValueIsEmptyArray_ReturnsEmptyOriginalTargetFrameworks(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"restore\":{\"originalTargetFrameworks\":[]}}"; @@ -3472,7 +3472,7 @@ public void GetPackageSpec_WhenRestoreOriginalTargetFrameworksValueIsEmptyArray_ } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenRestoreOriginalTargetFrameworksValueIsValid_ReturnsOriginalTargetFrameworks(IEnvironmentVariableReader environmentVariableReader) { string[] expectedResults = { "a", "b" }; @@ -3484,7 +3484,7 @@ public void GetPackageSpec_WhenRestoreOriginalTargetFrameworksValueIsValid_Retur } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenRestoreWarningPropertiesValueIsEmptyObject_ReturnsWarningProperties(IEnvironmentVariableReader environmentVariableReader) { var expectedResult = new WarningProperties(); @@ -3495,7 +3495,7 @@ public void GetPackageSpec_WhenRestoreWarningPropertiesValueIsEmptyObject_Return } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenRestoreWarningPropertiesValueIsValid_ReturnsWarningProperties(IEnvironmentVariableReader environmentVariableReader) { var expectedResult = new WarningProperties( @@ -3511,7 +3511,7 @@ public void GetPackageSpec_WhenRestoreWarningPropertiesValueIsValid_ReturnsWarni } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenRestoreRestoreLockPropertiesValueIsEmptyObject_ReturnsRestoreLockProperties(IEnvironmentVariableReader environmentVariableReader) { var expectedResult = new RestoreLockProperties(); @@ -3522,7 +3522,7 @@ public void GetPackageSpec_WhenRestoreRestoreLockPropertiesValueIsEmptyObject_Re } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenRestoreRestoreLockPropertiesValueIsValid_ReturnsRestoreLockProperties(IEnvironmentVariableReader environmentVariableReader) { var expectedResult = new RestoreLockProperties( @@ -3538,9 +3538,9 @@ public void GetPackageSpec_WhenRestoreRestoreLockPropertiesValueIsValid_ReturnsR } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), "null")] - [MemberData(nameof(TestEnvironmentVariableReader), "\"\"")] - [MemberData(nameof(TestEnvironmentVariableReader), "\"a\"")] + [MemberData(nameof(TestEnvironmentVariableReader), "null", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "\"\"", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "\"a\"", MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenRestorePackagesConfigPathValueIsValidAndProjectStyleValueIsNotPackagesConfig_DoesNotReturnPackagesConfigPath(IEnvironmentVariableReader environmentVariableReader, string value) { var json = $"{{\"restore\":{{\"projectStyle\":\"PackageReference\",\"packagesConfigPath\":{value}}}}}"; @@ -3550,9 +3550,9 @@ public void GetPackageSpec_WhenRestorePackagesConfigPathValueIsValidAndProjectSt } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), "null", null)] - [MemberData(nameof(TestEnvironmentVariableReader), "\"\"", "")] - [MemberData(nameof(TestEnvironmentVariableReader), "\"a\"", "a")] + [MemberData(nameof(TestEnvironmentVariableReader), "null", null, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "\"\"", "", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "\"a\"", "a", MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenRestorePackagesConfigPathValueIsValidAndProjectStyleValueIsPackagesConfig_ReturnsPackagesConfigPath( IEnvironmentVariableReader environmentVariableReader, string value, @@ -3566,7 +3566,7 @@ public void GetPackageSpec_WhenRestorePackagesConfigPathValueIsValidAndProjectSt } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenRestoreSettingsValueIsEmptyObject_ReturnsRestoreSettings(IEnvironmentVariableReader environmentVariableReader) { var expectedResult = new ProjectRestoreSettings(); @@ -3577,7 +3577,7 @@ public void GetPackageSpec_WhenRestoreSettingsValueIsEmptyObject_ReturnsRestoreS } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenRuntimesValueIsEmptyObject_ReturnsRuntimes(IEnvironmentVariableReader environmentVariableReader) { var expectedResult = RuntimeGraph.Empty; @@ -3588,7 +3588,7 @@ public void GetPackageSpec_WhenRuntimesValueIsEmptyObject_ReturnsRuntimes(IEnvir } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenRuntimesValueIsValidWithImports_ReturnsRuntimes(IEnvironmentVariableReader environmentVariableReader) { var runtimeDescription = new RuntimeDescription( @@ -3604,7 +3604,7 @@ public void GetPackageSpec_WhenRuntimesValueIsValidWithImports_ReturnsRuntimes(I } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenRuntimesValueIsValidWithDependencySet_ReturnsRuntimes(IEnvironmentVariableReader environmentVariableReader) { var dependencySet = new RuntimeDependencySet(id: "b"); @@ -3620,7 +3620,7 @@ public void GetPackageSpec_WhenRuntimesValueIsValidWithDependencySet_ReturnsRunt } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenRuntimesValueIsValidWithDependencySetWithDependency_ReturnsRuntimes(IEnvironmentVariableReader environmentVariableReader) { var dependency = new RuntimePackageDependency("c", VersionRange.Parse("[1.2.3,4.5.6)")); @@ -3638,7 +3638,7 @@ public void GetPackageSpec_WhenRuntimesValueIsValidWithDependencySetWithDependen } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenSupportsValueIsEmptyObject_ReturnsSupports(IEnvironmentVariableReader environmentVariableReader) { var expectedResult = RuntimeGraph.Empty; @@ -3649,7 +3649,7 @@ public void GetPackageSpec_WhenSupportsValueIsEmptyObject_ReturnsSupports(IEnvir } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenSupportsValueIsValidWithCompatibilityProfiles_ReturnsSupports(IEnvironmentVariableReader environmentVariableReader) { var profile = new CompatibilityProfile(name: "a"); @@ -3661,7 +3661,7 @@ public void GetPackageSpec_WhenSupportsValueIsValidWithCompatibilityProfiles_Ret } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenSupportsValueIsValidWithCompatibilityProfilesAndFrameworkRuntimePairs_ReturnsSupports(IEnvironmentVariableReader environmentVariableReader) { FrameworkRuntimePair[] restoreContexts = new[] @@ -3681,7 +3681,7 @@ public void GetPackageSpec_WhenSupportsValueIsValidWithCompatibilityProfilesAndF #pragma warning disable CS0612 // Type or member is obsolete [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenScriptsValueIsEmptyObject_ReturnsScripts(IEnvironmentVariableReader environmentVariableReader) { const string json = "{\"scripts\":{}}"; @@ -3691,7 +3691,7 @@ public void GetPackageSpec_WhenScriptsValueIsEmptyObject_ReturnsScripts(IEnviron } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenScriptsValueIsInvalid_Throws(IEnvironmentVariableReader environmentVariableReader) { var json = "{\"scripts\":{\"a\":0}}"; @@ -3709,7 +3709,7 @@ public void GetPackageSpec_WhenScriptsValueIsInvalid_Throws(IEnvironmentVariable } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenScriptsValueIsValid_ReturnsScripts(IEnvironmentVariableReader environmentVariableReader) { const string name0 = "a"; @@ -3742,9 +3742,9 @@ public void GetPackageSpec_WhenScriptsValueIsValid_ReturnsScripts(IEnvironmentVa #pragma warning restore CS0612 // Type or member is obsolete [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), "null", null)] - [MemberData(nameof(TestEnvironmentVariableReader), "\"\"", "")] - [MemberData(nameof(TestEnvironmentVariableReader), "\"a\"", "a")] + [MemberData(nameof(TestEnvironmentVariableReader), "null", null, MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "\"\"", "", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "\"a\"", "a", MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenTitleValueIsValid_ReturnsTitle(IEnvironmentVariableReader environmentVariableReader, string value, string expectedResult) { var json = $"{{\"title\":{value}}}"; @@ -3755,7 +3755,7 @@ public void GetPackageSpec_WhenTitleValueIsValid_ReturnsTitle(IEnvironmentVariab } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenNameIsNull_RestoreMetadataProvidesFallbackName(IEnvironmentVariableReader environmentVariableReader) { const string expectedResult = "a"; @@ -3767,9 +3767,9 @@ public void GetPackageSpec_WhenNameIsNull_RestoreMetadataProvidesFallbackName(IE } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader), "{\"restore\":{\"projectJsonPath\":\"a\"}}")] - [MemberData(nameof(TestEnvironmentVariableReader), "{\"restore\":{\"projectPath\":\"a\"}}")] - [MemberData(nameof(TestEnvironmentVariableReader), "{\"restore\":{\"projectJsonPath\":\"a\",\"projectPath\":\"b\"}}")] + [MemberData(nameof(TestEnvironmentVariableReader), "{\"restore\":{\"projectJsonPath\":\"a\"}}", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "{\"restore\":{\"projectPath\":\"a\"}}", MemberType = typeof(LockFileParsingEnvironmentVariable))] + [MemberData(nameof(TestEnvironmentVariableReader), "{\"restore\":{\"projectJsonPath\":\"a\",\"projectPath\":\"b\"}}", MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFilePathIsNull_RestoreMetadataProvidesFallbackFilePath(IEnvironmentVariableReader environmentVariableReader, string json) { const string expectedResult = "a"; @@ -3780,7 +3780,7 @@ public void GetPackageSpec_WhenFilePathIsNull_RestoreMetadataProvidesFallbackFil } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetTargetFrameworkInformation_WithAnAlias(IEnvironmentVariableReader environmentVariableReader) { TargetFrameworkInformation framework = GetFramework("{\"frameworks\":{\"net46\":{ \"targetAlias\" : \"alias\"}}}", environmentVariableReader); @@ -3789,7 +3789,7 @@ public void GetTargetFrameworkInformation_WithAnAlias(IEnvironmentVariableReader } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void PackageSpecReader_ReadsRestoreMetadataWithAliases(IEnvironmentVariableReader environmentVariableReader) { // Arrange @@ -3825,7 +3825,7 @@ public void PackageSpecReader_ReadsRestoreMetadataWithAliases(IEnvironmentVariab } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void PackageSpecReader_Read(IEnvironmentVariableReader environmentVariableReader) { // Arrange @@ -3920,7 +3920,7 @@ public void PackageSpecReader_Read(IEnvironmentVariableReader environmentVariabl [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void PackageSpecReader_Malformed_Exception(IEnvironmentVariableReader environmentVariableReader) { // Arrange @@ -3974,7 +3974,7 @@ public void PackageSpecReader_Malformed_Exception(IEnvironmentVariableReader env } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WithSecondaryFrameworks_ReturnsTargetFrameworkInformationWithDualCompatibilityFramework(IEnvironmentVariableReader environmentVariableReader) { var json = $"{{\"frameworks\":{{\"net5.0\":{{\"secondaryFramework\": \"native\"}}}}}}"; @@ -3987,7 +3987,7 @@ public void GetPackageSpec_WithSecondaryFrameworks_ReturnsTargetFrameworkInforma } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WithAssetTargetFallbackAndWithSecondaryFrameworks_ReturnsTargetFrameworkInformationWithDualCompatibilityFramework(IEnvironmentVariableReader environmentVariableReader) { var json = $"{{\"frameworks\":{{\"net5.0\":{{\"assetTargetFallback\": true, \"imports\": [\"net472\", \"net471\"], \"secondaryFramework\": \"native\" }}}}}}"; @@ -4006,7 +4006,7 @@ public void GetPackageSpec_WithAssetTargetFallbackAndWithSecondaryFrameworks_Ret } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WithRestoreAuditProperties_ReturnsRestoreAuditProperties(IEnvironmentVariableReader environmentVariableReader) { // Arrange @@ -4059,55 +4059,5 @@ private static FrameworkDependency GetFrameworksFrameworkReference(string json, return framework.FrameworkReferences.Single(); } - - public static IEnumerable TestEnvironmentVariableReader() - { - return GetTestEnvironmentVariableReader(); - } - - public static IEnumerable TestEnvironmentVariableReader(object value1) - { - return GetTestEnvironmentVariableReader(value1); - } - - public static IEnumerable TestEnvironmentVariableReader(object value1, object value2) - { - return GetTestEnvironmentVariableReader(value1, value2); - } - - public static IEnumerable TestEnvironmentVariableReader(object value1, object value2, object value3) - { - return GetTestEnvironmentVariableReader(value1, value2, value3); - } - - private static IEnumerable GetTestEnvironmentVariableReader(params object[] objects) - { - var UseNjForFileTrue = new List { - new TestEnvironmentVariableReader( - new Dictionary() - { - ["NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"] = bool.TrueString - }, "NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING: true") - }; - var UseNjForFileFalse = new List { - new TestEnvironmentVariableReader( - new Dictionary() - { - ["NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"] = bool.FalseString - }, "NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING: false") - }; - - if (objects != null) - { - UseNjForFileFalse.AddRange(objects); - UseNjForFileTrue.AddRange(objects); - } - - return new List - { - UseNjForFileTrue.ToArray(), - UseNjForFileFalse.ToArray() - }; - } } } diff --git a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileFormatTests.cs b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileFormatTests.cs index e5c4180f8e4..69d1709040f 100644 --- a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileFormatTests.cs +++ b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileFormatTests.cs @@ -11,7 +11,6 @@ using NuGet.LibraryModel; using NuGet.Packaging.Core; using NuGet.Versioning; -using Test.Utility; using Xunit; using static NuGet.Test.Utility.TestPackagesCore; @@ -21,7 +20,7 @@ public class LockFileFormatTests { // Verify the value of locked has no impact on the parsed lock file [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void LockFileFormat_LockedPropertyIsIgnored(IEnvironmentVariableReader environmentVariableReader) { @@ -170,7 +169,7 @@ public void LockFileFormat_LockedPropertyIsIgnored(IEnvironmentVariableReader en } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void LockFileFormat_ReadsLockFileWithNoTools(IEnvironmentVariableReader environmentVariableReader) { var lockFileContent = @"{ @@ -1336,7 +1335,7 @@ public void LockFileFormat_WritesMinimalWarningMessageWithWarningLevel() } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void LockFileFormat_ReadsMinimalErrorMessage(IEnvironmentVariableReader environmentVariableReader) { // Arrange @@ -1409,7 +1408,7 @@ public void LockFileFormat_ReadsMinimalErrorMessage(IEnvironmentVariableReader e } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void LockFileFormat_ReadsFullErrorMessage(IEnvironmentVariableReader environmentVariableReader) { // Arrange @@ -1492,7 +1491,7 @@ public void LockFileFormat_ReadsFullErrorMessage(IEnvironmentVariableReader envi } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void LockFileFormat_SafeRead(IEnvironmentVariableReader environmentVariableReader) { // Arrange @@ -1578,7 +1577,7 @@ public void LockFileFormat_SafeRead(IEnvironmentVariableReader environmentVariab [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void LockFileFormat_ReadsWarningMessage(IEnvironmentVariableReader environmentVariableReader) { @@ -1664,7 +1663,7 @@ public void LockFileFormat_ReadsWarningMessage(IEnvironmentVariableReader enviro } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void LockFileFormat_ReadsWarningMessageWithoutWarningLevel(IEnvironmentVariableReader environmentVariableReader) { // Arrange @@ -1749,7 +1748,7 @@ public void LockFileFormat_ReadsWarningMessageWithoutWarningLevel(IEnvironmentVa [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void LockFileFormat_ReadsMultipleMessages(IEnvironmentVariableReader environmentVariableReader) { // Arrange @@ -1839,7 +1838,7 @@ public void LockFileFormat_ReadsMultipleMessages(IEnvironmentVariableReader envi } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void LockFileFormat_ReadsLogMessageWithSameFilePathAndProjectPath(IEnvironmentVariableReader environmentVariableReader) { // Arrange @@ -1919,7 +1918,7 @@ public void LockFileFormat_ReadsLogMessageWithSameFilePathAndProjectPath(IEnviro } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void LockFileFormat_ReadsLogMessageWithNoFilePath(IEnvironmentVariableReader environmentVariableReader) { // Arrange @@ -1998,7 +1997,7 @@ public void LockFileFormat_ReadsLogMessageWithNoFilePath(IEnvironmentVariableRea } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void LockFileFormat_ReadsLockFileWithTools(IEnvironmentVariableReader environmentVariableReader) { var lockFileContent = @"{ @@ -2069,7 +2068,7 @@ public void LockFileFormat_ReadsLockFileWithTools(IEnvironmentVariableReader env } [Theory] - [MemberData(nameof(TestEnvironmentVariableReader))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void LockFileFormat_ReadsLockFileWithEmbedAssemblies(IEnvironmentVariableReader environmentVariableReader) { var lockFileContent = @"{ @@ -2312,40 +2311,5 @@ public void LockFileFormat_WritesCentralTransitiveDependencyGroups() // Assert Assert.Equal(expected.ToString(), output.ToString()); } - - public static IEnumerable TestEnvironmentVariableReader() - { - return GetTestEnvironmentVariableReader(); - } - - private static IEnumerable GetTestEnvironmentVariableReader(params object[] objects) - { - var UseNjForFileTrue = new List { - new TestEnvironmentVariableReader( - new Dictionary() - { - ["NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"] = bool.TrueString - }, "NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING: true") - }; - var UseNjForFileFalse = new List { - new TestEnvironmentVariableReader( - new Dictionary() - { - ["NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"] = bool.FalseString - }, "NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING: false") - }; - - if (objects != null) - { - UseNjForFileFalse.AddRange(objects); - UseNjForFileTrue.AddRange(objects); - } - - return new List - { - UseNjForFileTrue.ToArray(), - UseNjForFileFalse.ToArray() - }; - } } } diff --git a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileParsingEnvironmentVariable.cs b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileParsingEnvironmentVariable.cs new file mode 100644 index 00000000000..b29c06de105 --- /dev/null +++ b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileParsingEnvironmentVariable.cs @@ -0,0 +1,61 @@ +// 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. + +using System.Collections.Generic; +using Test.Utility; + +namespace NuGet.ProjectModel +{ + public class LockFileParsingEnvironmentVariable + { + public static IEnumerable TestEnvironmentVariableReader() + { + return GetTestEnvironmentVariableReader(); + } + + public static IEnumerable TestEnvironmentVariableReader(object value1) + { + return GetTestEnvironmentVariableReader(value1); + } + + public static IEnumerable TestEnvironmentVariableReader(object value1, object value2) + { + return GetTestEnvironmentVariableReader(value1, value2); + } + + public static IEnumerable TestEnvironmentVariableReader(object value1, object value2, object value3) + { + return GetTestEnvironmentVariableReader(value1, value2, value3); + } + + private static IEnumerable GetTestEnvironmentVariableReader(params object[] objects) + { + var UseNjForFileTrue = new List { + new TestEnvironmentVariableReader( + new Dictionary() + { + ["NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"] = bool.TrueString + }, "NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING: true") + }; + var UseNjForFileFalse = new List { + new TestEnvironmentVariableReader( + new Dictionary() + { + ["NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"] = bool.FalseString + }, "NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING: false") + }; + + if (objects != null) + { + UseNjForFileFalse.AddRange(objects); + UseNjForFileTrue.AddRange(objects); + } + + return new List + { + UseNjForFileTrue.ToArray(), + UseNjForFileFalse.ToArray() + }; + } + } +} diff --git a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileTests.cs b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileTests.cs index f6874628ac5..f2e770c7fef 100644 --- a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileTests.cs +++ b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileTests.cs @@ -854,13 +854,13 @@ public void LockFile_ConsiderCentralTransitiveDependencyGroupsForEquality() Assert.Equal(lockFile_1_2.GetHashCode(), lockFile_11_22.GetHashCode()); } - [Fact] - [Obsolete] - public void LockFile_GetTarget_WithNuGetFramework_ReturnsCorrectLockFileTarget() + [Theory] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] + public void LockFile_GetTarget_WithNuGetFramework_ReturnsCorrectLockFileTarget(IEnvironmentVariableReader environmentVariableReader) { // Arrange var expectedJson = ResourceTestUtility.GetResource("NuGet.ProjectModel.Test.compiler.resources.sample.assets.json", typeof(LockFileTests)); - var lockFile = new LockFileFormat().Parse(expectedJson, Path.GetTempPath()); + var lockFile = new LockFileFormat().Parse(expectedJson, Path.GetTempPath(), environmentVariableReader); NuGetFramework nuGetFramework = NuGetFramework.ParseComponents(".NETCoreApp,Version=v5.0", "Windows,Version=7.0"); // Act @@ -870,13 +870,13 @@ public void LockFile_GetTarget_WithNuGetFramework_ReturnsCorrectLockFileTarget() target.TargetFramework.Should().Be(nuGetFramework); } - [Fact] - [Obsolete] - public void LockFile_GetTarget_WithAlias_ReturnsCorrectLockFileTarget() + [Theory] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] + public void LockFile_GetTarget_WithAlias_ReturnsCorrectLockFileTarget(IEnvironmentVariableReader environmentVariableReader) { // Arrange var expectedJson = ResourceTestUtility.GetResource("NuGet.ProjectModel.Test.compiler.resources.sample.assets.json", typeof(LockFileTests)); - var lockFile = new LockFileFormat().Parse(expectedJson, Path.GetTempPath()); + var lockFile = new LockFileFormat().Parse(expectedJson, Path.GetTempPath(), environmentVariableReader); NuGetFramework nuGetFramework = NuGetFramework.ParseComponents(".NETCoreApp,Version=v5.0", "Windows,Version=7.0"); // Act From d083e23d144ca9013da9b4abd0d1fe8c6d4d100d Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Fri, 22 Dec 2023 13:27:06 -0800 Subject: [PATCH 15/43] fix references --- .../DependencyTargetTests.cs | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/DependencyTargetTests.cs b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/DependencyTargetTests.cs index b0e65bb8cc4..5f6d0b16b52 100644 --- a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/DependencyTargetTests.cs +++ b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/DependencyTargetTests.cs @@ -1,7 +1,6 @@ // 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. -using System; using System.IO; using System.Linq; using System.Text; @@ -11,11 +10,10 @@ namespace NuGet.ProjectModel.Test { - [Obsolete] public class DependencyTargetTests { [Theory] - [MemberData(nameof(JsonPackageSpecReaderTests.TestEnvironmentVariableReader), MemberType = typeof(JsonPackageSpecReaderTests))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void DependencyTarget_ExternalProjectValue(IEnvironmentVariableReader environmentVariableReader) { // Arrange @@ -40,7 +38,7 @@ public void DependencyTarget_ExternalProjectValue(IEnvironmentVariableReader env } [Theory] - [MemberData(nameof(JsonPackageSpecReaderTests.TestEnvironmentVariableReader), MemberType = typeof(JsonPackageSpecReaderTests))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void DependencyTarget_ProjectValue(IEnvironmentVariableReader environmentVariableReader) { // Arrange @@ -65,7 +63,7 @@ public void DependencyTarget_ProjectValue(IEnvironmentVariableReader environment } [Theory] - [MemberData(nameof(JsonPackageSpecReaderTests.TestEnvironmentVariableReader), MemberType = typeof(JsonPackageSpecReaderTests))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void DependencyTarget_PackageValue(IEnvironmentVariableReader environmentVariableReader) { // Arrange @@ -90,7 +88,7 @@ public void DependencyTarget_PackageValue(IEnvironmentVariableReader environment } [Theory] - [MemberData(nameof(JsonPackageSpecReaderTests.TestEnvironmentVariableReader), MemberType = typeof(JsonPackageSpecReaderTests))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void DependencyTarget_CaseInsensitive(IEnvironmentVariableReader environmentVariableReader) { // Arrange @@ -115,7 +113,7 @@ public void DependencyTarget_CaseInsensitive(IEnvironmentVariableReader environm } [Theory] - [MemberData(nameof(JsonPackageSpecReaderTests.TestEnvironmentVariableReader), MemberType = typeof(JsonPackageSpecReaderTests))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void DependencyTarget_DefaultValueDefault(IEnvironmentVariableReader environmentVariableReader) { // Arrange @@ -138,7 +136,7 @@ public void DependencyTarget_DefaultValueDefault(IEnvironmentVariableReader envi } [Theory] - [MemberData(nameof(JsonPackageSpecReaderTests.TestEnvironmentVariableReader), MemberType = typeof(JsonPackageSpecReaderTests))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void DependencyTarget_UnknownValueFails(IEnvironmentVariableReader environmentVariableReader) { // Arrange @@ -180,7 +178,7 @@ public void DependencyTarget_UnknownValueFails(IEnvironmentVariableReader enviro } [Theory] - [MemberData(nameof(JsonPackageSpecReaderTests.TestEnvironmentVariableReader), MemberType = typeof(JsonPackageSpecReaderTests))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void DependencyTarget_NonWhiteListValueFails(IEnvironmentVariableReader environmentVariableReader) { // Arrange @@ -222,7 +220,7 @@ public void DependencyTarget_NonWhiteListValueFails(IEnvironmentVariableReader e } [Theory] - [MemberData(nameof(JsonPackageSpecReaderTests.TestEnvironmentVariableReader), MemberType = typeof(JsonPackageSpecReaderTests))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void DependencyTarget_MultipleValuesFail(IEnvironmentVariableReader environmentVariableReader) { // Arrange @@ -264,7 +262,7 @@ public void DependencyTarget_MultipleValuesFail(IEnvironmentVariableReader envir } [Theory] - [MemberData(nameof(JsonPackageSpecReaderTests.TestEnvironmentVariableReader), MemberType = typeof(JsonPackageSpecReaderTests))] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void DependencyTarget_AcceptsWhitespace(IEnvironmentVariableReader environmentVariableReader) { // Arrange From 0b22126aaa73c53310c5e0b605d4829c01136d17 Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Fri, 22 Dec 2023 14:01:51 -0800 Subject: [PATCH 16/43] Fix typo --- src/NuGet.Core/NuGet.ProjectModel/LockFile/LockFileFormat.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/LockFileFormat.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/LockFileFormat.cs index f3f6a4210b4..b5cff76498c 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LockFile/LockFileFormat.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/LockFileFormat.cs @@ -113,7 +113,7 @@ internal LockFile Read(Stream stream, ILogger log, string path, IEnvironmentVari var useNj = environmentVariableReader.GetEnvironmentVariable("NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"); if (string.IsNullOrEmpty(useNj) || useNj.Equals("false", StringComparison.OrdinalIgnoreCase)) { - return Uf8JsonRead(stream, log, path); + return Utf8JsonRead(stream, log, path); } else { @@ -197,7 +197,7 @@ public string Render(LockFile lockFile) } } - private LockFile Uf8JsonRead(Stream stream, ILogger log, string path) + private LockFile Utf8JsonRead(Stream stream, ILogger log, string path) { try { From e81974f772ef74778cb9bb5358cbf4fe59c263d0 Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Thu, 4 Jan 2024 13:15:17 -0800 Subject: [PATCH 17/43] Added test for invalid logs --- .../LockFileFormatTests.cs | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileFormatTests.cs b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileFormatTests.cs index 69d1709040f..6a03d421f24 100644 --- a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileFormatTests.cs +++ b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileFormatTests.cs @@ -1407,6 +1407,90 @@ public void LockFileFormat_ReadsMinimalErrorMessage(IEnvironmentVariableReader e Assert.Equal("test log message", logMessage.Message); } + + [Theory] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] + public void LockFileFormat_SkipsInvalidErrorMessage(IEnvironmentVariableReader environmentVariableReader) + { + // Arrange + var lockFileContent = @"{ + ""version"": 3, + ""targets"": { + "".NETPlatform,Version=v5.0"": { + ""System.Runtime/4.0.20-beta-22927"": { + ""type"": ""package"", + ""dependencies"": { + ""Frob"": ""4.0.20"" + }, + ""compile"": { + ""ref/dotnet/System.Runtime.dll"": {} + } + } + } + }, + ""libraries"": { + ""System.Runtime/4.0.20-beta-22927"": { + ""sha512"": ""sup3rs3cur3"", + ""type"": ""package"", + ""files"": [ + ""System.Runtime.nuspec"" + ] + } + }, + ""projectFileDependencyGroups"": { + """": [ + ""System.Runtime [4.0.10-beta-*, )"" + ], + "".NETPlatform,Version=v5.0"": [] + }, + ""logs"": [ + { + ""code"": ""InvalidCode"", + ""level"": ""Error"", + ""message"": ""test log message"" + }, + { + ""code"": ""NU1000"", + ""level"": ""InvalidCode"", + ""message"": ""test log message"" + }, + { + ""code"": ""NU1000"", + ""level"": ""Error"", + ""message"": ""test log message"" + } + ] +}"; + LockFile lockFileObj = null; + IAssetsLogMessage logMessage = null; + using (var lockFile = new TempFile()) + { + + File.WriteAllText(lockFile, lockFileContent); + + // Act + var reader = new LockFileFormat(); + lockFileObj = reader.Read(lockFile, environmentVariableReader); + logMessage = lockFileObj?.LogMessages?.First(); + } + + + // Assert + Assert.NotNull(lockFileObj); + Assert.NotNull(logMessage); + Assert.Equal(1, lockFileObj.LogMessages.Count()); + Assert.Equal(LogLevel.Error, logMessage.Level); + Assert.Equal(NuGetLogCode.NU1000, logMessage.Code); + Assert.Null(logMessage.FilePath); + Assert.Equal(0, logMessage.StartLineNumber); + Assert.Equal(0, logMessage.EndLineNumber); + Assert.Equal(0, logMessage.StartColumnNumber); + Assert.Equal(0, logMessage.EndColumnNumber); + Assert.NotNull(logMessage.TargetGraphs); + Assert.Equal(0, logMessage.TargetGraphs.Count); + Assert.Equal("test log message", logMessage.Message); + } + [Theory] [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void LockFileFormat_ReadsFullErrorMessage(IEnvironmentVariableReader environmentVariableReader) From d2cc5d6a828180f301220ca46142ac6a28c4133c Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Thu, 4 Jan 2024 13:33:03 -0800 Subject: [PATCH 18/43] removed extra name assignment from package spec reader --- .../JsonPackageSpecReader.Utf8JsonStreamReader.cs | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.Utf8JsonStreamReader.cs b/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.Utf8JsonStreamReader.cs index c15205fd750..efb5c140100 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.Utf8JsonStreamReader.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.Utf8JsonStreamReader.cs @@ -112,19 +112,7 @@ public partial class JsonPackageSpecReader internal static PackageSpec GetPackageSpecUtf8JsonStreamReader(Stream stream, string name, string packageSpecPath, string snapshotValue) { var reader = new Utf8JsonStreamReader(stream); - PackageSpec packageSpec; - packageSpec = GetPackageSpec(ref reader, name, packageSpecPath, snapshotValue); - - if (!string.IsNullOrEmpty(name)) - { - packageSpec.Name = name; - if (!string.IsNullOrEmpty(packageSpecPath)) - { - packageSpec.FilePath = Path.GetFullPath(packageSpecPath); - - } - } - return packageSpec; + return GetPackageSpec(ref reader, name, packageSpecPath, snapshotValue); } internal static PackageSpec GetPackageSpec(ref Utf8JsonStreamReader jsonReader, string name, string packageSpecPath, string snapshotValue) From 2de68c400f81d8c476dc0967f86c666c6390cac1 Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Thu, 4 Jan 2024 13:39:31 -0800 Subject: [PATCH 19/43] use array empty --- .../LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs | 3 ++- src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamReader.cs | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs index 6c89c6afc2e..6b60f1ba925 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs @@ -1,6 +1,7 @@ // 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. +using System; using System.Collections.Generic; using System.Text; using System.Text.Json; @@ -34,7 +35,7 @@ private IList ReadPackageDependencyList(ref Utf8JsonStreamRea { if (reader.TokenType != JsonTokenType.StartObject) { - return new List(0); + return Array.Empty(); } var packageDependencies = new List(); diff --git a/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamReader.cs b/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamReader.cs index 88bb1d7a8ba..6cdb5dc60db 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamReader.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamReader.cs @@ -109,7 +109,7 @@ internal IList ReadObjectAsList(IUtf8JsonStreamReaderConverter streamRe { if (TokenType != JsonTokenType.StartObject) { - return new List(0); + return Array.Empty(); } //We use JsonObjects for the arrays so we advance to the first property in the object which is the name/ver of the first library @@ -117,7 +117,7 @@ internal IList ReadObjectAsList(IUtf8JsonStreamReaderConverter streamRe if (TokenType == JsonTokenType.EndObject) { - return new List(0); + return Array.Empty(); } var listObjects = new List(); From 79e2b718d228c63421a5b5e3bf7bdfb359d16589 Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Thu, 4 Jan 2024 13:42:06 -0800 Subject: [PATCH 20/43] move public method up --- ...sonStreamLockFileTargetLibraryConverter.cs | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs index 6b60f1ba925..024ac935075 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs @@ -31,26 +31,6 @@ internal class Utf8JsonStreamLockFileTargetLibraryConverter : IUtf8JsonStreamRea private static readonly byte[] EmbedPropertyName = Encoding.UTF8.GetBytes("embed"); private static readonly byte[] FrameworkReferencesPropertyName = Encoding.UTF8.GetBytes("frameworkReferences"); - private IList ReadPackageDependencyList(ref Utf8JsonStreamReader reader) - { - if (reader.TokenType != JsonTokenType.StartObject) - { - return Array.Empty(); - } - - var packageDependencies = new List(); - while (reader.Read() && reader.TokenType == JsonTokenType.PropertyName) - { - string propertyName = reader.GetString(); - string versionString = reader.ReadNextTokenAsString(); - - packageDependencies.Add(new PackageDependency( - propertyName, - versionString == null ? null : VersionRange.Parse(versionString))); - } - return packageDependencies; - } - public LockFileTargetLibrary Read(ref Utf8JsonStreamReader reader) { if (reader.TokenType != JsonTokenType.PropertyName) @@ -200,5 +180,25 @@ public LockFileTargetLibrary Read(ref Utf8JsonStreamReader reader) lockFileTargetLibrary.Freeze(); return lockFileTargetLibrary; } + + private IList ReadPackageDependencyList(ref Utf8JsonStreamReader reader) + { + if (reader.TokenType != JsonTokenType.StartObject) + { + return Array.Empty(); + } + + var packageDependencies = new List(); + while (reader.Read() && reader.TokenType == JsonTokenType.PropertyName) + { + string propertyName = reader.GetString(); + string versionString = reader.ReadNextTokenAsString(); + + packageDependencies.Add(new PackageDependency( + propertyName, + versionString == null ? null : VersionRange.Parse(versionString))); + } + return packageDependencies; + } } } From ccd6fe104841db1844cbac0c9d171ce37e2178f2 Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Thu, 4 Jan 2024 13:53:08 -0800 Subject: [PATCH 21/43] remove uneeded string list --- .../LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs index 024ac935075..e5dab3eeff7 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs @@ -167,7 +167,7 @@ public LockFileTargetLibrary Read(ref Utf8JsonStreamReader reader) else if (reader.ValueTextEquals(FrameworkReferencesPropertyName)) { reader.Read(); - if (reader.ReadStringArrayAsIList(new List()) is { Count: not 0 } frameworkReferences) + if (reader.ReadStringArrayAsIList() is { Count: not 0 } frameworkReferences) { lockFileTargetLibrary.FrameworkReferences = frameworkReferences; } From 8d719c692c83c0c00645031a3403f0c1f75dd99e Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Thu, 4 Jan 2024 13:55:13 -0800 Subject: [PATCH 22/43] use false string --- src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.cs b/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.cs index e5e4284020c..f2444e3fca1 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.cs @@ -78,7 +78,7 @@ internal static PackageSpec GetPackageSpec(JsonTextReader jsonReader, string pac internal static PackageSpec GetPackageSpec(Stream stream, string name, string packageSpecPath, string snapshotValue, IEnvironmentVariableReader environmentVariableReader) { var useNj = environmentVariableReader.GetEnvironmentVariable("NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"); - if (string.IsNullOrEmpty(useNj) || useNj.Equals("false", StringComparison.OrdinalIgnoreCase)) + if (string.IsNullOrEmpty(useNj) || useNj.Equals(bool.FalseString, StringComparison.OrdinalIgnoreCase)) { return GetPackageSpecUtf8JsonStreamReader(stream, name, packageSpecPath, snapshotValue); } From 212b7bd273669561c04f69121b8b7927244a219e Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Thu, 4 Jan 2024 14:05:41 -0800 Subject: [PATCH 23/43] add is final block to test --- .../NuGet.ProjectModel.Test/Utf8JsonStreamReaderTests.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/Utf8JsonStreamReaderTests.cs b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/Utf8JsonStreamReaderTests.cs index 1f76c427607..b4482c3dc9d 100644 --- a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/Utf8JsonStreamReaderTests.cs +++ b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/Utf8JsonStreamReaderTests.cs @@ -179,6 +179,7 @@ public void Read_WhenReadingWithoutOverflow_Read() using (var stream = new MemoryStream(json)) using (var reader = new Utf8JsonStreamReader(stream)) { + Assert.True(reader.IsFinalBlock); Assert.Equal(JsonTokenType.StartObject, reader.TokenType); reader.Read(); Assert.Equal(JsonTokenType.PropertyName, reader.TokenType); From b5a82d748a8a0bd31469671986189bbba61fb843 Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Thu, 4 Jan 2024 14:07:37 -0800 Subject: [PATCH 24/43] rename test --- .../NuGet.ProjectModel.Test/Utf8JsonStreamReaderTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/Utf8JsonStreamReaderTests.cs b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/Utf8JsonStreamReaderTests.cs index b4482c3dc9d..74753c80cf1 100644 --- a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/Utf8JsonStreamReaderTests.cs +++ b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/Utf8JsonStreamReaderTests.cs @@ -234,7 +234,7 @@ public void Read_WhenReadingWithLargeToken_ResizeBuffer() } [Fact] - public void Read_WhenReadingWithLargeTokenReadPastFinal() + public void Read_WithLargeToken_WhenReadPastFinal_ReadReturnsFalse() { var json = Encoding.UTF8.GetBytes("{\"largeToken\":\"abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz\",\"smallToken\":\"abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz\"}"); var mock = SetupMockArrayBuffer(); From 82363eed187d591f6c78c7fddfd672ae2020b9d9 Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Thu, 4 Jan 2024 14:33:40 -0800 Subject: [PATCH 25/43] style --- src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamReader.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamReader.cs b/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamReader.cs index 6cdb5dc60db..7e6d403f2a3 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamReader.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamReader.cs @@ -171,7 +171,7 @@ internal IList ReadStringArrayAsIList(IList strings = null) { string value = _reader.ReadTokenAsString(); - strings = strings ?? new List(); + strings ??= new List(); strings.Add(value); } From 0cc4e51e080a0d391b9262eea8b54039e1817800 Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Thu, 4 Jan 2024 14:44:51 -0800 Subject: [PATCH 26/43] style --- src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamReader.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamReader.cs b/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamReader.cs index 7e6d403f2a3..341e4efd82c 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamReader.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamReader.cs @@ -243,7 +243,7 @@ internal IReadOnlyList ReadStringArrayAsReadOnlyListFromArrayStart() { string value = _reader.ReadTokenAsString(); - strings = strings ?? new List(); + strings ??= new List(); strings.Add(value); } From c525dc833af6ec317344e84c64bea6b0e9f0de34 Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Thu, 4 Jan 2024 14:52:28 -0800 Subject: [PATCH 27/43] add tests for validating empty streams on creationg of utf8jsonstreamreader --- .../Utf8JsonStreamReaderTests.cs | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/Utf8JsonStreamReaderTests.cs b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/Utf8JsonStreamReaderTests.cs index 74753c80cf1..a94b0a4fedf 100644 --- a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/Utf8JsonStreamReaderTests.cs +++ b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/Utf8JsonStreamReaderTests.cs @@ -44,6 +44,33 @@ public void Utf8JsonStreamReaderCtr_WhenBufferToSmall_Throws() }); } + + [Fact] + public void Utf8JsonStreamReaderCtr_WhenEmptyJson_Throws() + { + Assert.ThrowsAny(() => + { + var json = ""; + + using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(json))) + using (var reader = new Utf8JsonStreamReader(stream)) + { + } + }); + } + + [Fact] + public void Utf8JsonStreamReaderCtr_WhenEmptySream_Throws() + { + Assert.ThrowsAny(() => + { + using (var stream = new MemoryStream(Array.Empty())) + using (var reader = new Utf8JsonStreamReader(stream)) + { + } + }); + } + [Fact] public void Utf8JsonStreamReaderCtr_WhenStreamStartsWithUtf8Bom_SkipThem() { From 4e5112a819d8973e440215ab1a0510d680728f65 Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Thu, 4 Jan 2024 17:19:22 -0800 Subject: [PATCH 28/43] Added test and implemented string split in two --- ...nPackageSpecReader.Utf8JsonStreamReader.cs | 7 ++- .../JsonPackageSpecReader.cs | 1 + .../Utf8JsonStreamLockFileLibraryConverter.cs | 9 ++- .../Utf8JsonStreamLockFileTargetConverter.cs | 11 +--- .../NuGet.ProjectModel/StringExtensions.cs | 34 +++++++++++ .../JsonPackageSpecReaderTests.cs | 16 ++++++ .../LazyStringSplitTests.cs | 57 +++++++++++++++++++ .../StringExtensionTests.cs | 31 ++++++++++ 8 files changed, 152 insertions(+), 14 deletions(-) create mode 100644 src/NuGet.Core/NuGet.ProjectModel/StringExtensions.cs create mode 100644 test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LazyStringSplitTests.cs create mode 100644 test/NuGet.Core.Tests/NuGet.ProjectModel.Test/StringExtensionTests.cs diff --git a/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.Utf8JsonStreamReader.cs b/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.Utf8JsonStreamReader.cs index efb5c140100..5f59fde6c4d 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.Utf8JsonStreamReader.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.Utf8JsonStreamReader.cs @@ -721,10 +721,15 @@ private static void ReadDownloadDependencies( packageSpecPath); } - string[] versions = versionValue.Split(VersionSeparators, StringSplitOptions.RemoveEmptyEntries); + var versions = new LazyStringSplit(versionValue, VersionSeparator); foreach (string singleVersionValue in versions) { + if (string.IsNullOrEmpty(singleVersionValue)) + { + continue; + } + try { VersionRange version = VersionRange.Parse(singleVersionValue); diff --git a/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.cs b/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.cs index f2444e3fca1..d76cda0c1a4 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.cs @@ -23,6 +23,7 @@ public static partial class JsonPackageSpecReader { private static readonly char[] DelimitedStringSeparators = { ' ', ',' }; private static readonly char[] VersionSeparators = new[] { ';' }; + private const char VersionSeparator = ';'; public static readonly string RestoreOptions = "restore"; public static readonly string RestoreSettings = "restoreSettings"; public static readonly string HideWarningsAndErrors = "hideWarningsAndErrors"; diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileLibraryConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileLibraryConverter.cs index 99bae073fe8..96e146202f4 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileLibraryConverter.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileLibraryConverter.cs @@ -19,7 +19,6 @@ internal class Utf8JsonStreamLockFileLibraryConverter : IUtf8JsonStreamReaderCon private static readonly byte[] ServicablePropertyName = Encoding.UTF8.GetBytes("servicable"); private static readonly byte[] HasToolsPropertyName = Encoding.UTF8.GetBytes("hasTools"); private static readonly byte[] FilesPropertyName = Encoding.UTF8.GetBytes("files"); - private static readonly char[] Separators = new[] { '/' }; public LockFileLibrary Read(ref Utf8JsonStreamReader reader) { @@ -32,11 +31,11 @@ public LockFileLibrary Read(ref Utf8JsonStreamReader reader) var lockFileLibrary = new LockFileLibrary(); //We want to read the property name right away var propertyName = reader.GetString(); - var parts = propertyName.Split(Separators, 2); - lockFileLibrary.Name = parts[0]; - if (parts.Length == 2) + var (name, version) = propertyName.SplitInTwo(LockFile.DirectorySeparatorChar); + lockFileLibrary.Name = name; + if (!string.IsNullOrWhiteSpace(version)) { - lockFileLibrary.Version = NuGetVersion.Parse(parts[1]); + lockFileLibrary.Version = NuGetVersion.Parse(version); } reader.Read(); diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetConverter.cs index a55155c8bcb..dcf6c05164f 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetConverter.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetConverter.cs @@ -21,15 +21,10 @@ public LockFileTarget Read(ref Utf8JsonStreamReader reader) var lockFileTarget = new LockFileTarget(); //We want to read the property name right away var propertyName = reader.GetString(); - var lazySplitter = new LazyStringSplit(propertyName, LockFile.DirectorySeparatorChar); - var targetFramework = lazySplitter.FirstOrDefault(); - var runtetimeIdentifier = lazySplitter.FirstOrDefault(); - var leftover = lazySplitter.FirstOrDefault(); + var (targetFramework, runTimeFramework) = propertyName.SplitInTwo(LockFile.DirectorySeparatorChar); + lockFileTarget.TargetFramework = NuGetFramework.Parse(targetFramework); - if (!string.IsNullOrEmpty(runtetimeIdentifier) && string.IsNullOrEmpty(leftover)) - { - lockFileTarget.RuntimeIdentifier = runtetimeIdentifier; - } + lockFileTarget.RuntimeIdentifier = runTimeFramework; reader.Read(); lockFileTarget.Libraries = reader.ReadObjectAsList(Utf8JsonReaderExtensions.LockFileTargetLibraryConverter); diff --git a/src/NuGet.Core/NuGet.ProjectModel/StringExtensions.cs b/src/NuGet.Core/NuGet.ProjectModel/StringExtensions.cs new file mode 100644 index 00000000000..e8caf1db691 --- /dev/null +++ b/src/NuGet.Core/NuGet.ProjectModel/StringExtensions.cs @@ -0,0 +1,34 @@ +// 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; + +namespace NuGet.ProjectModel +{ + internal static class StringExtensions + { + internal static (string firstPart, string? secondPart) SplitInTwo(this string s, char separator) + { + if (string.IsNullOrEmpty(s)) + { + return (s, null); + } +#if NETCORE5_0 + var index = s.IndexOf(separator, StringComparison.OrdinalIgnoreCase); +#endif +#if NETFRAMEWORK || NETSTANDARD + var index = s.IndexOf(separator.ToString(), StringComparison.OrdinalIgnoreCase); +#endif + if (index == -1) + { + return (s, null); + } + + return (s.Substring(0, index), + index >= s.Length - 1 ? + null : + s.Substring(index + 1)); + } + } +} diff --git a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/JsonPackageSpecReaderTests.cs b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/JsonPackageSpecReaderTests.cs index cda00225cbd..836173fa776 100644 --- a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/JsonPackageSpecReaderTests.cs +++ b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/JsonPackageSpecReaderTests.cs @@ -2297,6 +2297,22 @@ public void GetPackageSpec_WhenFrameworksDownloadDependenciesValueIsValid_Return Assert.Equal(expectedResult, framework.DownloadDependencies.Single()); } + [Theory] + [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] + public void GetPackageSpec_WhenFrameworksDownloadDependenciesValueIsValidWithMultipleVersions_ReturnsDownloadDependencies(IEnvironmentVariableReader environmentVariableReader) + { + var json = $"{{\"frameworks\":{{\"a\":{{\"downloadDependencies\":[{{\"name\":\"b\",\"version\":\"1.2.3;;2.0.0\"}}]}}}}}}"; + + TargetFrameworkInformation framework = GetFramework(json, environmentVariableReader); + + Assert.Equal(2, framework.DownloadDependencies.Count()); + Assert.Equal("b", framework.DownloadDependencies[0].Name); + Assert.Equal(new VersionRange(new NuGetVersion("1.2.3")), framework.DownloadDependencies[0].VersionRange); + Assert.Equal("b", framework.DownloadDependencies[1].Name); + Assert.Equal(new VersionRange(new NuGetVersion("2.0.0")), framework.DownloadDependencies[1].VersionRange); + + } + [Theory] [MemberData(nameof(LockFileParsingEnvironmentVariable.TestEnvironmentVariableReader), MemberType = typeof(LockFileParsingEnvironmentVariable))] public void GetPackageSpec_WhenFrameworksDownloadDependenciesValueHasDuplicates_PrefersFirstByName(IEnvironmentVariableReader environmentVariableReader) diff --git a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LazyStringSplitTests.cs b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LazyStringSplitTests.cs new file mode 100644 index 00000000000..e314c4f7226 --- /dev/null +++ b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LazyStringSplitTests.cs @@ -0,0 +1,57 @@ +// Licensed to the .NET Foundation under one or more agreements. The .NET Foundation licenses this file to you under the MIT license. See the LICENSE.md file in the project root for more information. + +using System.Collections.Generic; +using System; +using Xunit; + +namespace NuGet.ProjectModel.Test +{ + public sealed class LazyStringSplitTests + { + [Theory] + [InlineData("a;b;c", ';', new[] { "a", "b", "c" })] + [InlineData("a_b_c", '_', new[] { "a", "b", "c" })] + [InlineData("aa;bb;cc", ';', new[] { "aa", "bb", "cc" })] + [InlineData("aaa;bbb;ccc", ';', new[] { "aaa", "bbb", "ccc" })] + [InlineData(";a;b;c", ';', new[] { "a", "b", "c" })] + [InlineData("a;b;c;", ';', new[] { "a", "b", "c" })] + [InlineData(";a;b;c;", ';', new[] { "a", "b", "c" })] + [InlineData(";;a;;b;;c;;", ';', new[] { "a", "b", "c" })] + [InlineData("", ';', new string[0])] + [InlineData(";", ';', new string[0])] + [InlineData(";;", ';', new string[0])] + [InlineData(";;;", ';', new string[0])] + [InlineData(";;;a", ';', new[] { "a" })] + [InlineData("a;;;", ';', new[] { "a" })] + [InlineData(";a;;", ';', new[] { "a" })] + [InlineData(";;a;", ';', new[] { "a" })] + [InlineData("a", ';', new[] { "a" })] + [InlineData("aa", ';', new[] { "aa" })] + public void ProducesCorrectEnumeration(string input, char delimiter, string[] expected) + { + // This boxes + IEnumerable actual = new LazyStringSplit(input, delimiter); + + Assert.Equal(expected, actual); + + // Non boxing foreach + var list = new List(); + + foreach (var s in new LazyStringSplit(input, delimiter)) + { + list.Add(s); + } + + Assert.Equal(expected, list); + + // Equivalence with string.Split + Assert.Equal(expected, input.Split(new[] { delimiter }, StringSplitOptions.RemoveEmptyEntries)); + } + + [Fact] + public void Constructor_WithNullInput_Throws() + { + Assert.Throws(() => new LazyStringSplit(null!, ' ')); + } + } +} diff --git a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/StringExtensionTests.cs b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/StringExtensionTests.cs new file mode 100644 index 00000000000..ffcbeb2014f --- /dev/null +++ b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/StringExtensionTests.cs @@ -0,0 +1,31 @@ +// 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. + +using Xunit; + +namespace NuGet.ProjectModel.Test +{ + public class StringExtensionTests + { + [Theory] + [InlineData(null)] + [InlineData("")] + [InlineData(" ")] + public void SplitInTwo_WithNullOrEmptyString_ReturnStringAndNull(string s) + { + var result = s.SplitInTwo('/'); + Assert.Equal(s, result.firstPart); + Assert.Null(result.secondPart); + } + + [Theory] + [InlineData("part1/part2", "part1", "part2")] + [InlineData("part1/part2/NotPart3", "part1", "part2/NotPart3")] + public void SplitInTwo_WithSeperator_ReturnStringInTwoParts(string s, string expectedFirstPart, string expectedSecondPart) + { + var results = s.SplitInTwo('/'); + Assert.Equal(expectedFirstPart, results.firstPart); + Assert.Equal(expectedSecondPart, results.secondPart); + } + } +} From 23989801c0bb964f09a788455e2892c3689b9d5e Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Mon, 8 Jan 2024 11:28:07 -0800 Subject: [PATCH 29/43] fix validation for lazy string split --- src/NuGet.Core/NuGet.ProjectModel/LazyStringSplit.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NuGet.Core/NuGet.ProjectModel/LazyStringSplit.cs b/src/NuGet.Core/NuGet.ProjectModel/LazyStringSplit.cs index d3d4c5e6e9d..6ccb0f3fc9c 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LazyStringSplit.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LazyStringSplit.cs @@ -28,7 +28,7 @@ namespace NuGet.ProjectModel public LazyStringSplit(string input, char delimiter) { - if (string.IsNullOrEmpty(input)) + if (input is null) { throw new ArgumentNullException(nameof(input)); } From 16939136c5722cc91435917e4fd6da2029a1c07d Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Mon, 8 Jan 2024 11:58:57 -0800 Subject: [PATCH 30/43] reduce methods in LikeFileFormat --- .../LockFile/LockFileFormat.cs | 17 ------ .../LockFileFormatTests.cs | 61 +++++++++++-------- .../NuGet.ProjectModel.Test/LockFileTests.cs | 15 ++++- 3 files changed, 47 insertions(+), 46 deletions(-) diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/LockFileFormat.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/LockFileFormat.cs index b5cff76498c..6a3bfd2e47b 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LockFile/LockFileFormat.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/LockFileFormat.cs @@ -91,23 +91,6 @@ public LockFile Read(Stream stream, ILogger log, string path) return Read(stream, log, path, EnvironmentVariableWrapper.Instance); } - internal LockFile Read(string filePath, IEnvironmentVariableReader environmentVariableReader) - { - using (var stream = File.OpenRead(filePath)) - { - return Read(stream, NullLogger.Instance, filePath, environmentVariableReader); - } - } - - internal LockFile Parse(string lockFileContent, string path, IEnvironmentVariableReader environmentVariableReader) - { - byte[] byteArray = Encoding.UTF8.GetBytes(lockFileContent); - using (var stream = new MemoryStream(byteArray)) - { - return Read(stream, NullLogger.Instance, path, environmentVariableReader); - } - } - internal LockFile Read(Stream stream, ILogger log, string path, IEnvironmentVariableReader environmentVariableReader) { var useNj = environmentVariableReader.GetEnvironmentVariable("NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"); diff --git a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileFormatTests.cs b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileFormatTests.cs index 6a03d421f24..849b05a33c8 100644 --- a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileFormatTests.cs +++ b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileFormatTests.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Text; using Newtonsoft.Json.Linq; using NuGet.Common; using NuGet.Frameworks; @@ -151,9 +152,9 @@ public void LockFileFormat_LockedPropertyIsIgnored(IEnvironmentVariableReader en // Act #pragma warning disable CS0612 // Type or member is obsolete - var lockFileTrue = lockFileFormat.Parse(lockFileContentTrue, "In Memory", environmentVariableReader); - var lockFileFalse = lockFileFormat.Parse(lockFileContentFalse, "In Memory", environmentVariableReader); - var lockFileMissing = lockFileFormat.Parse(lockFileContentMissing, "In Memory", environmentVariableReader); + var lockFileTrue = Parse(lockFileContentTrue, "In Memory", environmentVariableReader); + var lockFileFalse = Parse(lockFileContentFalse, "In Memory", environmentVariableReader); + var lockFileMissing = Parse(lockFileContentMissing, "In Memory", environmentVariableReader); #pragma warning restore CS0612 // Type or member is obsolete var lockFileTrueString = lockFileFormat.Render(lockFileTrue); @@ -211,10 +212,7 @@ public void LockFileFormat_ReadsLockFileWithNoTools(IEnvironmentVariableReader e "".NETPlatform,Version=v5.0"": [] } }"; - var lockFileFormat = new LockFileFormat(); -#pragma warning disable CS0612 // Type or member is obsolete - var lockFile = lockFileFormat.Parse(lockFileContent, "In Memory", environmentVariableReader); -#pragma warning restore CS0612 // Type or member is obsolete + var lockFile = Parse(lockFileContent, "In Memory", environmentVariableReader); Assert.Equal(1, lockFile.Version); @@ -1385,8 +1383,7 @@ public void LockFileFormat_ReadsMinimalErrorMessage(IEnvironmentVariableReader e File.WriteAllText(lockFile, lockFileContent); // Act - var reader = new LockFileFormat(); - lockFileObj = reader.Read(lockFile, environmentVariableReader); + lockFileObj = Read(lockFile, environmentVariableReader); logMessage = lockFileObj?.LogMessages?.First(); } @@ -1469,8 +1466,7 @@ public void LockFileFormat_SkipsInvalidErrorMessage(IEnvironmentVariableReader e File.WriteAllText(lockFile, lockFileContent); // Act - var reader = new LockFileFormat(); - lockFileObj = reader.Read(lockFile, environmentVariableReader); + lockFileObj = Read(lockFile, environmentVariableReader); logMessage = lockFileObj?.LogMessages?.First(); } @@ -1552,8 +1548,7 @@ public void LockFileFormat_ReadsFullErrorMessage(IEnvironmentVariableReader envi File.WriteAllText(lockFile, lockFileContent); // Act - var reader = new LockFileFormat(); - lockFileObj = reader.Read(lockFile, environmentVariableReader); + lockFileObj = Read(lockFile, environmentVariableReader); logMessage = lockFileObj?.LogMessages?.First(); } @@ -1723,8 +1718,7 @@ public void LockFileFormat_ReadsWarningMessage(IEnvironmentVariableReader enviro File.WriteAllText(lockFile, lockFileContent); // Act - var reader = new LockFileFormat(); - lockFileObj = reader.Read(lockFile, environmentVariableReader); + lockFileObj = Read(lockFile, environmentVariableReader); logMessage = lockFileObj?.LogMessages?.First(); } @@ -1807,8 +1801,7 @@ public void LockFileFormat_ReadsWarningMessageWithoutWarningLevel(IEnvironmentVa File.WriteAllText(lockFile, lockFileContent); // Act - var reader = new LockFileFormat(); - lockFileObj = reader.Read(lockFile, environmentVariableReader); + lockFileObj = Read(lockFile, environmentVariableReader); logMessage = lockFileObj?.LogMessages?.First(); } @@ -1903,8 +1896,7 @@ public void LockFileFormat_ReadsMultipleMessages(IEnvironmentVariableReader envi File.WriteAllText(lockFile, lockFileContent); // Act - var reader = new LockFileFormat(); - lockFileObj = reader.Read(lockFile, environmentVariableReader); + lockFileObj = Read(lockFile, environmentVariableReader); } @@ -1978,8 +1970,7 @@ public void LockFileFormat_ReadsLogMessageWithSameFilePathAndProjectPath(IEnviro File.WriteAllText(lockFile, lockFileContent); // Act - var reader = new LockFileFormat(); - lockFileObj = reader.Read(lockFile, environmentVariableReader); + lockFileObj = Read(lockFile, environmentVariableReader); logMessage = lockFileObj?.LogMessages?.First(); } @@ -2057,8 +2048,7 @@ public void LockFileFormat_ReadsLogMessageWithNoFilePath(IEnvironmentVariableRea File.WriteAllText(lockFile, lockFileContent); // Act - var reader = new LockFileFormat(); - lockFileObj = reader.Read(lockFile, environmentVariableReader); + lockFileObj = Read(lockFile, environmentVariableReader); logMessage = lockFileObj?.LogMessages?.First(); } @@ -2117,8 +2107,7 @@ public void LockFileFormat_ReadsLockFileWithTools(IEnvironmentVariableReader env "".NETPlatform,Version=v5.0"": [] } }"; - var lockFileFormat = new LockFileFormat(); - var lockFile = lockFileFormat.Parse(lockFileContent, "In Memory", environmentVariableReader); + var lockFile = Parse(lockFileContent, "In Memory", environmentVariableReader); Assert.Equal(1, lockFile.Version); @@ -2194,8 +2183,7 @@ public void LockFileFormat_ReadsLockFileWithEmbedAssemblies(IEnvironmentVariable } }"; - var lockFileFormat = new LockFileFormat(); - var lockFile = lockFileFormat.Parse(lockFileContent, "In Memory", environmentVariableReader); + var lockFile = Parse(lockFileContent, "In Memory", environmentVariableReader); Assert.Equal(1, lockFile.Version); @@ -2395,5 +2383,24 @@ public void LockFileFormat_WritesCentralTransitiveDependencyGroups() // Assert Assert.Equal(expected.ToString(), output.ToString()); } + + private LockFile Read(string filePath, IEnvironmentVariableReader environmentVariableReader) + { + var reader = new LockFileFormat(); + using (var stream = File.OpenRead(filePath)) + { + return reader.Read(stream, NullLogger.Instance, filePath, environmentVariableReader); + } + } + + private LockFile Parse(string lockFileContent, string path, IEnvironmentVariableReader environmentVariableReader) + { + var reader = new LockFileFormat(); + byte[] byteArray = Encoding.UTF8.GetBytes(lockFileContent); + using (var stream = new MemoryStream(byteArray)) + { + return reader.Read(stream, NullLogger.Instance, path, environmentVariableReader); + } + } } } diff --git a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileTests.cs b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileTests.cs index f2e770c7fef..2585f6a0398 100644 --- a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileTests.cs +++ b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileTests.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Text; using FluentAssertions; using NuGet.Common; using NuGet.Frameworks; @@ -860,7 +861,7 @@ public void LockFile_GetTarget_WithNuGetFramework_ReturnsCorrectLockFileTarget(I { // Arrange var expectedJson = ResourceTestUtility.GetResource("NuGet.ProjectModel.Test.compiler.resources.sample.assets.json", typeof(LockFileTests)); - var lockFile = new LockFileFormat().Parse(expectedJson, Path.GetTempPath(), environmentVariableReader); + var lockFile = Parse(expectedJson, Path.GetTempPath(), environmentVariableReader); NuGetFramework nuGetFramework = NuGetFramework.ParseComponents(".NETCoreApp,Version=v5.0", "Windows,Version=7.0"); // Act @@ -876,7 +877,7 @@ public void LockFile_GetTarget_WithAlias_ReturnsCorrectLockFileTarget(IEnvironme { // Arrange var expectedJson = ResourceTestUtility.GetResource("NuGet.ProjectModel.Test.compiler.resources.sample.assets.json", typeof(LockFileTests)); - var lockFile = new LockFileFormat().Parse(expectedJson, Path.GetTempPath(), environmentVariableReader); + var lockFile = Parse(expectedJson, Path.GetTempPath(), environmentVariableReader); NuGetFramework nuGetFramework = NuGetFramework.ParseComponents(".NETCoreApp,Version=v5.0", "Windows,Version=7.0"); // Act @@ -885,5 +886,15 @@ public void LockFile_GetTarget_WithAlias_ReturnsCorrectLockFileTarget(IEnvironme // Assert target.TargetFramework.Should().Be(nuGetFramework); } + + private LockFile Parse(string lockFileContent, string path, IEnvironmentVariableReader environmentVariableReader) + { + var reader = new LockFileFormat(); + byte[] byteArray = Encoding.UTF8.GetBytes(lockFileContent); + using (var stream = new MemoryStream(byteArray)) + { + return reader.Read(stream, NullLogger.Instance, path, environmentVariableReader); + } + } } } From e0ef66d569ba27b1bbf3dc194426d3fba62d9ed8 Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Mon, 8 Jan 2024 12:28:21 -0800 Subject: [PATCH 31/43] set the list values with the results directly --- ...sonStreamLockFileTargetLibraryConverter.cs | 60 ++++--------------- 1 file changed, 12 insertions(+), 48 deletions(-) diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs index e5dab3eeff7..6d836a60abf 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs @@ -74,10 +74,7 @@ public LockFileTargetLibrary Read(ref Utf8JsonStreamReader reader) else if (reader.ValueTextEquals(DependenciesPropertyName)) { reader.Read(); - if (ReadPackageDependencyList(ref reader) is { Count: not 0 } packageDependencies) - { - lockFileTargetLibrary.Dependencies = packageDependencies; - } + lockFileTargetLibrary.Dependencies = ReadPackageDependencyList(ref reader); } else if (reader.ValueTextEquals(FrameworkAssembliesPropertyName)) { @@ -87,90 +84,57 @@ public LockFileTargetLibrary Read(ref Utf8JsonStreamReader reader) else if (reader.ValueTextEquals(RuntimePropertyName)) { reader.Read(); - if (reader.ReadObjectAsList(Utf8JsonReaderExtensions.LockFileItemConverter) is { Count: not 0 } runtimeAssemblies) - { - lockFileTargetLibrary.RuntimeAssemblies = runtimeAssemblies; - } + lockFileTargetLibrary.RuntimeAssemblies = reader.ReadObjectAsList(Utf8JsonReaderExtensions.LockFileItemConverter); } else if (reader.ValueTextEquals(CompilePropertyName)) { reader.Read(); - if (reader.ReadObjectAsList(Utf8JsonReaderExtensions.LockFileItemConverter) is { Count: not 0 } compileTimeAssemblies) - { - lockFileTargetLibrary.CompileTimeAssemblies = compileTimeAssemblies; - } + lockFileTargetLibrary.CompileTimeAssemblies = reader.ReadObjectAsList(Utf8JsonReaderExtensions.LockFileItemConverter); } else if (reader.ValueTextEquals(ResourcePropertyName)) { reader.Read(); - if (reader.ReadObjectAsList(Utf8JsonReaderExtensions.LockFileItemConverter) is { Count: not 0 } resourceAssemblies) - { - lockFileTargetLibrary.ResourceAssemblies = resourceAssemblies; - } + lockFileTargetLibrary.ResourceAssemblies = reader.ReadObjectAsList(Utf8JsonReaderExtensions.LockFileItemConverter); } else if (reader.ValueTextEquals(NativePropertyName)) { reader.Read(); - if (reader.ReadObjectAsList(Utf8JsonReaderExtensions.LockFileItemConverter) is { Count: not 0 } nativeLibraries) - { - lockFileTargetLibrary.NativeLibraries = nativeLibraries; - } + lockFileTargetLibrary.NativeLibraries = reader.ReadObjectAsList(Utf8JsonReaderExtensions.LockFileItemConverter); } else if (reader.ValueTextEquals(BuildPropertyName)) { reader.Read(); - if (reader.ReadObjectAsList(Utf8JsonReaderExtensions.LockFileItemConverter) is { Count: not 0 } build) - { - lockFileTargetLibrary.Build = build; - } + lockFileTargetLibrary.Build = reader.ReadObjectAsList(Utf8JsonReaderExtensions.LockFileItemConverter); } else if (reader.ValueTextEquals(BuildMultiTargetingPropertyName)) { reader.Read(); - if (reader.ReadObjectAsList(Utf8JsonReaderExtensions.LockFileItemConverter) is { Count: not 0 } buildMultiTargeting) - { - lockFileTargetLibrary.BuildMultiTargeting = buildMultiTargeting; - } + lockFileTargetLibrary.BuildMultiTargeting = reader.ReadObjectAsList(Utf8JsonReaderExtensions.LockFileItemConverter); } else if (reader.ValueTextEquals(ContentFilesPropertyName)) { reader.Read(); - if (reader.ReadObjectAsList(Utf8JsonReaderExtensions.LockFileContentFileConverter) is { Count: not 0 } contentFiles) - { - lockFileTargetLibrary.ContentFiles = contentFiles; - } + lockFileTargetLibrary.ContentFiles = reader.ReadObjectAsList(Utf8JsonReaderExtensions.LockFileContentFileConverter); } else if (reader.ValueTextEquals(RuntimeTargetsPropertyName)) { reader.Read(); - if (reader.ReadObjectAsList(Utf8JsonReaderExtensions.LockFileRuntimeTargetConverter) is { Count: not 0 } runtimeTargets) - { - lockFileTargetLibrary.RuntimeTargets = runtimeTargets; - } + lockFileTargetLibrary.RuntimeTargets = reader.ReadObjectAsList(Utf8JsonReaderExtensions.LockFileRuntimeTargetConverter); } else if (reader.ValueTextEquals(ToolsPropertyName)) { reader.Read(); - if (reader.ReadObjectAsList(Utf8JsonReaderExtensions.LockFileItemConverter) is { Count: not 0 } toolsAssemblies) - { - lockFileTargetLibrary.ToolsAssemblies = toolsAssemblies; - } + lockFileTargetLibrary.ToolsAssemblies = reader.ReadObjectAsList(Utf8JsonReaderExtensions.LockFileItemConverter); } else if (reader.ValueTextEquals(EmbedPropertyName)) { reader.Read(); - if (reader.ReadObjectAsList(Utf8JsonReaderExtensions.LockFileItemConverter) is { Count: not 0 } embedAssemblies) - { - lockFileTargetLibrary.EmbedAssemblies = embedAssemblies; - } + lockFileTargetLibrary.EmbedAssemblies = reader.ReadObjectAsList(Utf8JsonReaderExtensions.LockFileItemConverter); } else if (reader.ValueTextEquals(FrameworkReferencesPropertyName)) { reader.Read(); - if (reader.ReadStringArrayAsIList() is { Count: not 0 } frameworkReferences) - { - lockFileTargetLibrary.FrameworkReferences = frameworkReferences; - } + lockFileTargetLibrary.FrameworkReferences = reader.ReadStringArrayAsIList(); } else { From b4d0169dbe1edbf2301b1655178e36ef2171caf7 Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Mon, 8 Jan 2024 15:20:26 -0800 Subject: [PATCH 32/43] store environment variable to avoid calling GetEnvironmentVariable several times. --- .../JsonPackageSpecReader.cs | 5 ++--- .../NuGet.ProjectModel/JsonUtility.cs | 20 +++++++++++++++++++ .../LockFile/LockFileFormat.cs | 5 ++--- .../DependencyTargetTests.cs | 2 +- .../JsonPackageSpecReaderTests.cs | 2 +- .../LockFileFormatTests.cs | 6 +++--- .../NuGet.ProjectModel.Test/LockFileTests.cs | 2 +- 7 files changed, 30 insertions(+), 12 deletions(-) diff --git a/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.cs b/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.cs index d76cda0c1a4..70074621110 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.cs @@ -76,10 +76,9 @@ internal static PackageSpec GetPackageSpec(JsonTextReader jsonReader, string pac return GetPackageSpec(jsonReader, name: null, packageSpecPath, snapshotValue: null); } - internal static PackageSpec GetPackageSpec(Stream stream, string name, string packageSpecPath, string snapshotValue, IEnvironmentVariableReader environmentVariableReader) + internal static PackageSpec GetPackageSpec(Stream stream, string name, string packageSpecPath, string snapshotValue, IEnvironmentVariableReader environmentVariableReader, bool bypassCache = false) { - var useNj = environmentVariableReader.GetEnvironmentVariable("NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"); - if (string.IsNullOrEmpty(useNj) || useNj.Equals(bool.FalseString, StringComparison.OrdinalIgnoreCase)) + if (!JsonUtility.UseNewstonSoftJsonForParsing(environmentVariableReader, bypassCache)) { return GetPackageSpecUtf8JsonStreamReader(stream, name, packageSpecPath, snapshotValue); } diff --git a/src/NuGet.Core/NuGet.ProjectModel/JsonUtility.cs b/src/NuGet.Core/NuGet.ProjectModel/JsonUtility.cs index 7996bff6da1..657a231c0ec 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/JsonUtility.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/JsonUtility.cs @@ -6,6 +6,7 @@ using System.IO; using Newtonsoft.Json; using Newtonsoft.Json.Linq; +using NuGet.Common; using NuGet.Packaging.Core; using NuGet.Versioning; @@ -13,6 +14,8 @@ namespace NuGet.ProjectModel { internal static class JsonUtility { + internal const string NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING = nameof(NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING); + internal static bool? UseNewtonsoftJson = null; internal static readonly char[] PathSplitChars = new[] { LockFile.DirectorySeparatorChar }; /// @@ -57,6 +60,23 @@ internal static PackageDependency ReadPackageDependency(string property, JToken versionStr == null ? null : VersionRange.Parse(versionStr)); } + internal static bool UseNewstonSoftJsonForParsing(IEnvironmentVariableReader environmentVariableReader, bool bypassCache) + { + if (!UseNewtonsoftJson.HasValue || bypassCache) + { + if (bool.TryParse(environmentVariableReader.GetEnvironmentVariable(NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING), out var useNj)) + { + UseNewtonsoftJson = useNj; + } + else + { + UseNewtonsoftJson = false; + } + } + + return UseNewtonsoftJson.Value; + } + internal static JProperty WritePackageDependencyWithLegacyString(PackageDependency item) { return new JProperty( diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/LockFileFormat.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/LockFileFormat.cs index 6a3bfd2e47b..562d78bee52 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LockFile/LockFileFormat.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/LockFileFormat.cs @@ -91,10 +91,9 @@ public LockFile Read(Stream stream, ILogger log, string path) return Read(stream, log, path, EnvironmentVariableWrapper.Instance); } - internal LockFile Read(Stream stream, ILogger log, string path, IEnvironmentVariableReader environmentVariableReader) + internal LockFile Read(Stream stream, ILogger log, string path, IEnvironmentVariableReader environmentVariableReader, bool bypassCache = false) { - var useNj = environmentVariableReader.GetEnvironmentVariable("NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"); - if (string.IsNullOrEmpty(useNj) || useNj.Equals("false", StringComparison.OrdinalIgnoreCase)) + if (JsonUtility.UseNewstonSoftJsonForParsing(environmentVariableReader, bypassCache)) { return Utf8JsonRead(stream, log, path); } diff --git a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/DependencyTargetTests.cs b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/DependencyTargetTests.cs index 5f6d0b16b52..a23a8f44cf8 100644 --- a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/DependencyTargetTests.cs +++ b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/DependencyTargetTests.cs @@ -290,7 +290,7 @@ public void DependencyTarget_AcceptsWhitespace(IEnvironmentVariableReader enviro private static PackageSpec GetPackageSpec(string json, string name, string packageSpecPath, IEnvironmentVariableReader environmentVariableReader) { using var stream = new MemoryStream(Encoding.UTF8.GetBytes(json)); - return JsonPackageSpecReader.GetPackageSpec(stream, name, packageSpecPath, null, environmentVariableReader); + return JsonPackageSpecReader.GetPackageSpec(stream, name, packageSpecPath, null, environmentVariableReader, true); } } diff --git a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/JsonPackageSpecReaderTests.cs b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/JsonPackageSpecReaderTests.cs index 836173fa776..e710a6d6983 100644 --- a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/JsonPackageSpecReaderTests.cs +++ b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/JsonPackageSpecReaderTests.cs @@ -4045,7 +4045,7 @@ private static PackageSpec GetPackageSpec(string json, IEnvironmentVariableReade private static PackageSpec GetPackageSpec(string json, string name, string packageSpecPath, string snapshotValue, IEnvironmentVariableReader environmentVariableReader) { using var stream = new MemoryStream(Encoding.UTF8.GetBytes(json)); - return JsonPackageSpecReader.GetPackageSpec(stream, name, packageSpecPath, snapshotValue, environmentVariableReader); + return JsonPackageSpecReader.GetPackageSpec(stream, name, packageSpecPath, snapshotValue, environmentVariableReader, true); } private static LibraryDependency GetDependency(string json, IEnvironmentVariableReader environmentVariableReader) diff --git a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileFormatTests.cs b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileFormatTests.cs index 849b05a33c8..67a3b192a42 100644 --- a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileFormatTests.cs +++ b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileFormatTests.cs @@ -1632,7 +1632,7 @@ public void LockFileFormat_SafeRead(IEnvironmentVariableReader environmentVariab // Act var reader = new LockFileFormat(); - lockFileObj = FileUtility.SafeRead(lockFile, (stream, path) => reader.Read(stream, NullLogger.Instance, path, environmentVariableReader)); + lockFileObj = FileUtility.SafeRead(lockFile, (stream, path) => reader.Read(stream, NullLogger.Instance, path, environmentVariableReader, true)); logMessage = lockFileObj?.LogMessages?.First(); } @@ -2389,7 +2389,7 @@ private LockFile Read(string filePath, IEnvironmentVariableReader environmentVar var reader = new LockFileFormat(); using (var stream = File.OpenRead(filePath)) { - return reader.Read(stream, NullLogger.Instance, filePath, environmentVariableReader); + return reader.Read(stream, NullLogger.Instance, filePath, environmentVariableReader, true); } } @@ -2399,7 +2399,7 @@ private LockFile Parse(string lockFileContent, string path, IEnvironmentVariable byte[] byteArray = Encoding.UTF8.GetBytes(lockFileContent); using (var stream = new MemoryStream(byteArray)) { - return reader.Read(stream, NullLogger.Instance, path, environmentVariableReader); + return reader.Read(stream, NullLogger.Instance, path, environmentVariableReader, true); } } } diff --git a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileTests.cs b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileTests.cs index 2585f6a0398..8875d8e0ddd 100644 --- a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileTests.cs +++ b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileTests.cs @@ -893,7 +893,7 @@ private LockFile Parse(string lockFileContent, string path, IEnvironmentVariable byte[] byteArray = Encoding.UTF8.GetBytes(lockFileContent); using (var stream = new MemoryStream(byteArray)) { - return reader.Read(stream, NullLogger.Instance, path, environmentVariableReader); + return reader.Read(stream, NullLogger.Instance, path, environmentVariableReader, true); } } } From f060670a8a612ad3ce18cc602d78ff8c023b36c4 Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Mon, 8 Jan 2024 17:26:58 -0800 Subject: [PATCH 33/43] switch to splitintwo --- ...tf8JsonStreamLockFileTargetLibraryConverter.cs | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs index 6d836a60abf..f8187886061 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs @@ -42,18 +42,9 @@ public LockFileTargetLibrary Read(ref Utf8JsonStreamReader reader) //We want to read the property name right away var propertyName = reader.GetString(); -#pragma warning disable CA1307 // Specify StringComparison - int slashIndex = propertyName.IndexOf('/'); -#pragma warning restore CA1307 // Specify StringComparison - if (slashIndex == -1) - { - lockFileTargetLibrary.Name = propertyName; - } - else - { - lockFileTargetLibrary.Name = propertyName.Substring(0, slashIndex); - lockFileTargetLibrary.Version = NuGetVersion.Parse(propertyName.Substring(slashIndex + 1)); - } + var (targetLibraryName, version) = propertyName.SplitInTwo('/'); + lockFileTargetLibrary.Name = targetLibraryName; + lockFileTargetLibrary.Version = version is null ? null : NuGetVersion.Parse(version); reader.Read(); if (reader.TokenType != JsonTokenType.StartObject) From 4602b44d3ff10a703fe39683202c9ac67bbd444c Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Tue, 9 Jan 2024 11:08:38 -0800 Subject: [PATCH 34/43] Update conditional for framework --- src/NuGet.Core/NuGet.ProjectModel/StringExtensions.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/NuGet.Core/NuGet.ProjectModel/StringExtensions.cs b/src/NuGet.Core/NuGet.ProjectModel/StringExtensions.cs index e8caf1db691..d5a8500d0ff 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/StringExtensions.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/StringExtensions.cs @@ -14,10 +14,9 @@ internal static (string firstPart, string? secondPart) SplitInTwo(this string s, { return (s, null); } -#if NETCORE5_0 +#if NETCOREAPP2_1_OR_GREATER var index = s.IndexOf(separator, StringComparison.OrdinalIgnoreCase); -#endif -#if NETFRAMEWORK || NETSTANDARD +#else var index = s.IndexOf(separator.ToString(), StringComparison.OrdinalIgnoreCase); #endif if (index == -1) From a240062eeebc4d04e019af4557e9e188691b2b31 Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Wed, 10 Jan 2024 17:31:13 -0800 Subject: [PATCH 35/43] Caching the parsed NugetVersion and VersionRange objects. --- ...nPackageSpecReader.Utf8JsonStreamReader.cs | 12 +++---- .../JsonPackageSpecReader.cs | 12 +++---- .../NuGet.ProjectModel/JsonUtility.cs | 36 ++++++++++++++++++- .../LockFile/LockFileFormat.cs | 6 ++-- .../Utf8JsonStreamLockFileLibraryConverter.cs | 2 +- ...sonStreamLockFileTargetLibraryConverter.cs | 4 +-- .../NuGet.ProjectModel/PackageSpecUtility.cs | 4 +-- .../LockFileFormatTests.cs | 2 +- .../LockFileParsingEnvironmentVariable.cs | 31 ++++++++-------- 9 files changed, 72 insertions(+), 37 deletions(-) diff --git a/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.Utf8JsonStreamReader.cs b/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.Utf8JsonStreamReader.cs index 5f59fde6c4d..6eedcb5c10c 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.Utf8JsonStreamReader.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.Utf8JsonStreamReader.cs @@ -316,7 +316,7 @@ private static LibraryDependency ReadLibraryDependency(ref Utf8JsonStreamReader { try { - dependencyVersionRange = VersionRange.Parse(dependencyVersionValue); + dependencyVersionRange = JsonUtility.ParseVersionRange(dependencyVersionValue); } catch (Exception ex) { @@ -486,7 +486,7 @@ private static void ReadDependencies( var versionPropValue = jsonReader.GetString(); try { - versionOverride = VersionRange.Parse(versionPropValue); + versionOverride = JsonUtility.ParseVersionRange(versionPropValue); } catch (Exception ex) { @@ -515,7 +515,7 @@ private static void ReadDependencies( { try { - dependencyVersionRange = VersionRange.Parse(dependencyVersionValue); + dependencyVersionRange = JsonUtility.ParseVersionRange(dependencyVersionValue); } catch (Exception ex) { @@ -625,7 +625,7 @@ private static void ReadCentralPackageVersions( throw FileFormatException.Create("The version cannot be null or empty.", filePath); } - centralPackageVersions[propertyName] = new CentralPackageVersion(propertyName, VersionRange.Parse(version)); + centralPackageVersions[propertyName] = new CentralPackageVersion(propertyName, JsonUtility.ParseVersionRange(version)); } } } @@ -732,7 +732,7 @@ private static void ReadDownloadDependencies( try { - VersionRange version = VersionRange.Parse(singleVersionValue); + VersionRange version = JsonUtility.ParseVersionRange(singleVersionValue); downloadDependencies.Add(new DownloadDependency(name, version)); } @@ -1489,7 +1489,7 @@ private static RuntimeDependencySet ReadRuntimeDependencySet(ref Utf8JsonStreamR var propertyName = jsonReader.GetString(); dependencies ??= []; - var dependency = new RuntimePackageDependency(propertyName, VersionRange.Parse(jsonReader.ReadNextTokenAsString())); + var dependency = new RuntimePackageDependency(propertyName, JsonUtility.ParseVersionRange(jsonReader.ReadNextTokenAsString())); dependencies.Add(dependency); } diff --git a/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.cs b/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.cs index 70074621110..9ee659896ad 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.cs @@ -306,7 +306,7 @@ private static void ReadCentralPackageVersions( filePath); } - centralPackageVersions[propertyName] = new CentralPackageVersion(propertyName, VersionRange.Parse(version)); + centralPackageVersions[propertyName] = new CentralPackageVersion(propertyName, JsonUtility.ParseVersionRange(version)); }); } @@ -449,7 +449,7 @@ private static void ReadDependencies( { try { - versionOverride = VersionRange.Parse((string)jsonReader.Value); + versionOverride = JsonUtility.ParseVersionRange((string)jsonReader.Value); } catch (Exception ex) { @@ -478,7 +478,7 @@ private static void ReadDependencies( { try { - dependencyVersionRange = VersionRange.Parse(dependencyVersionValue); + dependencyVersionRange = JsonUtility.ParseVersionRange(dependencyVersionValue); } catch (Exception ex) { @@ -620,7 +620,7 @@ internal static void ReadCentralTransitiveDependencyGroup( { try { - dependencyVersionRange = VersionRange.Parse(dependencyVersionValue); + dependencyVersionRange = JsonUtility.ParseVersionRange(dependencyVersionValue); } catch (Exception ex) { @@ -737,7 +737,7 @@ private static void ReadDownloadDependencies( { try { - VersionRange version = VersionRange.Parse(singleVersionValue); + VersionRange version = JsonUtility.ParseVersionRange(singleVersionValue); downloadDependencies.Add(new DownloadDependency(name, version)); } @@ -1502,7 +1502,7 @@ static RuntimeDependencySet ReadRuntimeDependencySet(JsonTextReader jsonReader, { dependencies ??= new List(); - var dependency = new RuntimePackageDependency(propertyName, VersionRange.Parse(jsonReader.ReadNextTokenAsString())); + var dependency = new RuntimePackageDependency(propertyName, JsonUtility.ParseVersionRange(jsonReader.ReadNextTokenAsString())); dependencies.Add(dependency); }); diff --git a/src/NuGet.Core/NuGet.ProjectModel/JsonUtility.cs b/src/NuGet.Core/NuGet.ProjectModel/JsonUtility.cs index 657a231c0ec..8012bf5b075 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/JsonUtility.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/JsonUtility.cs @@ -14,6 +14,9 @@ namespace NuGet.ProjectModel { internal static class JsonUtility { + private static readonly Dictionary NuGetVersionCache = new(); + private static readonly Dictionary VersionRangeCache = new(); + internal const string NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING = nameof(NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING); internal static bool? UseNewtonsoftJson = null; internal static readonly char[] PathSplitChars = new[] { LockFile.DirectorySeparatorChar }; @@ -57,7 +60,7 @@ internal static PackageDependency ReadPackageDependency(string property, JToken var versionStr = json.Value(); return new PackageDependency( property, - versionStr == null ? null : VersionRange.Parse(versionStr)); + versionStr == null ? null : JsonUtility.ParseVersionRange(versionStr)); } internal static bool UseNewstonSoftJsonForParsing(IEnvironmentVariableReader environmentVariableReader, bool bypassCache) @@ -167,5 +170,36 @@ internal static JToken WriteString(string item) { return item != null ? new JValue(item) : JValue.CreateNull(); } + + internal static NuGetVersion ParseNugetVersion(string value) + { + if (!NuGetVersionCache.ContainsKey(value)) + { + var result = NuGetVersion.Parse(value); + NuGetVersionCache[value] = result; + } + return NuGetVersionCache[value]; + } + + internal static bool TryParseNugetVersion(string value, out NuGetVersion version) + { + if (!NuGetVersionCache.ContainsKey(value)) + { + _ = NuGetVersion.TryParse(value, out version); + NuGetVersionCache[value] = version; + } + version = NuGetVersionCache[value]; + return version is not null; + } + + internal static VersionRange ParseVersionRange(string value) + { + if (!VersionRangeCache.ContainsKey(value)) + { + var result = VersionRange.Parse(value); + VersionRangeCache[value] = result; + } + return VersionRangeCache[value]; + } } } diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/LockFileFormat.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/LockFileFormat.cs index 562d78bee52..6633df719c1 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LockFile/LockFileFormat.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/LockFileFormat.cs @@ -93,7 +93,7 @@ public LockFile Read(Stream stream, ILogger log, string path) internal LockFile Read(Stream stream, ILogger log, string path, IEnvironmentVariableReader environmentVariableReader, bool bypassCache = false) { - if (JsonUtility.UseNewstonSoftJsonForParsing(environmentVariableReader, bypassCache)) + if (!JsonUtility.UseNewstonSoftJsonForParsing(environmentVariableReader, bypassCache)) { return Utf8JsonRead(stream, log, path); } @@ -284,7 +284,7 @@ private static LockFileLibrary ReadLibrary(string property, JToken json) library.Name = parts[0]; if (parts.Length == 2) { - library.Version = NuGetVersion.Parse(parts[1]); + library.Version = JsonUtility.ParseNugetVersion(parts[1]); } library.Type = ReadString(json[TypeProperty]); @@ -560,7 +560,7 @@ private static LockFileTargetLibrary ReadTargetLibrary(string property, JToken j else { library.Name = property.Substring(0, slashIndex); - library.Version = NuGetVersion.Parse(property.Substring(slashIndex + 1)); + library.Version = JsonUtility.ParseNugetVersion(property.Substring(slashIndex + 1)); } var jObject = json as JObject; diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileLibraryConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileLibraryConverter.cs index 96e146202f4..f3ba5216716 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileLibraryConverter.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileLibraryConverter.cs @@ -35,7 +35,7 @@ public LockFileLibrary Read(ref Utf8JsonStreamReader reader) lockFileLibrary.Name = name; if (!string.IsNullOrWhiteSpace(version)) { - lockFileLibrary.Version = NuGetVersion.Parse(version); + lockFileLibrary.Version = JsonUtility.ParseNugetVersion(version); } reader.Read(); diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs index f8187886061..743e41d3fa3 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs @@ -44,7 +44,7 @@ public LockFileTargetLibrary Read(ref Utf8JsonStreamReader reader) var propertyName = reader.GetString(); var (targetLibraryName, version) = propertyName.SplitInTwo('/'); lockFileTargetLibrary.Name = targetLibraryName; - lockFileTargetLibrary.Version = version is null ? null : NuGetVersion.Parse(version); + lockFileTargetLibrary.Version = version is null ? null : JsonUtility.ParseNugetVersion(version); reader.Read(); if (reader.TokenType != JsonTokenType.StartObject) @@ -151,7 +151,7 @@ private IList ReadPackageDependencyList(ref Utf8JsonStreamRea packageDependencies.Add(new PackageDependency( propertyName, - versionString == null ? null : VersionRange.Parse(versionString))); + versionString == null ? null : JsonUtility.ParseVersionRange(versionString))); } return packageDependencies; } diff --git a/src/NuGet.Core/NuGet.ProjectModel/PackageSpecUtility.cs b/src/NuGet.Core/NuGet.ProjectModel/PackageSpecUtility.cs index 11ff892913f..2fd415315ad 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/PackageSpecUtility.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/PackageSpecUtility.cs @@ -27,7 +27,7 @@ public static NuGetVersion SpecifySnapshot(string version, string snapshotValue) } } - return NuGetVersion.Parse(version); + return JsonUtility.ParseNugetVersion(version); } /// @@ -44,7 +44,7 @@ public static bool IsSnapshotVersion(string version) { // Verify the version is valid NuGetVersion parsed = null; - return NuGetVersion.TryParse(version.Substring(0, version.Length - 2), out parsed); + return JsonUtility.TryParseNugetVersion(version.Substring(0, version.Length - 2), out parsed); } return false; diff --git a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileFormatTests.cs b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileFormatTests.cs index 67a3b192a42..9dd76c69a68 100644 --- a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileFormatTests.cs +++ b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileFormatTests.cs @@ -2384,7 +2384,7 @@ public void LockFileFormat_WritesCentralTransitiveDependencyGroups() Assert.Equal(expected.ToString(), output.ToString()); } - private LockFile Read(string filePath, IEnvironmentVariableReader environmentVariableReader) + public static LockFile Read(string filePath, IEnvironmentVariableReader environmentVariableReader) { var reader = new LockFileFormat(); using (var stream = File.OpenRead(filePath)) diff --git a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileParsingEnvironmentVariable.cs b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileParsingEnvironmentVariable.cs index b29c06de105..50dce830d50 100644 --- a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileParsingEnvironmentVariable.cs +++ b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileParsingEnvironmentVariable.cs @@ -2,12 +2,25 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; +using NuGet.Common; using Test.Utility; -namespace NuGet.ProjectModel +namespace NuGet.ProjectModel.Test { public class LockFileParsingEnvironmentVariable { + public static readonly IEnvironmentVariableReader UseNjForProcessingEnvironmentVariable = new TestEnvironmentVariableReader( + new Dictionary() + { + ["NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"] = bool.TrueString + }, "NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING: true"); + + public static readonly IEnvironmentVariableReader UseStjForProcessingEnvironmentVariable = new TestEnvironmentVariableReader( + new Dictionary() + { + ["NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"] = bool.FalseString + }, "NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING: false"); + public static IEnumerable TestEnvironmentVariableReader() { return GetTestEnvironmentVariableReader(); @@ -30,20 +43,8 @@ public static IEnumerable TestEnvironmentVariableReader(object value1, private static IEnumerable GetTestEnvironmentVariableReader(params object[] objects) { - var UseNjForFileTrue = new List { - new TestEnvironmentVariableReader( - new Dictionary() - { - ["NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"] = bool.TrueString - }, "NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING: true") - }; - var UseNjForFileFalse = new List { - new TestEnvironmentVariableReader( - new Dictionary() - { - ["NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"] = bool.FalseString - }, "NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING: false") - }; + var UseNjForFileTrue = new List { UseNjForProcessingEnvironmentVariable }; + var UseNjForFileFalse = new List { UseStjForProcessingEnvironmentVariable }; if (objects != null) { From 08835675183f84a816190a07e0c2891472480b8f Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Thu, 11 Jan 2024 12:46:32 -0800 Subject: [PATCH 36/43] Fixes from PR --- .../Utf8JsonStreamLockFileItemConverter.cs | 22 ++++++++----------- ...sonStreamLockFileTargetLibraryConverter.cs | 6 ++--- .../NuGet.ProjectModel/StringExtensions.cs | 9 +++----- .../Utf8JsonReaderExtensions.cs | 6 ++--- ...reamProjectFileDependencyGroupConverter.cs | 4 ++-- 5 files changed, 19 insertions(+), 28 deletions(-) diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileItemConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileItemConverter.cs index d81a928e87c..03ee8f05799 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileItemConverter.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileItemConverter.cs @@ -1,6 +1,7 @@ // 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. +using System; using System.Text.Json; namespace NuGet.ProjectModel @@ -10,6 +11,13 @@ namespace NuGet.ProjectModel /// internal class Utf8JsonStreamLockFileItemConverter : IUtf8JsonStreamReaderConverter where T : LockFileItem { + private Func _lockFileItemCreator; + + public Utf8JsonStreamLockFileItemConverter(Func lockFileItemCreator) + { + _lockFileItemCreator = lockFileItemCreator; + } + public T Read(ref Utf8JsonStreamReader reader) { var genericType = typeof(T); @@ -21,19 +29,7 @@ public T Read(ref Utf8JsonStreamReader reader) //We want to read the property name right away var lockItemPath = reader.GetString(); - LockFileItem lockFileItem; - if (genericType == typeof(LockFileContentFile)) - { - lockFileItem = new LockFileContentFile(lockItemPath); - } - else if (genericType == typeof(LockFileRuntimeTarget)) - { - lockFileItem = new LockFileRuntimeTarget(lockItemPath); - } - else - { - lockFileItem = new LockFileItem(lockItemPath); - } + LockFileItem lockFileItem = _lockFileItemCreator(lockItemPath); reader.Read(); if (reader.TokenType == JsonTokenType.StartObject) diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs index 743e41d3fa3..d9dafa50289 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs @@ -6,7 +6,6 @@ using System.Text; using System.Text.Json; using NuGet.Packaging.Core; -using NuGet.Versioning; namespace NuGet.ProjectModel { @@ -70,7 +69,7 @@ public LockFileTargetLibrary Read(ref Utf8JsonStreamReader reader) else if (reader.ValueTextEquals(FrameworkAssembliesPropertyName)) { reader.Read(); - lockFileTargetLibrary.FrameworkAssemblies = reader.ReadStringArrayAsIList(new List()); + lockFileTargetLibrary.FrameworkAssemblies = reader.ReadStringArrayAsIList() ?? Array.Empty(); } else if (reader.ValueTextEquals(RuntimePropertyName)) { @@ -143,12 +142,11 @@ private IList ReadPackageDependencyList(ref Utf8JsonStreamRea return Array.Empty(); } - var packageDependencies = new List(); + var packageDependencies = new List(10); while (reader.Read() && reader.TokenType == JsonTokenType.PropertyName) { string propertyName = reader.GetString(); string versionString = reader.ReadNextTokenAsString(); - packageDependencies.Add(new PackageDependency( propertyName, versionString == null ? null : JsonUtility.ParseVersionRange(versionString))); diff --git a/src/NuGet.Core/NuGet.ProjectModel/StringExtensions.cs b/src/NuGet.Core/NuGet.ProjectModel/StringExtensions.cs index d5a8500d0ff..925bda42fd2 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/StringExtensions.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/StringExtensions.cs @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. #nullable enable -using System; +using System.Globalization; namespace NuGet.ProjectModel { @@ -14,11 +14,8 @@ internal static (string firstPart, string? secondPart) SplitInTwo(this string s, { return (s, null); } -#if NETCOREAPP2_1_OR_GREATER - var index = s.IndexOf(separator, StringComparison.OrdinalIgnoreCase); -#else - var index = s.IndexOf(separator.ToString(), StringComparison.OrdinalIgnoreCase); -#endif + var index = CultureInfo.CurrentCulture.CompareInfo.IndexOf(s, separator, CompareOptions.Ordinal); + if (index == -1) { return (s, null); diff --git a/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonReaderExtensions.cs b/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonReaderExtensions.cs index fe5e5c7bb1a..f0546fa61c0 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonReaderExtensions.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonReaderExtensions.cs @@ -9,9 +9,9 @@ namespace NuGet.ProjectModel internal static class Utf8JsonReaderExtensions { internal static readonly Utf8JsonStreamLockFileConverter LockFileConverter = new Utf8JsonStreamLockFileConverter(); - internal static readonly Utf8JsonStreamLockFileItemConverter LockFileItemConverter = new Utf8JsonStreamLockFileItemConverter(); - internal static readonly Utf8JsonStreamLockFileItemConverter LockFileContentFileConverter = new Utf8JsonStreamLockFileItemConverter(); - internal static readonly Utf8JsonStreamLockFileItemConverter LockFileRuntimeTargetConverter = new Utf8JsonStreamLockFileItemConverter(); + internal static readonly Utf8JsonStreamLockFileItemConverter LockFileItemConverter = new Utf8JsonStreamLockFileItemConverter((string filePath) => new LockFileItem(filePath)); + internal static readonly Utf8JsonStreamLockFileItemConverter LockFileContentFileConverter = new Utf8JsonStreamLockFileItemConverter((string filePath) => new LockFileContentFile(filePath)); + internal static readonly Utf8JsonStreamLockFileItemConverter LockFileRuntimeTargetConverter = new Utf8JsonStreamLockFileItemConverter((string filePath) => new LockFileRuntimeTarget(filePath)); internal static readonly Utf8JsonStreamLockFileTargetLibraryConverter LockFileTargetLibraryConverter = new Utf8JsonStreamLockFileTargetLibraryConverter(); internal static readonly Utf8JsonStreamLockFileLibraryConverter LockFileLibraryConverter = new Utf8JsonStreamLockFileLibraryConverter(); internal static readonly Utf8JsonStreamLockFileTargetConverter LockFileTargetConverter = new Utf8JsonStreamLockFileTargetConverter(); diff --git a/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamProjectFileDependencyGroupConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamProjectFileDependencyGroupConverter.cs index 91104b87793..1b692e86f02 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamProjectFileDependencyGroupConverter.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamProjectFileDependencyGroupConverter.cs @@ -1,7 +1,7 @@ // 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. -using System.Collections.Generic; +using System; using System.Text.Json; namespace NuGet.ProjectModel @@ -20,7 +20,7 @@ public ProjectFileDependencyGroup Read(ref Utf8JsonStreamReader reader) var frameworkName = reader.GetString(); reader.Read(); - var dependencies = reader.ReadStringArrayAsIList(new List()); + var dependencies = reader.ReadStringArrayAsIList() ?? Array.Empty(); return new ProjectFileDependencyGroup(frameworkName, dependencies); } From c4adaf762a80bb16de903fe6509df142f7623a90 Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Thu, 11 Jan 2024 14:02:50 -0800 Subject: [PATCH 37/43] Avoid creating empty lists --- ...nPackageSpecReader.Utf8JsonStreamReader.cs | 28 +++++++++++-------- .../Utf8JsonStreamLockFileConverter.cs | 9 +++--- .../JsonPackageSpecReaderTests.cs | 6 ++-- 3 files changed, 24 insertions(+), 19 deletions(-) diff --git a/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.Utf8JsonStreamReader.cs b/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.Utf8JsonStreamReader.cs index 6eedcb5c10c..750e2bbe153 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.Utf8JsonStreamReader.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.Utf8JsonStreamReader.cs @@ -265,9 +265,10 @@ internal static PackageSpec GetPackageSpec(ref Utf8JsonStreamReader jsonReader, internal static void ReadCentralTransitiveDependencyGroup( ref Utf8JsonStreamReader jsonReader, - IList results, + out IList results, string packageSpecPath) { + results = null; if (jsonReader.Read() && jsonReader.TokenType == JsonTokenType.StartObject) { while (jsonReader.Read() && jsonReader.TokenType == JsonTokenType.PropertyName) @@ -283,10 +284,12 @@ internal static void ReadCentralTransitiveDependencyGroup( if (jsonReader.Read()) { var libraryDependency = ReadLibraryDependency(ref jsonReader, packageSpecPath, libraryName); + results ??= []; results.Add(libraryDependency); } } } + results ??= Array.Empty(); } private static LibraryDependency ReadLibraryDependency(ref Utf8JsonStreamReader jsonReader, string packageSpecPath, string libraryName) @@ -931,7 +934,7 @@ private static void ReadMSBuildMetadata(ref Utf8JsonStreamReader jsonReader, Pac RestoreLockProperties restoreLockProperties = null; var skipContentFileWrite = false; List sources = null; - List targetFrameworks = null; + IList targetFrameworks = null; var validateRuntimeAssets = false; WarningProperties warningProperties = null; RestoreAuditProperties auditProperties = null; @@ -1287,7 +1290,7 @@ private static void ReadPackageTypes(PackageSpec packageSpec, ref Utf8JsonStream packageTypes = new[] { packageType }; break; case JsonTokenType.StartArray: - var types = new List(); + List types = null; while (jsonReader.Read() && jsonReader.TokenType != JsonTokenType.EndArray) { @@ -1302,8 +1305,10 @@ private static void ReadPackageTypes(PackageSpec packageSpec, ref Utf8JsonStream } packageType = CreatePackageType(ref jsonReader); + types ??= []; types.Add(packageType); } + packageTypes = types; break; case JsonTokenType.Null: @@ -1534,14 +1539,14 @@ private static RuntimeDescription ReadRuntimeDescription(ref Utf8JsonStreamReade private static List ReadRuntimes(ref Utf8JsonStreamReader jsonReader) { - var runtimeDescriptions = new List(); + List runtimeDescriptions = null; if (jsonReader.Read() && jsonReader.TokenType == JsonTokenType.StartObject) { while (jsonReader.Read() && jsonReader.TokenType == JsonTokenType.PropertyName) { RuntimeDescription runtimeDescription = ReadRuntimeDescription(ref jsonReader, jsonReader.GetString()); - + runtimeDescriptions ??= []; runtimeDescriptions.Add(runtimeDescription); } } @@ -1565,14 +1570,15 @@ private static void ReadScripts(ref Utf8JsonStreamReader jsonReader, PackageSpec } else if (jsonReader.TokenType == JsonTokenType.StartArray) { - var list = new List(); + IList list = null; while (jsonReader.Read() && jsonReader.TokenType == JsonTokenType.String) { + list ??= []; list.Add(jsonReader.GetString()); } - packageSpec.Scripts[propertyName] = list; + packageSpec.Scripts[propertyName] = list ?? Enumerable.Empty(); } else { @@ -1587,7 +1593,7 @@ private static void ReadScripts(ref Utf8JsonStreamReader jsonReader, PackageSpec private static List ReadSupports(ref Utf8JsonStreamReader jsonReader) { - var compatibilityProfiles = new List(); + List compatibilityProfiles = null; if (jsonReader.Read() && jsonReader.TokenType == JsonTokenType.StartObject) { @@ -1595,7 +1601,7 @@ private static List ReadSupports(ref Utf8JsonStreamReader { var propertyName = jsonReader.GetString(); CompatibilityProfile compatibilityProfile = ReadCompatibilityProfile(ref jsonReader, propertyName); - + compatibilityProfiles ??= []; compatibilityProfiles.Add(compatibilityProfile); } } @@ -1633,7 +1639,7 @@ private static LibraryDependencyTarget ReadTarget( private static List ReadTargetFrameworks(ref Utf8JsonStreamReader jsonReader) { - var targetFrameworks = new List(); + List targetFrameworks = null; if (jsonReader.Read() && jsonReader.TokenType == JsonTokenType.StartObject) { @@ -1716,7 +1722,7 @@ private static List ReadTargetFrameworks(re jsonReader.Skip(); } } - + targetFrameworks ??= []; targetFrameworks.Add(frameworkGroup); } } diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileConverter.cs index fb2004f1829..95eae0ce711 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileConverter.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileConverter.cs @@ -1,6 +1,7 @@ // 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. +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -78,23 +79,23 @@ public LockFile Read(ref Utf8JsonStreamReader reader) } else if (reader.ValueTextEquals(CentralTransitiveDependencyGroupsPropertyName)) { - var results = new List(); + IList results = null; if (reader.Read() && reader.TokenType == JsonTokenType.StartObject) { while (reader.Read() && reader.TokenType == JsonTokenType.PropertyName) { + results ??= new List(); var frameworkPropertyName = reader.GetString(); NuGetFramework framework = NuGetFramework.Parse(frameworkPropertyName); - var dependencies = new List(); JsonPackageSpecReader.ReadCentralTransitiveDependencyGroup( jsonReader: ref reader, - results: dependencies, + results: out var dependencies, packageSpecPath: string.Empty); results.Add(new CentralTransitiveDependencyGroup(framework, dependencies)); } } - lockFile.CentralTransitiveDependencyGroups = results; + lockFile.CentralTransitiveDependencyGroups = results ?? Array.Empty(); } else if (reader.ValueTextEquals(LogsPropertyName)) { diff --git a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/JsonPackageSpecReaderTests.cs b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/JsonPackageSpecReaderTests.cs index e710a6d6983..f803aed468e 100644 --- a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/JsonPackageSpecReaderTests.cs +++ b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/JsonPackageSpecReaderTests.cs @@ -3883,11 +3883,10 @@ public void PackageSpecReader_Read(IEnvironmentVariableReader environmentVariabl { var frameworkPropertyName = reader.GetString(); NuGetFramework framework = NuGetFramework.Parse(frameworkPropertyName); - var dependencies = new List(); JsonPackageSpecReader.ReadCentralTransitiveDependencyGroup( jsonReader: ref reader, - results: dependencies, + results: out var dependencies, packageSpecPath: "SomePath"); results.Add(new CentralTransitiveDependencyGroup(framework, dependencies)); } @@ -3958,11 +3957,10 @@ public void PackageSpecReader_Malformed_Exception(IEnvironmentVariableReader env { reader.Read(); NuGetFramework framework = NuGetFramework.Parse(reader.GetString()); - var dependencies = new List(); JsonPackageSpecReader.ReadCentralTransitiveDependencyGroup( jsonReader: ref reader, - results: dependencies, + results: out var dependencies, packageSpecPath: "SomePath"); results.Add(new CentralTransitiveDependencyGroup(framework, dependencies)); } From bda30bbb8822b98143705b754a9aa7026aea55ca Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Tue, 16 Jan 2024 16:06:20 -0800 Subject: [PATCH 38/43] Revert "Caching the parsed NugetVersion and VersionRange objects." This reverts commit a240062eeebc4d04e019af4557e9e188691b2b31. --- ...nPackageSpecReader.Utf8JsonStreamReader.cs | 12 +++---- .../JsonPackageSpecReader.cs | 12 +++---- .../NuGet.ProjectModel/JsonUtility.cs | 36 +------------------ .../LockFile/LockFileFormat.cs | 6 ++-- .../Utf8JsonStreamLockFileLibraryConverter.cs | 2 +- ...sonStreamLockFileTargetLibraryConverter.cs | 4 +-- .../NuGet.ProjectModel/PackageSpecUtility.cs | 4 +-- .../LockFileFormatTests.cs | 2 +- .../LockFileParsingEnvironmentVariable.cs | 31 ++++++++-------- 9 files changed, 37 insertions(+), 72 deletions(-) diff --git a/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.Utf8JsonStreamReader.cs b/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.Utf8JsonStreamReader.cs index 750e2bbe153..796f0103ae3 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.Utf8JsonStreamReader.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.Utf8JsonStreamReader.cs @@ -319,7 +319,7 @@ private static LibraryDependency ReadLibraryDependency(ref Utf8JsonStreamReader { try { - dependencyVersionRange = JsonUtility.ParseVersionRange(dependencyVersionValue); + dependencyVersionRange = VersionRange.Parse(dependencyVersionValue); } catch (Exception ex) { @@ -489,7 +489,7 @@ private static void ReadDependencies( var versionPropValue = jsonReader.GetString(); try { - versionOverride = JsonUtility.ParseVersionRange(versionPropValue); + versionOverride = VersionRange.Parse(versionPropValue); } catch (Exception ex) { @@ -518,7 +518,7 @@ private static void ReadDependencies( { try { - dependencyVersionRange = JsonUtility.ParseVersionRange(dependencyVersionValue); + dependencyVersionRange = VersionRange.Parse(dependencyVersionValue); } catch (Exception ex) { @@ -628,7 +628,7 @@ private static void ReadCentralPackageVersions( throw FileFormatException.Create("The version cannot be null or empty.", filePath); } - centralPackageVersions[propertyName] = new CentralPackageVersion(propertyName, JsonUtility.ParseVersionRange(version)); + centralPackageVersions[propertyName] = new CentralPackageVersion(propertyName, VersionRange.Parse(version)); } } } @@ -735,7 +735,7 @@ private static void ReadDownloadDependencies( try { - VersionRange version = JsonUtility.ParseVersionRange(singleVersionValue); + VersionRange version = VersionRange.Parse(singleVersionValue); downloadDependencies.Add(new DownloadDependency(name, version)); } @@ -1494,7 +1494,7 @@ private static RuntimeDependencySet ReadRuntimeDependencySet(ref Utf8JsonStreamR var propertyName = jsonReader.GetString(); dependencies ??= []; - var dependency = new RuntimePackageDependency(propertyName, JsonUtility.ParseVersionRange(jsonReader.ReadNextTokenAsString())); + var dependency = new RuntimePackageDependency(propertyName, VersionRange.Parse(jsonReader.ReadNextTokenAsString())); dependencies.Add(dependency); } diff --git a/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.cs b/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.cs index 9ee659896ad..70074621110 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.cs @@ -306,7 +306,7 @@ private static void ReadCentralPackageVersions( filePath); } - centralPackageVersions[propertyName] = new CentralPackageVersion(propertyName, JsonUtility.ParseVersionRange(version)); + centralPackageVersions[propertyName] = new CentralPackageVersion(propertyName, VersionRange.Parse(version)); }); } @@ -449,7 +449,7 @@ private static void ReadDependencies( { try { - versionOverride = JsonUtility.ParseVersionRange((string)jsonReader.Value); + versionOverride = VersionRange.Parse((string)jsonReader.Value); } catch (Exception ex) { @@ -478,7 +478,7 @@ private static void ReadDependencies( { try { - dependencyVersionRange = JsonUtility.ParseVersionRange(dependencyVersionValue); + dependencyVersionRange = VersionRange.Parse(dependencyVersionValue); } catch (Exception ex) { @@ -620,7 +620,7 @@ internal static void ReadCentralTransitiveDependencyGroup( { try { - dependencyVersionRange = JsonUtility.ParseVersionRange(dependencyVersionValue); + dependencyVersionRange = VersionRange.Parse(dependencyVersionValue); } catch (Exception ex) { @@ -737,7 +737,7 @@ private static void ReadDownloadDependencies( { try { - VersionRange version = JsonUtility.ParseVersionRange(singleVersionValue); + VersionRange version = VersionRange.Parse(singleVersionValue); downloadDependencies.Add(new DownloadDependency(name, version)); } @@ -1502,7 +1502,7 @@ static RuntimeDependencySet ReadRuntimeDependencySet(JsonTextReader jsonReader, { dependencies ??= new List(); - var dependency = new RuntimePackageDependency(propertyName, JsonUtility.ParseVersionRange(jsonReader.ReadNextTokenAsString())); + var dependency = new RuntimePackageDependency(propertyName, VersionRange.Parse(jsonReader.ReadNextTokenAsString())); dependencies.Add(dependency); }); diff --git a/src/NuGet.Core/NuGet.ProjectModel/JsonUtility.cs b/src/NuGet.Core/NuGet.ProjectModel/JsonUtility.cs index 8012bf5b075..657a231c0ec 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/JsonUtility.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/JsonUtility.cs @@ -14,9 +14,6 @@ namespace NuGet.ProjectModel { internal static class JsonUtility { - private static readonly Dictionary NuGetVersionCache = new(); - private static readonly Dictionary VersionRangeCache = new(); - internal const string NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING = nameof(NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING); internal static bool? UseNewtonsoftJson = null; internal static readonly char[] PathSplitChars = new[] { LockFile.DirectorySeparatorChar }; @@ -60,7 +57,7 @@ internal static PackageDependency ReadPackageDependency(string property, JToken var versionStr = json.Value(); return new PackageDependency( property, - versionStr == null ? null : JsonUtility.ParseVersionRange(versionStr)); + versionStr == null ? null : VersionRange.Parse(versionStr)); } internal static bool UseNewstonSoftJsonForParsing(IEnvironmentVariableReader environmentVariableReader, bool bypassCache) @@ -170,36 +167,5 @@ internal static JToken WriteString(string item) { return item != null ? new JValue(item) : JValue.CreateNull(); } - - internal static NuGetVersion ParseNugetVersion(string value) - { - if (!NuGetVersionCache.ContainsKey(value)) - { - var result = NuGetVersion.Parse(value); - NuGetVersionCache[value] = result; - } - return NuGetVersionCache[value]; - } - - internal static bool TryParseNugetVersion(string value, out NuGetVersion version) - { - if (!NuGetVersionCache.ContainsKey(value)) - { - _ = NuGetVersion.TryParse(value, out version); - NuGetVersionCache[value] = version; - } - version = NuGetVersionCache[value]; - return version is not null; - } - - internal static VersionRange ParseVersionRange(string value) - { - if (!VersionRangeCache.ContainsKey(value)) - { - var result = VersionRange.Parse(value); - VersionRangeCache[value] = result; - } - return VersionRangeCache[value]; - } } } diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/LockFileFormat.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/LockFileFormat.cs index 6633df719c1..562d78bee52 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LockFile/LockFileFormat.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/LockFileFormat.cs @@ -93,7 +93,7 @@ public LockFile Read(Stream stream, ILogger log, string path) internal LockFile Read(Stream stream, ILogger log, string path, IEnvironmentVariableReader environmentVariableReader, bool bypassCache = false) { - if (!JsonUtility.UseNewstonSoftJsonForParsing(environmentVariableReader, bypassCache)) + if (JsonUtility.UseNewstonSoftJsonForParsing(environmentVariableReader, bypassCache)) { return Utf8JsonRead(stream, log, path); } @@ -284,7 +284,7 @@ private static LockFileLibrary ReadLibrary(string property, JToken json) library.Name = parts[0]; if (parts.Length == 2) { - library.Version = JsonUtility.ParseNugetVersion(parts[1]); + library.Version = NuGetVersion.Parse(parts[1]); } library.Type = ReadString(json[TypeProperty]); @@ -560,7 +560,7 @@ private static LockFileTargetLibrary ReadTargetLibrary(string property, JToken j else { library.Name = property.Substring(0, slashIndex); - library.Version = JsonUtility.ParseNugetVersion(property.Substring(slashIndex + 1)); + library.Version = NuGetVersion.Parse(property.Substring(slashIndex + 1)); } var jObject = json as JObject; diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileLibraryConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileLibraryConverter.cs index f3ba5216716..96e146202f4 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileLibraryConverter.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileLibraryConverter.cs @@ -35,7 +35,7 @@ public LockFileLibrary Read(ref Utf8JsonStreamReader reader) lockFileLibrary.Name = name; if (!string.IsNullOrWhiteSpace(version)) { - lockFileLibrary.Version = JsonUtility.ParseNugetVersion(version); + lockFileLibrary.Version = NuGetVersion.Parse(version); } reader.Read(); diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs index d9dafa50289..a26bf198756 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs @@ -43,7 +43,7 @@ public LockFileTargetLibrary Read(ref Utf8JsonStreamReader reader) var propertyName = reader.GetString(); var (targetLibraryName, version) = propertyName.SplitInTwo('/'); lockFileTargetLibrary.Name = targetLibraryName; - lockFileTargetLibrary.Version = version is null ? null : JsonUtility.ParseNugetVersion(version); + lockFileTargetLibrary.Version = version is null ? null : NuGetVersion.Parse(version); reader.Read(); if (reader.TokenType != JsonTokenType.StartObject) @@ -149,7 +149,7 @@ private IList ReadPackageDependencyList(ref Utf8JsonStreamRea string versionString = reader.ReadNextTokenAsString(); packageDependencies.Add(new PackageDependency( propertyName, - versionString == null ? null : JsonUtility.ParseVersionRange(versionString))); + versionString == null ? null : VersionRange.Parse(versionString))); } return packageDependencies; } diff --git a/src/NuGet.Core/NuGet.ProjectModel/PackageSpecUtility.cs b/src/NuGet.Core/NuGet.ProjectModel/PackageSpecUtility.cs index 2fd415315ad..11ff892913f 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/PackageSpecUtility.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/PackageSpecUtility.cs @@ -27,7 +27,7 @@ public static NuGetVersion SpecifySnapshot(string version, string snapshotValue) } } - return JsonUtility.ParseNugetVersion(version); + return NuGetVersion.Parse(version); } /// @@ -44,7 +44,7 @@ public static bool IsSnapshotVersion(string version) { // Verify the version is valid NuGetVersion parsed = null; - return JsonUtility.TryParseNugetVersion(version.Substring(0, version.Length - 2), out parsed); + return NuGetVersion.TryParse(version.Substring(0, version.Length - 2), out parsed); } return false; diff --git a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileFormatTests.cs b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileFormatTests.cs index 9dd76c69a68..67a3b192a42 100644 --- a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileFormatTests.cs +++ b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileFormatTests.cs @@ -2384,7 +2384,7 @@ public void LockFileFormat_WritesCentralTransitiveDependencyGroups() Assert.Equal(expected.ToString(), output.ToString()); } - public static LockFile Read(string filePath, IEnvironmentVariableReader environmentVariableReader) + private LockFile Read(string filePath, IEnvironmentVariableReader environmentVariableReader) { var reader = new LockFileFormat(); using (var stream = File.OpenRead(filePath)) diff --git a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileParsingEnvironmentVariable.cs b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileParsingEnvironmentVariable.cs index 50dce830d50..b29c06de105 100644 --- a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileParsingEnvironmentVariable.cs +++ b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileParsingEnvironmentVariable.cs @@ -2,25 +2,12 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; -using NuGet.Common; using Test.Utility; -namespace NuGet.ProjectModel.Test +namespace NuGet.ProjectModel { public class LockFileParsingEnvironmentVariable { - public static readonly IEnvironmentVariableReader UseNjForProcessingEnvironmentVariable = new TestEnvironmentVariableReader( - new Dictionary() - { - ["NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"] = bool.TrueString - }, "NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING: true"); - - public static readonly IEnvironmentVariableReader UseStjForProcessingEnvironmentVariable = new TestEnvironmentVariableReader( - new Dictionary() - { - ["NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"] = bool.FalseString - }, "NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING: false"); - public static IEnumerable TestEnvironmentVariableReader() { return GetTestEnvironmentVariableReader(); @@ -43,8 +30,20 @@ public static IEnumerable TestEnvironmentVariableReader(object value1, private static IEnumerable GetTestEnvironmentVariableReader(params object[] objects) { - var UseNjForFileTrue = new List { UseNjForProcessingEnvironmentVariable }; - var UseNjForFileFalse = new List { UseStjForProcessingEnvironmentVariable }; + var UseNjForFileTrue = new List { + new TestEnvironmentVariableReader( + new Dictionary() + { + ["NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"] = bool.TrueString + }, "NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING: true") + }; + var UseNjForFileFalse = new List { + new TestEnvironmentVariableReader( + new Dictionary() + { + ["NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"] = bool.FalseString + }, "NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING: false") + }; if (objects != null) { From fb7ebd51eb7823c5cfb306074bf08f8b12e414d0 Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Tue, 16 Jan 2024 16:07:34 -0800 Subject: [PATCH 39/43] Fix netwonsoft json parsing --- src/NuGet.Core/NuGet.ProjectModel/LockFile/LockFileFormat.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/LockFileFormat.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/LockFileFormat.cs index 562d78bee52..cef14d45673 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LockFile/LockFileFormat.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/LockFileFormat.cs @@ -93,7 +93,7 @@ public LockFile Read(Stream stream, ILogger log, string path) internal LockFile Read(Stream stream, ILogger log, string path, IEnvironmentVariableReader environmentVariableReader, bool bypassCache = false) { - if (JsonUtility.UseNewstonSoftJsonForParsing(environmentVariableReader, bypassCache)) + if (!JsonUtility.UseNewstonSoftJsonForParsing(environmentVariableReader, bypassCache)) { return Utf8JsonRead(stream, log, path); } From 32aba9a270cc91765c550615aa7568b4c6365f4f Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Tue, 16 Jan 2024 16:51:54 -0800 Subject: [PATCH 40/43] Add missing reference --- .../LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs index a26bf198756..5c67af2241b 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs @@ -6,6 +6,7 @@ using System.Text; using System.Text.Json; using NuGet.Packaging.Core; +using NuGet.Versioning; namespace NuGet.ProjectModel { From 88537340a06282fc6996b23003a8ab50128e4fdd Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Wed, 17 Jan 2024 14:33:21 -0800 Subject: [PATCH 41/43] added some examples of the json to be parsed --- ...Utf8JsonStreamAssetsLogMessageConverter.cs | 17 +++++++++ .../Utf8JsonStreamLockFileConverter.cs | 12 +++++- .../Utf8JsonStreamLockFileItemConverter.cs | 8 ++++ .../Utf8JsonStreamLockFileLibraryConverter.cs | 14 +++++++ .../Utf8JsonStreamLockFileTargetConverter.cs | 5 +++ ...sonStreamLockFileTargetLibraryConverter.cs | 37 +++++++++++++++++++ ...reamProjectFileDependencyGroupConverter.cs | 5 +++ 7 files changed, 97 insertions(+), 1 deletion(-) diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamAssetsLogMessageConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamAssetsLogMessageConverter.cs index e9aaeb0b85c..ddd9bdb9ee6 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamAssetsLogMessageConverter.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamAssetsLogMessageConverter.cs @@ -12,6 +12,23 @@ namespace NuGet.ProjectModel /// /// A to allow read JSON into /// + /// + /// { + /// "code": "", + /// "level": "", + /// "message": "test log message", + /// "warningLevel": , + /// "filePath": "C:\a\file\path.txt", + /// "startLineNumber": 1, + /// "startColumnNumber": 2, + /// "endLineNumber": 10, + /// "endcolumnNumber": 20, + /// "libraryId": "libraryId", + /// "targetGraphs": [ + /// "targetGraph1" + /// ] + /// } + /// internal class Utf8JsonStreamAssetsLogMessageConverter : IUtf8JsonStreamReaderConverter { private static readonly byte[] LevelPropertyName = Encoding.UTF8.GetBytes(LogMessageProperties.LEVEL); diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileConverter.cs index 95eae0ce711..36517a13c40 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileConverter.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileConverter.cs @@ -7,13 +7,23 @@ using System.Text; using System.Text.Json; using NuGet.Frameworks; -using NuGet.LibraryModel; namespace NuGet.ProjectModel { /// /// A to allow read JSON into /// + /// + /// { + /// "version": 3, + /// "targets": { }, + /// "libraries": { }, + /// "projectFileDependencyGroups": { }, + /// "packageFolders": { }, + /// "project": { }, + /// "logs": [ ] + /// } + /// internal class Utf8JsonStreamLockFileConverter : IUtf8JsonStreamReaderConverter { private static readonly byte[] VersionPropertyName = Encoding.UTF8.GetBytes("version"); diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileItemConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileItemConverter.cs index 03ee8f05799..8fecfe8b0c0 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileItemConverter.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileItemConverter.cs @@ -9,6 +9,14 @@ namespace NuGet.ProjectModel /// /// A to allow read JSON into /// + /// + /// "path/to/the.dll": { + /// "property1": "val1", + /// "property2": 2 + /// "property3": true + /// "property4": false + /// } + /// internal class Utf8JsonStreamLockFileItemConverter : IUtf8JsonStreamReaderConverter where T : LockFileItem { private Func _lockFileItemCreator; diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileLibraryConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileLibraryConverter.cs index 96e146202f4..e79e463122b 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileLibraryConverter.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileLibraryConverter.cs @@ -10,6 +10,20 @@ namespace NuGet.ProjectModel /// /// A to allow read JSON into /// + /// + /// "PackageA/1.0.0": { + /// "sha512": "ASha512", + /// "type": "package", + /// "path": "C:\a\test\path", + /// "files": [ + /// "PackageA.nuspec", + /// "lib/netstandard2.0/PackageA.dll" + /// ], + /// "msbuildProject": "bar", + /// "servicable": true, + /// "hasTools": true, + /// } + /// internal class Utf8JsonStreamLockFileLibraryConverter : IUtf8JsonStreamReaderConverter { private static readonly byte[] Sha512PropertyName = Encoding.UTF8.GetBytes("sha512"); diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetConverter.cs index dcf6c05164f..e9bbdab9bf4 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetConverter.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetConverter.cs @@ -9,6 +9,11 @@ namespace NuGet.ProjectModel /// /// A to allow read JSON into /// + /// + /// "net45/win8": { + /// , + /// } + /// internal class Utf8JsonStreamLockFileTargetConverter : IUtf8JsonStreamReaderConverter { public LockFileTarget Read(ref Utf8JsonStreamReader reader) diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs index 5c67af2241b..aabd7d0b015 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs @@ -13,6 +13,43 @@ namespace NuGet.ProjectModel /// /// A to allow read JSON into /// + /// + /// "Lirbary/1.0.0": { + /// "type": "package", + /// "framework": ".NETCoreApp,Version=v6.0", + /// "dependencies": { + /// "Library.Name": "1.0.1", + /// "Parser.Json": "10.0.0", + /// }, + /// "frameworkAssemblies": [ + /// "System" + /// ], + /// "compile": { + /// , + /// }, + /// "runtime": { + /// , + /// }, + /// "resource": { + /// , + /// }, + /// "contentFiles": { + /// , + /// }, + /// "runtimeTargets": { + /// , + /// }, + /// "tools": { + /// , + /// }, + /// "embed": { + /// , + /// }, + /// "frameworkReferences": [ + /// "Framework1", + /// ] + /// } + /// internal class Utf8JsonStreamLockFileTargetLibraryConverter : IUtf8JsonStreamReaderConverter { private static readonly byte[] TypePropertyName = Encoding.UTF8.GetBytes("type"); diff --git a/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamProjectFileDependencyGroupConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamProjectFileDependencyGroupConverter.cs index 1b692e86f02..1ac6b18210d 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamProjectFileDependencyGroupConverter.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamProjectFileDependencyGroupConverter.cs @@ -9,6 +9,11 @@ namespace NuGet.ProjectModel /// /// A to allow reading JSON into /// + /// + /// "net45": [ + /// "Json.Parser (>= 1.0.1)", + /// ] + /// internal class Utf8JsonStreamProjectFileDependencyGroupConverter : IUtf8JsonStreamReaderConverter { public ProjectFileDependencyGroup Read(ref Utf8JsonStreamReader reader) From 1b294552873b6c1f1773c7f99fd3b14e52bb852f Mon Sep 17 00:00:00 2001 From: "Jonatan Gonzalez (HE/HIM) (from Dev Box)" Date: Wed, 17 Jan 2024 15:03:19 -0800 Subject: [PATCH 42/43] Fix references in comments --- .../LockFile/Utf8JsonStreamAssetsLogMessageConverter.cs | 4 ++-- .../LockFile/Utf8JsonStreamLockFileItemConverter.cs | 2 +- .../LockFile/Utf8JsonStreamLockFileLibraryConverter.cs | 2 +- .../LockFile/Utf8JsonStreamLockFileTargetConverter.cs | 2 +- .../LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs | 2 +- .../Utf8JsonStreamProjectFileDependencyGroupConverter.cs | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamAssetsLogMessageConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamAssetsLogMessageConverter.cs index ddd9bdb9ee6..bea4c4e3924 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamAssetsLogMessageConverter.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamAssetsLogMessageConverter.cs @@ -10,11 +10,11 @@ namespace NuGet.ProjectModel { /// - /// A to allow read JSON into + /// A to allow read JSON into /// /// /// { - /// "code": "", + /// "code": "", /// "level": "", /// "message": "test log message", /// "warningLevel": , diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileItemConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileItemConverter.cs index 8fecfe8b0c0..9a2ce569db0 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileItemConverter.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileItemConverter.cs @@ -7,7 +7,7 @@ namespace NuGet.ProjectModel { /// - /// A to allow read JSON into + /// A to allow read JSON into /// /// /// "path/to/the.dll": { diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileLibraryConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileLibraryConverter.cs index e79e463122b..43006240f4a 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileLibraryConverter.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileLibraryConverter.cs @@ -8,7 +8,7 @@ namespace NuGet.ProjectModel { /// - /// A to allow read JSON into + /// A to allow read JSON into /// /// /// "PackageA/1.0.0": { diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetConverter.cs index e9bbdab9bf4..1de4e0de65f 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetConverter.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetConverter.cs @@ -7,7 +7,7 @@ namespace NuGet.ProjectModel { /// - /// A to allow read JSON into + /// A to allow read JSON into /// /// /// "net45/win8": { diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs index aabd7d0b015..4f88c3d0dcc 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileTargetLibraryConverter.cs @@ -11,7 +11,7 @@ namespace NuGet.ProjectModel { /// - /// A to allow read JSON into + /// A to allow read JSON into /// /// /// "Lirbary/1.0.0": { diff --git a/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamProjectFileDependencyGroupConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamProjectFileDependencyGroupConverter.cs index 1ac6b18210d..b452497341a 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamProjectFileDependencyGroupConverter.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamProjectFileDependencyGroupConverter.cs @@ -7,7 +7,7 @@ namespace NuGet.ProjectModel { /// - /// A to allow reading JSON into + /// A to allow reading JSON into /// /// /// "net45": [ From 1877448e581fd2a4feb192d8bc453ae8786e2603 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonatan=20Gonzalez=20=F0=9F=90=B1=F0=9F=8C=B4?= Date: Mon, 22 Jan 2024 15:04:43 -0800 Subject: [PATCH 43/43] Fixes from PR --- .../JsonPackageSpecReader.cs | 2 +- .../NuGet.ProjectModel/JsonUtility.cs | 4 +- .../LockFile/LockFileFormat.cs | 2 +- ...f8JsonStreamIAssetsLogMessageConverter.cs} | 6 +-- .../Utf8JsonStreamLockFileConverter.cs | 5 ++- .../Utf8JsonReaderExtensions.cs | 2 +- .../Utf8JsonStreamReader.cs | 17 ++++--- .../DependencyTargetTests.cs | 6 +-- .../JsonPackageSpecReaderTests.cs | 43 +++++++++--------- .../LockFileParsingEnvironmentVariable.cs | 6 +-- .../Utf8JsonStreamReaderTests.cs | 44 +++++++++++++++++++ 11 files changed, 94 insertions(+), 43 deletions(-) rename src/NuGet.Core/NuGet.ProjectModel/LockFile/{Utf8JsonStreamAssetsLogMessageConverter.cs => Utf8JsonStreamIAssetsLogMessageConverter.cs} (96%) diff --git a/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.cs b/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.cs index 70074621110..7f651b40bc7 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/JsonPackageSpecReader.cs @@ -78,7 +78,7 @@ internal static PackageSpec GetPackageSpec(JsonTextReader jsonReader, string pac internal static PackageSpec GetPackageSpec(Stream stream, string name, string packageSpecPath, string snapshotValue, IEnvironmentVariableReader environmentVariableReader, bool bypassCache = false) { - if (!JsonUtility.UseNewstonSoftJsonForParsing(environmentVariableReader, bypassCache)) + if (!JsonUtility.UseNewtonsoftJsonForParsing(environmentVariableReader, bypassCache)) { return GetPackageSpecUtf8JsonStreamReader(stream, name, packageSpecPath, snapshotValue); } diff --git a/src/NuGet.Core/NuGet.ProjectModel/JsonUtility.cs b/src/NuGet.Core/NuGet.ProjectModel/JsonUtility.cs index 657a231c0ec..4de5162b05c 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/JsonUtility.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/JsonUtility.cs @@ -14,7 +14,7 @@ namespace NuGet.ProjectModel { internal static class JsonUtility { - internal const string NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING = nameof(NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING); + internal static string NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING = nameof(NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING); internal static bool? UseNewtonsoftJson = null; internal static readonly char[] PathSplitChars = new[] { LockFile.DirectorySeparatorChar }; @@ -60,7 +60,7 @@ internal static PackageDependency ReadPackageDependency(string property, JToken versionStr == null ? null : VersionRange.Parse(versionStr)); } - internal static bool UseNewstonSoftJsonForParsing(IEnvironmentVariableReader environmentVariableReader, bool bypassCache) + internal static bool UseNewtonsoftJsonForParsing(IEnvironmentVariableReader environmentVariableReader, bool bypassCache) { if (!UseNewtonsoftJson.HasValue || bypassCache) { diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/LockFileFormat.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/LockFileFormat.cs index cef14d45673..dbc8a0f310f 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LockFile/LockFileFormat.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/LockFileFormat.cs @@ -93,7 +93,7 @@ public LockFile Read(Stream stream, ILogger log, string path) internal LockFile Read(Stream stream, ILogger log, string path, IEnvironmentVariableReader environmentVariableReader, bool bypassCache = false) { - if (!JsonUtility.UseNewstonSoftJsonForParsing(environmentVariableReader, bypassCache)) + if (!JsonUtility.UseNewtonsoftJsonForParsing(environmentVariableReader, bypassCache)) { return Utf8JsonRead(stream, log, path); } diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamAssetsLogMessageConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamIAssetsLogMessageConverter.cs similarity index 96% rename from src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamAssetsLogMessageConverter.cs rename to src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamIAssetsLogMessageConverter.cs index bea4c4e3924..30ff0ad1c00 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamAssetsLogMessageConverter.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamIAssetsLogMessageConverter.cs @@ -10,7 +10,7 @@ namespace NuGet.ProjectModel { /// - /// A to allow read JSON into + /// A to allow read JSON into /// /// /// { @@ -29,7 +29,7 @@ namespace NuGet.ProjectModel /// ] /// } /// - internal class Utf8JsonStreamAssetsLogMessageConverter : IUtf8JsonStreamReaderConverter + internal class Utf8JsonStreamIAssetsLogMessageConverter : IUtf8JsonStreamReaderConverter { private static readonly byte[] LevelPropertyName = Encoding.UTF8.GetBytes(LogMessageProperties.LEVEL); private static readonly byte[] CodePropertyName = Encoding.UTF8.GetBytes(LogMessageProperties.CODE); @@ -43,7 +43,7 @@ internal class Utf8JsonStreamAssetsLogMessageConverter : IUtf8JsonStreamReaderCo private static readonly byte[] LibraryIdPropertyName = Encoding.UTF8.GetBytes(LogMessageProperties.LIBRARY_ID); private static readonly byte[] TargetGraphsPropertyName = Encoding.UTF8.GetBytes(LogMessageProperties.TARGET_GRAPHS); - public AssetsLogMessage Read(ref Utf8JsonStreamReader reader) + public IAssetsLogMessage Read(ref Utf8JsonStreamReader reader) { if (reader.TokenType != JsonTokenType.StartObject) { diff --git a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileConverter.cs b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileConverter.cs index 36517a13c40..07c9e8c0b23 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileConverter.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/LockFile/Utf8JsonStreamLockFileConverter.cs @@ -21,7 +21,7 @@ namespace NuGet.ProjectModel /// "projectFileDependencyGroups": { }, /// "packageFolders": { }, /// "project": { }, - /// "logs": [ ] + /// "logs": [ ] /// } /// internal class Utf8JsonStreamLockFileConverter : IUtf8JsonStreamReaderConverter @@ -109,7 +109,8 @@ public LockFile Read(ref Utf8JsonStreamReader reader) } else if (reader.ValueTextEquals(LogsPropertyName)) { - reader.ReadArrayOfObjects(lockFile.LogMessages, Utf8JsonReaderExtensions.AssetsLogMessageConverter); + reader.Read(); + lockFile.LogMessages = reader.ReadListOfObjects(Utf8JsonReaderExtensions.IAssetsLogMessageConverter); } else { diff --git a/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonReaderExtensions.cs b/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonReaderExtensions.cs index f0546fa61c0..bf53c40bba2 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonReaderExtensions.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonReaderExtensions.cs @@ -16,7 +16,7 @@ internal static class Utf8JsonReaderExtensions internal static readonly Utf8JsonStreamLockFileLibraryConverter LockFileLibraryConverter = new Utf8JsonStreamLockFileLibraryConverter(); internal static readonly Utf8JsonStreamLockFileTargetConverter LockFileTargetConverter = new Utf8JsonStreamLockFileTargetConverter(); internal static readonly Utf8JsonStreamProjectFileDependencyGroupConverter ProjectFileDepencencyGroupConverter = new Utf8JsonStreamProjectFileDependencyGroupConverter(); - internal static readonly Utf8JsonStreamAssetsLogMessageConverter AssetsLogMessageConverter = new Utf8JsonStreamAssetsLogMessageConverter(); + internal static readonly Utf8JsonStreamIAssetsLogMessageConverter IAssetsLogMessageConverter = new Utf8JsonStreamIAssetsLogMessageConverter(); internal static string ReadTokenAsString(this ref Utf8JsonReader reader) diff --git a/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamReader.cs b/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamReader.cs index 341e4efd82c..e92a2dc0c98 100644 --- a/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamReader.cs +++ b/src/NuGet.Core/NuGet.ProjectModel/Utf8JsonStreamReader.cs @@ -107,10 +107,14 @@ internal void Skip() internal IList ReadObjectAsList(IUtf8JsonStreamReaderConverter streamReaderConverter) { - if (TokenType != JsonTokenType.StartObject) + if (TokenType == JsonTokenType.Null) { return Array.Empty(); + } + if (TokenType != JsonTokenType.StartObject) + { + throw new JsonException($"Expected start object token but instead found '{TokenType}'"); } //We use JsonObjects for the arrays so we advance to the first property in the object which is the name/ver of the first library Read(); @@ -131,24 +135,27 @@ internal IList ReadObjectAsList(IUtf8JsonStreamReaderConverter streamRe return listObjects; } - internal void ReadArrayOfObjects(IList objectList, IUtf8JsonStreamReaderConverter streamReaderConverter) where T1 : T2 + internal IList ReadListOfObjects(IUtf8JsonStreamReaderConverter streamReaderConverter) { - if (objectList is null) + if (TokenType != JsonTokenType.StartArray) { - return; + throw new JsonException($"Expected start array token but instead found '{TokenType}'"); } - if (Read() && TokenType == JsonTokenType.StartArray) + IList objectList = null; + if (TokenType == JsonTokenType.StartArray) { while (Read() && TokenType != JsonTokenType.EndArray) { var convertedObject = streamReaderConverter.Read(ref this); if (convertedObject != null) { + objectList ??= new List(); objectList.Add(convertedObject); } } } + return objectList ?? Array.Empty(); } internal string ReadNextTokenAsString() diff --git a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/DependencyTargetTests.cs b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/DependencyTargetTests.cs index a23a8f44cf8..0fe32011470 100644 --- a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/DependencyTargetTests.cs +++ b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/DependencyTargetTests.cs @@ -171,7 +171,7 @@ public void DependencyTarget_UnknownValueFails(IEnvironmentVariableReader enviro Assert.Equal("Invalid dependency target value 'blah'.", exception.Message); Assert.EndsWith("project.json", exception.Path); - if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable("NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"))) + if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable(JsonUtility.NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING))) { Assert.Equal(5, exception.Line); } @@ -213,7 +213,7 @@ public void DependencyTarget_NonWhiteListValueFails(IEnvironmentVariableReader e Assert.Equal("Invalid dependency target value 'winmd'.", exception.Message); Assert.EndsWith("project.json", exception.Path); - if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable("NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"))) + if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable(JsonUtility.NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING))) { Assert.Equal(5, exception.Line); } @@ -255,7 +255,7 @@ public void DependencyTarget_MultipleValuesFail(IEnvironmentVariableReader envir Assert.Equal("Invalid dependency target value 'package,project'.", exception.Message); Assert.EndsWith("project.json", exception.Path); - if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable("NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"))) + if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable(JsonUtility.NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING))) { Assert.Equal(5, exception.Line); } diff --git a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/JsonPackageSpecReaderTests.cs b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/JsonPackageSpecReaderTests.cs index f803aed468e..f129e1098a3 100644 --- a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/JsonPackageSpecReaderTests.cs +++ b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/JsonPackageSpecReaderTests.cs @@ -197,7 +197,6 @@ public void PackageSpecReader_ExplicitIncludesOverrideTypePlatform(IEnvironmentV [Theory] [MemberData(nameof(TestEnvironmentVariableReader), "{}", MemberType = typeof(LockFileParsingEnvironmentVariable))] - [MemberData(nameof(TestEnvironmentVariableReader), "{}", MemberType = typeof(LockFileParsingEnvironmentVariable))] [MemberData(nameof(TestEnvironmentVariableReader), @"{ ""packOptions"": {} }", MemberType = typeof(LockFileParsingEnvironmentVariable))] @@ -1238,7 +1237,7 @@ public void GetPackageSpec_WhenDependenciesDependencyNameIsEmptyString_Throws(IE Assert.Equal("Unable to resolve dependency ''.", exception.Message); Assert.Null(exception.InnerException); - if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable("NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"))) + if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable(JsonUtility.NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING))) { Assert.Equal(1, exception.Line); Assert.Equal(21, exception.Column); @@ -1291,7 +1290,7 @@ public void GetPackageSpec_WhenDependenciesDependencyTargetIsUnsupported_Throws( Assert.Equal($"Invalid dependency target value '{target}'.", exception.Message); Assert.Null(exception.InnerException); - if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable("NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"))) + if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable(JsonUtility.NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING))) { Assert.Equal(1, exception.Line); // The position is after the target name, which is of variable length. @@ -1429,7 +1428,7 @@ public void GetPackageSpec_WhenDependenciesDependencyVersionValueIsInvalid_Throw FileFormatException exception = Assert.Throws(() => GetPackageSpec(json, environmentVariableReader)); - if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable("NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"))) + if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable(JsonUtility.NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING))) { Assert.Equal("Error reading '' at line 1 column 35 : 'b' is not a valid version string.", exception.Message); Assert.Equal(1, exception.Line); @@ -1462,7 +1461,7 @@ public void GetPackageSpec_WhenDependenciesDependencyTargetValueIsPackageAndVers Assert.IsType(exception.InnerException); Assert.Null(exception.InnerException.InnerException); - if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable("NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"))) + if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable(JsonUtility.NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING))) { Assert.Equal("Error reading '' at line 1 column 22 : Package dependencies must specify a version range.", exception.Message); Assert.Equal(1, exception.Line); @@ -1694,7 +1693,7 @@ public void GetPackageSpec_WhenFrameworksCentralPackageVersionsVersionPropertyNa Assert.IsType(exception.InnerException); Assert.Null(exception.InnerException.InnerException); - if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable("NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"))) + if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable(JsonUtility.NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING))) { Assert.Equal("Error reading '' at line 1 column 20 : Unable to resolve central version ''.", exception.Message); Assert.Equal(1, exception.Line); @@ -1718,7 +1717,7 @@ public void GetPackageSpec_WhenFrameworksCentralPackageVersionsVersionPropertyVa Assert.IsType(exception.InnerException); Assert.Null(exception.InnerException.InnerException); - if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable("NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"))) + if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable(JsonUtility.NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING))) { Assert.Equal("Error reading '' at line 1 column 20 : The version cannot be null or empty.", exception.Message); Assert.Equal(1, exception.Line); @@ -1798,7 +1797,7 @@ public void GetPackageSpec_WhenFrameworksDependenciesDependencyNameIsEmptyString FileFormatException exception = Assert.Throws(() => GetPackageSpec(json, environmentVariableReader)); - if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable("NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"))) + if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable(JsonUtility.NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING))) { Assert.Equal("Error reading '' at line 1 column 20 : Unable to resolve dependency ''.", exception.Message); Assert.Equal(1, exception.Line); @@ -1858,7 +1857,7 @@ public void GetPackageSpec_WhenFrameworksDependenciesDependencyTargetValueIsUnsu Assert.IsType(exception.InnerException); Assert.Null(exception.InnerException.InnerException); - if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable("NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"))) + if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable(JsonUtility.NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING))) { Assert.Equal($"Error reading '' at line 1 column 20 : Invalid dependency target value '{target}'.", exception.Message); Assert.Equal(1, exception.Line); @@ -1908,7 +1907,7 @@ public void GetPackageSpec_WhenFrameworksDependenciesDependencyValueIsArray_Thro Assert.IsType(exception.InnerException); Assert.Null(exception.InnerException.InnerException); - if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable("NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"))) + if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable(JsonUtility.NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING))) { Assert.Equal("Error reading '' at line 1 column 20 : Specified cast is not valid.", exception.Message); Assert.Equal(1, exception.Line); @@ -2009,7 +2008,7 @@ public void GetPackageSpec_WhenFrameworksDependenciesDependencyVersionValueIsInv Assert.IsType(exception.InnerException.InnerException); Assert.Null(exception.InnerException.InnerException.InnerException); - if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable("NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"))) + if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable(JsonUtility.NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING))) { Assert.Equal("Error reading '' at line 1 column 20 : Error reading '' at line 1 column 54 : 'c' is not a valid version string.", exception.Message); Assert.Equal(1, exception.Line); @@ -2046,7 +2045,7 @@ public void GetPackageSpec_WhenFrameworksDependenciesDependencyTargetValueIsPack Assert.IsType(exception.InnerException.InnerException); Assert.Null(exception.InnerException.InnerException.InnerException); - if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable("NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"))) + if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable(JsonUtility.NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING))) { Assert.Equal("Error reading '' at line 1 column 20 : Error reading '' at line 1 column 41 : Package dependencies must specify a version range.", exception.Message); Assert.Equal(1, exception.Line); @@ -2209,7 +2208,7 @@ public void GetPackageSpec_WhenFrameworksDownloadDependenciesDependencyNameIsAbs Assert.IsType(exception.InnerException); Assert.Null(exception.InnerException.InnerException); - if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable("NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"))) + if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable(JsonUtility.NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING))) { Assert.Equal("Error reading '' at line 1 column 20 : Unable to resolve downloadDependency ''.", exception.Message); Assert.Equal(1, exception.Line); @@ -2246,7 +2245,7 @@ public void GetPackageSpec_WhenFrameworksDownloadDependenciesDependencyVersionIs Assert.IsType(exception.InnerException); Assert.Null(exception.InnerException.InnerException); - if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable("NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"))) + if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable(JsonUtility.NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING))) { Assert.Equal("Error reading '' at line 1 column 20 : The version cannot be null or empty", exception.Message); Assert.Equal(1, exception.Line); @@ -2273,7 +2272,7 @@ public void GetPackageSpec_WhenFrameworksDownloadDependenciesDependencyVersionIs Assert.IsType(exception.InnerException.InnerException); Assert.Null(exception.InnerException.InnerException.InnerException); - if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable("NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"))) + if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable(JsonUtility.NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING))) { Assert.Equal($"Error reading '' at line 1 column 20 : Error reading '' at line 1 column {expectedColumn} : '{version}' is not a valid version string.", exception.Message); Assert.Equal(1, exception.Line); @@ -2385,7 +2384,7 @@ public void GetPackageSpec_WhenFrameworksFrameworkAssembliesDependencyTargetValu Assert.IsType(exception.InnerException.InnerException); Assert.Null(exception.InnerException.InnerException.InnerException); - if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable("NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"))) + if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable(JsonUtility.NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING))) { Assert.Equal("Error reading '' at line 1 column 20 : Error reading '' at line 1 column 48 : Package dependencies must specify a version range.", exception.Message); Assert.Equal(1, exception.Line); @@ -2452,7 +2451,7 @@ public void GetPackageSpec_WhenFrameworksFrameworkReferencesFrameworkNameIsEmpty Assert.IsType(exception.InnerException); Assert.Null(exception.InnerException.InnerException); - if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable("NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"))) + if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable(JsonUtility.NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING))) { Assert.Equal("Error reading '' at line 1 column 20 : Unable to resolve frameworkReference.", exception.Message); Assert.Equal(1, exception.Line); @@ -2575,7 +2574,7 @@ public void GetPackageSpec_WhenFrameworksImportsValueContainsInvalidValue_Throws Assert.IsType(exception.InnerException); Assert.Null(exception.InnerException.InnerException); - if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable("NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"))) + if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable(JsonUtility.NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING))) { Assert.Equal( $"Error reading '' at line 1 column 20 : Imports contains an invalid framework: '{expectedImport}' in 'project.json'.", @@ -2814,7 +2813,7 @@ public void GetPackageSpec_WhenPackOptionsPackageTypeIsInvalid_Throws(IEnvironme Assert.Null(exception.InnerException); Assert.Equal("The pack options package type must be a string or array of strings in 'project.json'.", exception.Message); - if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable("NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"))) + if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable(JsonUtility.NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING))) { Assert.Equal(1, exception.Line); Assert.Equal(expectedColumn, exception.Column); @@ -3717,7 +3716,7 @@ public void GetPackageSpec_WhenScriptsValueIsInvalid_Throws(IEnvironmentVariable Assert.Equal("The value of a script in 'project.json' can only be a string or an array of strings", exception.Message); Assert.Null(exception.InnerException); - if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable("NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"))) + if (string.Equals(bool.TrueString, environmentVariableReader.GetEnvironmentVariable(JsonUtility.NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING))) { Assert.Equal(1, exception.Line); Assert.Equal(17, exception.Column); @@ -3868,7 +3867,7 @@ public void PackageSpecReader_Read(IEnvironmentVariableReader environmentVariabl // Act var results = new List(); - if (environmentVariableReader.GetEnvironmentVariable("NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING").Equals(bool.FalseString, StringComparison.OrdinalIgnoreCase)) + if (environmentVariableReader.GetEnvironmentVariable(JsonUtility.NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING).Equals(bool.FalseString, StringComparison.OrdinalIgnoreCase)) { using Stream stream = new MemoryStream(Encoding.UTF8.GetBytes(json)); var reader = new Utf8JsonStreamReader(stream); @@ -3946,7 +3945,7 @@ public void PackageSpecReader_Malformed_Exception(IEnvironmentVariableReader env // Act var results = new List(); - if (environmentVariableReader.GetEnvironmentVariable("NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING").Equals(bool.FalseString, StringComparison.OrdinalIgnoreCase)) + if (environmentVariableReader.GetEnvironmentVariable(JsonUtility.NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING).Equals(bool.FalseString, StringComparison.OrdinalIgnoreCase)) { Assert.ThrowsAny(() => { diff --git a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileParsingEnvironmentVariable.cs b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileParsingEnvironmentVariable.cs index b29c06de105..6224637214d 100644 --- a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileParsingEnvironmentVariable.cs +++ b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/LockFileParsingEnvironmentVariable.cs @@ -6,7 +6,7 @@ namespace NuGet.ProjectModel { - public class LockFileParsingEnvironmentVariable + public static class LockFileParsingEnvironmentVariable { public static IEnumerable TestEnvironmentVariableReader() { @@ -34,14 +34,14 @@ private static IEnumerable GetTestEnvironmentVariableReader(params obj new TestEnvironmentVariableReader( new Dictionary() { - ["NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"] = bool.TrueString + [JsonUtility.NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING] = bool.TrueString }, "NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING: true") }; var UseNjForFileFalse = new List { new TestEnvironmentVariableReader( new Dictionary() { - ["NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING"] = bool.FalseString + [JsonUtility.NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING] = bool.FalseString }, "NUGET_EXPERIMENTAL_USE_NJ_FOR_FILE_PARSING: false") }; diff --git a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/Utf8JsonStreamReaderTests.cs b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/Utf8JsonStreamReaderTests.cs index a94b0a4fedf..e7c7963431e 100644 --- a/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/Utf8JsonStreamReaderTests.cs +++ b/test/NuGet.Core.Tests/NuGet.ProjectModel.Test/Utf8JsonStreamReaderTests.cs @@ -797,6 +797,50 @@ public void ReadNextStringOrArrayOfStringsAsReadOnlyList_WhenValueIsArrayOfStrin } } + [Fact] + public void ReadObjectAsList_WithValidJson_ReturnsValue() + { + var json = "{ \"a\": { \"property1\": \"1\" },\"b\": { \"property1\": \"1\" }, \"c\": { \"property1\": \"1\" }}"; + var encodedBytes = Encoding.UTF8.GetBytes(json); + using (var stream = new MemoryStream(encodedBytes)) + using (var reader = new Utf8JsonStreamReader(stream)) + { + var results = reader.ReadObjectAsList(Utf8JsonReaderExtensions.LockFileItemConverter); + Assert.Equal(3, results.Count); + } + } + + [Theory] + [InlineData("{}")] + [InlineData("null")] + public void ReadObjectAsList_WithEmptyValues_ReturnsEmptyArray(string json) + { + var encodedBytes = Encoding.UTF8.GetBytes(json); + using (var stream = new MemoryStream(encodedBytes)) + using (var reader = new Utf8JsonStreamReader(stream)) + { + var results = reader.ReadObjectAsList(Utf8JsonReaderExtensions.LockFileItemConverter); + Assert.Equal(0, results.Count); + Assert.IsType(Array.Empty().GetType(), results); + } + } + + [Fact] + public void ReadObjectAsList_WithInvalidValue_ThrowsException() + { + var json = "\"a\": { \"property1\": \"1\" }"; + + var encodedBytes = Encoding.UTF8.GetBytes(json); + Assert.Throws(() => + { + using (var stream = new MemoryStream(encodedBytes)) + using (var reader = new Utf8JsonStreamReader(stream)) + { + reader.ReadObjectAsList(Utf8JsonReaderExtensions.LockFileItemConverter); + } + }); + } + [Fact] public void ReadStringArrayAsReadOnlyListFromArrayStart_WhenValuesAreConvertibleToString_ReturnsReadOnlyList() {