TestDagUtils.java 7.03 KB
Newer Older
1 2 3
package mvd.jester.model;

import static org.junit.jupiter.api.Assertions.assertTrue;
4
import java.util.concurrent.ThreadLocalRandom;
5
import org.jgrapht.Graphs;
6 7 8 9
import org.jgrapht.experimental.dag.DirectedAcyclicGraph;
import org.jgrapht.graph.DefaultEdge;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
10
import mvd.jester.utils.DagUtils;
Michael Schmid committed
11
import mvd.jester.model.SystemManager.DagTaskBuilder;
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
import mvd.jester.utils.BinaryDecompositionTree;

public class TestDagUtils {

    @Test
    @DisplayName("Test if dynamic segments are constructed correctly.")
    public void checkPathLength() {
        DirectedAcyclicGraph<Job, DefaultEdge> jobDag = createJobDag();
        long criticalPath = DagUtils.calculateCriticalPath(jobDag);

        for (Job j : jobDag) {
            assertTrue(j.getRelativeCompletionTime() <= criticalPath);
        }
        for (DefaultEdge e : jobDag.edgeSet()) {
            Job source = jobDag.getEdgeSource(e);
            Job target = jobDag.getEdgeTarget(e);
            assertTrue(source.getRelativeCompletionTime() < target.getRelativeCompletionTime());
        }

        assertTrue(criticalPath == 155);
    }


    @Test
36 37
    @DisplayName("Check if NFJ DAGs are created correctly.")
    void checkNfjDagCreation() {
38
        for (int i = 0; i < 100; ++i) {
Michael Schmid committed
39
            DagTaskBuilder b = new DagTaskBuilder();
40 41 42 43 44 45
            DagTask t = b.generateTask();

            DirectedAcyclicGraph<Job, DefaultEdge> nfjDag = DagUtils.createNFJGraph(t.getJobDag());

            assertTrue(DagUtils.checkNFJProperty(nfjDag));
        }
46 47 48

    }

49
    @Test
50 51
    @DisplayName("Check if Decomposition Tree is created correctly for NFJ Dag.")
    void checkDecompositionTreeCreation() {
52 53
        for (int i = 0; i < 100; ++i) {
            long numberOfProcessors = ThreadLocalRandom.current().nextLong(4, 16);
Michael Schmid committed
54
            DagTaskBuilder b = new DagTaskBuilder().setNumberOfProcessors(numberOfProcessors);
55 56 57 58 59 60 61 62
            DagTask t = b.generateTask();
            DirectedAcyclicGraph<Job, DefaultEdge> jobDag = t.getJobDag();
            DirectedAcyclicGraph<Job, DefaultEdge> nfjJobDag = DagUtils.createNFJGraph(jobDag);

            BinaryDecompositionTree<Job> tree = DagUtils.createDecompositionTree(nfjJobDag);
            DirectedAcyclicGraph<Job, DefaultEdge> jobDagFromTree =
                    DagUtils.createNFJfromDecompositionTree(tree);

63 64
            assertTrue(jobDag.vertexSet().size() == nfjJobDag.vertexSet().size());
            assertTrue(jobDag.vertexSet().size() == jobDagFromTree.vertexSet().size());
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
            assertTrue(jobDagFromTree.edgeSet().size() == nfjJobDag.edgeSet().size());

            for (DefaultEdge e : nfjJobDag.edgeSet()) {
                Job target = nfjJobDag.getEdgeTarget(e);
                Job source = nfjJobDag.getEdgeSource(e);

                assertTrue(jobDagFromTree.containsEdge(source, target));
            }

            for (Job j : nfjJobDag) {
                for (Job n : nfjJobDag) {
                    if (n == j) {
                        continue;
                    }
                    if (nfjJobDag.containsEdge(n, j)) {
                        assertTrue(jobDagFromTree.containsEdge(n, j));
                    }
                }
                assertTrue(nfjJobDag.inDegreeOf(j) == jobDagFromTree.inDegreeOf(j));
                assertTrue(nfjJobDag.outDegreeOf(j) == jobDagFromTree.outDegreeOf(j));

                for (Job p : Graphs.predecessorListOf(nfjJobDag, j)) {
                    assertTrue(Graphs.predecessorListOf(jobDagFromTree, j).contains(p));
                }

90
                for (Job s : Graphs.successorListOf(nfjJobDag, j)) {
91 92 93 94 95 96 97 98 99 100 101
                    assertTrue(Graphs.successorListOf(jobDagFromTree, j).contains(s));
                }

                for (Job a : nfjJobDag.getAncestors(nfjJobDag, j)) {
                    assertTrue(jobDagFromTree.getAncestors(jobDagFromTree, j).contains(a));
                }

                for (Job d : nfjJobDag.getDescendants(nfjJobDag, j)) {
                    assertTrue(jobDagFromTree.getDescendants(jobDagFromTree, j).contains(d));
                }
            }
102

103
        }
104

105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186
    }


