public void TestFailure1() { var p1 = new Project { Filename = @"C:\1" }; var p2 = new Project { Filename = @"C:\2" }; _graph.Add(p1, new BuildEnvironment()); _graph.Add(p2, new BuildEnvironment()); _graph.AddDependency(p2, p1); Project next; BuildEnvironment unused; _graph.TryGetNextProject(out next, out unused).Should().BeTrue(); next.Should().Be(p1); _graph.MarkAsFailed(p1); _graph.FailedCount.Should().Be(1); _graph.TryGetNextProject(out next, out unused) .Should() .BeFalse("because p2 depends on p1 and because the latter has failed, the former may not be build next"); _graph.FinishedEvent.Wait(TimeSpan.Zero).Should().BeTrue("Because no more projects can be build"); }
private void Run() { try { while (true) { Project project; BuildEnvironment environment; if (_graph.TryGetNextProject(out project, out environment)) { var logger = _buildLog.CreateLogger(); try { _taskEngine.Run(project, _target, environment, _graph, logger); if (logger.HasErrors) { _graph.MarkAsFailed(project); } else { _graph.MarkAsSuccess(project); } } catch (BuildException e) { logger.WriteLine(Verbosity.Quiet, "error: {0}", e.Message); Log.ErrorFormat("Cauhgt exception while building project '{0}': {1}", project.Filename, e); _graph.MarkAsFailed(project); } catch (Exception e) { logger.WriteLine(Verbosity.Quiet, "error: Internal build error: {0}", e); Log.ErrorFormat("Cauhgt unexpected exception while building project '{0}': {1}", project.Filename, e); _graph.MarkAsFailed(project); } } else { if (_graph.FinishedEvent.Wait(TimeSpan.FromSeconds(100))) { break; } } } } catch (Exception e) { Log.FatalFormat("Caught unexpected exception: {0}", e); } finally { _isFinished = true; } }