From b2aae7546a3808730c7c9b74f761e8b38a9c3132 Mon Sep 17 00:00:00 2001 From: Mihai Codoban Date: Thu, 24 Mar 2016 21:52:46 -0700 Subject: [PATCH] Add lock file patching tests --- .../project.fragment.lock.json | 25 +++++ .../invalid_missing-exports/project.json | 22 ++++ .../invalid_missing-exports/project.lock.json | 61 +++++++++++ .../project.fragment.lock.json | 35 ++++++ .../project.json | 22 ++++ .../project.lock.json | 61 +++++++++++ .../invalid_nofragment/project.json | 22 ++++ .../invalid_nofragment/project.lock.json | 61 +++++++++++ .../valid/project.fragment.lock.json | 35 ++++++ .../ExportFileSamples/valid/project.json | 22 ++++ .../ExportFileSamples/valid/project.lock.json | 61 +++++++++++ .../Graph/LockFilePatcher.cs | 2 - .../Graph/LockFileReader.cs | 2 +- .../LockFilePatchingTests.cs | 101 ++++++++++++++++++ 14 files changed, 529 insertions(+), 3 deletions(-) create mode 100644 TestAssets/LockFileSamples/ExportFileSamples/invalid_missing-exports/project.fragment.lock.json create mode 100644 TestAssets/LockFileSamples/ExportFileSamples/invalid_missing-exports/project.json create mode 100644 TestAssets/LockFileSamples/ExportFileSamples/invalid_missing-exports/project.lock.json create mode 100644 TestAssets/LockFileSamples/ExportFileSamples/invalid_missmatching-versions/project.fragment.lock.json create mode 100644 TestAssets/LockFileSamples/ExportFileSamples/invalid_missmatching-versions/project.json create mode 100644 TestAssets/LockFileSamples/ExportFileSamples/invalid_missmatching-versions/project.lock.json create mode 100644 TestAssets/LockFileSamples/ExportFileSamples/invalid_nofragment/project.json create mode 100644 TestAssets/LockFileSamples/ExportFileSamples/invalid_nofragment/project.lock.json create mode 100644 TestAssets/LockFileSamples/ExportFileSamples/valid/project.fragment.lock.json create mode 100644 TestAssets/LockFileSamples/ExportFileSamples/valid/project.json create mode 100644 TestAssets/LockFileSamples/ExportFileSamples/valid/project.lock.json create mode 100644 test/Microsoft.DotNet.ProjectModel.Tests/LockFilePatchingTests.cs diff --git a/TestAssets/LockFileSamples/ExportFileSamples/invalid_missing-exports/project.fragment.lock.json b/TestAssets/LockFileSamples/ExportFileSamples/invalid_missing-exports/project.fragment.lock.json new file mode 100644 index 000000000..d803c7d2c --- /dev/null +++ b/TestAssets/LockFileSamples/ExportFileSamples/invalid_missing-exports/project.fragment.lock.json @@ -0,0 +1,25 @@ +{ + "version": 2, + "exports": { + "ClassLibrary2/1.0.0": { + "type": "project", + "framework": ".NETFramework,Version=v4.6", + "compile": { + "bin/Debug/ClassLibrary2.dll": {} + }, + "runtime": { + "bin/Debug/ClassLibrary2.dll": {} + } + }, + "ClassLibrary3/1.0.0": { + "type": "project", + "framework": ".NETFramework,Version=v4.6", + "compile": { + "bin/Debug/ClassLibrary3.dll": {} + }, + "runtime": { + "bin/Debug/ClassLibrary3.dll": {} + } + } + } +} \ No newline at end of file diff --git a/TestAssets/LockFileSamples/ExportFileSamples/invalid_missing-exports/project.json b/TestAssets/LockFileSamples/ExportFileSamples/invalid_missing-exports/project.json new file mode 100644 index 000000000..1323d5f29 --- /dev/null +++ b/TestAssets/LockFileSamples/ExportFileSamples/invalid_missing-exports/project.json @@ -0,0 +1,22 @@ +{ + "version": "1.0.0-*", + "compilationOptions": { + "emitEntryPoint": true + }, + + "frameworks": { + "net46": { + "dependencies": { + "ClassLibrary1": { + "target": "project" + }, + "ClassLibrary2": { + "target": "project" + }, + "ClassLibrary3": { + "target": "project" + } + } + } + } +} diff --git a/TestAssets/LockFileSamples/ExportFileSamples/invalid_missing-exports/project.lock.json b/TestAssets/LockFileSamples/ExportFileSamples/invalid_missing-exports/project.lock.json new file mode 100644 index 000000000..244c3771b --- /dev/null +++ b/TestAssets/LockFileSamples/ExportFileSamples/invalid_missing-exports/project.lock.json @@ -0,0 +1,61 @@ +{ + "locked": false, + "version": 2, + "targets": { + ".NETFramework,Version=v4.6": { + "ClassLibrary1/1.0.0": { + "type": "project" + }, + "ClassLibrary2/1.0.0": { + "type": "project" + }, + "ClassLibrary3/1.0.0": { + "type": "project" + } + }, + ".NETFramework,Version=v4.6/win7-x64": { + "ClassLibrary1/1.0.0": { + "type": "project" + }, + "ClassLibrary2/1.0.0": { + "type": "project" + }, + "ClassLibrary3/1.0.0": { + "type": "project" + } + }, + ".NETFramework,Version=v4.6/win7-x86": { + "ClassLibrary1/1.0.0": { + "type": "project" + }, + "ClassLibrary2/1.0.0": { + "type": "project" + }, + "ClassLibrary3/1.0.0": { + "type": "project" + } + } + }, + "libraries": { + "ClassLibrary1/1.0.0": { + "type": "project", + "msbuildProject": "../../ClassLibrary1/ClassLibrary1.csproj" + }, + "ClassLibrary2/1.0.0": { + "type": "project", + "msbuildProject": "../../ClassLibrary2/ClassLibrary2.csproj" + }, + "ClassLibrary3/1.0.0": { + "type": "project", + "msbuildProject": "../../ClassLibrary3/ClassLibrary3.csproj" + } + }, + "projectFileDependencyGroups": { + "": [], + ".NETFramework,Version=v4.6": [ + "ClassLibrary1", + "ClassLibrary2", + "ClassLibrary3" + ] + } +} \ No newline at end of file diff --git a/TestAssets/LockFileSamples/ExportFileSamples/invalid_missmatching-versions/project.fragment.lock.json b/TestAssets/LockFileSamples/ExportFileSamples/invalid_missmatching-versions/project.fragment.lock.json new file mode 100644 index 000000000..7b6738e49 --- /dev/null +++ b/TestAssets/LockFileSamples/ExportFileSamples/invalid_missmatching-versions/project.fragment.lock.json @@ -0,0 +1,35 @@ +{ + "version": 3, + "exports": { + "ClassLibrary1/1.0.0": { + "type": "project", + "framework": ".NETFramework,Version=v4.5.2", + "compile": { + "bin/Debug/ClassLibrary1.dll": {} + }, + "runtime": { + "bin/Debug/ClassLibrary1.dll": {} + } + }, + "ClassLibrary2/1.0.0": { + "type": "project", + "framework": ".NETFramework,Version=v4.6", + "compile": { + "bin/Debug/ClassLibrary2.dll": {} + }, + "runtime": { + "bin/Debug/ClassLibrary2.dll": {} + } + }, + "ClassLibrary3/1.0.0": { + "type": "project", + "framework": ".NETFramework,Version=v4.6", + "compile": { + "bin/Debug/ClassLibrary3.dll": {} + }, + "runtime": { + "bin/Debug/ClassLibrary3.dll": {} + } + } + } +} \ No newline at end of file diff --git a/TestAssets/LockFileSamples/ExportFileSamples/invalid_missmatching-versions/project.json b/TestAssets/LockFileSamples/ExportFileSamples/invalid_missmatching-versions/project.json new file mode 100644 index 000000000..1323d5f29 --- /dev/null +++ b/TestAssets/LockFileSamples/ExportFileSamples/invalid_missmatching-versions/project.json @@ -0,0 +1,22 @@ +{ + "version": "1.0.0-*", + "compilationOptions": { + "emitEntryPoint": true + }, + + "frameworks": { + "net46": { + "dependencies": { + "ClassLibrary1": { + "target": "project" + }, + "ClassLibrary2": { + "target": "project" + }, + "ClassLibrary3": { + "target": "project" + } + } + } + } +} diff --git a/TestAssets/LockFileSamples/ExportFileSamples/invalid_missmatching-versions/project.lock.json b/TestAssets/LockFileSamples/ExportFileSamples/invalid_missmatching-versions/project.lock.json new file mode 100644 index 000000000..244c3771b --- /dev/null +++ b/TestAssets/LockFileSamples/ExportFileSamples/invalid_missmatching-versions/project.lock.json @@ -0,0 +1,61 @@ +{ + "locked": false, + "version": 2, + "targets": { + ".NETFramework,Version=v4.6": { + "ClassLibrary1/1.0.0": { + "type": "project" + }, + "ClassLibrary2/1.0.0": { + "type": "project" + }, + "ClassLibrary3/1.0.0": { + "type": "project" + } + }, + ".NETFramework,Version=v4.6/win7-x64": { + "ClassLibrary1/1.0.0": { + "type": "project" + }, + "ClassLibrary2/1.0.0": { + "type": "project" + }, + "ClassLibrary3/1.0.0": { + "type": "project" + } + }, + ".NETFramework,Version=v4.6/win7-x86": { + "ClassLibrary1/1.0.0": { + "type": "project" + }, + "ClassLibrary2/1.0.0": { + "type": "project" + }, + "ClassLibrary3/1.0.0": { + "type": "project" + } + } + }, + "libraries": { + "ClassLibrary1/1.0.0": { + "type": "project", + "msbuildProject": "../../ClassLibrary1/ClassLibrary1.csproj" + }, + "ClassLibrary2/1.0.0": { + "type": "project", + "msbuildProject": "../../ClassLibrary2/ClassLibrary2.csproj" + }, + "ClassLibrary3/1.0.0": { + "type": "project", + "msbuildProject": "../../ClassLibrary3/ClassLibrary3.csproj" + } + }, + "projectFileDependencyGroups": { + "": [], + ".NETFramework,Version=v4.6": [ + "ClassLibrary1", + "ClassLibrary2", + "ClassLibrary3" + ] + } +} \ No newline at end of file diff --git a/TestAssets/LockFileSamples/ExportFileSamples/invalid_nofragment/project.json b/TestAssets/LockFileSamples/ExportFileSamples/invalid_nofragment/project.json new file mode 100644 index 000000000..1323d5f29 --- /dev/null +++ b/TestAssets/LockFileSamples/ExportFileSamples/invalid_nofragment/project.json @@ -0,0 +1,22 @@ +{ + "version": "1.0.0-*", + "compilationOptions": { + "emitEntryPoint": true + }, + + "frameworks": { + "net46": { + "dependencies": { + "ClassLibrary1": { + "target": "project" + }, + "ClassLibrary2": { + "target": "project" + }, + "ClassLibrary3": { + "target": "project" + } + } + } + } +} diff --git a/TestAssets/LockFileSamples/ExportFileSamples/invalid_nofragment/project.lock.json b/TestAssets/LockFileSamples/ExportFileSamples/invalid_nofragment/project.lock.json new file mode 100644 index 000000000..244c3771b --- /dev/null +++ b/TestAssets/LockFileSamples/ExportFileSamples/invalid_nofragment/project.lock.json @@ -0,0 +1,61 @@ +{ + "locked": false, + "version": 2, + "targets": { + ".NETFramework,Version=v4.6": { + "ClassLibrary1/1.0.0": { + "type": "project" + }, + "ClassLibrary2/1.0.0": { + "type": "project" + }, + "ClassLibrary3/1.0.0": { + "type": "project" + } + }, + ".NETFramework,Version=v4.6/win7-x64": { + "ClassLibrary1/1.0.0": { + "type": "project" + }, + "ClassLibrary2/1.0.0": { + "type": "project" + }, + "ClassLibrary3/1.0.0": { + "type": "project" + } + }, + ".NETFramework,Version=v4.6/win7-x86": { + "ClassLibrary1/1.0.0": { + "type": "project" + }, + "ClassLibrary2/1.0.0": { + "type": "project" + }, + "ClassLibrary3/1.0.0": { + "type": "project" + } + } + }, + "libraries": { + "ClassLibrary1/1.0.0": { + "type": "project", + "msbuildProject": "../../ClassLibrary1/ClassLibrary1.csproj" + }, + "ClassLibrary2/1.0.0": { + "type": "project", + "msbuildProject": "../../ClassLibrary2/ClassLibrary2.csproj" + }, + "ClassLibrary3/1.0.0": { + "type": "project", + "msbuildProject": "../../ClassLibrary3/ClassLibrary3.csproj" + } + }, + "projectFileDependencyGroups": { + "": [], + ".NETFramework,Version=v4.6": [ + "ClassLibrary1", + "ClassLibrary2", + "ClassLibrary3" + ] + } +} \ No newline at end of file diff --git a/TestAssets/LockFileSamples/ExportFileSamples/valid/project.fragment.lock.json b/TestAssets/LockFileSamples/ExportFileSamples/valid/project.fragment.lock.json new file mode 100644 index 000000000..415fc75d8 --- /dev/null +++ b/TestAssets/LockFileSamples/ExportFileSamples/valid/project.fragment.lock.json @@ -0,0 +1,35 @@ +{ + "version": 2, + "exports": { + "ClassLibrary1/1.0.0": { + "type": "project", + "framework": ".NETFramework,Version=v4.5.2", + "compile": { + "bin/Debug/ClassLibrary1.dll": {} + }, + "runtime": { + "bin/Debug/ClassLibrary1.dll": {} + } + }, + "ClassLibrary2/1.0.0": { + "type": "project", + "framework": ".NETFramework,Version=v4.6", + "compile": { + "bin/Debug/ClassLibrary2.dll": {} + }, + "runtime": { + "bin/Debug/ClassLibrary2.dll": {} + } + }, + "ClassLibrary3/1.0.0": { + "type": "project", + "framework": ".NETFramework,Version=v4.6", + "compile": { + "bin/Debug/ClassLibrary3.dll": {} + }, + "runtime": { + "bin/Debug/ClassLibrary3.dll": {} + } + } + } +} \ No newline at end of file diff --git a/TestAssets/LockFileSamples/ExportFileSamples/valid/project.json b/TestAssets/LockFileSamples/ExportFileSamples/valid/project.json new file mode 100644 index 000000000..1323d5f29 --- /dev/null +++ b/TestAssets/LockFileSamples/ExportFileSamples/valid/project.json @@ -0,0 +1,22 @@ +{ + "version": "1.0.0-*", + "compilationOptions": { + "emitEntryPoint": true + }, + + "frameworks": { + "net46": { + "dependencies": { + "ClassLibrary1": { + "target": "project" + }, + "ClassLibrary2": { + "target": "project" + }, + "ClassLibrary3": { + "target": "project" + } + } + } + } +} diff --git a/TestAssets/LockFileSamples/ExportFileSamples/valid/project.lock.json b/TestAssets/LockFileSamples/ExportFileSamples/valid/project.lock.json new file mode 100644 index 000000000..244c3771b --- /dev/null +++ b/TestAssets/LockFileSamples/ExportFileSamples/valid/project.lock.json @@ -0,0 +1,61 @@ +{ + "locked": false, + "version": 2, + "targets": { + ".NETFramework,Version=v4.6": { + "ClassLibrary1/1.0.0": { + "type": "project" + }, + "ClassLibrary2/1.0.0": { + "type": "project" + }, + "ClassLibrary3/1.0.0": { + "type": "project" + } + }, + ".NETFramework,Version=v4.6/win7-x64": { + "ClassLibrary1/1.0.0": { + "type": "project" + }, + "ClassLibrary2/1.0.0": { + "type": "project" + }, + "ClassLibrary3/1.0.0": { + "type": "project" + } + }, + ".NETFramework,Version=v4.6/win7-x86": { + "ClassLibrary1/1.0.0": { + "type": "project" + }, + "ClassLibrary2/1.0.0": { + "type": "project" + }, + "ClassLibrary3/1.0.0": { + "type": "project" + } + } + }, + "libraries": { + "ClassLibrary1/1.0.0": { + "type": "project", + "msbuildProject": "../../ClassLibrary1/ClassLibrary1.csproj" + }, + "ClassLibrary2/1.0.0": { + "type": "project", + "msbuildProject": "../../ClassLibrary2/ClassLibrary2.csproj" + }, + "ClassLibrary3/1.0.0": { + "type": "project", + "msbuildProject": "../../ClassLibrary3/ClassLibrary3.csproj" + } + }, + "projectFileDependencyGroups": { + "": [], + ".NETFramework,Version=v4.6": [ + "ClassLibrary1", + "ClassLibrary2", + "ClassLibrary3" + ] + } +} \ No newline at end of file diff --git a/src/Microsoft.DotNet.ProjectModel/Graph/LockFilePatcher.cs b/src/Microsoft.DotNet.ProjectModel/Graph/LockFilePatcher.cs index cecc63974..1754890ea 100644 --- a/src/Microsoft.DotNet.ProjectModel/Graph/LockFilePatcher.cs +++ b/src/Microsoft.DotNet.ProjectModel/Graph/LockFilePatcher.cs @@ -84,8 +84,6 @@ namespace Microsoft.DotNet.ProjectModel.Graph libraryToPatch.RuntimeAssemblies = export.RuntimeAssemblies; } - - private static IList GetTargetsForLibrary(LockFile lockFile, LockFileProjectLibrary library) { return lockFile.Targets diff --git a/src/Microsoft.DotNet.ProjectModel/Graph/LockFileReader.cs b/src/Microsoft.DotNet.ProjectModel/Graph/LockFileReader.cs index b3306e500..84fea0ada 100644 --- a/src/Microsoft.DotNet.ProjectModel/Graph/LockFileReader.cs +++ b/src/Microsoft.DotNet.ProjectModel/Graph/LockFileReader.cs @@ -61,7 +61,7 @@ namespace Microsoft.DotNet.ProjectModel.Graph return lockFile; } - catch (LockFilePatchingException exception) + catch (LockFilePatchingException) { throw; } diff --git a/test/Microsoft.DotNet.ProjectModel.Tests/LockFilePatchingTests.cs b/test/Microsoft.DotNet.ProjectModel.Tests/LockFilePatchingTests.cs new file mode 100644 index 000000000..35eea7c4d --- /dev/null +++ b/test/Microsoft.DotNet.ProjectModel.Tests/LockFilePatchingTests.cs @@ -0,0 +1,101 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.IO; +using System.Linq; +using FluentAssertions; +using Xunit; +using Microsoft.DotNet.ProjectModel.Graph; +using Microsoft.DotNet.Tools.Test.Utilities; + +namespace Microsoft.DotNet.ProjectModel.Tests +{ + public class LockFilePatchingTests : TestBase + { + + private string ExportFilesRoot=> Path.Combine(RepoRoot, "TestAssets", "LockFileSamples", "ExportFileSamples"); + + [Fact] + public void TestValidPatching() + { + var lockFilePath = GetLockFilePath("valid"); + var lockFile = LockFileReader.Read(lockFilePath); + + var exportFile = lockFile.ExportFile; + + exportFile.Should().NotBeNull(); + exportFile.Exports.Count.Should().Be(3); + exportFile.Exports.Should().OnlyHaveUniqueItems(); + + // check export structure + for (int i = 0; i < 3; i++) + { + var export = exportFile.Exports.ToList().ElementAt(i); + + export.TargetFramework.Should().NotBeNull(); + + AssertTargetLibrary(i + 1, export); + } + + lockFile.Targets.Count.Should().Be(3); + + // check lock file structure is similar to export structure + foreach (var target in lockFile.Targets) + { + target.Libraries.Count.Should().Be(3); + + for (int i = 0; i < 3; i++) + { + var targetLibrary = target.Libraries.ElementAt(i); + AssertTargetLibrary(i + 1, targetLibrary); + } + } + } + + [Fact] + public void TestMissingExportFileThrows() + { + var lockFilePath = GetLockFilePath("invalid_nofragment"); + + Assert.Throws(() => LockFileReader.Read(lockFilePath)); + } + + [Fact] + public void TestMissingExportsThrow() + { + var lockFilePath = GetLockFilePath("invalid_missing-exports"); + + Assert.Throws(() => LockFileReader.Read(lockFilePath)); + } + + [Fact] + public void TestMissmatchingFileVersionsThrows() + { + var lockFilePath = GetLockFilePath("invalid_missmatching-versions"); + + Assert.Throws(() => LockFileReader.Read(lockFilePath)); + } + + private static void AssertTargetLibrary(int i, LockFileTargetLibrary export) + { + export.Type.Should().Be("project"); + + export.Name.Should().Be("ClassLibrary" + i); + export.Version.ToNormalizedString().Should().Be("1.0.0"); + + var dll = $"bin/Debug/ClassLibrary{i}.dll"; + dll = dll.Replace('/', Path.DirectorySeparatorChar); + + export.CompileTimeAssemblies.Count.Should().Be(1); + export.CompileTimeAssemblies.ElementAt(0).Path.Should().Be(dll); + + export.RuntimeAssemblies.Count.Should().Be(1); + export.RuntimeAssemblies.ElementAt(0).Path.Should().Be(dll); + } + + private string GetLockFilePath(string exportSample) + { + return Path.Combine(ExportFilesRoot, exportSample, "project.lock.json"); + } + } +}