    private DirectedAcyclicGraph<Job, DefaultEdge> createJobDag() {
        DirectedAcyclicGraph<Job, DefaultEdge> jobDag =
                new DirectedAcyclicGraph<>(DefaultEdge.class);

        Job source = new Job(20);
        Job pathA = new Job(10);
        Job pathB = new Job(30);
        Job pathC = new Job(40);

        Job child1OfA = new Job(5);
        Job child2OfA = new Job(15);
        Job child3OfA = new Job(5);

        Job childsOfAJoin = new Job(10);

        Job child1OfC = new Job(5);
        Job child2OfC = new Job(10);
        Job child3OfC = new Job(15);
        Job child4OfC = new Job(20);

        Job firstJoin = new Job(20);

        Job intermediateFork = new Job(10);

        Job forkChild1 = new Job(5);
        Job forkChild2 = new Job(10);
        Job forkChild3 = new Job(15);

        Job sink = new Job(30);
        try {
            jobDag.addVertex(source);
            jobDag.addVertex(pathA);
            jobDag.addVertex(pathB);
            jobDag.addVertex(pathC);
            jobDag.addVertex(child1OfA);
            jobDag.addVertex(child2OfA);
            jobDag.addVertex(child3OfA);
            jobDag.addVertex(childsOfAJoin);
            jobDag.addVertex(child1OfC);
            jobDag.addVertex(child2OfC);
            jobDag.addVertex(child3OfC);
            jobDag.addVertex(child4OfC);
            jobDag.addVertex(firstJoin);
            jobDag.addVertex(intermediateFork);
            jobDag.addVertex(forkChild1);
            jobDag.addVertex(forkChild2);
            jobDag.addVertex(forkChild3);
            jobDag.addVertex(sink);
            jobDag.addDagEdge(source, pathA);
            jobDag.addDagEdge(pathA, child1OfA);
            jobDag.addDagEdge(pathA, child2OfA);
            jobDag.addDagEdge(pathA, child3OfA);
            jobDag.addDagEdge(child1OfA, childsOfAJoin);
            jobDag.addDagEdge(child2OfA, childsOfAJoin);
            jobDag.addDagEdge(child3OfA, childsOfAJoin);
            jobDag.addDagEdge(childsOfAJoin, firstJoin);
            jobDag.addDagEdge(source, pathB);
            jobDag.addDagEdge(pathB, firstJoin);
            jobDag.addDagEdge(source, pathC);
            jobDag.addDagEdge(pathC, child1OfC);
            jobDag.addDagEdge(pathC, child2OfC);
            jobDag.addDagEdge(pathC, child3OfC);
            jobDag.addDagEdge(pathC, child4OfC);
            jobDag.addDagEdge(child1OfC, firstJoin);
            jobDag.addDagEdge(child2OfC, firstJoin);
            jobDag.addDagEdge(child3OfC, firstJoin);
            jobDag.addDagEdge(child4OfC, firstJoin);
            jobDag.addDagEdge(firstJoin, intermediateFork);
            jobDag.addDagEdge(intermediateFork, forkChild1);
            jobDag.addDagEdge(intermediateFork, forkChild2);
            jobDag.addDagEdge(intermediateFork, forkChild3);
            jobDag.addDagEdge(forkChild1, sink);
            jobDag.addDagEdge(forkChild2, sink);
            jobDag.addDagEdge(forkChild3, sink);
        } catch (Exception e) {
        }
        return jobDag;
    }
}