public void SimpleGraphExecute_WithConcurrency_NoThrottle_WithException() { var stack = new ConcurrentStack <int>(); var node0 = new Vertex(() => stack.Push(1)); var node1 = new Vertex(() => stack.Push(2)); var node2 = new Vertex(() => { throw new Exception(); }); var node3 = new Vertex(() => stack.Push(2)); var node4 = new Vertex(() => stack.Push(3)); node3.AddDependencies(node0); node2.AddDependencies(node0); node1.AddDependencies(node0); node4.AddDependencies(node1, node2, node3); var executive = new GraphExecutive(new DirectedAcyclicGraph(node0, node1, node2, node3, node4)); executive.ExecuteAndWait(); Assert.IsTrue(executive.VerticesFailed.Count == 2); var vals = stack.ToArray(); var expected = new[] { 2, 2, 1 }; for (var i = 0; i < expected.Length; i++) { Assert.AreEqual(expected[i], vals[i]); } }
static void Main(string[] args) { //Create six node that each do nothing for at least 1 second var nodeA = new Vertex(() => Thread.Sleep(1000)); var nodeB = new Vertex(() => Thread.Sleep(1000)); var nodeC = new Vertex(() => Thread.Sleep(1000)); var nodeD = new Vertex(() => Thread.Sleep(1000)); var nodeE = new Vertex(() => Thread.Sleep(1000)); var nodeF = new Vertex(() => Thread.Sleep(1000)); //Create a DAG from the nodes nodeC.AddDependencies(nodeA, nodeB); nodeD.AddDependencies(nodeC); nodeE.AddDependencies(nodeC); nodeF.AddDependencies(nodeB); var graph = new DirectedAcyclicGraph(nodeA, nodeB, nodeC, nodeD, nodeE, nodeF); //Create a graph executive var graphExecutive = new GraphExecutive(graph, new ConcurrencyThrottle(8)); graphExecutive.ExecuteAndWait(); //Output result Console.WriteLine("Graph Execution Complete"); Console.WriteLine(graphExecutive.VerticesFailed.Any() ? "\tn nodes failed" : "\tall nodes successful"); #if DEBUG Console.ReadLine(); #endif }
public void SimpleGraphExecute_NoConcurrency() { var stack = new Stack <int>(); var node0 = new Vertex(() => stack.Push(1)); var node1 = new Vertex(() => stack.Push(2)); var node2 = new Vertex(() => stack.Push(3)); node2.AddDependencies(node1); node1.AddDependencies(node0); var executive = new GraphExecutive(new DirectedAcyclicGraph(node0, node1, node2)); var resetEvent = new ManualResetEventSlim(); executive.OnGraphExecutionFinished += (sender, ergs) => resetEvent.Set(); executive.Execute(); resetEvent.Wait(); for (var i = 3; i > 0; i--) { Assert.AreEqual(i, stack.Pop()); } }
public void SimpleGraphExecute_WithConcurrency_NoThrottle() { //TODO: Sledgehammer, should be improved for (int ii = 0; ii < 1000; ii++) { var stack = new ConcurrentStack <int>(); var node0 = new Vertex(() => stack.Push(1)); var node1 = new Vertex(() => stack.Push(2)); var node2 = new Vertex(() => stack.Push(2)); var node3 = new Vertex(() => stack.Push(2)); var node4 = new Vertex(() => stack.Push(3)); node3.AddDependencies(node0); node2.AddDependencies(node0); node1.AddDependencies(node0); node4.AddDependencies(node1, node2, node3); var executive = new GraphExecutive(new DirectedAcyclicGraph(node0, node1, node2, node3, node4)); executive.ExecuteAndWait(); Assert.IsTrue(executive.VerticesFailed.Count == 0); var vals = stack.ToArray(); var expected = new[] { 3, 2, 2, 2, 1 }; for (var i = 0; i < expected.Length; i++) { Assert.AreEqual(expected[i], vals[i]); } } }
public void DoNotAddRedundantDependency() { var node = new Vertex(() => Thread.Sleep(1)); var node2 = new Vertex(() => Thread.Sleep(1)); var node3 = new Vertex(() => Thread.Sleep(1)); node2.AddDependencies(node); node3.AddDependencies(node2); Assert.AreEqual(1, node3.Dependencies.Count()); node3.AddDependencies(node); Assert.AreEqual(1, node3.Dependencies.Count()); }
public void NestedCircularDependencyTest() { var node = new Vertex(() => Thread.Sleep(1)); var node2 = new Vertex(() => Thread.Sleep(1)); var node3 = new Vertex(() => Thread.Sleep(1)); var node4 = new Vertex(() => Thread.Sleep(1)); node2.AddDependencies(node); node3.AddDependencies(node2); node4.AddDependencies(node3); node.AddDependencies(node2); }
public void SimpleGraphAggregates() { var node0 = new Vertex(() => Thread.Sleep(1)); var node1 = new Vertex(() => Thread.Sleep(1)); var node2 = new Vertex(() => Thread.Sleep(1)); node2.AddDependencies(node1); node1.AddDependencies(node0); var graph = new DirectedAcyclicGraph(node0, node1, node2); Assert.AreEqual(3, graph.AllVertices.Count()); Assert.AreEqual(1, graph.RootVertices.Count()); Assert.AreEqual(1, graph.TerminalVertices.Count()); Assert.AreEqual(node0, graph.RootVertices.First()); Assert.AreEqual(node2, graph.TerminalVertices.First()); }
public void FlattenAndGetDistinctUpwards() { var vertex00 = new Vertex(() => Thread.Sleep(1)); var vertex01 = new Vertex(() => Thread.Sleep(1)); var vertex10 = new Vertex(() => Thread.Sleep(1)); var vertex11 = new Vertex(() => Thread.Sleep(1)); vertex10.AddDependencies(vertex00, vertex01); vertex11.AddDependencies(vertex00, vertex01); var vertices = new[] { vertex10, vertex11 }.FlattenAndGetDistinct(true); Assert.AreEqual(4, vertices.Count()); Assert.IsTrue(vertices.Contains(vertex00)); Assert.IsTrue(vertices.Contains(vertex01)); Assert.IsTrue(vertices.Contains(vertex10)); Assert.IsTrue(vertices.Contains(vertex11)); }
public void ConcurrencyThrottle() { var maxCount = new MaxCount(); var node0 = new Vertex(() => Thread.Sleep(100)); var node10 = new Vertex(() => { maxCount.Inc(); Thread.Sleep(1000); maxCount.Dec(); }); var node11 = new Vertex(() => { maxCount.Inc(); Thread.Sleep(1000); maxCount.Dec(); }); var node12 = new Vertex(() => { maxCount.Inc(); Thread.Sleep(1000); maxCount.Dec(); }); var node13 = new Vertex(() => { maxCount.Inc(); Thread.Sleep(1000); maxCount.Dec(); }); var node14 = new Vertex(() => { maxCount.Inc(); Thread.Sleep(1000); maxCount.Dec(); }); var node15 = new Vertex(() => { maxCount.Inc(); Thread.Sleep(1000); maxCount.Dec(); }); var node16 = new Vertex(() => { maxCount.Inc(); Thread.Sleep(1000); maxCount.Dec(); }); node10.AddDependencies(node0); node11.AddDependencies(node0); node12.AddDependencies(node0); node13.AddDependencies(node0); node14.AddDependencies(node0); node15.AddDependencies(node0); node16.AddDependencies(node0); var executive = new GraphExecutive(new DirectedAcyclicGraph(node0), new ConcurrencyThrottle(2)); var resetEvent = new ManualResetEventSlim(); executive.OnGraphExecutionFinished += (sender, ergs) => resetEvent.Set(); executive.Execute(); resetEvent.Wait(); Assert.IsTrue(maxCount.Max < 3); }
public void CircularDependencyTest() { var node = new Vertex(() => Thread.Sleep(1)); node.AddDependencies(node); }