Ejemplo n.º 1
0
 /**
  * Dummy strategy to return as order value index of the vertex
  *
  * @param OutTree $tree
  * @return array
  */
 public function optimize(OutTree $tree)
 {
     $vertices = $tree->getVerticesDescendant($tree->getVertexRoot());
     $i = 0;
     $output = [];
     /** @var Vertex $vertex */
     foreach ($vertices as $vertex) {
         $output[$vertex->getId()] = $i++;
     }
     return $output;
 }
Ejemplo n.º 2
0
 /**
  * Build out-tree graph from defined Processes and their relations.
  *
  * @return OutTree
  */
 public function buildTree()
 {
     if (!$this->tree) {
         $root = $this->graph->createVertex(0);
         // Create edges directed from the root node
         foreach ($this->processes as $processClassName => $processObject) {
             $vertex = $this->graph->getVertex($processClassName);
             if (!$processObject->delayMinutes) {
                 // process doesn't depend on anything => link it to the root node
                 $root->createEdgeTo($vertex)->setWeight(0);
             } else {
                 // link process to its dependency
                 // Throw error if dependency is to not existing vertex
                 if (!$this->graph->hasVertex($processObject->delayAfter)) {
                     throw new \InvalidArgumentException(sprintf('Testcase "%s" has @delayAfter dependency on "%s", but this testcase was not defined.', $processClassName, $processObject->delayAfter));
                 }
                 $this->graph->getVertex($processObject->delayAfter)->createEdgeTo($vertex)->setWeight($processObject->delayMinutes);
             }
         }
     }
     $this->tree = new OutTree($this->graph);
     if (!$this->tree->isTree()) {
         throw new \InvalidArgumentException(sprintf('Cannot build tree graph from tests dependencies. Probably some cyclic dependency is present.'));
     }
     return $this->tree;
 }
Ejemplo n.º 3
0
 /**
  * Optimize order of tests in given tree based on their defined delay.
  * The aim is to run as first processes having the longest delay of their sub-dependencies.
  *
  * @param OutTree $tree
  * @return array Array of [string key (= testclass fully qualified name) => int value (= test order)]
  */
 public function optimize(OutTree $tree)
 {
     // get root node of the tree
     $root = $tree->getVertexRoot();
     // get all root descendants vertices (without the root vertex itself)
     $children = $tree->getVerticesDescendant($root);
     // for each vertex (process) get maximum total weight of its subtree (longest distance)
     $subTreeMaxDistances = [];
     /** @var Vertex $childVertex */
     foreach ($children as $childVertex) {
         $alg = new Dijkstra($childVertex);
         // get map with distances to all linked reachable vertexes
         $distanceMap = $alg->getDistanceMap();
         // save the longest distance
         $subTreeMaxDistances[$childVertex->getId()] = $distanceMap ? max($distanceMap) : 0;
     }
     return $subTreeMaxDistances;
 }