diff --git a/src/NuGetUtility/ReferencedPackagesReader/ReferencedPackageReader.cs b/src/NuGetUtility/ReferencedPackagesReader/ReferencedPackageReader.cs index 1a4cec64..40764c3b 100644 --- a/src/NuGetUtility/ReferencedPackagesReader/ReferencedPackageReader.cs +++ b/src/NuGetUtility/ReferencedPackagesReader/ReferencedPackageReader.cs @@ -119,6 +119,11 @@ private bool TryLoadAssetsFile(IProject project, [NotNullWhen(true)] out ILockFi } assetsFile = _lockFileFactory.GetFromFile(assetsPath); + if (assetsFile.TryGetErrors(out string[] errors)) + { + throw new ReferencedPackageReaderException($"Project assets file for project {project.FullPath} contains errors:{Environment.NewLine}{string.Join(Environment.NewLine, errors)}"); + } + if (!assetsFile.PackageSpec.IsValid() || !(assetsFile.Targets?.Any() ?? false)) { throw new ReferencedPackageReaderException( diff --git a/src/NuGetUtility/Wrapper/NuGetWrapper/ProjectModel/ILockFile.cs b/src/NuGetUtility/Wrapper/NuGetWrapper/ProjectModel/ILockFile.cs index 0012b7e0..50f582ed 100644 --- a/src/NuGetUtility/Wrapper/NuGetWrapper/ProjectModel/ILockFile.cs +++ b/src/NuGetUtility/Wrapper/NuGetWrapper/ProjectModel/ILockFile.cs @@ -5,6 +5,7 @@ namespace NuGetUtility.Wrapper.NuGetWrapper.ProjectModel { public interface ILockFile { + bool TryGetErrors(out string[] errors); IPackageSpec PackageSpec { get; } IEnumerable? Targets { get; } } diff --git a/src/NuGetUtility/Wrapper/NuGetWrapper/ProjectModel/WrappedLockFile.cs b/src/NuGetUtility/Wrapper/NuGetWrapper/ProjectModel/WrappedLockFile.cs index 3734a61e..b1d06559 100644 --- a/src/NuGetUtility/Wrapper/NuGetWrapper/ProjectModel/WrappedLockFile.cs +++ b/src/NuGetUtility/Wrapper/NuGetWrapper/ProjectModel/WrappedLockFile.cs @@ -18,5 +18,12 @@ public WrappedLockFile(LockFile file) public IPackageSpec PackageSpec => new WrappedPackageSpec(_file.PackageSpec); public IEnumerable? Targets => _file.Targets?.Select(t => new WrappedLockFileTarget(t)); + + public bool TryGetErrors(out string[] errors) + { + IAssetsLogMessage[] fileErrors = _file.LogMessages.Where(l => l.Level == NuGet.Common.LogLevel.Error).ToArray(); + errors = fileErrors.Select(e => $"[{e.Code}] {e.Message}").ToArray(); + return errors.Length > 0; + } } } diff --git a/tests/NuGetUtility.Test/ReferencedPackagesReader/ReferencedPackageReaderTest.cs b/tests/NuGetUtility.Test/ReferencedPackagesReader/ReferencedPackageReaderTest.cs index 40009459..2dedc2be 100644 --- a/tests/NuGetUtility.Test/ReferencedPackagesReader/ReferencedPackageReaderTest.cs +++ b/tests/NuGetUtility.Test/ReferencedPackagesReader/ReferencedPackageReaderTest.cs @@ -120,6 +120,24 @@ public void SetUp() private IDictionary _referencedPackagesForFramework = null!; private IDictionary _directlyReferencedPackagesForFramework = null!; + [Test] + public void GetInstalledPackages_Should_ThrowReferencedPackageReaderException_If_AssetsFileContainsErrors( + [Values] bool includeTransitive) + { + string[] errors = _fixture.CreateMany().ToArray(); + _lockFileMock.TryGetErrors(out Arg.Any()).Returns(args => + { + args[0] = errors; + return true; + }); + _projectMock.FullPath.Returns(_projectPath); + + ReferencedPackageReaderException? exception = Assert.Throws(() => + _uut.GetInstalledPackages(_projectPath, includeTransitive)); + + Assert.That(exception!.Message, Is.EqualTo($"Project assets file for project {_projectPath} contains errors:{Environment.NewLine}{string.Join(Environment.NewLine, errors)}")); + } + [Test] public void GetInstalledPackages_Should_ThrowReferencedPackageReaderException_If_PackageSpecificationIsInvalid( [Values] bool includeTransitive)