public void GenerateNuSpecForStub() { var pkg = m_packageGenerator.AnalyzePackageStub(s_packagesOnConfig); var spec = new NugetSpecGenerator(m_context.PathTable, pkg).CreateScriptSourceFile(pkg); var text = spec.ToDisplayStringV2(); m_output.WriteLine(text); string expectedSpec = @"import {Transformer} from ""Sdk.Transformers""; export declare const qualifier: { targetFramework: ""net10"" | ""net11"" | ""net20"" | ""net35"" | ""net40"" | ""net45"" | ""net451"" | ""net452"" | ""net46"" | ""net461"" | ""net462"" | ""net472"" | ""netstandard1.0"" | ""netstandard1.1"" | ""netstandard1.2"" | ""netstandard1.3"" | ""netstandard1.4"" | ""netstandard1.5"" | ""netstandard1.6"" | ""netstandard2.0"" | ""netcoreapp2.0"" | ""netcoreapp2.1"" | ""netcoreapp2.2"" | ""netcoreapp3.0"" | ""netcoreapp3.1"" | ""netstandard2.1"", targetRuntime: ""win-x64"" | ""osx-x64"" | ""linux-x64"", }; const packageRoot = Contents.packageRoot; namespace Contents { export declare const qualifier: { }; export const packageRoot = d`../../../pkgs/TestPkgStub.1.999`; @@public export const all: StaticDirectory = Transformer.sealDirectory(packageRoot, []); } @@public export const pkg: NugetPackage = {contents: Contents.all, dependencies: []};"; XAssert.ArrayEqual(SplitToLines(expectedSpec), SplitToLines(text)); }
public void TestNuget451() { // Perform a random sample for some target framework moniker scenarios. Otherwise there are too many combinations. // This just guarantees a basic functionality of the moniker management and spec generator functionality. var stringTable = new PathTable().StringTable; var monikers = new NugetFrameworkMonikers(stringTable); // Public member Assert.Equal("net451", monikers.Net451.ToString(stringTable)); Assert.Equal("net452", monikers.Net452.ToString(stringTable)); // Is well known Assert.True(monikers.WellknownMonikers.Contains(monikers.Net451)); // 4.5 is compatible with 4.5.1 and newer monikers, not older ones! var analyzedPackage = m_packageGenerator.AnalyzePackage( @"<?xml version='1.0' encoding='utf-8'?> <package xmlns='http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd'> <metadata> <id>MyPkg</id> <version>1.999</version> <dependencies> <group targetFramework='.NETFramework4.5'> <dependency id='System.Collections' version='4.0.11' /> <dependency id='System.Collections.Concurrent' version='4.0.12' /> </group> </dependencies> </metadata> </package>", s_packagesOnConfig, new string[] { "lib/net45/my.dll" }); List <PathAtom> compatibleTfms = new List <PathAtom>(); NugetSpecGenerator.FindAllCompatibleFrameworkMonikers(analyzedPackage, (List <PathAtom> m) => compatibleTfms.AddRange(m), m_monikers.FullFrameworkVersionHistory, m_monikers.NetCoreVersionHistory); Assert.False(compatibleTfms.Contains(m_monikers.Net40)); Assert.True(compatibleTfms.Contains(m_monikers.Net45)); Assert.True(compatibleTfms.Contains(m_monikers.Net451)); Assert.True(compatibleTfms.Contains(m_monikers.Net472)); // Mapping tests Assert.Equal(monikers.Net451, monikers.TargetFrameworkNameToMoniker[".NETFramework4.5.1"]); }
public void GenerateNuSpec() { var pkg = m_packageGenerator.AnalyzePackage( @"<?xml version='1.0' encoding='utf-8'?> <package xmlns='http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd'> <metadata> <id>MyPkg</id> <version>1.999</version> <dependencies> <group targetFramework='.NETFramework4.5'> <dependency id='System.Collections' version='4.0.11' /> <dependency id='System.Collections.Concurrent' version='4.0.12' /> </group> <group targetFramework='.NETFramework4.5.1'> <dependency id='System.Collections' version='4.0.11' /> <dependency id='System.Collections.Concurrent' version='4.0.12' /> </group> <group targetFramework='.NETStandard2.0'> <dependency id='Newtonsoft.Json' version='10.0.0' exclude='Build,Analyzers' /> </group> </dependencies> </metadata> </package>", s_packagesOnConfig, new string[] { "lib/net45/my.dll", "lib/net451/my.dll", "lib/netstandard2.0/my.dll" }); var spec = new NugetSpecGenerator(m_context.PathTable, pkg).CreateScriptSourceFile(pkg); var text = spec.ToDisplayStringV2(); m_output.WriteLine(text); string expectedSpec = $@"import {{Transformer}} from ""Sdk.Transformers""; import * as Managed from ""Sdk.Managed""; export declare const qualifier: {{ targetFramework: ""net45"" | ""net451"" | ""net452"" | ""net46"" | ""net461"" | ""net462"" | ""net472"" | ""netstandard2.0"" | ""netcoreapp2.0"" | ""netcoreapp2.1"" | ""netcoreapp2.2"" | ""netcoreapp3.0"" | ""netcoreapp3.1"" | ""netstandard2.1"", targetRuntime: ""win-x64"" | ""osx-x64"" | ""linux-x64"", }}; const packageRoot = Contents.packageRoot; namespace Contents {{ export declare const qualifier: {{ }}; export const packageRoot = d`../../../pkgs/TestPkg.1.999`; @@public export const all: StaticDirectory = Transformer.sealDirectory( packageRoot, [ f`${{packageRoot}}/lib/net45/my.dll`, f`${{packageRoot}}/lib/net451/my.dll`, f`${{packageRoot}}/lib/netstandard2.0/my.dll`, f`${{packageRoot}}/TestPkg.nuspec`, ] ); }} @@public export const pkg: Managed.ManagedNugetPackage = (() => {{ switch (qualifier.targetFramework) {{ case ""net45"": return Managed.Factory.createNugetPackage( ""TestPkg"", ""1.999"", Contents.all, [Managed.Factory.createBinaryFromFiles(f`${{packageRoot}}/lib/net45/my.dll`)], [Managed.Factory.createBinaryFromFiles(f`${{packageRoot}}/lib/net45/my.dll`)], [importFrom(""System.Collections"").pkg, importFrom(""System.Collections.Concurrent"").pkg] ); case ""net451"": case ""net452"": case ""net46"": case ""net461"": case ""net462"": case ""net472"": return Managed.Factory.createNugetPackage( ""TestPkg"", ""1.999"", Contents.all, [Managed.Factory.createBinaryFromFiles(f`${{packageRoot}}/lib/net451/my.dll`)], [Managed.Factory.createBinaryFromFiles(f`${{packageRoot}}/lib/net451/my.dll`)], [importFrom(""System.Collections"").pkg, importFrom(""System.Collections.Concurrent"").pkg] ); case ""netstandard2.0"": case ""netcoreapp2.0"": case ""netcoreapp2.1"": case ""netcoreapp2.2"": case ""netcoreapp3.0"": case ""netcoreapp3.1"": case ""netstandard2.1"": return Managed.Factory.createNugetPackage( ""TestPkg"", ""1.999"", Contents.all, [Managed.Factory.createBinaryFromFiles(f`${{packageRoot}}/lib/netstandard2.0/my.dll`)], [ Managed.Factory.createBinaryFromFiles(f`${{packageRoot}}/lib/netstandard2.0/my.dll`), ], [...addIfLazy(qualifier.targetFramework === ""netstandard2.0"", () => [importFrom(""Newtonsoft.Json"").pkg])] ); default: Contract.fail(""Unsupported target framework""); }}; }} )();"; XAssert.AreEqual(expectedSpec, text); const string CurrentSpecHash = "54628A3B7DB3041473955EE2FC145009CFD298A2"; ValidateCurrentSpecGenVersion(expectedSpec, CurrentSpecHash); }
public void GenerateNuSpec() { var pkg = m_packageGenerator.AnalyzePackage( @"<?xml version='1.0' encoding='utf-8'?> <package xmlns='http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd'> <metadata> <id>MyPkg</id> <version>1.999</version> <dependencies> <group targetFramework='.NETFramework4.5'> <dependency id='System.Collections' version='4.0.11' /> <dependency id='System.Collections.Concurrent' version='4.0.12' /> </group> <group targetFramework='.NETFramework4.5.1'> <dependency id='System.Collections' version='4.0.11' /> <dependency id='System.Collections.Concurrent' version='4.0.12' /> </group> <group targetFramework='.NETStandard2.0'> <dependency id='Newtonsoft.Json' version='10.0.0' exclude='Build,Analyzers' /> </group> </dependencies> </metadata> </package>", s_packagesOnConfig, new string[] { "lib/net45/my.dll", "lib/net451/my.dll", "lib/netstandard2.0/my.dll" }); var spec = new NugetSpecGenerator(m_context.PathTable, pkg).CreateScriptSourceFile(pkg); var text = spec.ToDisplayStringV2(); m_output.WriteLine(text); string expectedSpec = $@"import {{Transformer}} from ""Sdk.Transformers""; import * as Managed from ""Sdk.Managed""; export declare const qualifier: {{ targetFramework: ""net45"" | ""net451"" | ""net452"" | ""net46"" | ""net461"" | ""net462"" | ""net472"" | ""netstandard2.0"" | ""netcoreapp2.0"" | ""netcoreapp2.1"" | ""netcoreapp2.2"" | ""netcoreapp3.0"" | ""netcoreapp3.1"" | ""netstandard2.1"", targetRuntime: ""win-x64"" | ""osx-x64"" | ""linux-x64"", }}; const packageRoot = Contents.packageRoot; namespace Contents {{ export declare const qualifier: {{ }}; export const packageRoot = d`../../../pkgs/TestPkg.1.999`; @@public export const all: StaticDirectory = Transformer.sealDirectory( packageRoot, [ f`${{packageRoot}}/lib/net45/my.dll`, f`${{packageRoot}}/lib/net451/my.dll`, f`${{packageRoot}}/lib/netstandard2.0/my.dll`, f`${{packageRoot}}/TestPkg.nuspec`, ] ); }} @@public export const pkg: Managed.ManagedNugetPackage = (() => {{ switch (qualifier.targetFramework) {{ case ""net45"": return Managed.Factory.createNugetPackage( ""TestPkg"", ""1.999"", Contents.all, [Managed.Factory.createBinaryFromFiles(f`${{packageRoot}}/lib/net45/my.dll`)], [Managed.Factory.createBinaryFromFiles(f`${{packageRoot}}/lib/net45/my.dll`)], [importFrom(""System.Collections"").pkg, importFrom(""System.Collections.Concurrent"").pkg] ); case ""net451"": case ""net452"": case ""net46"": case ""net461"": case ""net462"": case ""net472"": return Managed.Factory.createNugetPackage( ""TestPkg"", ""1.999"", Contents.all, [Managed.Factory.createBinaryFromFiles(f`${{packageRoot}}/lib/net451/my.dll`)], [Managed.Factory.createBinaryFromFiles(f`${{packageRoot}}/lib/net451/my.dll`)], [importFrom(""System.Collections"").pkg, importFrom(""System.Collections.Concurrent"").pkg] ); case ""netstandard2.0"": case ""netcoreapp2.0"": case ""netcoreapp2.1"": case ""netcoreapp2.2"": case ""netcoreapp3.0"": case ""netcoreapp3.1"": case ""netstandard2.1"": return Managed.Factory.createNugetPackage( ""TestPkg"", ""1.999"", Contents.all, [Managed.Factory.createBinaryFromFiles(f`${{packageRoot}}/lib/netstandard2.0/my.dll`)], [ Managed.Factory.createBinaryFromFiles(f`${{packageRoot}}/lib/netstandard2.0/my.dll`), ], [...addIfLazy(qualifier.targetFramework === ""netstandard2.0"", () => [importFrom(""Newtonsoft.Json"").pkg])] ); default: Contract.fail(""Unsupported target framework""); }}; }} )();"; XAssert.AreEqual(expectedSpec, text); var hashingHelper = new global::BuildXL.Storage.Fingerprints.HashingHelper(m_context.PathTable, recordFingerprintString: false); hashingHelper.Add(expectedSpec); var hash = BitConverter.ToString(hashingHelper.GenerateHashBytes()).Replace("-", string.Empty); const string CurrentSpecHash = "54628A3B7DB3041473955EE2FC145009CFD298A2"; const int CurrentSpecGenVersion = 6; if (CurrentSpecHash != hash) { var hasFormatVersionIncreased = NugetSpecGenerator.SpecGenerationFormatVersion > CurrentSpecGenVersion; if (!hasFormatVersionIncreased) { XAssert.Fail( $@" ********************************************************************************** ** It looks like NuGet spec generation has changed but the version of ** '{nameof(NugetSpecGenerator.SpecGenerationFormatVersion)}.{nameof(NugetSpecGenerator)}' didn't increase. ** ** Please bump up the spec generation format version from {CurrentSpecGenVersion} to {CurrentSpecGenVersion+1} and then ** update the '{nameof(CurrentSpecHash)}' and '{nameof(CurrentSpecGenVersion)}' values in this ** test to '{hash}' and '{CurrentSpecGenVersion+1}' respectively. **********************************************************************************"); } else { var lines = new[] { $"Congratulations on remembering to increment '{nameof(NugetSpecGenerator.SpecGenerationFormatVersion)}.{nameof(NugetSpecGenerator)}'", $"after updating NuGet spec generator!", $"", $"To keep this reminder working, please update the '{nameof(CurrentSpecHash)}' and '{nameof(CurrentSpecGenVersion)}'", $"values in this unit test to '{hash}' and '{NugetSpecGenerator.SpecGenerationFormatVersion}' respectively.", }; const int width = 94; var fst = " " + String.Concat(Enumerable.Repeat("_", width + 2)) + " "; var snd = $"/ {' ',-width} \\"; var aligned = lines.Select(l => $"| {l,-width} |"); var last = "\\" + String.Concat(Enumerable.Repeat("_", width + 2)) + "/"; XAssert.Fail(string.Join(Environment.NewLine, new[] { fst, snd }.Concat(aligned).Concat(new[] { last }))); } } }
public void GenerateNuSpec() { var epectedpackageRoot = "../../../pkgs/TestPkg.1.999"; var pkg = m_packageGenerator.AnalyzePackage( @"<?xml version='1.0' encoding='utf-8'?> <package xmlns='http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd'> <metadata> <id>MyPkg</id> <version>1.999</version> <dependencies> <group targetFramework='.NETFramework4.5'> <dependency id='System.Collections' version='4.0.11' /> <dependency id='System.Collections.Concurrent' version='4.0.12' /> </group> <group targetFramework='.NETFramework4.5.1'> <dependency id='System.Collections' version='4.0.11' /> <dependency id='System.Collections.Concurrent' version='4.0.12' /> </group> </dependencies> </metadata> </package>", s_packagesOnConfig); var spec = new NugetSpecGenerator(m_context.PathTable, pkg).CreateScriptSourceFile(pkg); var text = spec.ToDisplayStringV2(); m_output.WriteLine(text); string expectedSpec = string.Format(@"import {{Transformer}} from ""Sdk.Transformers""; import * as Managed from ""Sdk.Managed""; export declare const qualifier: {{targetFramework: ""net472"" | ""net461"" | ""net451"" | ""net45""}}; const packageRoot = Contents.packageRoot; namespace Contents {{ export declare const qualifier: {{ }}; export const packageRoot = d`{0}`; @@public export const all: StaticDirectory = Transformer.sealDirectory(packageRoot, [f`${{packageRoot}}/TestPkg.nuspec`]); }} @@public export const pkg: Managed.ManagedNugetPackage = (() => {{ switch (qualifier.targetFramework) {{ case ""net45"": return Managed.Factory.createNugetPackge( ""TestPkg"", ""1.999"", Contents.all, [], [], [importFrom(""System.Collections"").pkg, importFrom(""System.Collections.Concurrent"").pkg] ); case ""net461"": case ""net472"": case ""net451"": return Managed.Factory.createNugetPackge( ""TestPkg"", ""1.999"", Contents.all, [], [], [importFrom(""System.Collections"").pkg, importFrom(""System.Collections.Concurrent"").pkg] ); default: Contract.fail(""Unsupported target framework""); }}; }} )();", epectedpackageRoot); Assert.Equal(expectedSpec, text); }