/*************************GO-LICENSE-START*********************************
* Copyright 2014 ThoughtWorks, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*************************GO-LICENSE-END***********************************/
package com.thoughtworks.go.server.valuestreammap;
import com.thoughtworks.go.config.CaseInsensitiveString;
import com.thoughtworks.go.config.materials.git.GitMaterial;
import com.thoughtworks.go.domain.MaterialRevision;
import com.thoughtworks.go.domain.materials.Modification;
import com.thoughtworks.go.domain.valuestreammap.Node;
import com.thoughtworks.go.domain.valuestreammap.NodeLevelMap;
import com.thoughtworks.go.domain.valuestreammap.PipelineDependencyNode;
import com.thoughtworks.go.domain.valuestreammap.PipelineRevision;
import com.thoughtworks.go.domain.valuestreammap.SCMDependencyNode;
import com.thoughtworks.go.domain.valuestreammap.ValueStreamMap;
import com.thoughtworks.go.helper.ModificationsMother;
import org.junit.Test;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.junit.Assert.assertThat;
public class LevelAssignmentTest {
@Test
public void shouldAssignLevelsForUpstreamNodesOfCurrentPipeline() throws Exception {
/*
---> p1 ---
/ \
g -----------p3
\ /
---> p2 ---
*/
String current = "p3";
Node p1 = new PipelineDependencyNode("p1", "p1");
Node p2 = new PipelineDependencyNode("p2", "p2");
Node gitNode = new SCMDependencyNode("git", "g", "git");
ValueStreamMap valueStreamMap = new ValueStreamMap(current, new PipelineRevision(current, 1, "1"));
valueStreamMap.addUpstreamNode(p1, new PipelineRevision("p1", 1, "1"), current);
valueStreamMap.addUpstreamNode(p2, new PipelineRevision("p2", 1, "1"), current);
valueStreamMap.addUpstreamMaterialNode(gitNode, new CaseInsensitiveString("trunk"), "p1", new MaterialRevision(null));
valueStreamMap.addUpstreamMaterialNode(gitNode, new CaseInsensitiveString("main-branch"), "p3", new MaterialRevision(null));
valueStreamMap.addUpstreamMaterialNode(gitNode, new CaseInsensitiveString("main-branch"), "p2", new MaterialRevision(null));
NodeLevelMap levelToNodeMap = new LevelAssignment().apply(valueStreamMap);
assertThat(valueStreamMap.getCurrentPipeline().getLevel(), is(0));
assertThat(p1.getLevel(), is(-1));
assertThat(p2.getLevel(), is(-1));
assertThat(gitNode.getLevel(), is(-2));
assertThat(levelToNodeMap.get(0), contains(valueStreamMap.getCurrentPipeline()));
assertThat(levelToNodeMap.get(-1), containsInAnyOrder(p1, p2));
assertThat(levelToNodeMap.get(-2), contains(gitNode));
}
@Test
public void shouldAssignLevelsForDownstreamNodesOfCurrentPipeline() throws Exception {
/*
---> p1 ----
/ \
git --> p ----------> p3
\ /
---> p2 ----
*/
String current = "p";
Node p1 = new PipelineDependencyNode("p1", "p1");
Node p2 = new PipelineDependencyNode("p2", "p2");
Node p3 = new PipelineDependencyNode("p3", "p3");
Node gitNode = new SCMDependencyNode("git", "g", "git");
ValueStreamMap valueStreamMap = new ValueStreamMap(current, new PipelineRevision(current, 1, "1"));
valueStreamMap.addUpstreamMaterialNode(gitNode, new CaseInsensitiveString("trunk"), "p", new MaterialRevision(null));
valueStreamMap.addDownstreamNode(p1, current);
valueStreamMap.addDownstreamNode(p2, current);
valueStreamMap.addDownstreamNode(p3, p1.getId());
valueStreamMap.addDownstreamNode(p3, p2.getId());
NodeLevelMap levelToNodeMap = new LevelAssignment().apply(valueStreamMap);
assertThat(valueStreamMap.getCurrentPipeline().getLevel(), is(0));
assertThat(gitNode.getLevel(), is(-1));
assertThat(p1.getLevel(), is(1));
assertThat(p2.getLevel(), is(1));
assertThat(p3.getLevel(), is(2));
assertThat(levelToNodeMap.get(0), contains(valueStreamMap.getCurrentPipeline()));
assertThat(levelToNodeMap.get(-1), contains(gitNode));
assertThat(levelToNodeMap.get(1), containsInAnyOrder(p1, p2));
assertThat(levelToNodeMap.get(2), contains(p3));
}
@Test
public void shouldAssignLevelsForDownstreamNodesOfCurrentMaterial() throws Exception {
/*
---> p1 ----
/ \
git --> p ----------> p3
\ /
---> p2 ----
*/
Node p = new PipelineDependencyNode("p", "p");
Node p1 = new PipelineDependencyNode("p1", "p1");
Node p2 = new PipelineDependencyNode("p2", "p2");
Node p3 = new PipelineDependencyNode("p3", "p3");
GitMaterial material = new GitMaterial("url");
Modification modification = ModificationsMother.aCheckIn("1");
ValueStreamMap valueStreamMap = new ValueStreamMap(material, null, modification);
Node gitNode = valueStreamMap.getCurrentMaterial();
valueStreamMap.addDownstreamNode(p, gitNode.getId());
valueStreamMap.addDownstreamNode(p1, p.getId());
valueStreamMap.addDownstreamNode(p2, p.getId());
valueStreamMap.addDownstreamNode(p3, p1.getId());
valueStreamMap.addDownstreamNode(p3, p2.getId());
NodeLevelMap levelToNodeMap = new LevelAssignment().apply(valueStreamMap);
assertThat(valueStreamMap.getCurrentMaterial().getLevel(), is(0));
assertThat(p.getLevel(), is(1));
assertThat(p1.getLevel(), is(2));
assertThat(p2.getLevel(), is(2));
assertThat(p3.getLevel(), is(3));
assertThat(levelToNodeMap.get(0), contains(valueStreamMap.getCurrentMaterial()));
assertThat(levelToNodeMap.get(1), containsInAnyOrder(p));
assertThat(levelToNodeMap.get(2), containsInAnyOrder(p1, p2));
assertThat(levelToNodeMap.get(3), contains(p3));
}
}