/******************************************************************************* * (c) Copyright 2016 Hewlett-Packard Development Company, L.P. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Apache License v2.0 which accompany this distribution. * * The Apache License is available at * http://www.apache.org/licenses/LICENSE-2.0 * *******************************************************************************/ package io.cloudslang.lang.systemtests; import com.google.common.collect.Sets; import io.cloudslang.lang.compiler.SlangSource; import io.cloudslang.lang.entities.CompilationArtifact; import io.cloudslang.lang.entities.SystemProperty; import io.cloudslang.lang.entities.bindings.values.Value; import io.cloudslang.lang.entities.bindings.values.ValueFactory; import java.io.Serializable; import java.net.URI; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.junit.Assert; import org.junit.Ignore; import org.junit.Test; import static com.google.common.collect.Sets.newHashSet; import static io.cloudslang.lang.compiler.SlangSource.fromFile; public class LoopFlowsTest extends SystemsTestsParent { @SuppressWarnings("unchecked") private static final Set<SystemProperty> EMPTY_SET = Collections.EMPTY_SET; @Test public void testFlowWithLoops() throws Exception { final URI resource = getClass().getResource("/yaml/loops/simple_loop.sl").toURI(); final URI operation1 = getClass().getResource("/yaml/loops/print.sl").toURI(); Set<SlangSource> path = newHashSet(fromFile(operation1)); CompilationArtifact compilationArtifact = slang.compile(fromFile(resource), path); Map<String, Value> userInputs = new HashMap<>(); Set<SystemProperty> systemProperties = new HashSet<>(); systemProperties.add( new SystemProperty("loop", "for.prop1", "for_value") ); Map<String, StepData> stepsData = triggerWithData(compilationArtifact, userInputs, systemProperties).getSteps(); final StepData firstStep = stepsData.get(FIRST_STEP_PATH); final StepData secondStep = stepsData.get(SECOND_STEP_KEY); final StepData thirdStep = stepsData.get(THIRD_STEP_KEY); Map<String, Serializable> expectedInputs = new HashMap<>(); expectedInputs.put("text", "1"); expectedInputs.put("sp_arg", "for_value"); Assert.assertEquals(expectedInputs, firstStep.getInputs()); expectedInputs.put("text", "2"); Assert.assertEquals(expectedInputs, secondStep.getInputs()); expectedInputs.put("text", "3"); Assert.assertEquals(expectedInputs, thirdStep.getInputs()); } @Test public void testFlowWithLoopsWithAccumulator() throws Exception { final URI resource = getClass().getResource("/yaml/loops/loop_with_acc.sl").toURI(); final URI operation1 = getClass().getResource("/yaml/loops/do_nothing.sl").toURI(); Set<SlangSource> path = newHashSet(fromFile(operation1)); CompilationArtifact compilationArtifact = slang.compile(fromFile(resource), path); Map<String, Value> userInputs = new HashMap<>(); Set<SystemProperty> systemProperties = new HashSet<>(); Map<String, StepData> stepsData = triggerWithData(compilationArtifact, userInputs, systemProperties).getSteps(); StepData flowData = stepsData.get(EXEC_START_PATH); Map<String, Serializable> expectedOutputs = new HashMap<>(); expectedOutputs.put("loop_result", "1 2 3"); Assert.assertEquals(expectedOutputs, flowData.getOutputs()); } @Test public void testFlowWithLoopsPyListCaseWorks() throws Exception { final URI resource = getClass().getResource("/yaml/loops/simple_loop_pylist.sl").toURI(); final URI operation1 = getClass().getResource("/yaml/loops/print.sl").toURI(); Set<SlangSource> path = newHashSet(fromFile(operation1)); CompilationArtifact compilationArtifact = slang.compile(fromFile(resource), path); Map<String, Value> userInputs = new HashMap<>(); Set<SystemProperty> systemProperties = new HashSet<>(); systemProperties.add( new SystemProperty("loop", "for.prop1", "for_value") ); Map<String, StepData> stepsData = triggerWithData(compilationArtifact, userInputs, systemProperties).getSteps(); final StepData firstStep = stepsData.get(FIRST_STEP_PATH); final StepData secondStep = stepsData.get(SECOND_STEP_KEY); final StepData thirdStep = stepsData.get(THIRD_STEP_KEY); Map<String, Serializable> expectedInputs = new HashMap<>(); expectedInputs.put("text", "36905525"); Assert.assertEquals(expectedInputs, firstStep.getInputs()); expectedInputs.put("text", "8136ccef"); Assert.assertEquals(expectedInputs, secondStep.getInputs()); expectedInputs.put("text", "b22e5036"); Assert.assertEquals(expectedInputs, thirdStep.getInputs()); } @Test public void testFlowWithLoopsWithCustomNavigation() throws Exception { final URI resource = getClass().getResource("/yaml/loops/loop_with_custom_navigation.sl").toURI(); final URI operation1 = getClass().getResource("/yaml/loops/print.sl").toURI(); Set<SlangSource> path = newHashSet(fromFile(operation1)); CompilationArtifact compilationArtifact = slang.compile(fromFile(resource), path); Map<String, Value> userInputs = new HashMap<>(); Map<String, StepData> stepsData = triggerWithData(compilationArtifact, userInputs, EMPTY_SET).getSteps(); StepData thirdStep = stepsData.get(THIRD_STEP_KEY); Assert.assertEquals("print_other_values", thirdStep.getName()); } @Test public void testFlowWithLoopsFromPropertyFile() throws Exception { final URI resource = getClass().getResource("/yaml/loops/loop_from_property_with_custom_navigation.sl").toURI(); final URI operation1 = getClass().getResource("/yaml/loops/print.sl").toURI(); final URI propertiesUri = getClass().getResource("/yaml/loops/loop_property.prop.sl").toURI(); Set<SlangSource> path = newHashSet(fromFile(operation1)); CompilationArtifact compilationArtifact = slang.compile(fromFile(resource), path); Assert.assertEquals(1, compilationArtifact.getSystemProperties().size()); Assert.assertEquals("loops.list", compilationArtifact.getSystemProperties().iterator().next()); Set<SystemProperty> systemProperties = loadSystemProperties(fromFile(propertiesUri)); Map<String, Value> userInputs = new HashMap<>(); Map<String, StepData> stepsData = triggerWithData(compilationArtifact, userInputs, systemProperties).getSteps(); StepData secondStep = stepsData.get(SECOND_STEP_KEY); Assert.assertEquals("print_values", secondStep.getName()); Assert.assertEquals("SUCCESS", secondStep.getResult()); StepData thirdStep = stepsData.get(THIRD_STEP_KEY); Assert.assertEquals("print_other_values", thirdStep.getName()); } @Test public void testFlowWithLoopsWithDefaultBreak() throws Exception { final URI resource = getClass().getResource("/yaml/loops/loop_with_default_break.sl").toURI(); final URI operation1 = getClass().getResource("/yaml/loops/operation_that_fails_when_value_is_2.sl").toURI(); Set<SlangSource> path = newHashSet(fromFile(operation1)); CompilationArtifact compilationArtifact = slang.compile(fromFile(resource), path); Map<String, Value> userInputs = new HashMap<>(); Map<String, StepData> stepsData = triggerWithData(compilationArtifact, userInputs, EMPTY_SET).getSteps(); List<String> actualSteps = getStepsOnly(stepsData); Assert.assertEquals(2, actualSteps.size()); } @Test public void testFlowWithLoopsWithEmptyBreak() throws Exception { final URI resource = getClass().getResource("/yaml/loops/loop_with_empty_break.sl").toURI(); final URI operation1 = getClass().getResource("/yaml/loops/operation_that_fails_when_value_is_2.sl").toURI(); Set<SlangSource> path = newHashSet(fromFile(operation1)); CompilationArtifact compilationArtifact = slang.compile(fromFile(resource), path); Map<String, Value> userInputs = new HashMap<>(); Map<String, StepData> stepsData = triggerWithData(compilationArtifact, userInputs, EMPTY_SET).getSteps(); List<String> actualSteps = getStepsOnly(stepsData); Assert.assertEquals(3, actualSteps.size()); } @Test public void testFlowWithLoopsWithBreak() throws Exception { final URI resource = getClass() .getResource("/yaml/loops/loop_with_break.sl").toURI(); final URI operation1 = getClass() .getResource("/yaml/loops/operation_that_goes_to_custom_when_value_is_2.sl").toURI(); final URI operation2 = getClass().getResource("/yaml/loops/print.sl").toURI(); Set<SlangSource> path = newHashSet(fromFile(operation1), fromFile(operation2)); CompilationArtifact compilationArtifact = slang.compile(fromFile(resource), path); Map<String, Value> userInputs = new HashMap<>(); Map<String, StepData> stepsData = triggerWithData(compilationArtifact, userInputs, EMPTY_SET).getSteps(); List<String> actualSteps = getStepsOnly(stepsData); Assert.assertEquals(3, actualSteps.size()); StepData thirdStep = stepsData.get(THIRD_STEP_KEY); Assert.assertEquals("print_other_values", thirdStep.getName()); } @Test public void testFlowWithInlineMapLoops() throws Exception { final URI resource = getClass().getResource("/yaml/loops/simple_loop_with_inline_map.sl").toURI(); final URI operation1 = getClass().getResource("/yaml/loops/print.sl").toURI(); Set<SlangSource> path = newHashSet(fromFile(operation1)); CompilationArtifact compilationArtifact = slang.compile(fromFile(resource), path); Map<String, Value> userInputs = new HashMap<>(); Map<String, StepData> stepsData = triggerWithData(compilationArtifact, userInputs, EMPTY_SET).getSteps(); verifyPersonMap(stepsData); } @Ignore("Remove when support for maps in loops is added") @Test public void testFlowWithMapLoops() throws Exception { final URI resource = getClass().getResource("/yaml/loops/simple_loop_with_map.sl").toURI(); final URI operation1 = getClass().getResource("/yaml/loops/print.sl").toURI(); Set<SlangSource> path = newHashSet(fromFile(operation1)); CompilationArtifact compilationArtifact = slang.compile(fromFile(resource), path); Map<String, Value> userInputs = new HashMap<>(); Map<String, StepData> stepsData = triggerWithData(compilationArtifact, userInputs, EMPTY_SET).getSteps(); verifyPersonMap(stepsData); } @Ignore("Remove when support for maps in loops is added") @Test public void testFlowWithHashMap() throws Exception { final URI resource = getClass().getResource("/yaml/loops/simple_loop_with_hashmap.sl").toURI(); final URI operation1 = getClass().getResource("/yaml/loops/print.sl").toURI(); Set<SlangSource> path = newHashSet(fromFile(operation1)); final CompilationArtifact compilationArtifact = slang.compile(fromFile(resource), path); Map<String, Value> personMap = new HashMap<>(); personMap.put("john", ValueFactory.create(1)); personMap.put("jane", ValueFactory.create(2)); personMap.put("peter", ValueFactory.create("three")); Map<String, Value> userInputs = new HashMap<>(); userInputs.put("person_map", ValueFactory.create((Serializable) personMap)); Map<String, StepData> stepsData = triggerWithData(compilationArtifact, userInputs, EMPTY_SET).getSteps(); verifyPersonMap(stepsData); } @Ignore("Remove when support for maps in loops is added") @Test public void testFlowWithMapLoopsWithCustomNavigation() throws Exception { final URI resource = getClass().getResource("/yaml/loops/loop_with_custom_navigation_with_map.sl").toURI(); final URI operation1 = getClass().getResource("/yaml/loops/print.sl").toURI(); Set<SlangSource> path = newHashSet(fromFile(operation1)); final CompilationArtifact compilationArtifact = slang.compile(fromFile(resource), path); Map<String, Value> userInputs = new HashMap<>(); Map<String, StepData> stepsData = triggerWithData(compilationArtifact, userInputs, EMPTY_SET).getSteps(); StepData fourthStep = stepsData.get(FOURTH_STEP_KEY); Assert.assertEquals("print_other_values", fourthStep.getName()); } @Ignore("Remove when support for maps in loops is added") @Test public void testFlowWithMapLoopsWithDefaultBreak() throws Exception { final URI resource = getClass().getResource("/yaml/loops/loop_with_default_break_with_map.sl").toURI(); final URI operation1 = getClass().getResource("/yaml/loops/operation_that_fails_when_value_is_2.sl").toURI(); Set<SlangSource> path = newHashSet(fromFile(operation1)); final CompilationArtifact compilationArtifact = slang.compile(fromFile(resource), path); Map<String, Value> userInputs = new HashMap<>(); Map<String, StepData> stepsData = triggerWithData(compilationArtifact, userInputs, EMPTY_SET).getSteps(); List<String> actualSteps = getStepsOnly(stepsData); Assert.assertEquals(1, actualSteps.size()); } @Ignore("Remove when support for maps in loops is added") @Test public void testFlowWithMapLoopsWithEmptyBreak() throws Exception { final URI resource = getClass().getResource("/yaml/loops/loop_with_empty_break_with_map.sl").toURI(); final URI operation1 = getClass().getResource("/yaml/loops/operation_that_fails_when_value_is_2.sl").toURI(); Set<SlangSource> path = newHashSet(fromFile(operation1)); final CompilationArtifact compilationArtifact = slang.compile(fromFile(resource), path); Map<String, Value> userInputs = new HashMap<>(); Map<String, StepData> stepsData = triggerWithData(compilationArtifact, userInputs, EMPTY_SET).getSteps(); List<String> actualSteps = getStepsOnly(stepsData); Assert.assertEquals(3, actualSteps.size()); } @Ignore("Remove when support for maps in loops is added") @Test public void testFlowWithMapLoopsWithBreak() throws Exception { final URI resource = getClass().getResource("/yaml/loops/loop_with_break_with_map.sl").toURI(); final URI operation1 = getClass() .getResource("/yaml/loops/operation_that_goes_to_custom_when_value_is_2.sl").toURI(); final URI operation2 = getClass().getResource("/yaml/loops/print.sl").toURI(); final Set<SlangSource> path = newHashSet(fromFile(operation1), fromFile(operation2)); final CompilationArtifact compilationArtifact = slang.compile(fromFile(resource), path); Map<String, Value> userInputs = new HashMap<>(); Map<String, StepData> stepsData = triggerWithData(compilationArtifact, userInputs, EMPTY_SET).getSteps(); List<String> actualSteps = getStepsOnly(stepsData); Assert.assertEquals(2, actualSteps.size()); StepData secondStep = stepsData.get(SECOND_STEP_KEY); Assert.assertEquals("print_other_values", secondStep.getName()); } private void verifyPersonMap(Map<String, StepData> stepsData) { final StepData firstStep = stepsData.get(FIRST_STEP_PATH); final StepData secondStep = stepsData.get(SECOND_STEP_KEY); final StepData thirdStep = stepsData.get(THIRD_STEP_KEY); @SuppressWarnings("unchecked") final Set<Map<String, Serializable>> actualContextSet = newHashSet( firstStep.getInputs(), secondStep.getInputs(), thirdStep.getInputs() ); Map<String, Serializable> context1 = new HashMap<>(); context1.put("text", "john"); context1.put("text2", "1"); Map<String, Serializable> context2 = new HashMap<>(); context2.put("text", "jane"); context2.put("text2", "2"); Map<String, Serializable> context3 = new HashMap<>(); context3.put("text", "peter"); context3.put("text2", "three"); @SuppressWarnings("unchecked") Set<Map<String, Serializable>> expectedContextSet = newHashSet( context1, context2, context3 ); Assert.assertEquals("loop step inputs not as expected", expectedContextSet, actualContextSet); } }