public void EscapedMetadataReference() { MockLogger logger = new MockLogger(); Project p = ObjectModelHelpers.CreateInMemoryProject(@" <Project xmlns=`msbuildnamespace`> <ItemGroup> <i Include=`i1`> <m>%25(m)</m> </i> </ItemGroup> <Target Name=`t`> <Message Text=`[%(i.m)]`/> </Target> </Project> ", logger); p.Build("t"); logger.AssertLogContains("[%(m)]"); }
public void Simple() { MockLogger log = ObjectModelHelpers.BuildProjectExpectSuccess(@" <Project ToolsVersion=`msbuilddefaulttoolsversion` xmlns=`msbuildnamespace`> <ItemGroup> <AToB Include=`a;b`/> </ItemGroup> <Target Name=`Build`> <CreateItem Include=`%(AToB.Identity)`> <Output ItemName=`AToBBatched` TaskParameter=`Include`/> </CreateItem> <Message Text=`[AToBBatched: @(AToBBatched)]`/> </Target> </Project> "); log.AssertLogContains("[AToBBatched: a;b]"); }
public void CreateBlankProperty() { MockLogger logger = ObjectModelHelpers.BuildProjectExpectSuccess(@" <Project ToolsVersion=`msbuilddefaulttoolsversion` xmlns=`msbuildnamespace`> <PropertyGroup> <NumberOfProcessors>Twenty</NumberOfProcessors> </PropertyGroup> <Target Name=`Build`> <CreateProperty Value=``> <Output PropertyName=`NumberOfProcessors` TaskParameter=`Value`/> </CreateProperty> <Message Text=`NumberOfProcessors='$(NumberOfProcessors)'`/> </Target> </Project> "); logger.AssertLogContains("NumberOfProcessors=''"); }
public void CaptureTargetOutputsRunningEachTargetSeparately() { MockLogger logger = ObjectModelHelpers.BuildProjectExpectSuccess(@" <Project DefaultTargets = `CallT` ToolsVersion=`msbuilddefaulttoolsversion` xmlns=`msbuildnamespace`> <Target Name = `a` Outputs = `a.txt`/> <Target Name = `b` Outputs = `b.txt`/> <Target Name = `c` Outputs = `c.txt`/> <Target Name = `CallT`> <CallTarget Targets = `a;b;c` RunEachTargetSeparately = `true`> <Output TaskParameter= `TargetOutputs` ItemName = `TaskOut`/> </CallTarget> <Message Text = `CallTarget Outputs: @(TaskOut)`/> </Target> </Project> "); // All three targets should have been run. logger.AssertLogContains("CallTarget Outputs: a.txt;b.txt;c.txt"); }
public void OnErrorSeesPropertiesAndItemsFromFirstTarget() { MockLogger l = new MockLogger(); Project p = ObjectModelHelpers.CreateInMemoryProject(@" <Project DefaultTargets=`Build` ToolsVersion=`msbuilddefaulttoolsversion` xmlns=`msbuildnamespace`> <Target Name='Build'> <!-- Create a bunch of items and properties --> <CreateItem Include='a1'> <Output ItemName='i1' TaskParameter='Include'/> </CreateItem> <ItemGroup> <i1 Include='a2'/> </ItemGroup> <CreateProperty Value='v1'> <Output PropertyName='p1' TaskParameter='Value'/> </CreateProperty> <PropertyGroup> <p2>v2</p2> </PropertyGroup> <Error Text='This is an error.'/> <OnError ExecuteTargets='ErrorTarget'/> </Target> <Target Name='ErrorTarget'> <Message Text='[@(i1)][$(p1)][$(p2)]'/> </Target> </Project>", l ); p.Build(new string[] { "Build" }, null); Assertion.Assert("Expected one error because 'Build' failed.", l.ErrorCount == 1); l.AssertLogContains("[a1;a2][v1][v2]"); }
public void TestPathFixupInMetadata() { string buildProjectContents = @" <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003' > <Target Name='Build'> <MSBuild Projects='projectDirectory/main.proj' /> </Target> </Project>"; string mainProjectContents = @" <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003' > <UsingTask TaskName='LogTaskPropertiesTask' AssemblyName='net.r_eg.IeXod.Engine.UnitTests' /> <ItemGroup> <Item0 Include='xyz'> <Md0>lib\foo.dll</Md0> </Item0> </ItemGroup> <Target Name='Build'> <LogTaskPropertiesTask Items='@(Item0)' /> </Target> </Project>"; string buildProjectPath = ObjectModelHelpers.CreateFileInTempProjectDirectory("build.proj", buildProjectContents); ObjectModelHelpers.CreateFileInTempProjectDirectory("projectDirectory/main.proj", mainProjectContents); ObjectModelHelpers.CreateFileInTempProjectDirectory(Path.Combine("projectDirectory", "lib", "foo.dll"), "just a text file"); var projColln = new ProjectCollection(); var logger = new MockLogger(); projColln.RegisterLogger(logger); var project = projColln.LoadProject(buildProjectPath); var result = project.Build("Build"); Assert.True(result); logger.AssertLogContains($"ItemMetadata: Md0 = {Path.Combine("lib", "foo.dll")}"); }
public void ItemsPickUpItemDefinitionMetadata() { MockLogger logger = ObjectModelHelpers.BuildProjectExpectSuccess(@" <Project DefaultTargets=`t` ToolsVersion=`msbuilddefaulttoolsversion` xmlns=`msbuildnamespace`> <ItemDefinitionGroup> <ItemWithDefinition> <SomeMetadata>foo</SomeMetadata> </ItemWithDefinition> </ItemDefinitionGroup> <ItemGroup> <ItemWithDefinition Include=`foo.cs` /> </ItemGroup> <Target Name=`t`> <Message Text=`[%(ItemWithDefinition.SomeMetadata)]` /> </Target> </Project> "); logger.AssertLogContains("[foo]"); }
public void SetInputsOutputsIncremental() { string oldFile = null, newFile = null; try { oldFile = GetTempFiles(1, new DateTime(2005, 1, 1))[0]; newFile = GetTempFiles(1, new DateTime(2006, 1, 1))[0]; MockLogger logger = new MockLogger(); Project p = ObjectModelHelpers.CreateInMemoryProject(@" <Project ToolsVersion=`msbuilddefaulttoolsversion` xmlns=`msbuildnamespace`> <Target Name=`t` Inputs=`" + newFile + "` Outputs=`" + oldFile + @"`> <Message Text=`building target !!`/> </Target> </Project> ", logger); p.Build(new string[] { "t" }); logger.AssertLogContains(new string[] { "building target !!" }); logger.ClearLog(); Target t = p.Targets["t"]; // reverse inputs and outputs t.Inputs = (string)oldFile; t.Outputs = (string)newFile; p.ResetBuildStatus(); p.Build(new string[] { "t" }); logger.AssertLogDoesntContain("building target !!"); } finally { DeleteTempFiles(new string[] { oldFile }); DeleteTempFiles(new string[] { newFile }); } }
public void ItemsPickUpItemDefinitionMetadataFromImportedProject() { try { ObjectModelHelpers.CreateFileInTempProjectDirectory("foo.proj", @" <Project DefaultTargets=`t` ToolsVersion=`msbuilddefaulttoolsversion` xmlns=`msbuildnamespace`> <ItemGroup> <ItemWithDefinition Include=`foo.cs` /> </ItemGroup> <Target Name=`t`> <Message Text=`[%(ItemWithDefinition.SomeMetadata)]` /> </Target> <Import Project=`foo2.proj` /> </Project> "); ObjectModelHelpers.CreateFileInTempProjectDirectory("foo2.proj", @" <Project DefaultTargets=`t2` ToolsVersion=`msbuilddefaulttoolsversion` xmlns=`msbuildnamespace`> <ItemDefinitionGroup> <ItemWithDefinition> <SomeMetadata>foo</SomeMetadata> </ItemWithDefinition> </ItemDefinitionGroup> <Target Name=`t2` /> </Project> "); MockLogger logger = ObjectModelHelpers.BuildTempProjectFileExpectSuccess("foo.proj"); logger.AssertLogContains("[foo]"); } finally { ObjectModelHelpers.DeleteTempProjectDirectory(); } }
public void MutualReferenceToMetadataQualified() { MockLogger logger = new MockLogger(); Project p = ObjectModelHelpers.CreateInMemoryProject(@" <Project xmlns=`msbuildnamespace`> <ItemGroup> <i Include=`i1`> <m>m1</m> <m>%(i.m);m2</m> <m Condition='false'>%(m);m3</m> </i> </ItemGroup> <Target Name=`t`> <Message Text=`[%(i.m)]`/> </Target> </Project> ", logger); p.Build("t"); logger.AssertLogContains("[m1;m2]"); }
public void ItemDefinitionForOtherItemType() { MockLogger logger = new MockLogger(); Project p = ObjectModelHelpers.CreateInMemoryProject(@" <Project ToolsVersion=`msbuilddefaulttoolsversion` xmlns=`msbuildnamespace`> <ItemGroup> <i Include='i1'/> </ItemGroup> <ItemDefinitionGroup> <j> <m>m1</m> </j> </ItemDefinitionGroup> <Target Name=`t`> <Message Text=`[%(i.m)]`/> </Target> </Project> ", logger); p.Build("t"); logger.AssertLogContains("[]"); }
public void EscapingInItemDefinitionInProject() { MockLogger logger = new MockLogger(); Project p = ObjectModelHelpers.CreateInMemoryProject(@" <Project ToolsVersion=`msbuilddefaulttoolsversion` xmlns=`msbuildnamespace`> <ItemGroup> <i Include='i1'/> </ItemGroup> <ItemDefinitionGroup Condition=`'%24'=='$'`> <i Condition=`'%24'=='$'`> <m Condition=`'%24'=='$'`>%24(xyz)</m> </i> </ItemDefinitionGroup> <Target Name=`t`> <Message Text=`[%(i.m)]`/> </Target> </Project> ", logger); p.Build("t"); logger.AssertLogContains("[$(xyz)]"); }
public void SetGlobalPropertyAfterLoadBeforeBuild() { MockLogger logger = new MockLogger(); Project project = ObjectModelHelpers.CreateInMemoryProject(@" <Project ToolsVersion=`msbuilddefaulttoolsversion` xmlns=`msbuildnamespace`> <Target Name=`log_property`> <Message Text=`[$(p)]`/> </Target> </Project> ", logger); BuildPropertyGroup globals = project.GlobalProperties; // Set a property before building -- this should work BuildProperty p = new BuildProperty("p", "v1"); globals.SetProperty(p); project.Build(); logger.AssertLogContains("[v1]"); }
public void DefinitionInImportedFile() { MockLogger logger = new MockLogger(); string importedFile = null; try { importedFile = Path.GetTempFileName(); File.WriteAllText(importedFile, @" <Project ToolsVersion='3.5' xmlns='http://schemas.microsoft.com/developer/msbuild/2003'> <ItemDefinitionGroup> <CppCompile> <Defines>DEBUG</Defines> </CppCompile> </ItemDefinitionGroup> </Project> "); Project p = ObjectModelHelpers.CreateInMemoryProject(@" <Project ToolsVersion=`msbuilddefaulttoolsversion` xmlns=`msbuildnamespace`> <ItemGroup> <CppCompile Include='a.cpp'/> </ItemGroup> <Import Project='" + importedFile + @"'/> <Target Name=`t`> <Message Text=`[%(CppCompile.Identity)==%(CppCompile.Defines)]`/> </Target> </Project> ", logger); p.Build("t"); logger.AssertLogContains("[a.cpp==DEBUG]"); } finally { ObjectModelHelpers.DeleteTempFiles(new string[] { importedFile }); } }
public void MetadataConditionOnItemDefinition() { MockLogger logger = new MockLogger(); Project p = ObjectModelHelpers.CreateInMemoryProject(@" <Project ToolsVersion=`msbuilddefaulttoolsversion` xmlns=`msbuildnamespace`> <ItemGroup> <i Include='i1'/> <j Include='j1'/> </ItemGroup> <ItemDefinitionGroup> <i> <m>m1</m> </i> <j> <n>n1</n> </j> </ItemDefinitionGroup> <ItemDefinitionGroup> <i Condition=`'%(m)'=='m1'`> <m>m2</m> </i> <!-- verify j metadata is distinct --> <j Condition=`'%(j.n)'=='n1' and '%(n)'=='n1'`> <n>n2</n> </j> </ItemDefinitionGroup> <Target Name=`t`> <Message Text=`[%(i.m)]`/> <Message Text=`[%(j.n)]`/> </Target> </Project> ", logger); p.Build("t"); logger.AssertLogContains("[m2]", "[n2]"); }
public void EscapeOutputItemspecs() { string projectContents = @" <Project ToolsVersion=`msbuilddefaulttoolsversion` xmlns=`msbuildnamespace`> <Target Name=`t` > <CreateItem Include=`%2520`><!-- should be a literal %20 not a space --> <Output TaskParameter=`Include` ItemName=`Include`/> </CreateItem> <Message Text=`@(include)` Importance=`high`/> </Target> </Project> "; Project p = ObjectModelHelpers.CreateInMemoryProject(projectContents); MockLogger l = new MockLogger(); p.ParentEngine.RegisterLogger(l); p.Build(new string[] { "t" }, null); Assertion.Assert(l.ErrorCount == 0); Assertion.Assert(l.WarningCount == 0); l.AssertLogContains("%20"); }
public void MutualReferenceToDefinition2() { MockLogger logger = new MockLogger(); Project p = ObjectModelHelpers.CreateInMemoryProject(@" <Project ToolsVersion=`msbuilddefaulttoolsversion` xmlns=`msbuildnamespace`> <ItemDefinitionGroup> <i> <m>~%(n)~</m> <n>n1</n> </i> </ItemDefinitionGroup> <ItemGroup> <i Include=`i1`/> </ItemGroup> <Target Name=`t`> <Message Text=`[%(i.m)][%(i.n)]`/> </Target> </Project> ", logger); p.Build("t"); logger.AssertLogContains("[~~][n1]"); }
public void ItemsEmittedByTaskPickUpItemDefinitions() { MockLogger logger = new MockLogger(); Project p = ObjectModelHelpers.CreateInMemoryProject(@" <Project ToolsVersion=`msbuilddefaulttoolsversion` xmlns=`msbuildnamespace`> <ItemDefinitionGroup> <i> <m>m1</m> <n>n1</n> </i> </ItemDefinitionGroup> <Target Name=`t`> <CreateItem Include=`i1` AdditionalMetadata=`n=n2`> <Output ItemName=`i` TaskParameter=`Include`/> </CreateItem> <Message Text=`[%(i.m)][%(i.n)]`/> </Target> </Project> ", logger); p.Build("t"); logger.AssertLogContains("[m1][n2]"); }
public void TestSkipInvalidConfigurationsCase() { string tmpFileName = Path.GetTempFileName(); File.Delete(tmpFileName); string projectFilePath = tmpFileName + ".sln"; string solutionContents = @" Microsoft Visual Studio Solution File, Format Version 9.00 # Visual Studio 2005 Project('{E24C65DC-7377-472B-9ABA-BC803B73C61A}') = 'C:\solutions\WebSite2\', '..\..\solutions\WebSite2\', '{F90528C4-6989-4D33-AFE8-F53173597CC2}' ProjectSection(WebsiteProperties) = preProject Debug.AspNetCompiler.VirtualPath = '/WebSite2' Debug.AspNetCompiler.PhysicalPath = '..\..\solutions\WebSite2\' Debug.AspNetCompiler.TargetPath = 'PrecompiledWeb\WebSite2\' Debug.AspNetCompiler.Updateable = 'true' Debug.AspNetCompiler.ForceOverwrite = 'true' Debug.AspNetCompiler.FixedNames = 'true' Debug.AspNetCompiler.Debug = 'True' Release.AspNetCompiler.VirtualPath = '/WebSite2' Release.AspNetCompiler.PhysicalPath = '..\..\solutions\WebSite2\' Release.AspNetCompiler.TargetPath = 'PrecompiledWeb\WebSite2\' Release.AspNetCompiler.Updateable = 'true' Release.AspNetCompiler.ForceOverwrite = 'true' Release.AspNetCompiler.FixedNames = 'true' Release.AspNetCompiler.Debug = 'False' VWDPort = '2776' DefaultWebSiteLanguage = 'Visual C#' EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {F90528C4-6989-4D33-AFE8-F53173597CC2}.Debug|Any CPU.ActiveCfg = Debug|.NET {F90528C4-6989-4D33-AFE8-F53173597CC2}.Debug|Any CPU.Build.0 = Debug|.NET EndGlobalSection EndGlobal"; File.WriteAllText(projectFilePath, solutionContents.Replace('\'', '"')); try { MockLogger logger = new MockLogger(); Engine engine = new Engine(); engine.RegisterLogger(logger); Project solutionWrapperProject = new Project(engine); solutionWrapperProject.Load(projectFilePath); solutionWrapperProject.SetProperty("Configuration", "Nonexistent"); solutionWrapperProject.SetProperty("SkipInvalidConfigurations", "true"); solutionWrapperProject.ToolsVersion = "4.0"; // Build should complete successfully even with an invalid solution config if SkipInvalidConfigurations is true Assertion.AssertEquals(true, solutionWrapperProject.Build(null, null)); // We should get the invalid solution configuration warning Assertion.AssertEquals(1, logger.Warnings.Count); BuildWarningEventArgs warning = logger.Warnings[0]; // Don't look at warning.Code here -- it may be null if PseudoLoc has messed // with our resource strings. The code will still be in the log -- it just wouldn't get // pulled out into the code field. logger.AssertLogContains("MSB4126"); // No errors expected Assertion.AssertEquals(0, logger.Errors.Count); } finally { File.Delete(projectFilePath); } }
public void SetGlobalPropertyDuringBuildToValueItAlreadyHas() { MockLogger logger = SetPropertyDuringBuild("v1", "v1"); logger.AssertLogContains("[v1]"); }
public void FailingTaskStillPublishesOutputs() { MockLogger l = new MockLogger(); string resx = Path.Combine(Path.GetTempPath(), "FailingTaskStillPublishesOutputs.resx"); try { File.WriteAllText(resx, @" <root> <resheader name=""resmimetype""> <value>text/microsoft-resx</value> </resheader> <resheader name=""version""> <value>2.0</value> </resheader> <resheader name=""reader""> <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> </resheader> <resheader name=""writer""> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> </resheader> <data name=""a""> <value>aa</value> </data> <data name=""b""> <value>bb</value> </data> </root>"); Project p = ObjectModelHelpers.CreateInMemoryProject(@" <Project DefaultTargets=`Build` ToolsVersion=`msbuilddefaulttoolsversion` xmlns=`msbuildnamespace`> <Target Name='Build'> <GenerateResource Sources='" + resx + @"' ExecuteAsTool='false' StronglyTypedLanguage='!@:|'> <Output TaskParameter='FilesWritten' ItemName='FilesWrittenItem'/> <Output TaskParameter='FilesWritten' PropertyName='FilesWrittenProperty'/> </GenerateResource> <OnError ExecuteTargets='ErrorTarget'/> </Target> <Target Name='ErrorTarget'> <Message Text='[@(fileswrittenitem)]'/> <Message Text='[$(fileswrittenproperty)]'/> </Target> </Project>", l ); p.Build(new string[] { "Build" }, null); string resource = Path.ChangeExtension(resx, ".resources"); Assertion.Assert("Expected one error because 'Build' failed.", l.ErrorCount >= 1); l.AssertLogContains("[" + resource + "]", "[" + resource + "]"); // And outputs are visible at the project level Assertion.AssertEquals(resource, p.GetEvaluatedItemsByName("FilesWrittenItem")[0].FinalItemSpec); Assertion.AssertEquals(resource, p.GetEvaluatedProperty("FilesWrittenProperty")); p.ResetBuildStatus(); // But are gone after resetting of course Assertion.AssertEquals(0, p.GetEvaluatedItemsByName("FilesWrittenItem").Count); Assertion.AssertEquals(null, p.GetEvaluatedProperty("FilesWrittenProperty")); } finally { File.Delete(resx); } }