Example #1
0
        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]);
            }
        }
Example #2
0
        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
        }
Example #3
0
        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());
            }
        }
Example #4
0
        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]);
                }
            }
        }
Example #5
0
        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());
        }
Example #6
0
        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());
        }
Example #8
0
        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));
        }
Example #9
0
        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);
        }
Example #10
0
        public void CircularDependencyTest()
        {
            var node = new Vertex(() => Thread.Sleep(1));

            node.AddDependencies(node);
        }