/******************************************************************************* * Copyright (c) 2017 Synopsys, Inc * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Synopsys, Inc - initial implementation and documentation *******************************************************************************/ package jenkins.plugins.coverity; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import jenkins.plugins.coverity.EnvParser; import jenkins.plugins.coverity.ParseException; import org.junit.Before; import org.junit.Test; import hudson.EnvVars; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; public class EnvParserTest{ private HashMap<String, String> envMap; private EnvVars environment; private static final String bigEnvVar = "_ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "12345678990"; @Before public void setUp() { this.envMap = new HashMap<String, String>(); envMap.put("ABC", "123"); envMap.put("XYZ", "456"); envMap.put(bigEnvVar, "78910"); environment = new EnvVars(envMap); } /** * Tests for the interpolate() method. */ private void assertInterpolatesTo(String input, String output) { try{ assertEquals(output, EnvParser.interpolate(input, environment)); } catch(ParseException e) { fail(); } } private void assertInterpolatesToSelf(String input) { assertInterpolatesTo(input, input); } private void assertInterpolateFails(String input) { try{ EnvParser.interpolate(input, environment); fail(); } catch(ParseException e) { } } @Test public void interpolateSuccessTest(){ // Innocuous text is unmodified assertInterpolatesToSelf(""); assertInterpolatesToSelf("a"); assertInterpolatesToSelf("ab"); String innocuous = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890!@#%^&*()_+{}[]|\\:\";<>,.?/"; assertInterpolatesToSelf(innocuous); // Quoted strings expand to themselves assertInterpolatesToSelf("''"); assertInterpolatesToSelf("'abc'"); // Function of quotes: block env vars from expansion assertInterpolatesToSelf("'$ABC'"); assertInterpolatesToSelf("'${ABC}'"); // Function of "plain" env vars: they expand assertInterpolatesTo("$ABC", "123"); assertInterpolatesTo("$ABC$XYZ", "123456"); assertInterpolatesTo("$A", ""); assertInterpolatesTo("$ABCD", ""); assertInterpolatesTo("$" + bigEnvVar, "78910"); assertInterpolatesTo("$" + bigEnvVar + "%", "78910%"); // Function of "braced" env vars: they expand, but letters following them don't assertInterpolatesTo("${ABC}", "123"); assertInterpolatesTo("${ABC}${XYZ}", "123456"); assertInterpolatesTo("${A}ABC", "ABC"); assertInterpolatesTo("${ABCD}", ""); assertInterpolatesTo("${" + bigEnvVar + "}", "78910"); assertInterpolatesTo("${" + bigEnvVar + "}%", "78910%"); } @Test public void interpolateFailureTest() { assertInterpolateFails("'"); assertInterpolateFails("$"); assertInterpolateFails("${"); assertInterpolateFails("${}"); assertInterpolateFails("${{}"); assertInterpolateFails("${a%}"); assertInterpolateFails("$5abc"); assertInterpolateFails("abc'def"); assertInterpolateFails("abc${def"); assertInterpolateFails("abc${}def"); assertInterpolateFails("abc${{}def"); assertInterpolateFails("abc$5abcdef"); } /** * Tests for the tokenize() method. */ private void assertTokenizesTo(String input, String... output) { try { assertArrayEquals(output, EnvParser.tokenize(input).toArray()); } catch(ParseException e) { fail(); } } private void assertTokenizeFails(String input) { try{ EnvParser.tokenize(input); fail(); } catch(ParseException e) { } } @Test public void tokenizeSuccessTests(){ // flush initial space; generate not tokens assertTokenizesTo(""); assertTokenizesTo(" "); assertTokenizesTo(" "); assertTokenizesTo(" \r\t\n "); // single tokens assertTokenizesTo("a", "a"); assertTokenizesTo("ab", "ab"); assertTokenizesTo(" ab", "ab"); assertTokenizesTo("ab ", "ab"); assertTokenizesTo("\tab ", "ab"); // single tokens single quoted assertTokenizesTo("'ab'", "ab"); assertTokenizesTo("'a b'", "a b"); assertTokenizesTo("'a''b'", "ab"); assertTokenizesTo(" 'a''b'\n", "ab"); // single tokens double quoted assertTokenizesTo("\"ab\"", "ab"); assertTokenizesTo("\"a b\"", "a b"); assertTokenizesTo("\"a\"\"b\"", "ab"); assertTokenizesTo(" \"a\"\"b\"\n", "ab"); // singles around doubles assertTokenizesTo("'a\"b'", "a\"b"); assertTokenizesTo("'a \"b'", "a \"b"); assertTokenizesTo("'a''b\"'", "ab\""); // doubles around singles assertTokenizesTo("\"a'b\"", "a'b"); assertTokenizesTo("\"a 'b\"", "a 'b"); assertTokenizesTo("\"a\"\"b'\"", "ab'"); // multiple tokens assertTokenizesTo("abc def", "abc", "def"); assertTokenizesTo("ab'c' d'e'f", "abc", "def"); assertTokenizesTo(" abc def ", "abc", "def"); } @Test public void tokenizeFailureTests(){ // unclosed single-quoted strings assertTokenizeFails("'"); assertTokenizeFails("!@#$%^&*'12345\n6789"); assertTokenizeFails("1234567890'"); // unclosed double-quoted strings assertTokenizeFails("\""); assertTokenizeFails("!@#$%^&*\"12345\n6789"); assertTokenizeFails("1234567890\""); } }