/******************************************************************************* * (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.tools.build; import com.beust.jcommander.internal.Lists; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.junit.Test; import java.io.File; import java.io.FileInputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.io.Writer; import java.net.URISyntaxException; import java.nio.file.Files; import java.nio.file.Path; import java.util.List; import java.util.Properties; import static com.google.common.io.Resources.getResource; import static io.cloudslang.lang.tools.build.ArgumentProcessorUtils.PROPERTIES_OBJECT_CANNOT_BE_NULL; import static io.cloudslang.lang.tools.build.ArgumentProcessorUtils.PROPERTY_KEY_CANNOT_BE_NULL; import static io.cloudslang.lang.tools.build.ArgumentProcessorUtils.getBooleanFromPropertiesWithDefault; import static io.cloudslang.lang.tools.build.ArgumentProcessorUtils.getEnumInstanceFromPropertiesWithDefault; import static io.cloudslang.lang.tools.build.ArgumentProcessorUtils.getIntFromPropertiesWithDefaultAndRange; import static io.cloudslang.lang.tools.build.ArgumentProcessorUtils.getListForPrint; import static io.cloudslang.lang.tools.build.ArgumentProcessorUtils.getPropertiesFromFile; import static io.cloudslang.lang.tools.build.ArgumentProcessorUtils.parseTestSuitesToList; import static io.cloudslang.lang.tools.build.SlangBuildMain.RunConfigurationProperties.TEST_COVERAGE; import static io.cloudslang.lang.tools.build.SlangBuildMain.RunConfigurationProperties.TEST_PARALLEL_THREAD_COUNT; import static io.cloudslang.lang.tools.build.SlangBuildMain.RunConfigurationProperties.TEST_SUITES_PARALLEL; import static io.cloudslang.lang.tools.build.SlangBuildMain.RunConfigurationProperties.TEST_SUITES_RUN_UNSPECIFIED; import static io.cloudslang.lang.tools.build.SlangBuildMain.RunConfigurationProperties.TEST_SUITES_SEQUENTIAL; import static io.cloudslang.lang.tools.build.SlangBuildMain.RunConfigurationProperties.TEST_SUITES_TO_RUN; import static io.cloudslang.lang.tools.build.SlangBuildMain.TestCaseRunMode.PARALLEL; import static io.cloudslang.lang.tools.build.SlangBuildMain.TestCaseRunMode.SEQUENTIAL; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; public class ArgumentProcessorUtilsTest { @Test public void testGetBooleanFromPropertiesWithDefaultExceptions() { testExceptionGetBooleanWithParams("aa", false, null, PROPERTIES_OBJECT_CANNOT_BE_NULL); testExceptionGetBooleanWithParams(null, true, new Properties(), PROPERTY_KEY_CANNOT_BE_NULL); } @Test public void testGetBooleanFromPropertiesWithDefaultSuccess() { // Missing property, mean default value is returned Properties properties = new Properties(); assertEquals(true, getBooleanFromPropertiesWithDefault("bbb", true, properties)); assertEquals(false, getBooleanFromPropertiesWithDefault("bbb", false, properties)); // Wrong value means default value is returned properties = new Properties(); properties.setProperty("bbb", "jkasda"); assertEquals(true, getBooleanFromPropertiesWithDefault("bbb", true, properties)); assertEquals(false, getBooleanFromPropertiesWithDefault("bbb", false, properties)); // Correct value means default is NOT taken properties = new Properties(); properties.setProperty("bbb", "TruE"); assertEquals(true, getBooleanFromPropertiesWithDefault("bbb", false, properties)); assertEquals(true, getBooleanFromPropertiesWithDefault("bbb", true, properties)); // Correct value means default is NOT taken properties.setProperty("ccc", "FalSE"); assertEquals(false, getBooleanFromPropertiesWithDefault("ccc", false, properties)); assertEquals(false, getBooleanFromPropertiesWithDefault("ccc", true, properties)); } @Test public void testGetIntFromPropertiesWithDefaultExceptions() { testExceptionGetIntWithParams("aa", 3, null, PROPERTIES_OBJECT_CANNOT_BE_NULL, 7, 11); testExceptionGetIntWithParams(null, 5, new Properties(), PROPERTY_KEY_CANNOT_BE_NULL, 2, 5); } @Test public void testGetIntFromPropertiesWithDefaultSuccess() { // Missing property, mean default value is returned Properties properties = new Properties(); assertEquals(11, getIntFromPropertiesWithDefaultAndRange("aaa", 11, properties, null, null)); assertEquals(21, getIntFromPropertiesWithDefaultAndRange("aaa", 21, properties, 2, 3)); // Wrong value means default value is returned properties = new Properties(); properties.setProperty("bbb", "56aava"); // string assertEquals(20, getIntFromPropertiesWithDefaultAndRange("bbb", 20, properties, null, null)); properties.setProperty("bbb", "11111111111111111111111"); //too large assertEquals(40, getIntFromPropertiesWithDefaultAndRange("bbb", 40, properties, 6, 12)); // Correct value means default is NOT taken properties = new Properties(); properties.setProperty("ccc", "5"); assertEquals(5, getIntFromPropertiesWithDefaultAndRange("ccc", 10, properties, null, null)); assertEquals(5, getIntFromPropertiesWithDefaultAndRange("ccc", 11, properties, 1, 20)); assertEquals(5, getIntFromPropertiesWithDefaultAndRange("ccc", 12, properties, 1, null)); // Check that range is checked properties.setProperty("ddd", "234"); assertEquals(90, getIntFromPropertiesWithDefaultAndRange("ddd", 90, properties, 1, 100)); assertEquals(234, getIntFromPropertiesWithDefaultAndRange("ddd", 150, properties, 1, 300)); } @Test public void testGetEnumFromPropertiesWithDefaultExceptions() { testExceptionGetEnumWithParams("aa", PARALLEL, null, PROPERTIES_OBJECT_CANNOT_BE_NULL); testExceptionGetEnumWithParams(null, SEQUENTIAL, new Properties(), PROPERTY_KEY_CANNOT_BE_NULL); } @Test public void testGetEnumFromPropertiesWithDefaultSuccess() { // Missing property, mean default value is returned Properties properties = new Properties(); assertSame(PARALLEL, getEnumInstanceFromPropertiesWithDefault("bbb", PARALLEL, properties)); assertSame(SEQUENTIAL, getEnumInstanceFromPropertiesWithDefault("bbb", SEQUENTIAL, properties)); // Wrong value means default value is returned properties = new Properties(); properties.setProperty("ccc", "parall454"); assertSame(SEQUENTIAL, getEnumInstanceFromPropertiesWithDefault("ccc", SEQUENTIAL, properties)); assertSame(PARALLEL, getEnumInstanceFromPropertiesWithDefault("ccc", PARALLEL, properties)); // Correct value means default is NOT taken properties = new Properties(); properties.setProperty("bbb", "PaRaLLeL"); assertSame(PARALLEL, getEnumInstanceFromPropertiesWithDefault("bbb", PARALLEL, properties)); assertSame(PARALLEL, getEnumInstanceFromPropertiesWithDefault("bbb", SEQUENTIAL, properties)); properties.setProperty("eee", "SeqUENTial"); assertSame(SEQUENTIAL, getEnumInstanceFromPropertiesWithDefault("eee", PARALLEL, properties)); assertSame(SEQUENTIAL, getEnumInstanceFromPropertiesWithDefault("eee", SEQUENTIAL, properties)); } @Test public void testParseTestSuitesToList() { // Case 1 String testSuitesString = "!default,abc"; // Tested call List<String> suites = parseTestSuitesToList(testSuitesString); assertEquals(1, suites.size()); assertEquals("abc", suites.get(0)); // Case 2 testSuitesString = "default,abcd"; // Tested call suites = parseTestSuitesToList(testSuitesString); assertEquals(2, suites.size()); assertEquals("abcd", suites.get(0)); assertEquals("default", suites.get(1)); // Case 3 testSuitesString = "!ab,abcd,!ef,defg,!cd"; // Tested call suites = parseTestSuitesToList(testSuitesString); assertEquals(2, suites.size()); assertEquals("abcd", suites.get(0)); assertEquals("defg", suites.get(1)); // Case 4 testSuitesString = "!default,default,ef"; // Tested call suites = parseTestSuitesToList(testSuitesString); assertEquals(1, suites.size()); assertEquals("ef", suites.get(0)); // Case 5 testSuitesString = "default,!default,gh"; // Tested call suites = parseTestSuitesToList(testSuitesString); assertEquals(1, suites.size()); assertEquals("gh", suites.get(0)); // Case 6 testSuitesString = "abc,ef,gh,ef"; // Tested call suites = parseTestSuitesToList(testSuitesString); assertEquals(3, suites.size()); assertEquals("abc", suites.get(0)); assertEquals("ef", suites.get(1)); assertEquals("gh", suites.get(2)); } @Test public void testGetPropertiesFromFileThrowsException() throws URISyntaxException, IOException { InputStream fis = null; Writer outputWriter = null; File tempRunConfigFile = null; try { fis = new FileInputStream(new File( getResource("lang/tools/build/builder_run_configuration.properties").toURI())); Path tempRunConfig = Files.createTempFile("temp_run_config", ".properties"); tempRunConfigFile = tempRunConfig.toFile(); outputWriter = new PrintWriter(new FileWriter(tempRunConfigFile)); IOUtils.copy(fis, outputWriter); outputWriter.flush(); String absolutePath = tempRunConfigFile.getAbsolutePath(); Properties propertiesFromFile = getPropertiesFromFile(absolutePath); assertEquals("false", propertiesFromFile.get(TEST_COVERAGE)); assertEquals("sequential", propertiesFromFile.get(TEST_SUITES_RUN_UNSPECIFIED)); assertEquals("!default,vmware-local,xml-local,images", propertiesFromFile.get(TEST_SUITES_TO_RUN)); assertEquals("images", propertiesFromFile.get(TEST_SUITES_SEQUENTIAL)); assertEquals("xml-local,vmware-local", propertiesFromFile.get(TEST_SUITES_PARALLEL)); assertEquals("8", propertiesFromFile.get(TEST_PARALLEL_THREAD_COUNT)); } finally { IOUtils.closeQuietly(fis); IOUtils.closeQuietly(outputWriter); FileUtils.deleteQuietly(tempRunConfigFile); } } @Test public void testGetListForPrint() { List<String> testSuites = Lists.newArrayList("aaa", "bbb", "ccc", "ddd"); assertEquals("aaa, bbb, ccc, ddd", getListForPrint(testSuites)); testSuites = Lists.newArrayList("AA1"); assertEquals("AA1", getListForPrint(testSuites)); testSuites = Lists.newArrayList(); assertEquals(ArgumentProcessorUtils.EMPTY, getListForPrint(testSuites)); testSuites = Lists.newArrayList(); assertEquals("empty list", getListForPrint(testSuites, "empty list")); } private void testExceptionGetBooleanWithParams(final String key, final boolean defaultValue, final Properties properties, final String expectedMessage) { try { getBooleanFromPropertiesWithDefault(key, defaultValue, properties); fail("Expecting exception"); } catch (Exception ex) { assertTrue(ex instanceof NullPointerException); assertEquals(expectedMessage, ex.getMessage()); } } private void testExceptionGetIntWithParams(final String key, final int defaultValue, final Properties properties, final String expectedMessage, final Integer lower, final Integer upper) { try { getIntFromPropertiesWithDefaultAndRange(key, defaultValue, properties, lower, upper); fail("Expecting exception"); } catch (Exception ex) { assertTrue(ex instanceof NullPointerException); assertEquals(expectedMessage, ex.getMessage()); } } private <T extends Enum<T>> void testExceptionGetEnumWithParams(final String key, T defaultValue, final Properties properties, final String expectedMessage) { try { getEnumInstanceFromPropertiesWithDefault(key, defaultValue, properties); fail("Expecting exception"); } catch (Exception ex) { assertTrue(ex instanceof NullPointerException); assertEquals(expectedMessage, ex.getMessage()); } } }