public void FailedTargets() { MockLogger logger = ObjectModelHelpers.BuildProjectExpectFailure(@" <Project DefaultTargets=`build` ToolsVersion=`msbuilddefaulttoolsversion` xmlns=`msbuildnamespace`> <Target Name=`build` > <CallTarget Targets=`a; b; c` /> </Target> <Target Name=`a` > <Message Text=`Inside A` /> </Target> <Target Name=`b` > <Error Text=`Inside B` /> </Target> <Target Name=`c` > <Message Text=`Inside C` /> </Target> </Project> "); logger.AssertLogContains("Inside A"); logger.AssertLogContains("Inside B"); // Target C should not have been run. logger.AssertLogDoesntContain("Inside C"); }
/// <summary> /// Assert that the log doesn't contain the given string. /// First check if the string is in the log string. If not /// than make sure it is also not in the MockLogger /// </summary> internal void AssertLogDoesntContain(string contains) { string logText; lock (_lockObj) { logText = _log.ToString(); } if (_output == null) { Console.WriteLine(logText); } else { _output.WriteLine(logText); } logText.ShouldNotContain(contains, Case.Insensitive); // If we do not contain this string than pass it to // MockLogger. Since MockLogger is also registered as // a logger it may have this string. MockLogger.AssertLogDoesntContain(contains); }
public void EndToEndMultilineExec() { using (var env = TestEnvironment.Create(_output)) { var testProject = env.CreateTestProjectWithFiles(@"<Project> <Target Name=""MultilineExec""> <Exec Command=""echo line 1 echo line 2 echo line 3"" /> </Target> </Project>"); using (var buildManager = new BuildManager()) { MockLogger logger = new MockLogger(_output, profileEvaluation: false, printEventsToStdout: false); var parameters = new BuildParameters() { Loggers = new[] { logger }, }; var collection = new ProjectCollection( new Dictionary <string, string>(), new[] { logger }, remoteLoggers: null, ToolsetDefinitionLocations.Default, maxNodeCount: 1, onlyLogCriticalEvents: false, loadProjectsReadOnly: true); var project = collection.LoadProject(testProject.ProjectFile).CreateProjectInstance(); var request = new BuildRequestData( project, targetsToBuild: new[] { "MultilineExec" }, hostServices: null); var result = buildManager.Build(parameters, request); logger.AssertLogContains("line 2"); logger.AssertLogContains("line 3"); // To be correct, these need to be on separate lines, not // all together on one. logger.AssertLogDoesntContain("1 echo line"); result.OverallResult.ShouldBe(BuildResultCode.Success); } } }
public void PeekWithoutUsingTask() { string projectContents = @" <Project ToolsVersion='msbuilddefaulttoolsversion' xmlns='http://schemas.microsoft.com/developer/msbuild/2003'> <Target Name='x'> <XmlPeek Query='abc' ContinueOnError='true' /> </Target> </Project>"; // The task won't complete properly, but ContinueOnError converts the errors to warnings, so the build should succeed MockLogger logger = ObjectModelHelpers.BuildProjectExpectSuccess(projectContents); // Verify that the task was indeed found. logger.AssertLogDoesntContain("MSB4036"); }
public void PokeWithoutUsingTask() { string projectContents = @" <Project ToolsVersion='msbuilddefaulttoolsversion' xmlns='http://schemas.microsoft.com/developer/msbuild/2003'> <Target Name='x'> <XmlPoke Value='abc' Query='def' XmlInputPath='ghi.jkl' ContinueOnError='true' /> </Target> </Project>"; // The task will error, but ContinueOnError means that it will just be a warning. MockLogger logger = ObjectModelHelpers.BuildProjectExpectSuccess(projectContents); // Verify that the task was indeed found. logger.AssertLogDoesntContain("MSB4036"); }
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 }); } }
/// <summary> /// Assert that the log doesnt contain the given string. /// First check if the string is in the log string. If not /// than make sure it is also not in the MockLogger /// </summary> /// <param name="contains"></param> internal void AssertLogDoesntContain(string contains) { if (upperLog == null) { upperLog = log; upperLog = upperLog.ToUpperInvariant(); } Assertion.Assert ( !upperLog.Contains ( contains.ToUpperInvariant() ) ); // If we do not contain this string than pass it to // MockLogger. Since MockLogger is also registered as // a logger it may have this string. mockLogger.AssertLogDoesntContain ( contains ); }