public void MultipleUnifiedFromNamesMiddlePrimaryOnBlackList() { string implicitRedistListContents = "<FileList Redist='Microsoft-Windows-CLRCoreComp' >" + "<File AssemblyName='DependsOnUnified' Version='3.0.0.0' Culture='neutral' PublicKeyToken='b77a5c561934e089' InGAC='false' />" + "</FileList >"; string engineOnlySubset = "<FileList Redist='Microsoft-Windows-CLRCoreComp' >" + "<File AssemblyName='Microsoft.Build.Engine' Version='2.0.0.0' PublicKeyToken='b03f5f7f11d50a3a' Culture='Neutral' FileVersion='2.0.50727.208' InGAC='true' />" + "</FileList >"; string redistListPath = FileUtilities.GetTemporaryFile(); string subsetListPath = FileUtilities.GetTemporaryFile(); File.WriteAllText(redistListPath, implicitRedistListContents); File.WriteAllText(subsetListPath, engineOnlySubset); // Create the engine. MockEngine engine = new MockEngine(_output); ITaskItem[] assemblyNames = new TaskItem[] { new TaskItem("DependsOnUnified, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"), new TaskItem("DependsOnUnified, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"), new TaskItem("DependsOnUnified, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089") }; // Now, pass feed resolved primary references into ResolveAssemblyReference. ResolveAssemblyReference t = new ResolveAssemblyReference(); t.InstalledAssemblyTables = new TaskItem[] { new TaskItem(redistListPath) }; t.InstalledAssemblySubsetTables = new TaskItem[] { new TaskItem(subsetListPath) }; t.BuildEngine = engine; t.Assemblies = assemblyNames; t.SearchPaths = DefaultPaths; t.TargetFrameworkDirectories = new string[] { @"c:\myfx" }; t.AutoUnify = true; bool succeeded = Execute(t); Assert.True(succeeded); Assert.Equal(2, t.ResolvedFiles.Length); // "Expected to find two resolved assemblies" Assert.True(ContainsItem(t.ResolvedFiles, Path.Combine(s_myApp_V10Path, "DependsOnUnified.dll"))); // "Expected the ItemSpec of the resolved file to be the item spec of the 1.0.0.0 assembly"); Assert.True(ContainsItem(t.ResolvedFiles, Path.Combine(s_myApp_V20Path, "DependsOnUnified.dll"))); // "Expected the ItemSpec of the resolved file to be the item spec of the 2.0.0.0 assembly"); t.ResolvedDependencyFiles[0].GetMetadata("FusionName").ShouldBe("UnifyMe, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", StringCompareShould.IgnoreCase); t.ResolvedDependencyFiles[0].ItemSpec.ShouldBe(s_unifyMeDll_V20Path, StringCompareShould.IgnoreCase); engine.AssertLogContains ( String.Format(AssemblyResources.GetString("ResolveAssemblyReference.UnifiedDependency"), "UniFYme, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089") ); engine.AssertLogContains ( String.Format(AssemblyResources.GetString("ResolveAssemblyReference.UnificationByAutoUnify"), "1.0.0.0", Path.Combine(s_myApp_V10Path, "DependsOnUnified.dll")) ); engine.AssertLogDoesntContain ( String.Format(AssemblyResources.GetString("ResolveAssemblyReference.UnificationByAutoUnify"), "2.0.0.0", Path.Combine(s_myApp_V20Path, "DependsOnUnified.dll")) ); }
internal static void VerifyLogDoesNotContainErrorFromResource(MockEngine e, TaskLoggingHelper log, string errorResource, params object[] args) { string errorMessage = log.FormatResourceString(errorResource, args); e.AssertLogDoesntContain(errorMessage); }
public void ReferenceTablePrimaryItemInBlackListSpecificVersionTrue() { MockEngine mockEngine = new MockEngine(); ResolveAssemblyReference rar = new ResolveAssemblyReference(); rar.BuildEngine = mockEngine; ReferenceTable referenceTable = MakeEmptyReferenceTable(rar.Log); Dictionary<AssemblyNameExtension, Reference> table = referenceTable.References; AssemblyNameExtension engineAssemblyName = new AssemblyNameExtension("Microsoft.Build.Engine, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"); AssemblyNameExtension xmlAssemblyName = new AssemblyNameExtension("System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"); Reference reference = new Reference(isWinMDFile, fileExists, getRuntimeVersion); TaskItem taskItem = new TaskItem("Microsoft.Build.Engine"); taskItem.SetMetadata("SpecificVersion", "true"); reference.MakePrimaryAssemblyReference(taskItem, true, ".dll"); table.Add(engineAssemblyName, reference); table.Add(xmlAssemblyName, new Reference(isWinMDFile, fileExists, getRuntimeVersion)); Hashtable blackList = new Hashtable(StringComparer.OrdinalIgnoreCase); blackList[engineAssemblyName.FullName] = null; string[] targetFrameworks = new string[] { "Client", "Web" }; string subSetName = ResolveAssemblyReference.GenerateSubSetName(targetFrameworks, null); referenceTable.MarkReferencesForExclusion(blackList); referenceTable.RemoveReferencesMarkedForExclusion(false, subSetName); Dictionary<AssemblyNameExtension, Reference> table2 = referenceTable.References; string warningMessage = rar.Log.FormatResourceString("ResolveAssemblyReference.FailedToResolveReferenceBecausePrimaryAssemblyInExclusionList", taskItem.ItemSpec, subSetName); Assert.False(Object.ReferenceEquals(table, table2)); // "Expected hashtable to be a different instance" Assert.Equal(2, table2.Count); // "Expected there to be two elements in the hashtable" Assert.True(table2.ContainsKey(engineAssemblyName)); // "Expected to find the engineAssemblyName in the referenceList" Assert.True(table2.ContainsKey(xmlAssemblyName)); // "Expected to find the xmlssemblyName in the referenceList" mockEngine.AssertLogDoesntContain(warningMessage); }
public void Verifyp2pAndProfile2() { // Create a generic redist list with system.xml and microsoft.build.engine. string profileRedistList = String.Empty; string fullRedistList = String.Empty; string fullFrameworkDirectory = Path.Combine(Path.GetTempPath(), "Verifyp2pAndProfile"); string targetFrameworkDirectory = Path.Combine(fullFrameworkDirectory, "Profiles\\Client"); string fullRedistListContents = "<FileList Redist='Microsoft-Windows-CLRCoreComp' >" + "<File AssemblyName='System' Version='9.0.0.0' PublicKeyToken='b77a5c561934e089' Culture='Neutral'/>" + "</FileList >"; try { GenerateRedistAndProfileXmlLocations(fullRedistListContents, _engineOnlySubset, out profileRedistList, out fullRedistList, fullFrameworkDirectory, targetFrameworkDirectory); ResolveAssemblyReference t = new ResolveAssemblyReference(); MockEngine e = new MockEngine(); t.BuildEngine = e; TaskItem item = new TaskItem(@"c:\MyComponents\misc\DependsOn9Also.dll"); item.SetMetadata("SpecificVersion", "true"); t.AssemblyFiles = new ITaskItem[] { item }; t.SearchPaths = new string[] { @"{TargetFrameworkDirectory}", fullFrameworkDirectory }; t.TargetFrameworkDirectories = new string[] { targetFrameworkDirectory }; t.InstalledAssemblyTables = new ITaskItem[] { new TaskItem(profileRedistList) }; t.IgnoreDefaultInstalledAssemblyTables = true; t.FullFrameworkFolders = new string[] { fullFrameworkDirectory }; t.ProfileName = "Client"; bool success = Execute(t); Assert.True(success); // "Expected no errors." Assert.Equal(1, t.ResolvedFiles.Length); // "Expected no resolved assemblies." string warningMessage = t.Log.FormatResourceString("ResolveAssemblyReference.FailBecauseDependentAssemblyInExclusionList", @"c:\MyComponents\misc\DependsOn9Also.dll", "System, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", "Client"); e.AssertLogDoesntContain(warningMessage); } finally { if (Directory.Exists(fullFrameworkDirectory)) { Directory.Delete(fullFrameworkDirectory, true); } } }
private void VerifyImplementationArchitecture(string winmdName, string targetProcessorArchitecture, string implementationFileArch, string warnOrErrorOnTargetArchitectureMismatch) { // Create the engine. MockEngine engine = new MockEngine(); TaskItem item = new TaskItem(winmdName); ITaskItem[] assemblyFiles = new TaskItem[] { item }; ResolveAssemblyReference t = new ResolveAssemblyReference(); t.BuildEngine = engine; t.Assemblies = assemblyFiles; t.SearchPaths = new String[] { @"C:\WinMDArchVerification" }; t.TargetProcessorArchitecture = targetProcessorArchitecture; t.WarnOrErrorOnTargetArchitectureMismatch = warnOrErrorOnTargetArchitectureMismatch; bool succeeded = Execute(t); Assert.Equal(1, t.ResolvedFiles.Length); Assert.True(t.ResolvedFiles[0].ItemSpec.Equals(@"C:\WinMDArchVerification\" + winmdName + ".winmd", StringComparison.OrdinalIgnoreCase)); Assert.True(t.ResolvedFiles[0].GetMetadata(ItemMetadataNames.imageRuntime).Equals(@"WindowsRuntime 1.0", StringComparison.OrdinalIgnoreCase)); Assert.True(bool.Parse(t.ResolvedFiles[0].GetMetadata(ItemMetadataNames.winMDFile))); string fullMessage = null; if (implementationFileArch.Equals("Unknown")) { fullMessage = ResourceUtilities.FormatResourceString("ResolveAssemblyReference.UnknownProcessorArchitecture", @"C:\WinMDArchVerification\" + winmdName + ".dll", @"C:\WinMDArchVerification\" + winmdName + ".winmd", NativeMethods.IMAGE_FILE_MACHINE_R4000.ToString("X", CultureInfo.InvariantCulture)); } else { fullMessage = ResourceUtilities.FormatResourceString("ResolveAssemblyReference.MismatchBetweenTargetedAndReferencedArchOfImplementation", targetProcessorArchitecture, implementationFileArch, @"C:\WinMDArchVerification\" + winmdName + ".dll", @"C:\WinMDArchVerification\" + winmdName + ".winmd"); } if (warnOrErrorOnTargetArchitectureMismatch.Equals("None", StringComparison.OrdinalIgnoreCase)) { engine.AssertLogDoesntContain(fullMessage); } else { engine.AssertLogContains(fullMessage); } if (warnOrErrorOnTargetArchitectureMismatch.Equals("Warning", StringComparison.OrdinalIgnoreCase)) { // Should fail since PE Header is not valid and this is always an error. Assert.True(succeeded); Assert.True(t.ResolvedFiles[0].GetMetadata(ItemMetadataNames.winmdImplmentationFile).Equals(winmdName + ".dll")); Assert.Equal(0, engine.Errors); Assert.Equal(1, engine.Warnings); } else if (warnOrErrorOnTargetArchitectureMismatch.Equals("Error", StringComparison.OrdinalIgnoreCase)) { // Should fail since PE Header is not valid and this is always an error. Assert.False(succeeded); Assert.Equal(0, t.ResolvedFiles[0].GetMetadata(ItemMetadataNames.winmdImplmentationFile).Length); Assert.Equal(1, engine.Errors); Assert.Equal(0, engine.Warnings); } else if (warnOrErrorOnTargetArchitectureMismatch.Equals("None", StringComparison.OrdinalIgnoreCase)) { Assert.True(succeeded); Assert.True(t.ResolvedFiles[0].GetMetadata(ItemMetadataNames.winmdImplmentationFile).Equals(winmdName + ".dll")); Assert.Equal(0, engine.Errors); Assert.Equal(0, engine.Warnings); } }
public void ResolveBadImageInSecondary() { ResolveAssemblyReference t = new ResolveAssemblyReference(); MockEngine engine = new MockEngine(true); t.BuildEngine = engine; t.Assemblies = new ITaskItem[] { new TaskItem("DependsOnBadImage") }; t.SearchPaths = new string[] { @"c:\Regress563286", @"c:\WINNT\Microsoft.NET\Framework\v2.0.MyVersion" }; Execute(t); // There should be one resolved file, because the dependency was bad. Assert.Equal(1, t.ResolvedFiles.Length); // There should be no related files. Assert.Equal(0, t.RelatedFiles.Length); engine.AssertLogDoesntContain("BadImage.pdb"); engine.AssertLogDoesntContain("HRESULT"); // There should have been no warning about the exception because it's only a dependency Assert.Equal(0, engine.Warnings); }
public void Regress242970() { ResolveAssemblyReference t = new ResolveAssemblyReference(); MockEngine engine = new MockEngine(); t.BuildEngine = engine; t.Assemblies = new ITaskItem[] { new TaskItem("System.XML") }; t.SearchPaths = new string[] { "{CandidateAssemblyFiles}" }; t.CandidateAssemblyFiles = new string[] { @"NonUI\testDirectoryRoot\.hiddenfile", @"NonUI\testDirectoryRoot\.dll", @"c:\WINNT\Microsoft.NET\Framework\v2.0.MyVersion\System.Xml.dll" }; bool succeeded = Execute(t); Assert.True(succeeded); Assert.Equal(1, t.ResolvedFiles.Length); Assert.Equal(@"c:\WINNT\Microsoft.NET\Framework\v2.0.MyVersion\System.Xml.dll", t.ResolvedFiles[0].ItemSpec); // For {CandidateAssemblyFiles} we don't even want to see a comment logged for files with non-standard extensions. // This is because {CandidateAssemblyFiles} is very likely to contain non-assemblies and its best not to clutter // up the log. engine.AssertLogDoesntContain ( String.Format(".hiddenfile") ); // ...but we do want to see a log entry for standard extensions, even if the base file name is empty. engine.AssertLogContains ( String.Format(@"NonUI\testDirectoryRoot\.dll") ); }
public void ExistsPromotedDependencyInTheBlackList() { string implicitRedistListContents = "<FileList Redist='Microsoft-Windows-CLRCoreComp' >" + "<File AssemblyName='UniFYme' Version='2.0.0.0' Culture='neutral' PublicKeyToken='b77a5c561934e089' InGAC='false' />" + "</FileList >"; string engineOnlySubset = "<FileList Redist='Microsoft-Windows-CLRCoreComp' >" + "<File AssemblyName='Microsoft.Build.Engine' Version='2.0.0.0' PublicKeyToken='b03f5f7f11d50a3a' Culture='Neutral' FileVersion='2.0.50727.208' InGAC='true' />" + "</FileList >"; string redistListPath = FileUtilities.GetTemporaryFile(); string subsetListPath = FileUtilities.GetTemporaryFile(); string appConfigFile = null; try { File.WriteAllText(redistListPath, implicitRedistListContents); File.WriteAllText(subsetListPath, engineOnlySubset); // Create the engine. MockEngine engine = new MockEngine(); ITaskItem[] assemblyNames = new TaskItem[] { new TaskItem("DependsOnUnified, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089") }; // Construct the app.config. appConfigFile = WriteAppConfig ( " <dependentAssembly>\n" + " <assemblyIdentity name='UnifyMe' PublicKeyToken='b77a5c561934e089' culture='neutral' />\n" + " <bindingRedirect oldVersion='1.0.0.0' newVersion='2.0.0.0' />\n" + " </dependentAssembly>\n" ); // Now, pass feed resolved primary references into ResolveAssemblyReference. ResolveAssemblyReference t = new ResolveAssemblyReference(); t.InstalledAssemblyTables = new TaskItem[] { new TaskItem(redistListPath) }; t.InstalledAssemblySubsetTables = new TaskItem[] { new TaskItem(subsetListPath) }; t.BuildEngine = engine; t.Assemblies = assemblyNames; t.SearchPaths = DefaultPaths; t.AppConfigFile = appConfigFile; bool succeeded = Execute(t); Assert.True(succeeded); Assert.Equal(0, t.ResolvedDependencyFiles.Length); engine.AssertLogDoesntContain ( String.Format(AssemblyResources.GetString("ResolveAssemblyReference.UnificationByAppConfig"), "1.0.0.0", appConfigFile, Path.Combine(s_myApp_V10Path, "DependsOnUnified.dll")) ); } finally { File.Delete(redistListPath); File.Delete(subsetListPath); // Cleanup. File.Delete(appConfigFile); } }
public void HigherThanHighestInRedistList3rdPartyRedist() { MockEngine e = new MockEngine(); ITaskItem[] items = new ITaskItem[] { new TaskItem("ReferenceVersion9") }; string redistString = "<FileList Redist='MyRandomREdist' >" + "<File AssemblyName='mscorlib' Version='4.0.0.0' PublicKeyToken='b17a5c561934e089' Culture='neutral' ProcessorArchitecture='MSIL' FileVersion='4.0.0.0' InGAC='true' />" + "</FileList >"; ResolveAssemblyReference t = new ResolveAssemblyReference(); ExecuteRAROnItemsAndRedist(t, e, items, redistString, false); Assert.Equal(0, e.Warnings); // "Expected one warning in this scenario." e.AssertLogDoesntContain("MSB3257"); e.AssertLogContains("ReferenceVersion9"); Assert.Equal(1, t.ResolvedFiles.Length); }
public void TwoDependenciesHigherThanHighestInRedistListIgnoreOnBoth() { MockEngine e = new MockEngine(); ITaskItem[] items = new ITaskItem[] { new TaskItem("DependsOn9, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b17a5c561934e089"), new TaskItem("DependsOn9Also, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b17a5c561934e089") }; items[0].SetMetadata("SpecificVersion", "true"); items[1].SetMetadata("SpecificVersion", "true"); string redistString = "<FileList Redist='Microsoft-Windows-CLRCoreComp-Random' >" + "<File AssemblyName='System' Version='4.0.0.0' PublicKeyToken='b77a5c561934e089' Culture='neutral' ProcessorArchitecture='MSIL' FileVersion='4.0.0.0' InGAC='true' />" + "</FileList >"; ResolveAssemblyReference t = new ResolveAssemblyReference(); ExecuteRAROnItemsAndRedist(t, e, items, redistString, true); Assert.Equal(0, e.Warnings); // "No warnings expected in this scenario." e.AssertLogDoesntContain("MSB3258"); Assert.Equal(0, e.Errors); // "No errors expected in this scenario." Assert.Equal(2, t.ResolvedFiles.Length); Assert.True(ContainsItem(t.ResolvedFiles, @"c:\MyComponents\misc\DependsOn9.dll")); // "Expected to find assembly, but didn't." Assert.True(ContainsItem(t.ResolvedFiles, @"c:\MyComponents\misc\DependsOn9Also.dll")); // "Expected to find assembly, but didn't." }
/// <summary> /// Given a log and a resource string, acquires the text of that resource string and /// compares it to the log. Assert fails if the log contains the desired string. /// </summary> /// <param name="e">The MockEngine that contains the log we're checking</param> /// <param name="log">The TaskLoggingHelper that we use to load the string resource</param> /// <param name="errorResource">The name of the resource string to check the log for</param> /// <param name="args">Arguments needed to format the resource string properly</param> internal static void VerifyLogDoesNotContainErrorFromResource(MockEngine e, TaskLoggingHelper log, string errorResource, params object[] args) { string errorMessage = log.FormatResourceString(errorResource, args); e.AssertLogDoesntContain(errorMessage); }
public void ToolPath() { var t = new ResolveComReference.AxImp(); t.ActiveXControlName = "FakeControl.ocx"; string badParameterValue = @"C:\Program Files\Microsoft Visual Studio 10.0\My Fake SDK Path"; string goodParameterValue = Path.GetTempPath(); bool taskPassed; Assert.Null(t.ToolPath); // "ToolPath should be null by default" Utilities.ExecuteTaskAndVerifyLogContainsErrorFromResource(t, "AxTlbBaseTask.SdkOrToolPathNotSpecifiedOrInvalid", t.SdkToolsPath, t.ToolPath); t.ToolPath = badParameterValue; Assert.Equal(badParameterValue, t.ToolPath); // "New ToolPath value should be set" Utilities.ExecuteTaskAndVerifyLogContainsErrorFromResource(t, "AxTlbBaseTask.SdkOrToolPathNotSpecifiedOrInvalid", t.SdkToolsPath, t.ToolPath); MockEngine e = new MockEngine(); t.BuildEngine = e; t.ToolPath = goodParameterValue; Assert.Equal(goodParameterValue, t.ToolPath); // "New ToolPath value should be set" taskPassed = t.Execute(); Assert.False(taskPassed); // "Task should still fail -- there are other things wrong with it." // but that particular error shouldn't be there anymore. string toolPathMessage = t.Log.FormatResourceString("AxTlbBaseTask.SdkOrToolPathNotSpecifiedOrInvalid", t.SdkToolsPath, t.ToolPath); string messageWithNoCode; string toolPathCode = t.Log.ExtractMessageCode(toolPathMessage, out messageWithNoCode); e.AssertLogDoesntContain(toolPathCode); }
public void ExistsWithPrimaryReferenceOnBlackList() { string implicitRedistListContents = "<FileList Redist='Microsoft-Windows-CLRCoreComp' >" + "<File AssemblyName='DependsOnUnified' Version='2.0.0.0' Culture='neutral' PublicKeyToken='b77a5c561934e089' InGAC='false' />" + "</FileList >"; string engineOnlySubset = "<FileList Redist='Microsoft-Windows-CLRCoreComp' >" + "<File AssemblyName='Microsoft.Build.Engine' Version='2.0.0.0' PublicKeyToken='b03f5f7f11d50a3a' Culture='Neutral' FileVersion='2.0.50727.208' InGAC='true' />" + "</FileList >"; string redistListPath = FileUtilities.GetTemporaryFile(); string subsetListPath = FileUtilities.GetTemporaryFile(); try { File.WriteAllText(redistListPath, implicitRedistListContents); File.WriteAllText(subsetListPath, engineOnlySubset); // Create the engine. MockEngine engine = new MockEngine(); ITaskItem[] assemblyNames = new TaskItem[] { new TaskItem("DependsOnUnified, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"), new TaskItem("DependsOnUnified, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089") }; // Now, pass feed resolved primary references into ResolveAssemblyReference. ResolveAssemblyReference t = new ResolveAssemblyReference(); t.InstalledAssemblyTables = new TaskItem[] { new TaskItem(redistListPath) }; t.InstalledAssemblySubsetTables = new TaskItem[] { new TaskItem(subsetListPath) }; t.BuildEngine = engine; t.Assemblies = assemblyNames; t.SearchPaths = DefaultPaths; t.AutoUnify = true; bool succeeded = Execute(t); Assert.True(succeeded); Assert.Equal(1, t.ResolvedFiles.Length); // "Expected there to only be one resolved file" Assert.True(t.ResolvedFiles[0].ItemSpec.Contains(@"C:\MyApp\v1.0\DependsOnUnified.dll")); // "Expected the ItemSpec of the resolved file to be the item spec of the 1.0.0.0 assembly" Assert.Equal(1, t.ResolvedDependencyFiles.Length); // "Expected there to be two resolved dependencies" AssertNoCase("UnifyMe, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", t.ResolvedDependencyFiles[0].GetMetadata("FusionName")); AssertNoCase(@"C:\MyComponents\v1.0\UnifyMe.dll", t.ResolvedDependencyFiles[0].ItemSpec); engine.AssertLogDoesntContain ( String.Format(AssemblyResources.GetString("ResolveAssemblyReference.UnifiedDependency"), "UnifyMe, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, ProcessorArchitecture=MSIL") ); engine.AssertLogDoesntContain ( String.Format(AssemblyResources.GetString("ResolveAssemblyReference.UnificationByAutoUnify"), "1.0.0.0", @"C:\MyApp\v2.0\DependsOnUnified.dll") ); } finally { File.Delete(redistListPath); File.Delete(subsetListPath); } }
public void ExistsWithPrimaryReferenceOnBlackList() { string implicitRedistListContents = "<FileList Redist='Microsoft-Windows-CLRCoreComp' >" + "<File AssemblyName='DependsOnUnified' Version='2.0.0.0' Culture='neutral' PublicKeyToken='b77a5c561934e089' InGAC='false' />" + "</FileList >"; string engineOnlySubset = "<FileList Redist='Microsoft-Windows-CLRCoreComp' >" + "<File AssemblyName='Microsoft.Build.Engine' Version='2.0.0.0' PublicKeyToken='b03f5f7f11d50a3a' Culture='Neutral' FileVersion='2.0.50727.208' InGAC='true' />" + "</FileList >"; string redistListPath = FileUtilities.GetTemporaryFile(); string subsetListPath = FileUtilities.GetTemporaryFile(); try { File.WriteAllText(redistListPath, implicitRedistListContents); File.WriteAllText(subsetListPath, engineOnlySubset); // Create the engine. MockEngine engine = new MockEngine(); ITaskItem[] assemblyNames = new TaskItem[] { new TaskItem("DependsOnUnified, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"), new TaskItem("DependsOnUnified, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089") }; // Now, pass feed resolved primary references into ResolveAssemblyReference. ResolveAssemblyReference t = new ResolveAssemblyReference(); t.InstalledAssemblyTables = new TaskItem[] { new TaskItem(redistListPath) }; t.InstalledAssemblySubsetTables = new TaskItem[] { new TaskItem(subsetListPath) }; t.BuildEngine = engine; t.Assemblies = assemblyNames; t.SearchPaths = DefaultPaths; t.AutoUnify = true; bool succeeded = Execute(t); Assert.True(succeeded); Assert.Equal(1, t.ResolvedFiles.Length); // "Expected there to only be one resolved file" Assert.True(t.ResolvedFiles[0].ItemSpec.Contains(Path.Combine(s_myApp_V10Path, "DependsOnUnified.dll"))); // "Expected the ItemSpec of the resolved file to be the item spec of the 1.0.0.0 assembly"); Assert.Equal(1, t.ResolvedDependencyFiles.Length); // "Expected there to be two resolved dependencies" AssertNoCase("UnifyMe, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", t.ResolvedDependencyFiles[0].GetMetadata("FusionName")); AssertNoCase(s_unifyMeDll_V10Path, t.ResolvedDependencyFiles[0].ItemSpec); engine.AssertLogDoesntContain ( String.Format(AssemblyResources.GetString("ResolveAssemblyReference.UnifiedDependency"), "UnifyMe, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, ProcessorArchitecture=MSIL") ); engine.AssertLogDoesntContain ( String.Format(AssemblyResources.GetString("ResolveAssemblyReference.UnificationByAutoUnify"), "1.0.0.0", Path.Combine(s_myApp_V20Path, "DependsOnUnified.dll")) ); } finally { File.Delete(redistListPath); File.Delete(subsetListPath); } }
public void Regress444793() { ResolveAssemblyReference t = new ResolveAssemblyReference(); MockEngine engine = new MockEngine(); t.BuildEngine = engine; TaskItem item = new TaskItem(@"c:\DoesntExist\System.Xml.dll"); item.SetMetadata("HintPath", @"c:\WINNT\Microsoft.NET\Framework\v2.0.MyVersion\System.Data.dll"); item.SetMetadata("SpecificVersion", "true"); t.Assemblies = new ITaskItem[] { item }; t.SearchPaths = new string[] { @"{HintPathFromItem}" }; bool succeeded = Execute(t); Assert.True(succeeded); engine.AssertLogDoesntContain("MSB4018"); engine.AssertLogContains ( String.Format(AssemblyResources.GetString("General.MalformedAssemblyName"), "c:\\DoesntExist\\System.Xml.dll") ); }
public void ExistsPromotedDependencyInTheBlackList() { string engineOnlySubset = "<FileList Redist='Microsoft-Windows-CLRCoreComp' >" + "<File AssemblyName='Microsoft.Build.Engine' Version='2.0.0.0' PublicKeyToken='b03f5f7f11d50a3a' Culture='Neutral' FileVersion='2.0.50727.208' InGAC='true' />" + "</FileList >"; string implicitRedistListContents = "<FileList Redist='Microsoft-Windows-CLRCoreComp' >" + "<File AssemblyName='UniFYme' Version='2.0.0.0' Culture='neutral' PublicKeyToken='b77a5c561934e089' InGAC='false' />" + "</FileList >"; string redistListPath = FileUtilities.GetTemporaryFile(); string subsetListPath = FileUtilities.GetTemporaryFile(); string appConfigFile = null; try { File.WriteAllText(redistListPath, implicitRedistListContents); File.WriteAllText(subsetListPath, engineOnlySubset); // Create the engine. MockEngine engine = new MockEngine(); ITaskItem[] assemblyNames = new TaskItem[] { new TaskItem("DependsOnUnified, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089") }; // Construct the app.config. appConfigFile = WriteAppConfig ( " <dependentAssembly>\n" + " <assemblyIdentity name='UnifyMe' PublicKeyToken='b77a5c561934e089' culture='neutral' />\n" + " <bindingRedirect oldVersion='1.0.0.0' newVersion='2.0.0.0' />\n" + " </dependentAssembly>\n" ); // Now, pass feed resolved primary references into ResolveAssemblyReference. ResolveAssemblyReference t = new ResolveAssemblyReference(); t.InstalledAssemblyTables = new TaskItem[] { new TaskItem(redistListPath) }; t.InstalledAssemblySubsetTables = new TaskItem[] { new TaskItem(subsetListPath) }; t.BuildEngine = engine; t.Assemblies = assemblyNames; t.SearchPaths = DefaultPaths; t.AppConfigFile = appConfigFile; bool succeeded = Execute(t, false); Assert.True(succeeded); Assert.Equal(0, t.ResolvedDependencyFiles.Length); engine.AssertLogDoesntContain ( String.Format(AssemblyResources.GetString("ResolveAssemblyReference.UnificationByAppConfig"), "1.0.0.0", appConfigFile, @"C:\MyApp\v1.0\DependsOnUnified.dll") ); } finally { File.Delete(redistListPath); File.Delete(subsetListPath); // Cleanup. File.Delete(appConfigFile); } }
public void ResolveBadImageInPrimary() { ResolveAssemblyReference t = new ResolveAssemblyReference(); MockEngine engine = new MockEngine(); t.BuildEngine = engine; t.Assemblies = new ITaskItem[] { new TaskItem("BadImage") }; t.Assemblies[0].SetMetadata("Private", "true"); t.SearchPaths = new string[] { @"c:\WINNT\Microsoft.NET\Framework\v2.0.MyVersion" }; t.TargetFrameworkDirectories = new string[] { @"c:\WINNT\Microsoft.NET\Framework\v2.0.MyVersion" }; Execute(t); // There should be no resolved file, because the image was bad. Assert.Equal(0, t.ResolvedFiles.Length); // There should be no related files either. Assert.Equal(0, t.RelatedFiles.Length); engine.AssertLogDoesntContain("BadImage.pdb"); engine.AssertLogDoesntContain("HRESULT"); // There should have been one warning about the exception. Assert.Equal(1, engine.Warnings); }
private void VerifyImplementationArchitecture(string winmdName, string targetProcessorArchitecture, string implementationFileArch, string warnOrErrorOnTargetArchitectureMismatch) { // Create the engine. MockEngine engine = new MockEngine(_output); TaskItem item = new TaskItem(winmdName); ITaskItem[] assemblyFiles = new TaskItem[] { item }; ResolveAssemblyReference t = new ResolveAssemblyReference(); t.BuildEngine = engine; t.Assemblies = assemblyFiles; t.SearchPaths = new String[] { @"C:\WinMDArchVerification" }; t.TargetProcessorArchitecture = targetProcessorArchitecture; t.WarnOrErrorOnTargetArchitectureMismatch = warnOrErrorOnTargetArchitectureMismatch; bool succeeded = Execute(t); Assert.Single(t.ResolvedFiles); Assert.Equal(@"C:\WinMDArchVerification\" + winmdName + ".winmd", t.ResolvedFiles[0].ItemSpec); Assert.Equal(@"WindowsRuntime 1.0", t.ResolvedFiles[0].GetMetadata(ItemMetadataNames.imageRuntime)); Assert.True(bool.Parse(t.ResolvedFiles[0].GetMetadata(ItemMetadataNames.winMDFile))); string fullMessage = null; if (implementationFileArch.Equals("Unknown")) { fullMessage = ResourceUtilities.FormatResourceStringStripCodeAndKeyword("ResolveAssemblyReference.UnknownProcessorArchitecture", @"C:\WinMDArchVerification\" + winmdName + ".dll", @"C:\WinMDArchVerification\" + winmdName + ".winmd", NativeMethods.IMAGE_FILE_MACHINE_R4000.ToString("X", CultureInfo.InvariantCulture)); } else { fullMessage = ResourceUtilities.FormatResourceStringStripCodeAndKeyword("ResolveAssemblyReference.MismatchBetweenTargetedAndReferencedArchOfImplementation", targetProcessorArchitecture, implementationFileArch, @"C:\WinMDArchVerification\" + winmdName + ".dll", @"C:\WinMDArchVerification\" + winmdName + ".winmd"); } if (warnOrErrorOnTargetArchitectureMismatch.Equals("None", StringComparison.OrdinalIgnoreCase)) { engine.AssertLogDoesntContain(fullMessage); } else { engine.AssertLogContains(fullMessage); } if (warnOrErrorOnTargetArchitectureMismatch.Equals("Warning", StringComparison.OrdinalIgnoreCase)) { // Should fail since PE Header is not valid and this is always an error. Assert.True(succeeded); Assert.Equal(winmdName + ".dll", t.ResolvedFiles[0].GetMetadata(ItemMetadataNames.winmdImplmentationFile)); Assert.Equal(0, engine.Errors); Assert.Equal(1, engine.Warnings); } else if (warnOrErrorOnTargetArchitectureMismatch.Equals("Error", StringComparison.OrdinalIgnoreCase)) { // Should fail since PE Header is not valid and this is always an error. Assert.False(succeeded); Assert.Empty(t.ResolvedFiles[0].GetMetadata(ItemMetadataNames.winmdImplmentationFile)); Assert.Equal(1, engine.Errors); Assert.Equal(0, engine.Warnings); } else if (warnOrErrorOnTargetArchitectureMismatch.Equals("None", StringComparison.OrdinalIgnoreCase)) { Assert.True(succeeded); Assert.Equal(winmdName + ".dll", t.ResolvedFiles[0].GetMetadata(ItemMetadataNames.winmdImplmentationFile)); Assert.Equal(0, engine.Errors); Assert.Equal(0, engine.Warnings); } }
public void IgnoreReferenceToMscorlib() { // Create the engine. MockEngine engine = new MockEngine(); ITaskItem[] assemblyFiles = new TaskItem[] { new TaskItem(@"SampleWindowsRuntimeOnly"), new TaskItem(@"SampleWindowsRuntimeAndClr") }; // Now, pass feed resolved primary references into ResolveAssemblyReference. ResolveAssemblyReference t = new ResolveAssemblyReference(); t.BuildEngine = engine; t.Assemblies = assemblyFiles; t.TargetProcessorArchitecture = "X86"; t.SearchPaths = new String[] { @"C:\WinMD", @"C:\WinMD\v4\", @"C:\WinMD\v255\" }; bool succeeded = Execute(t); Assert.True(succeeded); Assert.Equal(2, t.ResolvedFiles.Length); Assert.Equal(0, t.ResolvedDependencyFiles.Length); Assert.Equal(0, engine.Errors); Assert.Equal(0, engine.Warnings); engine.AssertLogDoesntContain("conflict"); }