From 6717057c5fe2be9a2fe3a0cd11a9e90d2c03833c Mon Sep 17 00:00:00 2001 From: pesse Date: Wed, 5 Jun 2019 00:13:41 +0200 Subject: [PATCH 01/31] Failing test to catch and reproduce #143 --- .../java/org/utplsql/cli/PathMapperTest.java | 26 ++++++++++ src/test/resources/plsql/source/betwnstr.sql | 9 ++++ .../resources/plsql/test/test_betwnstr.pkg | 51 +++++++++++++++++++ 3 files changed, 86 insertions(+) create mode 100644 src/test/java/org/utplsql/cli/PathMapperTest.java create mode 100644 src/test/resources/plsql/source/betwnstr.sql create mode 100644 src/test/resources/plsql/test/test_betwnstr.pkg diff --git a/src/test/java/org/utplsql/cli/PathMapperTest.java b/src/test/java/org/utplsql/cli/PathMapperTest.java new file mode 100644 index 0000000..029cc22 --- /dev/null +++ b/src/test/java/org/utplsql/cli/PathMapperTest.java @@ -0,0 +1,26 @@ +package org.utplsql.cli; + +import org.junit.jupiter.api.Test; +import org.utplsql.api.TestRunner; + +import java.util.ArrayList; + +public class PathMapperTest { + + @Test + void checkPathMapperOutput() { + RunCommand runCmd = TestHelper.createRunCommand(TestHelper.getConnectionString(), + "-f=ut_sonar_test_reporter", + "-o=sonar_result.xml", + "-s", + "-d", + "-source_path=src/test/resources/plsql/source", + "-owner=app", + "-regex_expression=\"*\"", + "-type_mapping=\"sql=PACKAGE BODY\"", + "-test_path=src/test/resources/plsql/test" + ); + + TestRunner testRunner = runCmd.newTestRunner(new ArrayList<>());; + } +} diff --git a/src/test/resources/plsql/source/betwnstr.sql b/src/test/resources/plsql/source/betwnstr.sql new file mode 100644 index 0000000..dcdf343 --- /dev/null +++ b/src/test/resources/plsql/source/betwnstr.sql @@ -0,0 +1,9 @@ +create or replace function betwnstr( a_string varchar2, a_start_pos integer, a_end_pos integer ) return varchar2 is + l_start_pos pls_integer := a_start_pos; +begin + if l_start_pos = 0 then + l_start_pos := 1; + end if; + return substr( a_string, l_start_pos, a_end_pos - l_start_pos + 1); +end; +/ diff --git a/src/test/resources/plsql/test/test_betwnstr.pkg b/src/test/resources/plsql/test/test_betwnstr.pkg new file mode 100644 index 0000000..84f153e --- /dev/null +++ b/src/test/resources/plsql/test/test_betwnstr.pkg @@ -0,0 +1,51 @@ +create or replace package test_betwnstr as + + -- %suite(Between string function) + + -- %test(Returns substring from start position to end position) + procedure normal_case; + + -- %test(Returns substring when start position is zero) + procedure zero_start_position; + + -- %test(Returns string until end if end position is greater than string length) + procedure big_end_position; + + -- %test(Returns null for null input string value) + procedure null_string; + + -- %test(Demo of a disabled test) + -- %disabled + procedure disabled_test; + +end; +/ +create or replace package body test_betwnstr as + + procedure normal_case is + begin + ut.expect( betwnstr( '1234567', 2, 5 ) ).to_equal('2345'); + end; + + procedure zero_start_position is + begin + ut.expect( betwnstr( '1234567', 0, 5 ) ).to_equal('12345'); + end; + + procedure big_end_position is + begin + ut.expect( betwnstr( '1234567', 0, 500 ) ).to_equal('1234567'); + end; + + procedure null_string is + begin + ut.expect( betwnstr( null, 2, 5 ) ).to_be_null; + end; + + procedure disabled_test is + begin + ut.expect( betwnstr( null, null, null) ).not_to_be_null; + end; + +end; +/ From b21f651c07662c15c4a233b6cd55e0cbb9829d14 Mon Sep 17 00:00:00 2001 From: pesse Date: Fri, 7 Jun 2019 14:20:39 +0200 Subject: [PATCH 02/31] Unit-Test to simulate passing all parameters that should be known --- .../utplsql/cli/RunCommandArgumentsTest.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 src/test/java/org/utplsql/cli/RunCommandArgumentsTest.java diff --git a/src/test/java/org/utplsql/cli/RunCommandArgumentsTest.java b/src/test/java/org/utplsql/cli/RunCommandArgumentsTest.java new file mode 100644 index 0000000..40465b1 --- /dev/null +++ b/src/test/java/org/utplsql/cli/RunCommandArgumentsTest.java @@ -0,0 +1,42 @@ +package org.utplsql.cli; + +import org.junit.jupiter.api.Test; +import org.utplsql.api.TestRunner; + +import java.util.ArrayList; + +public class RunCommandArgumentsTest { + + @Test + public void allArgumentsAreRecognized() { + RunCommand runCmd = TestHelper.createRunCommand(TestHelper.getConnectionString(), + "-p=app", + "-f=ut_sonar_test_reporter", + "-o=sonar_result.xml", + "-s", + "-d", + "-c", + "--failure-exit-code=10", + "-scc", + "-t=60", + "-exclude=app.betwnstr", + "-include=app.betwnstr", + "-source_path=src/test/resources/plsql/source", + "-owner=app", + "-regex_expression=\"*\"", + "-type_mapping=\"sql=PACKAGE BODY\"", + "-owner_subexpression=0", + "-type_subexpression=0", + "-name_subexpression=0", + "-test_path=src/test/resources/plsql/test", + "-owner=app", + "-regex_expression=\"*\"", + "-type_mapping=\"sql=PACKAGE BODY\"", + "-owner_subexpression=0", + "-type_subexpression=0", + "-name_subexpression=0" + ); + + TestRunner testRunner = runCmd.newTestRunner(new ArrayList<>()); + } +} From ce849fcabf34dd39bd47fdca0691ec724335a200 Mon Sep 17 00:00:00 2001 From: pesse Date: Tue, 11 Jun 2019 23:37:22 +0200 Subject: [PATCH 03/31] Initial implementation of Picocli usage Introduced new Config-Objects to abstract away cli-arguments to config transformation. Will also be needed for YAML/JSON configuration in the future --- pom.xml | 5 + .../org/utplsql/cli/LoggerConfiguration.java | 2 +- .../org/utplsql/cli/RunPicocliCommand.java | 230 ++++++++++++++++++ .../utplsql/cli/UtplsqlPicocliCommand.java | 11 + .../utplsql/cli/config/ConnectionConfig.java | 18 ++ .../utplsql/cli/config/FileMapperConfig.java | 54 ++++ .../utplsql/cli/config/ReporterConfig.java | 29 +++ .../utplsql/cli/config/RunCommandConfig.java | 89 +++++++ .../utplsql/cli/PicocliRunCommandTest.java | 170 +++++++++++++ .../utplsql/cli/RunCommandArgumentsTest.java | 14 ++ 10 files changed, 621 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/utplsql/cli/RunPicocliCommand.java create mode 100644 src/main/java/org/utplsql/cli/UtplsqlPicocliCommand.java create mode 100644 src/main/java/org/utplsql/cli/config/ConnectionConfig.java create mode 100644 src/main/java/org/utplsql/cli/config/FileMapperConfig.java create mode 100644 src/main/java/org/utplsql/cli/config/ReporterConfig.java create mode 100644 src/main/java/org/utplsql/cli/config/RunCommandConfig.java create mode 100644 src/test/java/org/utplsql/cli/PicocliRunCommandTest.java diff --git a/pom.xml b/pom.xml index a74200d..e777689 100644 --- a/pom.xml +++ b/pom.xml @@ -61,6 +61,11 @@ logback-classic 1.2.3 + + info.picocli + picocli + 4.0.0-beta-1b + com.oracle.jdbc ojdbc8 diff --git a/src/main/java/org/utplsql/cli/LoggerConfiguration.java b/src/main/java/org/utplsql/cli/LoggerConfiguration.java index a10d8e6..abac178 100644 --- a/src/main/java/org/utplsql/cli/LoggerConfiguration.java +++ b/src/main/java/org/utplsql/cli/LoggerConfiguration.java @@ -9,7 +9,7 @@ import com.zaxxer.hikari.HikariDataSource; import org.slf4j.LoggerFactory; -class LoggerConfiguration { +public class LoggerConfiguration { public enum ConfigLevel { BASIC, NONE, DEBUG diff --git a/src/main/java/org/utplsql/cli/RunPicocliCommand.java b/src/main/java/org/utplsql/cli/RunPicocliCommand.java new file mode 100644 index 0000000..08ff37d --- /dev/null +++ b/src/main/java/org/utplsql/cli/RunPicocliCommand.java @@ -0,0 +1,230 @@ +package org.utplsql.cli; + +import org.utplsql.cli.config.FileMapperConfig; +import org.utplsql.cli.config.ReporterConfig; +import org.utplsql.cli.config.RunCommandConfig; +import picocli.CommandLine.*; + +import java.util.*; +import java.util.concurrent.Callable; + +@Command( name = "run", description = "run tests") +public class RunPicocliCommand implements Callable { + + @Parameters(description = ConnectionInfo.COMMANDLINE_PARAM_DESCRIPTION) + private String connectionString; + + @Option(names = {"-p", "--path"}, + description = "run suites/tests by path, format: " + + "-p=[schema|schema:[suite ...][.test]|schema[.suite ...][.test]") + private List paths = new ArrayList<>(); + + + @Option( + names = {"-c", "--color"}, + description = "enables printing of test results in colors as defined by ANSICONSOLE standards") + private boolean colorConsole = false; + + @Option( + names = {"-d", "--debug"}, + description = "Outputs a load of debug information to console") + private boolean logDebug = false; + + @Option( + names = {"-q", "--quiet"}, + description = "Does not output the informational messages normally printed to console") + private boolean logSilent = false; + + @Option( + names = {"--failure-exit-code"}, + description = "override the exit code on failure, default = 1") + private int failureExitCode = 1; + + + @Option( + names = {"-scc", "--skip-compatibility-check"}, + description = "Skips the check for compatibility with database framework. CLI expects the framework to be " + + "most actual. Use this if you use CLI with a development version of utPLSQL-framework") + private boolean skipCompatibilityCheck = false; + + @Option( + names = {"-t", "--timeout"}, + description = "Sets the timeout in minutes after which the cli will abort. Default 60") + private int timeoutInMinutes = 60; + + @Option( + names = {"-include"}, + description = "Comma-separated object list to include in the coverage report. " + + "Format: [schema.]package[,[schema.]package ...]. See coverage reporting options in framework documentation" + ) + private String includeObjects = null; + + @Option( + names = {"-exclude"}, + description = "Comma-separated object list to exclude from the coverage report. " + + "Format: [schema.]package[,[schema.]package ...]. See coverage reporting options in framework documentation" + ) + private String excludeObjects = null; + + + @Option( + names = {"-D", "--dbms_output"}, + description = "Enables DBMS_OUTPUT for the TestRunner (default: DISABLED)" + ) + private boolean enableDbmsOutput = false; + + // RandomTestOrder + @Option( + names = {"-r", "--random-test-order"}, + description = "Enables random order of test executions (default: DISABLED)" + ) + private boolean randomTestOrder = false; + + @Option( + names = {"-seed", "--random-test-order-seed"}, + description = "Sets the seed to use for random test execution order. If set, it sets --random-test-order to true" + ) + private Integer randomTestOrderSeed; + + @ArgGroup(exclusive = false, multiplicity = "0..*") + private List reporters = new ArrayList<>(); + + static class Format { + @Option(names={"-f", "--format"}, required = true, description = "Enables specified format reporting") + String format; + @Option(names={"-o"}, description = "Outputs format to file") + String outputFile; + @Option(names={"-s"}, description = "Outputs to screen even when an output file is specified") + boolean outputToScreen = false; + } + + // FileMappings + @ArgGroup(exclusive = false, multiplicity = "0..2") + private List fileMappings; + + static class FileMappingComposite { + + static class TestOrSourcePath { + @Option(names="-source_path", required = true) + String sourcePath; + @Option(names="-test_path", required = true) + String testPath; + + String getPath() { + return ( isSourcePath() ) ? sourcePath : testPath; + } + + boolean isSourcePath() { + return sourcePath != null; + } + } + + static class FileMapping { + @Option(names="-owner") + String owner; + @Option(names="-regex_expression") + String regexExpression; + @Option(names="-type_mapping") + String typeMapping; + @Option(names="-owner_subexpression") + Integer ownerSubExpression; + @Option(names="-type_subexpression") + Integer typeSubExpression; + @Option(names="-name_subexpression") + Integer nameSubExpression; + } + + @ArgGroup(exclusive = true, multiplicity = "1") + TestOrSourcePath testOrSourcePath; + + @ArgGroup(exclusive = false, multiplicity = "1") + FileMapping mapping; + + + FileMapperConfig toFileMapperConfig() { + Map typeMap = new HashMap<>(); + + if ( mapping.typeMapping != null && !mapping.typeMapping.isEmpty()) { + for ( String keyVal : mapping.typeMapping.split("/")) { + String[] values = keyVal.split("="); + typeMap.put(values[0], values[1]); + } + } + + return new FileMapperConfig( + testOrSourcePath.getPath(), + mapping.owner, + mapping.regexExpression, + typeMap, + mapping.ownerSubExpression, + mapping.typeSubExpression, + mapping.nameSubExpression + ); + } + } + + private String[] splitOrEmpty(String value) { + if ( value == null || value.isEmpty() ) { + return new String[0]; + } + else { + return value.split(","); + } + } + + @Override + public RunCommandConfig call() throws Exception { + + // Prepare path elements + ArrayList suitePaths = new ArrayList<>(); + for ( String pathElem : paths ) { + suitePaths.addAll(Arrays.asList(pathElem.split(","))); + } + + // Prepare LogLevelConfig + LoggerConfiguration.ConfigLevel loggerConfigLevel = LoggerConfiguration.ConfigLevel.BASIC; + if ( logSilent ) { + loggerConfigLevel = LoggerConfiguration.ConfigLevel.NONE; + } + else if ( logDebug ) { + loggerConfigLevel = LoggerConfiguration.ConfigLevel.DEBUG; + } + + // Prepare Reporter configs + List reporterConfigs = new ArrayList<>(); + for ( Format format : reporters ) { + reporterConfigs.add(new ReporterConfig(format.format, format.outputFile, format.outputToScreen)); + } + + // Prepare TypeMappings + FileMapperConfig sourceFileMapping = null; + FileMapperConfig testFileMapping = null; + if ( fileMappings != null ) { + for ( FileMappingComposite fmc : fileMappings ) { + if ( fmc.testOrSourcePath.isSourcePath() ) { + sourceFileMapping = fmc.toFileMapperConfig(); + } + else { + testFileMapping = fmc.toFileMapperConfig(); + } + } + } + + return new RunCommandConfig( + connectionString, + suitePaths.toArray(new String[0]), + reporterConfigs.toArray(new ReporterConfig[0]), + colorConsole, + failureExitCode, + skipCompatibilityCheck, + splitOrEmpty(includeObjects), + splitOrEmpty(excludeObjects), + sourceFileMapping, + testFileMapping, + loggerConfigLevel, + timeoutInMinutes, + enableDbmsOutput, + randomTestOrder, + randomTestOrderSeed); + } +} diff --git a/src/main/java/org/utplsql/cli/UtplsqlPicocliCommand.java b/src/main/java/org/utplsql/cli/UtplsqlPicocliCommand.java new file mode 100644 index 0000000..891d4f0 --- /dev/null +++ b/src/main/java/org/utplsql/cli/UtplsqlPicocliCommand.java @@ -0,0 +1,11 @@ +package org.utplsql.cli; + +import picocli.CommandLine; + +@CommandLine.Command( + name = "utplsql", + description = "utPLSQL cli", + subcommands = { RunPicocliCommand.class }) +public class UtplsqlPicocliCommand { + +} diff --git a/src/main/java/org/utplsql/cli/config/ConnectionConfig.java b/src/main/java/org/utplsql/cli/config/ConnectionConfig.java new file mode 100644 index 0000000..ef0231e --- /dev/null +++ b/src/main/java/org/utplsql/cli/config/ConnectionConfig.java @@ -0,0 +1,18 @@ +package org.utplsql.cli.config; + +import java.beans.ConstructorProperties; + +public class ConnectionConfig { + + private final String connectString; + + @ConstructorProperties({"connectString"}) + public ConnectionConfig(String connectString) { + this.connectString = connectString; + } + + public String getConnectString() { + return connectString; + } + +} diff --git a/src/main/java/org/utplsql/cli/config/FileMapperConfig.java b/src/main/java/org/utplsql/cli/config/FileMapperConfig.java new file mode 100644 index 0000000..f5d4db2 --- /dev/null +++ b/src/main/java/org/utplsql/cli/config/FileMapperConfig.java @@ -0,0 +1,54 @@ +package org.utplsql.cli.config; + +import java.beans.ConstructorProperties; +import java.util.Map; + +public class FileMapperConfig { + + private final String path; + private final String owner; + private final String regexExpression; + private final Map typeMapping; + private final Integer ownerSubexpression; + private final Integer nameSubexpression; + private final Integer typeSubexpression; + + @ConstructorProperties({"path", "owner", "regexExpression", "typeMapping", "ownerSubexpression", "nameSubexpression", "typeSubexpression"}) + public FileMapperConfig(String path, String owner, String regexExpression, Map typeMapping, Integer ownerSubexpression, Integer nameSubexpression, Integer typeSubexpression) { + this.path = path; + this.owner = owner; + this.regexExpression = regexExpression; + this.typeMapping = typeMapping; + this.ownerSubexpression = ownerSubexpression; + this.nameSubexpression = nameSubexpression; + this.typeSubexpression = typeSubexpression; + } + + public String getPath() { + return path; + } + + public String getOwner() { + return owner; + } + + public String getRegexExpression() { + return regexExpression; + } + + public Map getTypeMapping() { + return typeMapping; + } + + public Integer getOwnerSubexpression() { + return ownerSubexpression; + } + + public Integer getNameSubexpression() { + return nameSubexpression; + } + + public Integer getTypeSubexpression() { + return typeSubexpression; + } +} diff --git a/src/main/java/org/utplsql/cli/config/ReporterConfig.java b/src/main/java/org/utplsql/cli/config/ReporterConfig.java new file mode 100644 index 0000000..8729848 --- /dev/null +++ b/src/main/java/org/utplsql/cli/config/ReporterConfig.java @@ -0,0 +1,29 @@ +package org.utplsql.cli.config; + +import java.beans.ConstructorProperties; + +public class ReporterConfig { + + private final String name; + private final String output; + private boolean screen = false; + + @ConstructorProperties({"name", "output", "screen"}) + public ReporterConfig( String name, String output, Boolean screen ) { + this.name = name; + this.output = output; + if ( screen != null ) this.screen = screen; + } + + public String getName() { + return name; + } + + public String getOutput() { + return output; + } + + public boolean isScreen() { + return screen; + } +} diff --git a/src/main/java/org/utplsql/cli/config/RunCommandConfig.java b/src/main/java/org/utplsql/cli/config/RunCommandConfig.java new file mode 100644 index 0000000..cc5fd76 --- /dev/null +++ b/src/main/java/org/utplsql/cli/config/RunCommandConfig.java @@ -0,0 +1,89 @@ +package org.utplsql.cli.config; + + +import org.utplsql.cli.LoggerConfiguration.ConfigLevel; + +import java.beans.ConstructorProperties; + +public class RunCommandConfig extends ConnectionConfig { + + private final String[] suitePaths; + private final ReporterConfig[] reporters; + private boolean outputAnsiColor = false; + private final Integer failureExitCode; + private boolean skipCompatibilityCheck = false; + private final String[] includePackages; + private final String[] excludePackages; + private final FileMapperConfig sourceMapping; + private final FileMapperConfig testMapping; + private final ConfigLevel logConfigLevel; + private final Integer timeoutInMinutes; + private boolean dbmsOutput = false; + private boolean randomTestOrder = false; + private final Integer randomTestOrderSeed; + + @ConstructorProperties({"connectString", "suitePaths", "reporters", "outputAnsiColor", "failureExitCode", "skipCompatibilityCheck", "includePackages", "excludePackages", "sourceMapping", "testMapping", "logConfigLevel", "timeoutInMinutes", "dbmsOutput", "randomTestOrder", "randomTestOrderSeed"}) + public RunCommandConfig(String connectString, String[] suitePaths, ReporterConfig[] reporters, boolean outputAnsiColor, Integer failureExitCode, boolean skipCompatibilityCheck, String[] includePackages, String[] excludePackages, FileMapperConfig sourceMapping, FileMapperConfig testMapping, ConfigLevel logConfigLevel, Integer timeoutInMinutes, boolean dbmsOutput, boolean randomTestOrder, Integer randomTestOrderSeed) { + super(connectString); + this.suitePaths = suitePaths; + this.reporters = reporters; + this.outputAnsiColor = outputAnsiColor; + this.failureExitCode = failureExitCode; + this.skipCompatibilityCheck = skipCompatibilityCheck; + this.includePackages = includePackages; + this.excludePackages = excludePackages; + this.sourceMapping = sourceMapping; + this.testMapping = testMapping; + this.logConfigLevel = logConfigLevel; + this.timeoutInMinutes = timeoutInMinutes; + this.dbmsOutput = dbmsOutput; + this.randomTestOrder = randomTestOrder; + this.randomTestOrderSeed = randomTestOrderSeed; + } + + public String[] getSuitePaths() { + return suitePaths; + } + + public ReporterConfig[] getReporters() { + return reporters; + } + + public boolean isOutputAnsiColor() { + return outputAnsiColor; + } + + public Integer getFailureExitCode() { + return failureExitCode; + } + + public boolean isSkipCompatibilityCheck() { + return skipCompatibilityCheck; + } + + public String[] getIncludePackages() { + return includePackages; + } + + public String[] getExcludePackages() { + return excludePackages; + } + + public FileMapperConfig getSourceMapping() { + return sourceMapping; + } + + public FileMapperConfig getTestMapping() { + return testMapping; + } + + public ConfigLevel getLogConfigLevel() { return logConfigLevel; } + + public Integer getTimeoutInMinutes() { return timeoutInMinutes; } + + public boolean isDbmsOutput() { return dbmsOutput; } + + public boolean isRandomTestOrder() { return randomTestOrder; } + + public Integer getRandomTestOrderSeed() { return randomTestOrderSeed; } +} diff --git a/src/test/java/org/utplsql/cli/PicocliRunCommandTest.java b/src/test/java/org/utplsql/cli/PicocliRunCommandTest.java new file mode 100644 index 0000000..6e4928f --- /dev/null +++ b/src/test/java/org/utplsql/cli/PicocliRunCommandTest.java @@ -0,0 +1,170 @@ +package org.utplsql.cli; + +import org.junit.jupiter.api.Test; +import org.utplsql.cli.config.ReporterConfig; +import org.utplsql.cli.config.RunCommandConfig; +import picocli.CommandLine; + +import java.util.List; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.junit.jupiter.api.Assertions.*; + +public class PicocliRunCommandTest { + + private RunCommandConfig parseForConfig( String... args ) throws Exception { + Object obj = new UtplsqlPicocliCommand(); + CommandLine cline = new CommandLine(obj); + List parsed = cline.parse(args); + + RunPicocliCommand runCmd = parsed.get(1).getCommand(); + return runCmd.call(); + } + + @Test + void runCommandAllArguments() throws Exception { + RunCommandConfig config = parseForConfig("run", + TestHelper.getConnectionString(), + "-p=app.betwnstr,app.basic", + "-d", + "-c", + "-q", + "--failure-exit-code=10", + "-scc", + "-t=60", + "-exclude=app.exclude1,app.exclude2", + "-include=app.include1,app.include2", + "-D", + "-r", + "-seed=123", + "-f=ut_sonar_test_reporter", + "-o=sonar_result.xml", + "-s", + "-source_path=src/test/resources/plsql/source", + "-owner=app", + "-regex_expression=\"*\"", + "-type_mapping=\"sql=PACKAGE BODY\"", + "-owner_subexpression=0", + "-type_subexpression=0", + "-name_subexpression=0", + "-test_path=src/test/resources/plsql/test", + "-owner=test_app", + "-regex_expression=\"test_regex\"", + "-type_mapping=\"tsql=PACKAGE BODY\"", + "-owner_subexpression=1", + "-type_subexpression=2", + "-name_subexpression=3"); + + assertNotNull(config.getConnectString()); + assertThat( config.getSuitePaths(), is(new String[]{"app.betwnstr", "app.basic"})); + assertTrue( config.isOutputAnsiColor() ); + assertEquals( LoggerConfiguration.ConfigLevel.NONE, config.getLogConfigLevel()); + assertEquals( 10, config.getFailureExitCode()); + assertTrue( config.isSkipCompatibilityCheck() ); + assertEquals( 60, config.getTimeoutInMinutes()); + assertThat( config.getExcludePackages(), is(new String[]{"app.exclude1", "app.exclude2"})); + assertThat( config.getIncludePackages(), is(new String[]{"app.include1", "app.include2"})); + assertTrue( config.isDbmsOutput() ); + assertTrue( config.isRandomTestOrder() ); + assertEquals( 123, config.getRandomTestOrderSeed() ); + assertNotNull( config.getReporters() ); + assertEquals( 1, config.getReporters().length ); + + // Source FileMapping + assertNotNull(config.getSourceMapping()); + assertNotNull(config.getTestMapping()); + } + + @Test + void commaSeparatedPath() throws Exception { + RunCommandConfig config = parseForConfig("run", + TestHelper.getConnectionString(), + "-p=app.betwnstr,app.basic"); + + assertThat( config.getSuitePaths(), is(new String[]{"app.betwnstr", "app.basic"})); + } + + @Test + void multiplePaths() throws Exception { + RunCommandConfig config = parseForConfig("run", + TestHelper.getConnectionString(), + "-p=app.betwnstr", + "-p=app.basic"); + + assertThat( config.getSuitePaths(), is(new String[]{"app.betwnstr", "app.basic"})); + } + + @Test + void combinedOptions() throws Exception { + RunCommandConfig config = parseForConfig("run", + TestHelper.getConnectionString(), + "-cdq"); + + assertTrue( config.isOutputAnsiColor() ); + assertEquals( LoggerConfiguration.ConfigLevel.NONE, config.getLogConfigLevel()); + } + + @Test + void debugLevelOptionsDebug() throws Exception { + RunCommandConfig config = parseForConfig("run", + TestHelper.getConnectionString(), + "-d"); + + assertEquals( LoggerConfiguration.ConfigLevel.DEBUG, config.getLogConfigLevel()); + } + + @Test + void debugLevelOptionsBasic() throws Exception { + RunCommandConfig config = parseForConfig("run", + TestHelper.getConnectionString()); + + assertEquals( LoggerConfiguration.ConfigLevel.BASIC, config.getLogConfigLevel()); + } + + @Test + void debugLevelOptionsNone() throws Exception { + RunCommandConfig config = parseForConfig("run", + TestHelper.getConnectionString(), + "-q"); + + assertEquals( LoggerConfiguration.ConfigLevel.NONE, config.getLogConfigLevel()); + } + + @Test + void singleReporter() throws Exception { + RunCommandConfig config = parseForConfig("run", + TestHelper.getConnectionString(), + "-f=ut_documentation_reporter"); + + assertNotNull( config.getReporters() ); + + ReporterConfig reporterConfig = config.getReporters()[0]; + assertEquals("ut_documentation_reporter", reporterConfig.getName()); + assertNull(reporterConfig.getOutput()); + assertFalse(reporterConfig.isScreen()); + } + + @Test + void multipleReporters() throws Exception { + RunCommandConfig config = parseForConfig("run", + TestHelper.getConnectionString(), + "-f=ut_documentation_reporter", + "-o=output1.txt", + "-f=ut_coverage_html", + "-o=output2.html", + "-s"); + + assertNotNull( config.getReporters() ); + + ReporterConfig reporterConfig = config.getReporters()[0]; + assertEquals("ut_documentation_reporter", reporterConfig.getName()); + assertEquals("output1.txt", reporterConfig.getOutput()); + assertFalse(reporterConfig.isScreen()); + + reporterConfig = config.getReporters()[1]; + assertEquals("ut_coverage_html", reporterConfig.getName()); + assertEquals("output2.html", reporterConfig.getOutput()); + assertTrue(reporterConfig.isScreen()); + } +} diff --git a/src/test/java/org/utplsql/cli/RunCommandArgumentsTest.java b/src/test/java/org/utplsql/cli/RunCommandArgumentsTest.java index 40465b1..84b87ad 100644 --- a/src/test/java/org/utplsql/cli/RunCommandArgumentsTest.java +++ b/src/test/java/org/utplsql/cli/RunCommandArgumentsTest.java @@ -5,6 +5,9 @@ import java.util.ArrayList; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.contains; + public class RunCommandArgumentsTest { @Test @@ -39,4 +42,15 @@ public void allArgumentsAreRecognized() { TestRunner testRunner = runCmd.newTestRunner(new ArrayList<>()); } + + @Test + void multiplePaths() { + RunCommand runCmd = TestHelper.createRunCommand(TestHelper.getConnectionString(), + "-p=app.test_betwnstr,app.test_award_bonus" + ); + + TestRunner testRunner = runCmd.newTestRunner(new ArrayList<>()); + assertThat( testRunner.getOptions().pathList, contains("app.test_betwnstr", "app.test_award_bonus") ); + + } } From 55205629e4f2e13970a7a99147b55af473961354 Mon Sep 17 00:00:00 2001 From: pesse Date: Wed, 12 Jun 2019 09:14:47 +0200 Subject: [PATCH 04/31] Some more tests around FileMapping Also fixed a bug - the Object types are the actual key which should be translated into Key-Values later --- .../org/utplsql/cli/RunPicocliCommand.java | 6 +-- .../utplsql/cli/PicocliRunCommandTest.java | 49 ++++++++++++++++++- 2 files changed, 51 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/utplsql/cli/RunPicocliCommand.java b/src/main/java/org/utplsql/cli/RunPicocliCommand.java index 08ff37d..6687c4c 100644 --- a/src/main/java/org/utplsql/cli/RunPicocliCommand.java +++ b/src/main/java/org/utplsql/cli/RunPicocliCommand.java @@ -147,7 +147,7 @@ FileMapperConfig toFileMapperConfig() { if ( mapping.typeMapping != null && !mapping.typeMapping.isEmpty()) { for ( String keyVal : mapping.typeMapping.split("/")) { String[] values = keyVal.split("="); - typeMap.put(values[0], values[1]); + typeMap.put(values[1], values[0]); } } @@ -157,8 +157,8 @@ FileMapperConfig toFileMapperConfig() { mapping.regexExpression, typeMap, mapping.ownerSubExpression, - mapping.typeSubExpression, - mapping.nameSubExpression + mapping.nameSubExpression, + mapping.typeSubExpression ); } } diff --git a/src/test/java/org/utplsql/cli/PicocliRunCommandTest.java b/src/test/java/org/utplsql/cli/PicocliRunCommandTest.java index 6e4928f..f720b59 100644 --- a/src/test/java/org/utplsql/cli/PicocliRunCommandTest.java +++ b/src/test/java/org/utplsql/cli/PicocliRunCommandTest.java @@ -1,6 +1,7 @@ package org.utplsql.cli; import org.junit.jupiter.api.Test; +import org.utplsql.cli.config.FileMapperConfig; import org.utplsql.cli.config.ReporterConfig; import org.utplsql.cli.config.RunCommandConfig; import picocli.CommandLine; @@ -8,7 +9,7 @@ import java.util.List; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.*; import static org.junit.jupiter.api.Assertions.*; public class PicocliRunCommandTest { @@ -16,6 +17,7 @@ public class PicocliRunCommandTest { private RunCommandConfig parseForConfig( String... args ) throws Exception { Object obj = new UtplsqlPicocliCommand(); CommandLine cline = new CommandLine(obj); + cline.setTrimQuotes(true); List parsed = cline.parse(args); RunPicocliCommand runCmd = parsed.get(1).getCommand(); @@ -167,4 +169,49 @@ void multipleReporters() throws Exception { assertEquals("output2.html", reporterConfig.getOutput()); assertTrue(reporterConfig.isScreen()); } + + @Test + void sourceFileMapping() throws Exception { + RunCommandConfig config = parseForConfig("run", + TestHelper.getConnectionString(), + "-source_path=src/test/resources/plsql/source", + "-owner=app", + "-regex_expression=\"[a-Z+]\"", + "-type_mapping=\"sql=PACKAGE BODY/pks=PACKAGE\"", + "-owner_subexpression=0", + "-type_subexpression=1", + "-name_subexpression=3"); + + FileMapperConfig sourceMapperConfig = config.getSourceMapping(); + assertEquals( "src/test/resources/plsql/source", sourceMapperConfig.getPath()); + assertEquals( "app", sourceMapperConfig.getOwner()); + assertEquals( "[a-Z+]", sourceMapperConfig.getRegexExpression()); + assertThat( sourceMapperConfig.getTypeMapping(), hasEntry("PACKAGE BODY", "sql")); + assertThat( sourceMapperConfig.getTypeMapping(), hasEntry("PACKAGE", "pks")); + assertEquals( 0, sourceMapperConfig.getOwnerSubexpression()); + assertEquals( 1, sourceMapperConfig.getTypeSubexpression()); + assertEquals( 3, sourceMapperConfig.getNameSubexpression()); + } + @Test + void testFileMapping() throws Exception { + RunCommandConfig config = parseForConfig("run", + TestHelper.getConnectionString(), + "-test_path=src/test/resources/plsql/test", + "-owner=test_app", + "-regex_expression=\"test_regex\"", + "-type_mapping=\"tsql=PACKAGE BODY/tsql=FUNCTION\"", + "-owner_subexpression=4", + "-type_subexpression=5", + "-name_subexpression=6"); + + FileMapperConfig testMapperConfig = config.getTestMapping(); + assertEquals( "src/test/resources/plsql/test", testMapperConfig.getPath()); + assertEquals( "test_app", testMapperConfig.getOwner()); + assertEquals( "test_regex", testMapperConfig.getRegexExpression()); + assertThat( testMapperConfig.getTypeMapping(), hasEntry("PACKAGE BODY", "tsql")); + assertThat( testMapperConfig.getTypeMapping(), hasEntry("FUNCTION", "tsql")); + assertEquals( 4, testMapperConfig.getOwnerSubexpression()); + assertEquals( 5, testMapperConfig.getTypeSubexpression()); + assertEquals( 6, testMapperConfig.getNameSubexpression()); + } } From f9c4cf744e0cd13a325c1eead9dcb9326b377ee4 Mon Sep 17 00:00:00 2001 From: pesse Date: Wed, 12 Jun 2019 09:58:08 +0200 Subject: [PATCH 05/31] New RunAction which does the logic based on RunCommandConfig --- .../org/utplsql/cli/DataSourceProvider.java | 6 +- src/main/java/org/utplsql/cli/RunAction.java | 283 ++++++++++++++++++ .../java/org/utplsql/cli/RunActionTest.java | 129 ++++++++ src/test/java/org/utplsql/cli/TestHelper.java | 22 ++ 4 files changed, 439 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/utplsql/cli/RunAction.java create mode 100644 src/test/java/org/utplsql/cli/RunActionTest.java diff --git a/src/main/java/org/utplsql/cli/DataSourceProvider.java b/src/main/java/org/utplsql/cli/DataSourceProvider.java index 335a6a4..9ab8f50 100644 --- a/src/main/java/org/utplsql/cli/DataSourceProvider.java +++ b/src/main/java/org/utplsql/cli/DataSourceProvider.java @@ -22,10 +22,14 @@ public class DataSourceProvider { } public static DataSource getDataSource(ConnectionInfo info, int maxConnections ) throws SQLException { + return getDataSource(info.getConnectionString(), maxConnections); + } + + public static DataSource getDataSource(String connectString, int maxConnections ) throws SQLException { requireOjdbc(); - ConnectionConfig config = new ConnectionConfig(info.getConnectionString()); + ConnectionConfig config = new ConnectionConfig(connectString); warnIfSysDba(config); return new TestedDataSourceProvider(config, maxConnections).getDataSource(); diff --git a/src/main/java/org/utplsql/cli/RunAction.java b/src/main/java/org/utplsql/cli/RunAction.java new file mode 100644 index 0000000..2e4e627 --- /dev/null +++ b/src/main/java/org/utplsql/cli/RunAction.java @@ -0,0 +1,283 @@ +package org.utplsql.cli; + +import com.beust.jcommander.Parameter; +import com.beust.jcommander.Parameters; +import com.zaxxer.hikari.HikariDataSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.utplsql.api.*; +import org.utplsql.api.compatibility.CompatibilityProxy; +import org.utplsql.api.compatibility.OptionalFeatures; +import org.utplsql.api.db.DefaultDatabaseInformation; +import org.utplsql.api.exception.DatabaseNotCompatibleException; +import org.utplsql.api.exception.OracleCreateStatmenetStuckException; +import org.utplsql.api.exception.SomeTestsFailedException; +import org.utplsql.api.exception.UtPLSQLNotInstalledException; +import org.utplsql.api.reporter.Reporter; +import org.utplsql.api.reporter.ReporterFactory; +import org.utplsql.cli.config.FileMapperConfig; +import org.utplsql.cli.config.RunCommandConfig; +import org.utplsql.cli.exception.DatabaseConnectionFailed; +import org.utplsql.cli.exception.ReporterTimeoutException; +import org.utplsql.cli.log.StringBlockFormatter; + +import javax.sql.DataSource; +import javax.xml.crypto.dsig.keyinfo.KeyValue; +import java.io.File; +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.*; + +/** + * Starts a test-runner and gathers the results based on the given Configuration + * + * @author pesse + */ +public class RunAction { + + private static final Logger logger = LoggerFactory.getLogger(RunAction.class); + + private RunCommandConfig config; + + private CompatibilityProxy compatibilityProxy; + private ReporterFactory reporterFactory; + private ReporterManager reporterManager; + + public RunAction( RunCommandConfig config ) { + this.config = config; + } + + void init() { + LoggerConfiguration.configure(config.getLogConfigLevel()); + } + + public int doRun() throws OracleCreateStatmenetStuckException { + init(); + outputMainInformation(); + + HikariDataSource dataSource = null; + int returnCode = 0; + try { + + final List reporterList; + + dataSource = (HikariDataSource) DataSourceProvider.getDataSource(config.getConnectString(), getReporterManager().getNumberOfReporters() + 2); + + initDatabase(dataSource); + reporterList = initReporters(dataSource); + + checkForCompatibility(compatibilityProxy.getUtPlsqlVersion()); + + ExecutorService executorService = Executors.newFixedThreadPool(1 + reporterList.size()); + + // Run tests. + Future future = executorService.submit(new RunTestRunnerTask(dataSource, newTestRunner(reporterList), config.isDbmsOutput())); + + // Gather each reporter results on a separate thread. + getReporterManager().startReporterGatherers(executorService, dataSource); + + try { + future.get(config.getTimeoutInMinutes(), TimeUnit.MINUTES); + } catch (TimeoutException e) { + executorService.shutdownNow(); + throw new ReporterTimeoutException(config.getTimeoutInMinutes()); + } catch (ExecutionException e) { + if (e.getCause() instanceof SomeTestsFailedException) { + returnCode = config.getFailureExitCode(); + } else { + executorService.shutdownNow(); + throw e.getCause(); + } + } catch (InterruptedException e) { + executorService.shutdownNow(); + throw e; + } + finally { + executorService.shutdown(); + if (!executorService.awaitTermination(config.getTimeoutInMinutes(), TimeUnit.MINUTES)) { + throw new ReporterTimeoutException(config.getTimeoutInMinutes()); + } + } + + logger.info("--------------------------------------"); + logger.info("All tests done."); + } catch ( OracleCreateStatmenetStuckException e ) { + throw e; + } catch ( DatabaseNotCompatibleException | UtPLSQLNotInstalledException | DatabaseConnectionFailed | ReporterTimeoutException e ) { + System.out.println(e.getMessage()); + returnCode = Cli.DEFAULT_ERROR_CODE; + } catch (Throwable e) { + e.printStackTrace(); + returnCode = Cli.DEFAULT_ERROR_CODE; + } finally { + if ( dataSource != null ) + dataSource.close(); + } + return returnCode; + } + + public int run() { + for ( int i = 1; i<5; i++ ) { + try { + return doRun(); + } catch (OracleCreateStatmenetStuckException e) { + logger.warn("WARNING: Caught Oracle stuck during creation of Runner-Statement. Retrying ({})", i); + } + } + + return Cli.DEFAULT_ERROR_CODE; + } + + private void checkForCompatibility( Version utPlSqlVersion ) { + if (!OptionalFeatures.FAIL_ON_ERROR.isAvailableFor(utPlSqlVersion) && config.getFailureExitCode() != null ) { + System.out.println("You specified option `--failure-exit-code` but your database framework version (" + + utPlSqlVersion.getNormalizedString() + ") is not able to " + + "redirect failureCodes. Please upgrade to a newer version if you want to use that feature."); + } + + if ( !OptionalFeatures.RANDOM_EXECUTION_ORDER.isAvailableFor(utPlSqlVersion) && config.isRandomTestOrder() ) { + System.out.println("You specified option `-random` but your database framework version (" + + utPlSqlVersion.getNormalizedString() + ") is not able to " + + "redirect failureCodes. Please upgrade to a newer version if you want to use that feature."); + } + + if ( !OptionalFeatures.RANDOM_EXECUTION_ORDER.isAvailableFor(utPlSqlVersion) && config.getRandomTestOrderSeed() != null ) { + System.out.println("You specified option `-seed` but your database framework version (" + + utPlSqlVersion.getNormalizedString() + ") is not able to " + + "redirect failureCodes. Please upgrade to a newer version if you want to use that feature."); + } + + } + + TestRunner newTestRunner( List reporterList) { + + final File baseDir = new File("").getAbsoluteFile(); + + return new TestRunner() + .addPathList(Arrays.asList(config.getSuitePaths())) + .addReporterList(reporterList) + .sourceMappingOptions(getFileMapperOptionsByParamListItem(config.getSourceMapping(), baseDir)) + .testMappingOptions(getFileMapperOptionsByParamListItem(config.getTestMapping(), baseDir)) + .colorConsole(config.isOutputAnsiColor()) + .failOnErrors(true) + .skipCompatibilityCheck(config.isSkipCompatibilityCheck()) + .includeObjects(Arrays.asList(config.getIncludePackages())) + .excludeObjects(Arrays.asList(config.getExcludePackages())) + .randomTestOrder(config.isRandomTestOrder()) + .randomTestOrderSeed(config.getRandomTestOrderSeed()); + } + + private void outputMainInformation() { + + StringBlockFormatter formatter = new StringBlockFormatter("utPLSQL cli"); + formatter.appendLine(CliVersionInfo.getInfo()); + formatter.appendLine(JavaApiVersionInfo.getInfo()); + formatter.appendLine("Java-Version: " + System.getProperty("java.version")); + formatter.appendLine("ORACLE_HOME: " + EnvironmentVariableUtil.getEnvValue("ORACLE_HOME")); + formatter.appendLine("NLS_LANG: " + EnvironmentVariableUtil.getEnvValue("NLS_LANG")); + formatter.appendLine(""); + formatter.appendLine("Thanks for testing!"); + + logger.info(formatter.toString()); + logger.info(""); + } + + private void initDatabase(DataSource dataSource) throws SQLException { + try (Connection conn = dataSource.getConnection()) { + + // Check if orai18n exists if database version is 11g + RunCommandChecker.checkOracleI18nExists(conn); + + // First of all do a compatibility check and fail-fast + compatibilityProxy = checkFrameworkCompatibility(conn); + + logger.info("Successfully connected to database. UtPLSQL core: {}", compatibilityProxy.getVersionDescription()); + logger.info("Oracle-Version: {}", new DefaultDatabaseInformation().getOracleVersion(conn)); + } + catch (SQLException e) { + if (e.getErrorCode() == 1017 || e.getErrorCode() == 12514) { + throw new DatabaseConnectionFailed(e); + } else { + throw e; + } + } + } + + private List initReporters(DataSource dataSource) throws SQLException { + try (Connection conn = dataSource.getConnection()) { + reporterFactory = ReporterFactoryProvider.createReporterFactory(compatibilityProxy); + return getReporterManager().initReporters(conn, reporterFactory, compatibilityProxy); + } + } + + /** Returns FileMapperOptions for the first item of a given param list in a baseDir + * + * @param fileMapperConfig + * @param baseDir + * @return FileMapperOptions or null + */ + private FileMapperOptions getFileMapperOptionsByParamListItem(FileMapperConfig fileMapperConfig, File baseDir ) + { + if (fileMapperConfig != null) { + String sourcePath = fileMapperConfig.getPath(); + + logger.debug("BaseDir: {}", baseDir); + logger.debug("SourcePath: {}", sourcePath); + + List files = new FileWalker().getFileList(baseDir, sourcePath); + + logger.debug("Getting FileMapperOptions - Files: "); + files.forEach(logger::debug); + + FileMapperOptions options = new FileMapperOptions(files); + options.setObjectOwner(fileMapperConfig.getOwner()); + options.setRegexPattern(fileMapperConfig.getRegexExpression()); + options.setTypeSubExpression(fileMapperConfig.getTypeSubexpression()); + options.setOwnerSubExpression(fileMapperConfig.getOwnerSubexpression()); + options.setNameSubExpression(fileMapperConfig.getNameSubexpression()); + + List mappings = new ArrayList<>(); + fileMapperConfig.getTypeMapping().forEach((k, v) -> mappings.add(new KeyValuePair(v, k))); + options.setTypeMappings(mappings); + + return options; + } + + return null; + } + + /** Checks whether cli is compatible with the database framework + * + * @param conn Active Connection + * @throws SQLException + */ + private CompatibilityProxy checkFrameworkCompatibility(Connection conn) throws SQLException { + + CompatibilityProxy proxy = new CompatibilityProxy(conn, config.isSkipCompatibilityCheck()); + + if ( !config.isSkipCompatibilityCheck() ) { + proxy.failOnNotCompatible(); + } + else { + System.out.println("Skipping Compatibility check with framework version, expecting the latest version " + + "to be installed in database"); + } + + return proxy; + } + + private ReporterManager getReporterManager() { + ArrayList reporterParams = new ArrayList<>(); + if ( reporterManager == null ) + reporterManager = new ReporterManager(reporterParams); + + return reporterManager; + } + + List getReporterOptionsList() { + return getReporterManager().getReporterOptionsList(); + } +} diff --git a/src/test/java/org/utplsql/cli/RunActionTest.java b/src/test/java/org/utplsql/cli/RunActionTest.java new file mode 100644 index 0000000..f03d703 --- /dev/null +++ b/src/test/java/org/utplsql/cli/RunActionTest.java @@ -0,0 +1,129 @@ +package org.utplsql.cli; + +import org.junit.jupiter.api.Test; +import org.utplsql.api.TestRunnerOptions; +import org.utplsql.api.reporter.CoreReporters; + +import java.util.ArrayList; +import java.util.List; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +/** + * Unit test for run command. + */ +class RunActionTest { + + @Test + void reporterOptions_Default() throws Exception { + RunAction runCmd = TestHelper.createRunAction(TestHelper.getConnectionString()); + + List reporterOptionsList = runCmd.getReporterOptionsList(); + + ReporterOptions reporterOptions1 = reporterOptionsList.get(0); + assertEquals(CoreReporters.UT_DOCUMENTATION_REPORTER.name(), reporterOptions1.getReporterName()); + assertNull(reporterOptions1.getOutputFileName()); + assertFalse(reporterOptions1.outputToFile()); + assertTrue(reporterOptions1.outputToScreen()); + } + + @Test + void reporterOptions_OneReporter() throws Exception { + RunAction runCmd = TestHelper.createRunAction(TestHelper.getConnectionString(), "-f=ut_documentation_reporter", "-o=output.txt"); + + List reporterOptionsList = runCmd.getReporterOptionsList(); + + ReporterOptions reporterOptions1 = reporterOptionsList.get(0); + assertEquals(CoreReporters.UT_DOCUMENTATION_REPORTER.name(), reporterOptions1.getReporterName()); + assertEquals(reporterOptions1.getOutputFileName(), "output.txt"); + assertTrue(reporterOptions1.outputToFile()); + assertFalse(reporterOptions1.outputToScreen()); + } + + @Test + void reporterOptions_OneReporterForceScreen() throws Exception { + RunAction runCmd = TestHelper.createRunAction(TestHelper.getConnectionString(), "-f=ut_documentation_reporter", "-o=output.txt", "-s"); + + List reporterOptionsList = runCmd.getReporterOptionsList(); + + ReporterOptions reporterOptions1 = reporterOptionsList.get(0); + assertEquals(CoreReporters.UT_DOCUMENTATION_REPORTER.name(), reporterOptions1.getReporterName()); + assertEquals(reporterOptions1.getOutputFileName(), "output.txt"); + assertTrue(reporterOptions1.outputToFile()); + assertTrue(reporterOptions1.outputToScreen()); + } + + @Test + void reporterOptions_OneReporterForceScreenInverse() throws Exception { + RunAction runCmd = TestHelper.createRunAction(TestHelper.getConnectionString(), "-f=ut_documentation_reporter", "-s", "-o=output.txt"); + + List reporterOptionsList = runCmd.getReporterOptionsList(); + + ReporterOptions reporterOptions1 = reporterOptionsList.get(0); + assertEquals(CoreReporters.UT_DOCUMENTATION_REPORTER.name(), reporterOptions1.getReporterName()); + assertEquals(reporterOptions1.getOutputFileName(), "output.txt"); + assertTrue(reporterOptions1.outputToFile()); + assertTrue(reporterOptions1.outputToScreen()); + } + + @Test + void reporterOptions_TwoReporters() throws Exception { + RunAction runCmd = TestHelper.createRunAction(TestHelper.getConnectionString(), + "-f=ut_documentation_reporter", + "-f=ut_coverage_html_reporter", "-o=coverage.html", "-s"); + + List reporterOptionsList = runCmd.getReporterOptionsList(); + + ReporterOptions reporterOptions1 = reporterOptionsList.get(0); + assertEquals(CoreReporters.UT_DOCUMENTATION_REPORTER.name(), reporterOptions1.getReporterName()); + assertNull(reporterOptions1.getOutputFileName()); + assertFalse(reporterOptions1.outputToFile()); + assertTrue(reporterOptions1.outputToScreen()); + + ReporterOptions reporterOptions2 = reporterOptionsList.get(1); + assertEquals(CoreReporters.UT_COVERAGE_HTML_REPORTER.name(), reporterOptions2.getReporterName()); + assertEquals(reporterOptions2.getOutputFileName(), "coverage.html"); + assertTrue(reporterOptions2.outputToFile()); + assertTrue(reporterOptions2.outputToScreen()); + } + + /*@Test + void connectionString_asSysdba() throws Exception { + RunAction runCmd = TestHelper.createRunAction("sys as sysdba/mypass@connectstring/service"); + + assertEquals("sys as sysdba/mypass@connectstring/service", + runCmd.getConnectionInfo().getConnectionString()); + }*/ + + @Test + void randomOrder_default() throws Exception { + RunAction runCmd = TestHelper.createRunAction(TestHelper.getConnectionString()); + + TestRunnerOptions options = runCmd.newTestRunner(new ArrayList<>()).getOptions(); + assertThat(options.randomTestOrder, equalTo(false)); + assertThat(options.randomTestOrderSeed, nullValue()); + } + + @Test + void randomOrder_withoutSeed() throws Exception { + RunAction runCmd = TestHelper.createRunAction(TestHelper.getConnectionString(), + "-r"); + + TestRunnerOptions options = runCmd.newTestRunner(new ArrayList<>()).getOptions(); + assertThat(options.randomTestOrder, equalTo(true)); + assertThat(options.randomTestOrderSeed, nullValue()); + } + + @Test + void randomOrder_withSeed() throws Exception { + RunAction runCmd = TestHelper.createRunAction(TestHelper.getConnectionString(), + "-seed=42"); + + TestRunnerOptions options = runCmd.newTestRunner(new ArrayList<>()).getOptions(); + assertThat(options.randomTestOrder, equalTo(true)); + assertThat(options.randomTestOrderSeed, equalTo(42)); + } +} diff --git a/src/test/java/org/utplsql/cli/TestHelper.java b/src/test/java/org/utplsql/cli/TestHelper.java index 77375bd..2edb421 100644 --- a/src/test/java/org/utplsql/cli/TestHelper.java +++ b/src/test/java/org/utplsql/cli/TestHelper.java @@ -4,10 +4,15 @@ import org.utplsql.api.DBHelper; import org.utplsql.api.EnvironmentVariableUtil; import org.utplsql.api.Version; +import org.utplsql.cli.config.RunCommandConfig; +import picocli.CommandLine; import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; class TestHelper { private static String sUrl; @@ -31,6 +36,23 @@ static RunCommand createRunCommand(String... args) { return runCmd; } + static RunCommandConfig parseRunConfig(String... args ) throws Exception { + Object obj = new UtplsqlPicocliCommand(); + CommandLine cline = new CommandLine(obj); + cline.setTrimQuotes(true); + List parsed = cline.parse(args); + + RunPicocliCommand runCmd = parsed.get(1).getCommand(); + return runCmd.call(); + } + + static RunAction createRunAction(String... args) throws Exception { + ArrayList newArgs = new ArrayList<>(args.length+1); + newArgs.add("run"); + newArgs.addAll(Arrays.asList(args)); + return new RunAction(parseRunConfig(newArgs.toArray(new String[0]))); + } + static int runApp(String... args) { return Cli.runWithExitCode(args); } From d8cbce21e825b555fc847f44f47c196112cdf0a4 Mon Sep 17 00:00:00 2001 From: pesse Date: Wed, 12 Jun 2019 14:30:37 +0200 Subject: [PATCH 06/31] RunAction tested and functional so far --- .../java/org/utplsql/cli/ReporterManager.java | 21 +++++++++++++++--- src/main/java/org/utplsql/cli/RunAction.java | 22 ++++++++++++++++--- .../java/org/utplsql/cli/RunActionTest.java | 8 +++---- 3 files changed, 41 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/utplsql/cli/ReporterManager.java b/src/main/java/org/utplsql/cli/ReporterManager.java index fe846a7..2593667 100644 --- a/src/main/java/org/utplsql/cli/ReporterManager.java +++ b/src/main/java/org/utplsql/cli/ReporterManager.java @@ -13,6 +13,7 @@ import java.sql.Connection; import java.sql.SQLException; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.concurrent.ExecutorService; @@ -23,10 +24,16 @@ class ReporterManager { private ExecutorService executorService; ReporterManager(List reporterParams ) { - initReporterOptionsList(reporterParams); + parseReporterOptionsList(reporterParams); + initReporterOptionsList(); } - private void initReporterOptionsList( List reporterParams ) { + ReporterManager( ReporterOptions[] reporterOptions ) { + this.reporterOptionsList = Arrays.asList(reporterOptions); + initReporterOptionsList(); + } + + private void parseReporterOptionsList( List reporterParams ) { reporterOptionsList = new ArrayList<>(); ReporterOptions reporterOptions = null; @@ -44,13 +51,21 @@ private void initReporterOptionsList( List reporterParams ) { reporterOptions.forceOutputToScreen(true); } } + } + + private void initReporterOptionsList( ) { // If no reporter parameters were passed, use default reporter. if (reporterOptionsList.isEmpty()) { - reporterOptionsList.add(new ReporterOptions(CoreReporters.UT_DOCUMENTATION_REPORTER.name())); + reporterOptionsList = new ArrayList<>(); + reporterOptionsList.add(getDefaultReporterOption()); } } + private ReporterOptions getDefaultReporterOption() { + return new ReporterOptions(CoreReporters.UT_DOCUMENTATION_REPORTER.name()); + } + private void abortGathering(Throwable e) { addGatherError(e); executorService.shutdownNow(); diff --git a/src/main/java/org/utplsql/cli/RunAction.java b/src/main/java/org/utplsql/cli/RunAction.java index 2e4e627..352493e 100644 --- a/src/main/java/org/utplsql/cli/RunAction.java +++ b/src/main/java/org/utplsql/cli/RunAction.java @@ -16,6 +16,7 @@ import org.utplsql.api.reporter.Reporter; import org.utplsql.api.reporter.ReporterFactory; import org.utplsql.cli.config.FileMapperConfig; +import org.utplsql.cli.config.ReporterConfig; import org.utplsql.cli.config.RunCommandConfig; import org.utplsql.cli.exception.DatabaseConnectionFailed; import org.utplsql.cli.exception.ReporterTimeoutException; @@ -54,6 +55,10 @@ void init() { LoggerConfiguration.configure(config.getLogConfigLevel()); } + public RunCommandConfig getConfig() { + return config; + } + public int doRun() throws OracleCreateStatmenetStuckException { init(); outputMainInformation(); @@ -270,9 +275,20 @@ private CompatibilityProxy checkFrameworkCompatibility(Connection conn) throws S } private ReporterManager getReporterManager() { - ArrayList reporterParams = new ArrayList<>(); - if ( reporterManager == null ) - reporterManager = new ReporterManager(reporterParams); + if ( reporterManager == null ) { + + ReporterConfig[] reporterConfigs = config.getReporters(); + if ( reporterConfigs != null ) { + ReporterOptions[] options = new ReporterOptions[reporterConfigs.length]; + for (int i = 0; i Date: Wed, 12 Jun 2019 14:52:28 +0200 Subject: [PATCH 07/31] Include RunAction into RunCommand --- .../org/utplsql/cli/RunPicocliCommand.java | 23 ++++++++++++++----- .../utplsql/cli/PicocliRunCommandTest.java | 2 +- src/test/java/org/utplsql/cli/TestHelper.java | 2 +- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/utplsql/cli/RunPicocliCommand.java b/src/main/java/org/utplsql/cli/RunPicocliCommand.java index 6687c4c..2b46d62 100644 --- a/src/main/java/org/utplsql/cli/RunPicocliCommand.java +++ b/src/main/java/org/utplsql/cli/RunPicocliCommand.java @@ -3,13 +3,15 @@ import org.utplsql.cli.config.FileMapperConfig; import org.utplsql.cli.config.ReporterConfig; import org.utplsql.cli.config.RunCommandConfig; -import picocli.CommandLine.*; +import picocli.CommandLine.ArgGroup; +import picocli.CommandLine.Command; +import picocli.CommandLine.Option; +import picocli.CommandLine.Parameters; import java.util.*; -import java.util.concurrent.Callable; @Command( name = "run", description = "run tests") -public class RunPicocliCommand implements Callable { +public class RunPicocliCommand implements ICommand { @Parameters(description = ConnectionInfo.COMMANDLINE_PARAM_DESCRIPTION) private String connectionString; @@ -172,9 +174,7 @@ private String[] splitOrEmpty(String value) { } } - @Override - public RunCommandConfig call() throws Exception { - + public RunCommandConfig getRunCommandConfig() { // Prepare path elements ArrayList suitePaths = new ArrayList<>(); for ( String pathElem : paths ) { @@ -227,4 +227,15 @@ else if ( logDebug ) { randomTestOrder, randomTestOrderSeed); } + + @Override + public int run() { + RunAction action = new RunAction(getRunCommandConfig()); + return action.run(); + } + + @Override + public String getCommand() { + return null; + } } diff --git a/src/test/java/org/utplsql/cli/PicocliRunCommandTest.java b/src/test/java/org/utplsql/cli/PicocliRunCommandTest.java index f720b59..af65592 100644 --- a/src/test/java/org/utplsql/cli/PicocliRunCommandTest.java +++ b/src/test/java/org/utplsql/cli/PicocliRunCommandTest.java @@ -21,7 +21,7 @@ private RunCommandConfig parseForConfig( String... args ) throws Exception { List parsed = cline.parse(args); RunPicocliCommand runCmd = parsed.get(1).getCommand(); - return runCmd.call(); + return runCmd.getRunCommandConfig(); } @Test diff --git a/src/test/java/org/utplsql/cli/TestHelper.java b/src/test/java/org/utplsql/cli/TestHelper.java index 2edb421..9fd74cf 100644 --- a/src/test/java/org/utplsql/cli/TestHelper.java +++ b/src/test/java/org/utplsql/cli/TestHelper.java @@ -43,7 +43,7 @@ static RunCommandConfig parseRunConfig(String... args ) throws Exception { List parsed = cline.parse(args); RunPicocliCommand runCmd = parsed.get(1).getCommand(); - return runCmd.call(); + return runCmd.getRunCommandConfig(); } static RunAction createRunAction(String... args) throws Exception { From 60997d7eea5a691ddc95c23db098b69ddbfd47b5 Mon Sep 17 00:00:00 2001 From: pesse Date: Wed, 12 Jun 2019 15:43:06 +0200 Subject: [PATCH 08/31] New entry point for Picocli --- src/main/java/org/utplsql/cli/Cli.java | 32 +++++++++++++++++++ .../java/org/utplsql/cli/RunCommandIT.java | 2 +- src/test/java/org/utplsql/cli/TestHelper.java | 2 +- 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/utplsql/cli/Cli.java b/src/main/java/org/utplsql/cli/Cli.java index 3111ac1..b025dde 100644 --- a/src/main/java/org/utplsql/cli/Cli.java +++ b/src/main/java/org/utplsql/cli/Cli.java @@ -2,6 +2,9 @@ import com.beust.jcommander.JCommander; import com.beust.jcommander.ParameterException; +import picocli.CommandLine; + +import java.util.List; public class Cli { @@ -50,5 +53,34 @@ static int runWithExitCode( String[] args ) { return exitCode; } + static int runPicocliWithExitCode( String[] args ) { + + LoggerConfiguration.configure(LoggerConfiguration.ConfigLevel.NONE); + LocaleInitializer.initLocale(); + + CommandLine commandLine = new CommandLine(UtplsqlPicocliCommand.class); + commandLine.setTrimQuotes(true); + + int exitCode = DEFAULT_ERROR_CODE; + + try { + + List parsedLines = commandLine.parse(args); + + for ( CommandLine parsedLine : parsedLines ) { + Object command = parsedLine.getCommand(); + if ( command instanceof ICommand ) { + exitCode = ((ICommand)command).run(); + break; + } + } + } catch (ParameterException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + + return exitCode; + } } diff --git a/src/test/java/org/utplsql/cli/RunCommandIT.java b/src/test/java/org/utplsql/cli/RunCommandIT.java index 7f1185e..336f2a8 100644 --- a/src/test/java/org/utplsql/cli/RunCommandIT.java +++ b/src/test/java/org/utplsql/cli/RunCommandIT.java @@ -70,7 +70,7 @@ void run_withDbmsOutputEnabled() throws Exception { int result = TestHelper.runApp("run", TestHelper.getConnectionString(), - "-dbout", + "-D", "--failure-exit-code=2"); assertValidReturnCode(result); diff --git a/src/test/java/org/utplsql/cli/TestHelper.java b/src/test/java/org/utplsql/cli/TestHelper.java index 9fd74cf..cd317f9 100644 --- a/src/test/java/org/utplsql/cli/TestHelper.java +++ b/src/test/java/org/utplsql/cli/TestHelper.java @@ -54,7 +54,7 @@ static RunAction createRunAction(String... args) throws Exception { } static int runApp(String... args) { - return Cli.runWithExitCode(args); + return Cli.runPicocliWithExitCode(args); } static Version getFrameworkVersion() throws SQLException { From d13ae5ba614f5fc924441ede604546b812ea8a13 Mon Sep 17 00:00:00 2001 From: pesse Date: Wed, 12 Jun 2019 15:51:11 +0200 Subject: [PATCH 09/31] Extract functionality to interface --- src/main/java/org/utplsql/cli/IRunCommand.java | 13 +++++++++++++ src/main/java/org/utplsql/cli/RunCommand.java | 8 +++++--- .../java/org/utplsql/cli/RunCommandIssue20Test.java | 2 +- src/test/java/org/utplsql/cli/TestHelper.java | 2 +- 4 files changed, 20 insertions(+), 5 deletions(-) create mode 100644 src/main/java/org/utplsql/cli/IRunCommand.java diff --git a/src/main/java/org/utplsql/cli/IRunCommand.java b/src/main/java/org/utplsql/cli/IRunCommand.java new file mode 100644 index 0000000..29700b2 --- /dev/null +++ b/src/main/java/org/utplsql/cli/IRunCommand.java @@ -0,0 +1,13 @@ +package org.utplsql.cli; + +import org.utplsql.api.TestRunner; +import org.utplsql.api.reporter.Reporter; + +import java.util.List; + +public interface IRunCommand extends ICommand { + + TestRunner newTestRunner(List reporterList); + + List getReporterOptionsList(); +} diff --git a/src/main/java/org/utplsql/cli/RunCommand.java b/src/main/java/org/utplsql/cli/RunCommand.java index 29b5a2b..78d9111 100644 --- a/src/main/java/org/utplsql/cli/RunCommand.java +++ b/src/main/java/org/utplsql/cli/RunCommand.java @@ -37,7 +37,7 @@ * @author pesse */ @Parameters(separators = "=", commandDescription = "run tests") -public class RunCommand implements ICommand { +public class RunCommand implements ICommand, IRunCommand { private static final Logger logger = LoggerFactory.getLogger(RunCommand.class); @@ -258,7 +258,8 @@ private void checkForCompatibility( Version utPlSqlVersion ) { } - TestRunner newTestRunner( List reporterList) { + @Override + public TestRunner newTestRunner( List reporterList) { final File baseDir = new File("").getAbsoluteFile(); @@ -437,7 +438,8 @@ private ReporterManager getReporterManager() { return reporterManager; } - List getReporterOptionsList() { + @Override + public List getReporterOptionsList() { return getReporterManager().getReporterOptionsList(); } } diff --git a/src/test/java/org/utplsql/cli/RunCommandIssue20Test.java b/src/test/java/org/utplsql/cli/RunCommandIssue20Test.java index 6b847f8..cbbbeb4 100644 --- a/src/test/java/org/utplsql/cli/RunCommandIssue20Test.java +++ b/src/test/java/org/utplsql/cli/RunCommandIssue20Test.java @@ -21,7 +21,7 @@ class RunCommandIssue20Test { @Test void runLoop() { - RunCommand runCmd = TestHelper.createRunCommand( + IRunCommand runCmd = TestHelper.createRunCommand( TestHelper.getConnectionString(), "-p=TEST_BETWNSTR.normal_case", "-f=ut_documentation_reporter"); diff --git a/src/test/java/org/utplsql/cli/TestHelper.java b/src/test/java/org/utplsql/cli/TestHelper.java index cd317f9..bf5874a 100644 --- a/src/test/java/org/utplsql/cli/TestHelper.java +++ b/src/test/java/org/utplsql/cli/TestHelper.java @@ -25,7 +25,7 @@ class TestHelper { sPass = EnvironmentVariableUtil.getEnvValue("DB_PASS", "app"); } - static RunCommand createRunCommand(String... args) { + static IRunCommand createRunCommand(String... args) { RunCommand runCmd = new RunCommand(); JCommander.newBuilder() From 5e86b01601791c51ac35704ad4340be1365e4bc3 Mon Sep 17 00:00:00 2001 From: pesse Date: Wed, 12 Jun 2019 17:50:10 +0200 Subject: [PATCH 10/31] Adapt tests to IRunCommand and implement necessary functionality --- .../java/org/utplsql/cli/IRunCommand.java | 2 ++ src/main/java/org/utplsql/cli/RunCommand.java | 4 +-- .../org/utplsql/cli/RunPicocliCommand.java | 31 +++++++++++++++++-- .../java/org/utplsql/cli/PathMapperTest.java | 2 +- .../utplsql/cli/RunCommandArgumentsTest.java | 4 +-- .../cli/RunCommandConfigLevelTest.java | 6 ++-- .../java/org/utplsql/cli/RunCommandTest.java | 24 +++++--------- src/test/java/org/utplsql/cli/TestHelper.java | 18 +++++++++-- 8 files changed, 62 insertions(+), 29 deletions(-) diff --git a/src/main/java/org/utplsql/cli/IRunCommand.java b/src/main/java/org/utplsql/cli/IRunCommand.java index 29700b2..6aa2681 100644 --- a/src/main/java/org/utplsql/cli/IRunCommand.java +++ b/src/main/java/org/utplsql/cli/IRunCommand.java @@ -7,6 +7,8 @@ public interface IRunCommand extends ICommand { + void initLogger(); + TestRunner newTestRunner(List reporterList); List getReporterOptionsList(); diff --git a/src/main/java/org/utplsql/cli/RunCommand.java b/src/main/java/org/utplsql/cli/RunCommand.java index 78d9111..7a973df 100644 --- a/src/main/java/org/utplsql/cli/RunCommand.java +++ b/src/main/java/org/utplsql/cli/RunCommand.java @@ -147,7 +147,7 @@ ConnectionInfo getConnectionInfo() { return connectionInfoList.get(0); } - void init() { + public void initLogger() { LoggerConfiguration.ConfigLevel level = LoggerConfiguration.ConfigLevel.BASIC; if ( logSilent ) { @@ -161,7 +161,7 @@ else if ( logDebug ) { } public int doRun() throws OracleCreateStatmenetStuckException { - init(); + initLogger(); outputMainInformation(); HikariDataSource dataSource = null; diff --git a/src/main/java/org/utplsql/cli/RunPicocliCommand.java b/src/main/java/org/utplsql/cli/RunPicocliCommand.java index 2b46d62..eb7872e 100644 --- a/src/main/java/org/utplsql/cli/RunPicocliCommand.java +++ b/src/main/java/org/utplsql/cli/RunPicocliCommand.java @@ -1,5 +1,7 @@ package org.utplsql.cli; +import org.utplsql.api.TestRunner; +import org.utplsql.api.reporter.Reporter; import org.utplsql.cli.config.FileMapperConfig; import org.utplsql.cli.config.ReporterConfig; import org.utplsql.cli.config.RunCommandConfig; @@ -11,7 +13,7 @@ import java.util.*; @Command( name = "run", description = "run tests") -public class RunPicocliCommand implements ICommand { +public class RunPicocliCommand implements IRunCommand { @Parameters(description = ConnectionInfo.COMMANDLINE_PARAM_DESCRIPTION) private String connectionString; @@ -165,6 +167,8 @@ FileMapperConfig toFileMapperConfig() { } } + private RunAction runAction; + private String[] splitOrEmpty(String value) { if ( value == null || value.isEmpty() ) { return new String[0]; @@ -228,14 +232,35 @@ else if ( logDebug ) { randomTestOrderSeed); } + private RunAction getRunAction() { + if ( runAction == null ) + runAction = new RunAction(getRunCommandConfig()); + + return runAction; + } + @Override public int run() { - RunAction action = new RunAction(getRunCommandConfig()); - return action.run(); + return getRunAction().run(); } @Override public String getCommand() { return null; } + + @Override + public TestRunner newTestRunner(List reporterList) { + return getRunAction().newTestRunner(reporterList); + } + + @Override + public List getReporterOptionsList() { + return getRunAction().getReporterOptionsList(); + } + + @Override + public void initLogger() { + getRunAction().init(); + } } diff --git a/src/test/java/org/utplsql/cli/PathMapperTest.java b/src/test/java/org/utplsql/cli/PathMapperTest.java index 029cc22..17798ca 100644 --- a/src/test/java/org/utplsql/cli/PathMapperTest.java +++ b/src/test/java/org/utplsql/cli/PathMapperTest.java @@ -9,7 +9,7 @@ public class PathMapperTest { @Test void checkPathMapperOutput() { - RunCommand runCmd = TestHelper.createRunCommand(TestHelper.getConnectionString(), + IRunCommand runCmd = TestHelper.createRunCommand(TestHelper.getConnectionString(), "-f=ut_sonar_test_reporter", "-o=sonar_result.xml", "-s", diff --git a/src/test/java/org/utplsql/cli/RunCommandArgumentsTest.java b/src/test/java/org/utplsql/cli/RunCommandArgumentsTest.java index 84b87ad..ccabd3d 100644 --- a/src/test/java/org/utplsql/cli/RunCommandArgumentsTest.java +++ b/src/test/java/org/utplsql/cli/RunCommandArgumentsTest.java @@ -12,7 +12,7 @@ public class RunCommandArgumentsTest { @Test public void allArgumentsAreRecognized() { - RunCommand runCmd = TestHelper.createRunCommand(TestHelper.getConnectionString(), + IRunCommand runCmd = TestHelper.createRunCommand(TestHelper.getConnectionString(), "-p=app", "-f=ut_sonar_test_reporter", "-o=sonar_result.xml", @@ -45,7 +45,7 @@ public void allArgumentsAreRecognized() { @Test void multiplePaths() { - RunCommand runCmd = TestHelper.createRunCommand(TestHelper.getConnectionString(), + IRunCommand runCmd = TestHelper.createRunCommand(TestHelper.getConnectionString(), "-p=app.test_betwnstr,app.test_award_bonus" ); diff --git a/src/test/java/org/utplsql/cli/RunCommandConfigLevelTest.java b/src/test/java/org/utplsql/cli/RunCommandConfigLevelTest.java index e6263ce..b677ed2 100644 --- a/src/test/java/org/utplsql/cli/RunCommandConfigLevelTest.java +++ b/src/test/java/org/utplsql/cli/RunCommandConfigLevelTest.java @@ -16,7 +16,7 @@ private Logger getRootLogger() { @Test void defaultIsInfo() { TestHelper.createRunCommand(TestHelper.getConnectionString()) - .init(); + .initLogger(); assertEquals(Level.INFO, getRootLogger().getLevel()); } @@ -24,7 +24,7 @@ void defaultIsInfo() { @Test void silentModeSetsLoggerToOff() { TestHelper.createRunCommand(TestHelper.getConnectionString(), "-q") - .init(); + .initLogger(); assertEquals(Level.OFF, getRootLogger().getLevel()); } @@ -32,7 +32,7 @@ void silentModeSetsLoggerToOff() { @Test void debugModeSetsLoggerToDebug() { TestHelper.createRunCommand(TestHelper.getConnectionString(), "-d") - .init(); + .initLogger(); assertEquals(Level.DEBUG, getRootLogger().getLevel()); } diff --git a/src/test/java/org/utplsql/cli/RunCommandTest.java b/src/test/java/org/utplsql/cli/RunCommandTest.java index e2ec155..4035cf2 100644 --- a/src/test/java/org/utplsql/cli/RunCommandTest.java +++ b/src/test/java/org/utplsql/cli/RunCommandTest.java @@ -19,7 +19,7 @@ class RunCommandTest { @Test void reporterOptions_Default() { - RunCommand runCmd = TestHelper.createRunCommand(TestHelper.getConnectionString()); + IRunCommand runCmd = TestHelper.createRunCommand(TestHelper.getConnectionString()); List reporterOptionsList = runCmd.getReporterOptionsList(); @@ -32,7 +32,7 @@ void reporterOptions_Default() { @Test void reporterOptions_OneReporter() { - RunCommand runCmd = TestHelper.createRunCommand(TestHelper.getConnectionString(), "-f=ut_documentation_reporter", "-o=output.txt"); + IRunCommand runCmd = TestHelper.createRunCommand(TestHelper.getConnectionString(), "-f=ut_documentation_reporter", "-o=output.txt"); List reporterOptionsList = runCmd.getReporterOptionsList(); @@ -45,7 +45,7 @@ void reporterOptions_OneReporter() { @Test void reporterOptions_OneReporterForceScreen() { - RunCommand runCmd = TestHelper.createRunCommand(TestHelper.getConnectionString(), "-f=ut_documentation_reporter", "-o=output.txt", "-s"); + IRunCommand runCmd = TestHelper.createRunCommand(TestHelper.getConnectionString(), "-f=ut_documentation_reporter", "-o=output.txt", "-s"); List reporterOptionsList = runCmd.getReporterOptionsList(); @@ -58,7 +58,7 @@ void reporterOptions_OneReporterForceScreen() { @Test void reporterOptions_OneReporterForceScreenInverse() { - RunCommand runCmd = TestHelper.createRunCommand(TestHelper.getConnectionString(), "-f=ut_documentation_reporter", "-s", "-o=output.txt"); + IRunCommand runCmd = TestHelper.createRunCommand(TestHelper.getConnectionString(), "-f=ut_documentation_reporter", "-s", "-o=output.txt"); List reporterOptionsList = runCmd.getReporterOptionsList(); @@ -71,7 +71,7 @@ void reporterOptions_OneReporterForceScreenInverse() { @Test void reporterOptions_TwoReporters() { - RunCommand runCmd = TestHelper.createRunCommand(TestHelper.getConnectionString(), + IRunCommand runCmd = TestHelper.createRunCommand(TestHelper.getConnectionString(), "-f=ut_documentation_reporter", "-f=ut_coverage_html_reporter", "-o=coverage.html", "-s"); @@ -90,17 +90,9 @@ void reporterOptions_TwoReporters() { assertTrue(reporterOptions2.outputToScreen()); } - @Test - void connectionString_asSysdba() { - RunCommand runCmd = TestHelper.createRunCommand("sys as sysdba/mypass@connectstring/service"); - - assertEquals("sys as sysdba/mypass@connectstring/service", - runCmd.getConnectionInfo().getConnectionString()); - } - @Test void randomOrder_default() { - RunCommand runCmd = TestHelper.createRunCommand(TestHelper.getConnectionString()); + IRunCommand runCmd = TestHelper.createRunCommand(TestHelper.getConnectionString()); TestRunnerOptions options = runCmd.newTestRunner(new ArrayList<>()).getOptions(); assertThat(options.randomTestOrder, equalTo(false)); @@ -109,7 +101,7 @@ void randomOrder_default() { @Test void randomOrder_withoutSeed() { - RunCommand runCmd = TestHelper.createRunCommand(TestHelper.getConnectionString(), + IRunCommand runCmd = TestHelper.createRunCommand(TestHelper.getConnectionString(), "-random"); TestRunnerOptions options = runCmd.newTestRunner(new ArrayList<>()).getOptions(); @@ -119,7 +111,7 @@ void randomOrder_withoutSeed() { @Test void randomOrder_withSeed() { - RunCommand runCmd = TestHelper.createRunCommand(TestHelper.getConnectionString(), + IRunCommand runCmd = TestHelper.createRunCommand(TestHelper.getConnectionString(), "-seed=42"); TestRunnerOptions options = runCmd.newTestRunner(new ArrayList<>()).getOptions(); diff --git a/src/test/java/org/utplsql/cli/TestHelper.java b/src/test/java/org/utplsql/cli/TestHelper.java index bf5874a..613e867 100644 --- a/src/test/java/org/utplsql/cli/TestHelper.java +++ b/src/test/java/org/utplsql/cli/TestHelper.java @@ -25,15 +25,29 @@ class TestHelper { sPass = EnvironmentVariableUtil.getEnvValue("DB_PASS", "app"); } + static RunPicocliCommand createPicocliRunCommand(String... args ) { + Object obj = new UtplsqlPicocliCommand(); + CommandLine cline = new CommandLine(obj); + cline.setTrimQuotes(true); + List parsed = cline.parse(args); + + return parsed.get(1).getCommand(); + } + static IRunCommand createRunCommand(String... args) { - RunCommand runCmd = new RunCommand(); + ArrayList newArgs = new ArrayList<>(args.length+1); + newArgs.add("run"); + newArgs.addAll(Arrays.asList(args)); + return createPicocliRunCommand(newArgs.toArray(new String[0])); + + /*RunCommand runCmd = new RunCommand(); JCommander.newBuilder() .addObject(runCmd) .args(args) .build(); - return runCmd; + return runCmd;*/ } static RunCommandConfig parseRunConfig(String... args ) throws Exception { From 00f3f5f232e344bf2dc7f859be7b12b63dacee61 Mon Sep 17 00:00:00 2001 From: pesse Date: Wed, 12 Jun 2019 17:57:28 +0200 Subject: [PATCH 11/31] Change VersionCommand to Picocli --- .../utplsql/cli/UtplsqlPicocliCommand.java | 5 +++- .../org/utplsql/cli/VersionInfoCommand.java | 30 ++++++------------- 2 files changed, 13 insertions(+), 22 deletions(-) diff --git a/src/main/java/org/utplsql/cli/UtplsqlPicocliCommand.java b/src/main/java/org/utplsql/cli/UtplsqlPicocliCommand.java index 891d4f0..a58367b 100644 --- a/src/main/java/org/utplsql/cli/UtplsqlPicocliCommand.java +++ b/src/main/java/org/utplsql/cli/UtplsqlPicocliCommand.java @@ -5,7 +5,10 @@ @CommandLine.Command( name = "utplsql", description = "utPLSQL cli", - subcommands = { RunPicocliCommand.class }) + subcommands = { + RunPicocliCommand.class, + VersionInfoCommand.class + }) public class UtplsqlPicocliCommand { } diff --git a/src/main/java/org/utplsql/cli/VersionInfoCommand.java b/src/main/java/org/utplsql/cli/VersionInfoCommand.java index cc636e4..37bb546 100644 --- a/src/main/java/org/utplsql/cli/VersionInfoCommand.java +++ b/src/main/java/org/utplsql/cli/VersionInfoCommand.java @@ -1,34 +1,22 @@ package org.utplsql.cli; -import com.beust.jcommander.Parameter; -import com.beust.jcommander.Parameters; import org.utplsql.api.JavaApiVersionInfo; import org.utplsql.api.Version; import org.utplsql.api.db.DefaultDatabaseInformation; import org.utplsql.api.exception.UtPLSQLNotInstalledException; +import picocli.CommandLine.Command; +import picocli.CommandLine.Parameters; import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; -@Parameters(separators = "=", commandDescription = "prints version information of cli, java-api and - if connection is given - database utPLSQL framework") +@Command( name = "info", description = "prints version information of cli, java-api and - if connection is given - database utPLSQL framework") public class VersionInfoCommand implements ICommand { - @Parameter( - converter = ConnectionInfo.ConnectionStringConverter.class, - variableArity = true, - description = ConnectionInfo.COMMANDLINE_PARAM_DESCRIPTION) - private List connectionInfoList = new ArrayList<>(); - - private ConnectionInfo getConnectionInfo() { - if ( connectionInfoList != null && connectionInfoList.size() > 0 ) - return connectionInfoList.get(0); - else - return null; - } + @Parameters(description = ConnectionInfo.COMMANDLINE_PARAM_DESCRIPTION, arity = "0..1") + private String connectionString; public int run() { @@ -36,7 +24,7 @@ public int run() { System.out.println(JavaApiVersionInfo.getInfo()); try { - writeUtPlsqlVersion(getConnectionInfo()); + writeUtPlsqlVersion(connectionString); } catch (SQLException e) { e.printStackTrace(); @@ -46,10 +34,10 @@ public int run() { return 0; } - private void writeUtPlsqlVersion( ConnectionInfo ci ) throws SQLException { - if ( ci != null ) { + private void writeUtPlsqlVersion( String connectString ) throws SQLException { + if ( connectString != null ) { - DataSource dataSource = DataSourceProvider.getDataSource(ci, 1); + DataSource dataSource = DataSourceProvider.getDataSource(connectString, 1); try (Connection con = dataSource.getConnection()) { Version v = new DefaultDatabaseInformation().getUtPlsqlFrameworkVersion(con); From 2ce4e91e0e31ed8917e9f696a89e5e0728b00bca Mon Sep 17 00:00:00 2001 From: pesse Date: Thu, 13 Jun 2019 09:58:22 +0200 Subject: [PATCH 12/31] Change ReportersCommand to Picocli --- .../org/utplsql/cli/ReportersCommand.java | 24 ++++--------------- .../utplsql/cli/UtplsqlPicocliCommand.java | 3 ++- 2 files changed, 7 insertions(+), 20 deletions(-) diff --git a/src/main/java/org/utplsql/cli/ReportersCommand.java b/src/main/java/org/utplsql/cli/ReportersCommand.java index 0c3560a..b35a42a 100644 --- a/src/main/java/org/utplsql/cli/ReportersCommand.java +++ b/src/main/java/org/utplsql/cli/ReportersCommand.java @@ -1,43 +1,29 @@ package org.utplsql.cli; -import com.beust.jcommander.Parameter; -import com.beust.jcommander.Parameters; import org.utplsql.api.exception.DatabaseNotCompatibleException; import org.utplsql.api.exception.UtPLSQLNotInstalledException; import org.utplsql.api.reporter.ReporterFactory; import org.utplsql.api.reporter.inspect.ReporterInfo; import org.utplsql.api.reporter.inspect.ReporterInspector; import org.utplsql.cli.exception.DatabaseConnectionFailed; +import picocli.CommandLine.*; import javax.sql.DataSource; import java.io.PrintStream; import java.sql.Connection; import java.util.*; -@Parameters(separators = "=", commandDescription = "prints a list of reporters available in the specified database") +@Command( name = "reporters", description = "prints a list of reporters available in the specified database") public class ReportersCommand implements ICommand { - @Parameter( - converter = ConnectionInfo.ConnectionStringConverter.class, - arity = 1, - description = ConnectionInfo.COMMANDLINE_PARAM_DESCRIPTION) - private List connectionInfoList = new ArrayList<>(); - - private ConnectionInfo getConnectionInfo() { - Objects.requireNonNull(connectionInfoList); - - if ( connectionInfoList.size() <= 0 - || connectionInfoList.get(0) == null) - throw new IllegalArgumentException("No Connection-Info given"); - - return connectionInfoList.get(0); - } + @Parameters(description = ConnectionInfo.COMMANDLINE_PARAM_DESCRIPTION, arity = "1") + private String connectionString; @Override public int run() { try { - DataSource ds = DataSourceProvider.getDataSource(getConnectionInfo(), 1); + DataSource ds = DataSourceProvider.getDataSource(connectionString, 1); try (Connection con = ds.getConnection()) { ReporterFactory reporterFactory = ReporterFactoryProvider.createReporterFactory(con); diff --git a/src/main/java/org/utplsql/cli/UtplsqlPicocliCommand.java b/src/main/java/org/utplsql/cli/UtplsqlPicocliCommand.java index a58367b..d96b83d 100644 --- a/src/main/java/org/utplsql/cli/UtplsqlPicocliCommand.java +++ b/src/main/java/org/utplsql/cli/UtplsqlPicocliCommand.java @@ -7,7 +7,8 @@ description = "utPLSQL cli", subcommands = { RunPicocliCommand.class, - VersionInfoCommand.class + VersionInfoCommand.class, + ReportersCommand.class }) public class UtplsqlPicocliCommand { From b88d5c5a07850271e219dcc6fab83b1f09c6a78f Mon Sep 17 00:00:00 2001 From: pesse Date: Thu, 13 Jun 2019 10:48:21 +0200 Subject: [PATCH 13/31] Fix arity for mapping options and prevent NPE --- .../org/utplsql/cli/RunPicocliCommand.java | 16 +++++++++------- .../org/utplsql/cli/PicocliRunCommandTest.java | 18 ++++++++++++++++++ 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/utplsql/cli/RunPicocliCommand.java b/src/main/java/org/utplsql/cli/RunPicocliCommand.java index eb7872e..516c1f6 100644 --- a/src/main/java/org/utplsql/cli/RunPicocliCommand.java +++ b/src/main/java/org/utplsql/cli/RunPicocliCommand.java @@ -108,6 +108,12 @@ static class Format { static class FileMappingComposite { + @ArgGroup(exclusive = true, multiplicity = "1") + TestOrSourcePath testOrSourcePath; + + @ArgGroup(exclusive = false, multiplicity = "0..1") + FileMapping mapping; + static class TestOrSourcePath { @Option(names="-source_path", required = true) String sourcePath; @@ -138,14 +144,10 @@ static class FileMapping { Integer nameSubExpression; } - @ArgGroup(exclusive = true, multiplicity = "1") - TestOrSourcePath testOrSourcePath; - - @ArgGroup(exclusive = false, multiplicity = "1") - FileMapping mapping; - - FileMapperConfig toFileMapperConfig() { + if ( mapping == null ) + mapping = new FileMapping(); + Map typeMap = new HashMap<>(); if ( mapping.typeMapping != null && !mapping.typeMapping.isEmpty()) { diff --git a/src/test/java/org/utplsql/cli/PicocliRunCommandTest.java b/src/test/java/org/utplsql/cli/PicocliRunCommandTest.java index af65592..353699a 100644 --- a/src/test/java/org/utplsql/cli/PicocliRunCommandTest.java +++ b/src/test/java/org/utplsql/cli/PicocliRunCommandTest.java @@ -1,5 +1,6 @@ package org.utplsql.cli; +import org.hamcrest.Matchers; import org.junit.jupiter.api.Test; import org.utplsql.cli.config.FileMapperConfig; import org.utplsql.cli.config.ReporterConfig; @@ -192,6 +193,7 @@ void sourceFileMapping() throws Exception { assertEquals( 1, sourceMapperConfig.getTypeSubexpression()); assertEquals( 3, sourceMapperConfig.getNameSubexpression()); } + @Test void testFileMapping() throws Exception { RunCommandConfig config = parseForConfig("run", @@ -214,4 +216,20 @@ void testFileMapping() throws Exception { assertEquals( 5, testMapperConfig.getTypeSubexpression()); assertEquals( 6, testMapperConfig.getNameSubexpression()); } + + @Test + void testFileMappingWithoutDetails() throws Exception { + RunCommandConfig config = parseForConfig("run", + TestHelper.getConnectionString(), + "-test_path=src/test/resources/plsql/test"); + + FileMapperConfig testMapperConfig = config.getTestMapping(); + assertEquals( "src/test/resources/plsql/test", testMapperConfig.getPath()); + assertNull( testMapperConfig.getOwner()); + assertNull( testMapperConfig.getRegexExpression()); + assertThat( testMapperConfig.getTypeMapping(), anEmptyMap()); + assertNull( testMapperConfig.getOwnerSubexpression()); + assertNull( testMapperConfig.getTypeSubexpression()); + assertNull( testMapperConfig.getNameSubexpression()); + } } From c80dc8c66800216558aef082e5f363ecddfda99a Mon Sep 17 00:00:00 2001 From: pesse Date: Thu, 13 Jun 2019 10:56:28 +0200 Subject: [PATCH 14/31] Refactor RunCommandTest to cover new approach No need for RunActionTest anymore --- .../utplsql/cli/PicocliRunCommandTest.java | 8 +- .../java/org/utplsql/cli/RunActionTest.java | 129 ------------------ .../java/org/utplsql/cli/RunCommandTest.java | 6 +- 3 files changed, 4 insertions(+), 139 deletions(-) delete mode 100644 src/test/java/org/utplsql/cli/RunActionTest.java diff --git a/src/test/java/org/utplsql/cli/PicocliRunCommandTest.java b/src/test/java/org/utplsql/cli/PicocliRunCommandTest.java index 353699a..caed33c 100644 --- a/src/test/java/org/utplsql/cli/PicocliRunCommandTest.java +++ b/src/test/java/org/utplsql/cli/PicocliRunCommandTest.java @@ -16,13 +16,7 @@ public class PicocliRunCommandTest { private RunCommandConfig parseForConfig( String... args ) throws Exception { - Object obj = new UtplsqlPicocliCommand(); - CommandLine cline = new CommandLine(obj); - cline.setTrimQuotes(true); - List parsed = cline.parse(args); - - RunPicocliCommand runCmd = parsed.get(1).getCommand(); - return runCmd.getRunCommandConfig(); + return TestHelper.parseRunConfig(args); } @Test diff --git a/src/test/java/org/utplsql/cli/RunActionTest.java b/src/test/java/org/utplsql/cli/RunActionTest.java deleted file mode 100644 index 6c63ae5..0000000 --- a/src/test/java/org/utplsql/cli/RunActionTest.java +++ /dev/null @@ -1,129 +0,0 @@ -package org.utplsql.cli; - -import org.junit.jupiter.api.Test; -import org.utplsql.api.TestRunnerOptions; -import org.utplsql.api.reporter.CoreReporters; - -import java.util.ArrayList; -import java.util.List; - -import static org.hamcrest.CoreMatchers.equalTo; -import static org.hamcrest.CoreMatchers.nullValue; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.jupiter.api.Assertions.*; - -/** - * Unit test for run command. - */ -class RunActionTest { - - @Test - void reporterOptions_Default() throws Exception { - RunAction runCmd = TestHelper.createRunAction(TestHelper.getConnectionString()); - - List reporterOptionsList = runCmd.getReporterOptionsList(); - - ReporterOptions reporterOptions1 = reporterOptionsList.get(0); - assertEquals(CoreReporters.UT_DOCUMENTATION_REPORTER.name(), reporterOptions1.getReporterName()); - assertNull(reporterOptions1.getOutputFileName()); - assertFalse(reporterOptions1.outputToFile()); - assertTrue(reporterOptions1.outputToScreen()); - } - - @Test - void reporterOptions_OneReporter() throws Exception { - RunAction runCmd = TestHelper.createRunAction(TestHelper.getConnectionString(), "-f=ut_documentation_reporter", "-o=output.txt"); - - List reporterOptionsList = runCmd.getReporterOptionsList(); - - ReporterOptions reporterOptions1 = reporterOptionsList.get(0); - assertEquals(CoreReporters.UT_DOCUMENTATION_REPORTER.name(), reporterOptions1.getReporterName()); - assertEquals(reporterOptions1.getOutputFileName(), "output.txt"); - assertTrue(reporterOptions1.outputToFile()); - assertFalse(reporterOptions1.outputToScreen()); - } - - @Test - void reporterOptions_OneReporterForceScreen() throws Exception { - RunAction runCmd = TestHelper.createRunAction(TestHelper.getConnectionString(), "-f=ut_documentation_reporter", "-o=output.txt", "-s"); - - List reporterOptionsList = runCmd.getReporterOptionsList(); - - ReporterOptions reporterOptions1 = reporterOptionsList.get(0); - assertEquals(CoreReporters.UT_DOCUMENTATION_REPORTER.name(), reporterOptions1.getReporterName()); - assertEquals(reporterOptions1.getOutputFileName(), "output.txt"); - assertTrue(reporterOptions1.outputToFile()); - assertTrue(reporterOptions1.outputToScreen()); - } - - @Test - void reporterOptions_OneReporterForceScreenInverse() throws Exception { - RunAction runCmd = TestHelper.createRunAction(TestHelper.getConnectionString(), "-f=ut_documentation_reporter", "-s", "-o=output.txt"); - - List reporterOptionsList = runCmd.getReporterOptionsList(); - - ReporterOptions reporterOptions1 = reporterOptionsList.get(0); - assertEquals(CoreReporters.UT_DOCUMENTATION_REPORTER.name(), reporterOptions1.getReporterName()); - assertEquals(reporterOptions1.getOutputFileName(), "output.txt"); - assertTrue(reporterOptions1.outputToFile()); - assertTrue(reporterOptions1.outputToScreen()); - } - - @Test - void reporterOptions_TwoReporters() throws Exception { - RunAction runCmd = TestHelper.createRunAction(TestHelper.getConnectionString(), - "-f=ut_documentation_reporter", - "-f=ut_coverage_html_reporter", "-o=coverage.html", "-s"); - - List reporterOptionsList = runCmd.getReporterOptionsList(); - - ReporterOptions reporterOptions1 = reporterOptionsList.get(0); - assertEquals(CoreReporters.UT_DOCUMENTATION_REPORTER.name(), reporterOptions1.getReporterName()); - assertNull(reporterOptions1.getOutputFileName()); - assertFalse(reporterOptions1.outputToFile()); - assertFalse(reporterOptions1.outputToScreen()); - - ReporterOptions reporterOptions2 = reporterOptionsList.get(1); - assertEquals(CoreReporters.UT_COVERAGE_HTML_REPORTER.name(), reporterOptions2.getReporterName()); - assertEquals(reporterOptions2.getOutputFileName(), "coverage.html"); - assertTrue(reporterOptions2.outputToFile()); - assertTrue(reporterOptions2.outputToScreen()); - } - - @Test - void connectionString_asSysdba() throws Exception { - RunAction runCmd = TestHelper.createRunAction("sys as sysdba/mypass@connectstring/service"); - - assertEquals("sys as sysdba/mypass@connectstring/service", - runCmd.getConfig().getConnectString()); - } - - @Test - void randomOrder_default() throws Exception { - RunAction runCmd = TestHelper.createRunAction(TestHelper.getConnectionString()); - - TestRunnerOptions options = runCmd.newTestRunner(new ArrayList<>()).getOptions(); - assertThat(options.randomTestOrder, equalTo(false)); - assertThat(options.randomTestOrderSeed, nullValue()); - } - - @Test - void randomOrder_withoutSeed() throws Exception { - RunAction runCmd = TestHelper.createRunAction(TestHelper.getConnectionString(), - "-r"); - - TestRunnerOptions options = runCmd.newTestRunner(new ArrayList<>()).getOptions(); - assertThat(options.randomTestOrder, equalTo(true)); - assertThat(options.randomTestOrderSeed, nullValue()); - } - - @Test - void randomOrder_withSeed() throws Exception { - RunAction runCmd = TestHelper.createRunAction(TestHelper.getConnectionString(), - "-seed=42"); - - TestRunnerOptions options = runCmd.newTestRunner(new ArrayList<>()).getOptions(); - assertThat(options.randomTestOrder, equalTo(true)); - assertThat(options.randomTestOrderSeed, equalTo(42)); - } -} diff --git a/src/test/java/org/utplsql/cli/RunCommandTest.java b/src/test/java/org/utplsql/cli/RunCommandTest.java index 4035cf2..c255f1d 100644 --- a/src/test/java/org/utplsql/cli/RunCommandTest.java +++ b/src/test/java/org/utplsql/cli/RunCommandTest.java @@ -81,7 +81,7 @@ void reporterOptions_TwoReporters() { assertEquals(CoreReporters.UT_DOCUMENTATION_REPORTER.name(), reporterOptions1.getReporterName()); assertNull(reporterOptions1.getOutputFileName()); assertFalse(reporterOptions1.outputToFile()); - assertTrue(reporterOptions1.outputToScreen()); + assertFalse(reporterOptions1.outputToScreen()); ReporterOptions reporterOptions2 = reporterOptionsList.get(1); assertEquals(CoreReporters.UT_COVERAGE_HTML_REPORTER.name(), reporterOptions2.getReporterName()); @@ -91,7 +91,7 @@ void reporterOptions_TwoReporters() { } @Test - void randomOrder_default() { + void randomOrder_default() throws Exception { IRunCommand runCmd = TestHelper.createRunCommand(TestHelper.getConnectionString()); TestRunnerOptions options = runCmd.newTestRunner(new ArrayList<>()).getOptions(); @@ -102,7 +102,7 @@ void randomOrder_default() { @Test void randomOrder_withoutSeed() { IRunCommand runCmd = TestHelper.createRunCommand(TestHelper.getConnectionString(), - "-random"); + "-r"); TestRunnerOptions options = runCmd.newTestRunner(new ArrayList<>()).getOptions(); assertThat(options.randomTestOrder, equalTo(true)); From 8eec2cbdf50597f0f5cf0bc3dfc75a84a5444e39 Mon Sep 17 00:00:00 2001 From: pesse Date: Thu, 13 Jun 2019 16:32:53 +0200 Subject: [PATCH 15/31] Implement rules for printToScreen Reporters: Only one can go to screen --- .../java/org/utplsql/cli/ReporterOptions.java | 6 +- src/main/java/org/utplsql/cli/RunAction.java | 14 +- .../utplsql/cli/config/ReporterConfig.java | 12 +- .../utplsql/cli/PicocliRunCommandTest.java | 10 +- .../java/org/utplsql/cli/RunCommandTest.java | 251 +++++++++++++----- 5 files changed, 201 insertions(+), 92 deletions(-) diff --git a/src/main/java/org/utplsql/cli/ReporterOptions.java b/src/main/java/org/utplsql/cli/ReporterOptions.java index a20ae3d..c64bfbe 100644 --- a/src/main/java/org/utplsql/cli/ReporterOptions.java +++ b/src/main/java/org/utplsql/cli/ReporterOptions.java @@ -14,15 +14,15 @@ public class ReporterOptions { private Reporter reporterObj = null; - public ReporterOptions(String reporterName, String outputFileName, boolean outputToScreen) { + public ReporterOptions(String reporterName, String outputFileName ) { setReporterName(reporterName); setOutputFileName(outputFileName); - this.outputToScreen = outputToScreen; + this.outputToScreen = (outputFileName == null); // If outputFileName is null we assume it should be sent to screen this.forceOutputToScreen = false; } public ReporterOptions(String reporterName) { - this(reporterName, null, true); + this(reporterName, null); } public Reporter getReporterObj() { diff --git a/src/main/java/org/utplsql/cli/RunAction.java b/src/main/java/org/utplsql/cli/RunAction.java index 352493e..9ebabd0 100644 --- a/src/main/java/org/utplsql/cli/RunAction.java +++ b/src/main/java/org/utplsql/cli/RunAction.java @@ -1,7 +1,5 @@ package org.utplsql.cli; -import com.beust.jcommander.Parameter; -import com.beust.jcommander.Parameters; import com.zaxxer.hikari.HikariDataSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -23,7 +21,6 @@ import org.utplsql.cli.log.StringBlockFormatter; import javax.sql.DataSource; -import javax.xml.crypto.dsig.keyinfo.KeyValue; import java.io.File; import java.sql.Connection; import java.sql.SQLException; @@ -280,11 +277,18 @@ private ReporterManager getReporterManager() { ReporterConfig[] reporterConfigs = config.getReporters(); if ( reporterConfigs != null ) { ReporterOptions[] options = new ReporterOptions[reporterConfigs.length]; + boolean printToScreen = false; for (int i = 0; i reporterOptionsList = runCmd.getReporterOptionsList(); - - ReporterOptions reporterOptions1 = reporterOptionsList.get(0); - assertEquals(CoreReporters.UT_DOCUMENTATION_REPORTER.name(), reporterOptions1.getReporterName()); - assertNull(reporterOptions1.getOutputFileName()); - assertFalse(reporterOptions1.outputToFile()); - assertTrue(reporterOptions1.outputToScreen()); - } - - @Test - void reporterOptions_OneReporter() { - IRunCommand runCmd = TestHelper.createRunCommand(TestHelper.getConnectionString(), "-f=ut_documentation_reporter", "-o=output.txt"); - - List reporterOptionsList = runCmd.getReporterOptionsList(); - - ReporterOptions reporterOptions1 = reporterOptionsList.get(0); - assertEquals(CoreReporters.UT_DOCUMENTATION_REPORTER.name(), reporterOptions1.getReporterName()); - assertEquals(reporterOptions1.getOutputFileName(), "output.txt"); - assertTrue(reporterOptions1.outputToFile()); - assertFalse(reporterOptions1.outputToScreen()); - } - - @Test - void reporterOptions_OneReporterForceScreen() { - IRunCommand runCmd = TestHelper.createRunCommand(TestHelper.getConnectionString(), "-f=ut_documentation_reporter", "-o=output.txt", "-s"); - - List reporterOptionsList = runCmd.getReporterOptionsList(); - - ReporterOptions reporterOptions1 = reporterOptionsList.get(0); - assertEquals(CoreReporters.UT_DOCUMENTATION_REPORTER.name(), reporterOptions1.getReporterName()); - assertEquals(reporterOptions1.getOutputFileName(), "output.txt"); - assertTrue(reporterOptions1.outputToFile()); - assertTrue(reporterOptions1.outputToScreen()); - } - - @Test - void reporterOptions_OneReporterForceScreenInverse() { - IRunCommand runCmd = TestHelper.createRunCommand(TestHelper.getConnectionString(), "-f=ut_documentation_reporter", "-s", "-o=output.txt"); - - List reporterOptionsList = runCmd.getReporterOptionsList(); - - ReporterOptions reporterOptions1 = reporterOptionsList.get(0); - assertEquals(CoreReporters.UT_DOCUMENTATION_REPORTER.name(), reporterOptions1.getReporterName()); - assertEquals(reporterOptions1.getOutputFileName(), "output.txt"); - assertTrue(reporterOptions1.outputToFile()); - assertTrue(reporterOptions1.outputToScreen()); - } - - @Test - void reporterOptions_TwoReporters() { - IRunCommand runCmd = TestHelper.createRunCommand(TestHelper.getConnectionString(), - "-f=ut_documentation_reporter", - "-f=ut_coverage_html_reporter", "-o=coverage.html", "-s"); - - List reporterOptionsList = runCmd.getReporterOptionsList(); - - ReporterOptions reporterOptions1 = reporterOptionsList.get(0); - assertEquals(CoreReporters.UT_DOCUMENTATION_REPORTER.name(), reporterOptions1.getReporterName()); - assertNull(reporterOptions1.getOutputFileName()); - assertFalse(reporterOptions1.outputToFile()); - assertFalse(reporterOptions1.outputToScreen()); - - ReporterOptions reporterOptions2 = reporterOptionsList.get(1); - assertEquals(CoreReporters.UT_COVERAGE_HTML_REPORTER.name(), reporterOptions2.getReporterName()); - assertEquals(reporterOptions2.getOutputFileName(), "coverage.html"); - assertTrue(reporterOptions2.outputToFile()); - assertTrue(reporterOptions2.outputToScreen()); + @Nested + class A_reporter { + + List getReporterOptionsWithArgs(String... args) { + ArrayList newArgs = new ArrayList<>(args.length + 1); + newArgs.add(TestHelper.getConnectionString()); + newArgs.addAll(Arrays.asList(args)); + IRunCommand cmd = TestHelper.createRunCommand(newArgs.toArray(new String[0])); + return cmd.getReporterOptionsList(); + } + + @Nested + class Is_output_to_screen { + + @Test + void by_default() { + List options = getReporterOptionsWithArgs(); + + assertTrue(options.get(0).outputToScreen()); + } + + @Test + void when_only_reporter_without_output_specified() { + List options = getReporterOptionsWithArgs("-f=ut_documentation_reporter"); + + assertTrue(options.get(0).outputToScreen()); + } + + @Test + void when_without_output_and_no_other_reporter_has_forceToScreen_flag() { + List options = getReporterOptionsWithArgs( + "-f=ut_coverage_sonar_reporter", "-o=output.txt", + "-f=ut_coverage_html_reporter"); + + assertTrue(options.get(1).outputToScreen()); + } + + @Test + void when_only_reporter_with_forceToScreen_flag() { + List options = getReporterOptionsWithArgs( + "-f=ut_coverage_sonar_reporter", "-o=output.txt", + "-f=ut_coverage_html_reporter", "-o=output.html", "-s", + "-f=ut_coverage_cobertura_reporter", "-o=cobertura.html"); + + assertTrue(options.get(1).outputToScreen()); + } + } + + @Nested + class Is_not_output_to_screen { + + @Test + void when_it_has_output_specified_but_no_forceToScreen() { + List options = getReporterOptionsWithArgs( + "-f=ut_documentation_reporter", "-o=output.txt", + "-f=ut_coverage_html_reporter", "-o=output.html" + ); + + assertFalse(options.get(0).outputToScreen()); + assertFalse(options.get(1).outputToScreen()); + } + } + + @Nested + class Cannot_be_run { + + @Test + void when_more_than_one_forceToScreen_flags() { + assertThrows(IllegalArgumentException.class, () -> { + getReporterOptionsWithArgs( + "-f=ut_coverage_sonar_reporter", "-o=output.txt", "-s", + "-f=ut_coverage_html_reporter", "-o=output.html", "-s"); + }); + } + + @Test + void when_more_than_one_reporters_without_output() { + assertThrows(IllegalArgumentException.class, () -> { + getReporterOptionsWithArgs( + "-f=ut_coverage_sonar_reporter", + "-f=ut_coverage_html_reporter"); + }); + } + @Test + void when_one_reporter_without_output_and_one_with_forceToScreen() { + assertThrows(IllegalArgumentException.class, () -> { + getReporterOptionsWithArgs( + "-f=ut_coverage_sonar_reporter", + "-f=ut_coverage_html_reporter", "-o=output.html", "-s"); + }); + } + } + + @Test + void reporterOptions_Default() { + IRunCommand runCmd = TestHelper.createRunCommand(TestHelper.getConnectionString()); + + List reporterOptionsList = runCmd.getReporterOptionsList(); + + ReporterOptions reporterOptions1 = reporterOptionsList.get(0); + assertEquals(CoreReporters.UT_DOCUMENTATION_REPORTER.name(), reporterOptions1.getReporterName()); + assertNull(reporterOptions1.getOutputFileName()); + assertFalse(reporterOptions1.outputToFile()); + assertTrue(reporterOptions1.outputToScreen()); + } + + @Test + void reporterOptions_OneReporter() { + IRunCommand runCmd = TestHelper.createRunCommand(TestHelper.getConnectionString(), "-f=ut_documentation_reporter", "-o=output.txt"); + + List reporterOptionsList = runCmd.getReporterOptionsList(); + + ReporterOptions reporterOptions1 = reporterOptionsList.get(0); + assertEquals(CoreReporters.UT_DOCUMENTATION_REPORTER.name(), reporterOptions1.getReporterName()); + assertEquals("output.txt", reporterOptions1.getOutputFileName()); + assertTrue(reporterOptions1.outputToFile()); + assertFalse(reporterOptions1.outputToScreen()); + } + + @Test + void reporterOptions_OneReporter_DefaultToScreen() { + IRunCommand runCmd = TestHelper.createRunCommand(TestHelper.getConnectionString(), "-f=ut_documentation_reporter"); + + List reporterOptionsList = runCmd.getReporterOptionsList(); + + ReporterOptions reporterOptions1 = reporterOptionsList.get(0); + assertEquals(CoreReporters.UT_DOCUMENTATION_REPORTER.name(), reporterOptions1.getReporterName()); + assertNull(reporterOptions1.getOutputFileName()); + assertFalse(reporterOptions1.outputToFile()); + assertTrue(reporterOptions1.outputToScreen()); + } + + @Test + void reporterOptions_OneReporterForceScreen() { + IRunCommand runCmd = TestHelper.createRunCommand(TestHelper.getConnectionString(), "-f=ut_documentation_reporter", "-o=output.txt", "-s"); + + List reporterOptionsList = runCmd.getReporterOptionsList(); + + ReporterOptions reporterOptions1 = reporterOptionsList.get(0); + assertEquals(CoreReporters.UT_DOCUMENTATION_REPORTER.name(), reporterOptions1.getReporterName()); + assertEquals("output.txt", reporterOptions1.getOutputFileName()); + assertTrue(reporterOptions1.outputToFile()); + assertTrue(reporterOptions1.outputToScreen()); + } + + @Test + void reporterOptions_OneReporterForceScreenInverse() { + IRunCommand runCmd = TestHelper.createRunCommand(TestHelper.getConnectionString(), "-f=ut_documentation_reporter", "-s", "-o=output.txt"); + + List reporterOptionsList = runCmd.getReporterOptionsList(); + + ReporterOptions reporterOptions1 = reporterOptionsList.get(0); + assertEquals(CoreReporters.UT_DOCUMENTATION_REPORTER.name(), reporterOptions1.getReporterName()); + assertEquals("output.txt", reporterOptions1.getOutputFileName()); + assertTrue(reporterOptions1.outputToFile()); + assertTrue(reporterOptions1.outputToScreen()); + } + + @Test + void reporterOptions_TwoReporters() { + IRunCommand runCmd = TestHelper.createRunCommand(TestHelper.getConnectionString(), + "-f=ut_documentation_reporter", "-o=output.txt", + "-f=ut_coverage_html_reporter", "-o=coverage.html", "-s"); + + List reporterOptionsList = runCmd.getReporterOptionsList(); + + ReporterOptions reporterOptions1 = reporterOptionsList.get(0); + assertEquals(CoreReporters.UT_DOCUMENTATION_REPORTER.name(), reporterOptions1.getReporterName()); + assertEquals("output.txt", reporterOptions1.getOutputFileName()); + assertTrue(reporterOptions1.outputToFile()); + assertFalse(reporterOptions1.outputToScreen()); + + ReporterOptions reporterOptions2 = reporterOptionsList.get(1); + assertEquals(CoreReporters.UT_COVERAGE_HTML_REPORTER.name(), reporterOptions2.getReporterName()); + assertEquals("coverage.html", reporterOptions2.getOutputFileName()); + assertTrue(reporterOptions2.outputToFile()); + assertTrue(reporterOptions2.outputToScreen()); + } } @Test From ded39d3e7e9b3847a7fd285a32ef8e698bcb704f Mon Sep 17 00:00:00 2001 From: pesse Date: Thu, 13 Jun 2019 16:54:39 +0200 Subject: [PATCH 16/31] Implemented new Picocli help --- src/main/java/org/utplsql/cli/Cli.java | 24 ++++++++++++++++--- .../org/utplsql/cli/RunPicocliCommand.java | 3 +++ .../utplsql/cli/UtplsqlPicocliCommand.java | 3 +++ .../java/org/utplsql/cli/HelpCommandTest.java | 11 +++++++++ 4 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/utplsql/cli/Cli.java b/src/main/java/org/utplsql/cli/Cli.java index b025dde..fc5ead3 100644 --- a/src/main/java/org/utplsql/cli/Cli.java +++ b/src/main/java/org/utplsql/cli/Cli.java @@ -14,7 +14,7 @@ public class Cli { public static void main(String[] args) { - int exitCode = runWithExitCode(args); + int exitCode = runPicocliWithExitCode(args); System.exit(exitCode); } @@ -67,15 +67,33 @@ static int runPicocliWithExitCode( String[] args ) { List parsedLines = commandLine.parse(args); + boolean commandWasRun = false; for ( CommandLine parsedLine : parsedLines ) { + if (parsedLine.isUsageHelpRequested()) { + parsedLine.usage(System.out); + return 0; + } + else if (parsedLine.isVersionHelpRequested()) { + parsedLine.printVersionHelp(System.out); + return 0; + } + Object command = parsedLine.getCommand(); if ( command instanceof ICommand ) { exitCode = ((ICommand)command).run(); + commandWasRun = true; break; } } - } catch (ParameterException e) { - e.printStackTrace(); + + if ( !commandWasRun ) { + commandLine.usage(System.out); + } + } catch (CommandLine.ParameterException e) { + System.err.println(e.getMessage()); + if (!CommandLine.UnmatchedArgumentException.printSuggestions(e, System.err)) { + e.getCommandLine().usage(System.err); + } } catch (Exception e) { e.printStackTrace(); } diff --git a/src/main/java/org/utplsql/cli/RunPicocliCommand.java b/src/main/java/org/utplsql/cli/RunPicocliCommand.java index 516c1f6..59b7f41 100644 --- a/src/main/java/org/utplsql/cli/RunPicocliCommand.java +++ b/src/main/java/org/utplsql/cli/RunPicocliCommand.java @@ -169,6 +169,9 @@ FileMapperConfig toFileMapperConfig() { } } + @Option(names = "-h", usageHelp = true, description = "display this help and exit") + boolean help; + private RunAction runAction; private String[] splitOrEmpty(String value) { diff --git a/src/main/java/org/utplsql/cli/UtplsqlPicocliCommand.java b/src/main/java/org/utplsql/cli/UtplsqlPicocliCommand.java index d96b83d..cb6a5d6 100644 --- a/src/main/java/org/utplsql/cli/UtplsqlPicocliCommand.java +++ b/src/main/java/org/utplsql/cli/UtplsqlPicocliCommand.java @@ -12,4 +12,7 @@ }) public class UtplsqlPicocliCommand { + @CommandLine.Option(names = "-h", usageHelp = true, description = "display this help and exit") + boolean help; + } diff --git a/src/test/java/org/utplsql/cli/HelpCommandTest.java b/src/test/java/org/utplsql/cli/HelpCommandTest.java index a22928f..689560c 100644 --- a/src/test/java/org/utplsql/cli/HelpCommandTest.java +++ b/src/test/java/org/utplsql/cli/HelpCommandTest.java @@ -31,6 +31,17 @@ void callHelp() { assertTrue(output.contains("Usage:")); } + @Test + void callRunHelp() { + + capturer.start(); + int result = TestHelper.runApp("run", "-h"); + String output = capturer.stop(); + + assertEquals(0, result); + assertTrue(output.contains("Usage:")); + } + @Test void callWithNoArgs() { From 6922e5256d4b03d55bcbca09c3b64343017e50b2 Mon Sep 17 00:00:00 2001 From: pesse Date: Thu, 13 Jun 2019 16:57:50 +0200 Subject: [PATCH 17/31] Removed some now unnecessary stuff --- src/main/java/org/utplsql/cli/Cli.java | 38 ---------------- .../java/org/utplsql/cli/CommandProvider.java | 40 ----------------- .../java/org/utplsql/cli/HelpCommand.java | 43 ------------------- .../java/org/utplsql/cli/TestRunnerTask.java | 24 ----------- 4 files changed, 145 deletions(-) delete mode 100644 src/main/java/org/utplsql/cli/CommandProvider.java delete mode 100644 src/main/java/org/utplsql/cli/HelpCommand.java delete mode 100644 src/main/java/org/utplsql/cli/TestRunnerTask.java diff --git a/src/main/java/org/utplsql/cli/Cli.java b/src/main/java/org/utplsql/cli/Cli.java index fc5ead3..88ea12e 100644 --- a/src/main/java/org/utplsql/cli/Cli.java +++ b/src/main/java/org/utplsql/cli/Cli.java @@ -1,7 +1,5 @@ package org.utplsql.cli; -import com.beust.jcommander.JCommander; -import com.beust.jcommander.ParameterException; import picocli.CommandLine; import java.util.List; @@ -10,8 +8,6 @@ public class Cli { static final int DEFAULT_ERROR_CODE = 1; - static final String HELP_CMD = "-h"; - public static void main(String[] args) { int exitCode = runPicocliWithExitCode(args); @@ -19,40 +15,6 @@ public static void main(String[] args) { System.exit(exitCode); } - static int runWithExitCode( String[] args ) { - - LoggerConfiguration.configure(LoggerConfiguration.ConfigLevel.NONE); - LocaleInitializer.initLocale(); - - JCommander jc = new JCommander(); - jc.setProgramName("utplsql"); - - CommandProvider cmdProvider = new CommandProvider(jc); - - cmdProvider.commands().forEach(cmd -> jc.addCommand(cmd.getCommand(), cmd)); - - int exitCode = DEFAULT_ERROR_CODE; - - if ( args.length >= 1 && args[0].equals("-h") ) // Help? - { - exitCode = 0; - jc.usage(); - } - else { - try { - jc.parse(args); - - exitCode = cmdProvider.getCommand(jc.getParsedCommand()).run(); - - } catch (ParameterException e) { - exitCode = new HelpCommand(jc, e.getMessage()).run(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - return exitCode; - } static int runPicocliWithExitCode( String[] args ) { LoggerConfiguration.configure(LoggerConfiguration.ConfigLevel.NONE); diff --git a/src/main/java/org/utplsql/cli/CommandProvider.java b/src/main/java/org/utplsql/cli/CommandProvider.java deleted file mode 100644 index 2a03fd8..0000000 --- a/src/main/java/org/utplsql/cli/CommandProvider.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.utplsql.cli; - -import com.beust.jcommander.JCommander; - -import java.util.HashMap; -import java.util.Map; -import java.util.stream.Stream; - -class CommandProvider { - - private final Map commands = new HashMap<>(); - private final JCommander jCommander; - - public CommandProvider( JCommander jCommander ) { - this.jCommander = jCommander; - init(); - } - - private void init() { - addCommand(new RunCommand()); - addCommand(new VersionInfoCommand()); - addCommand(new ReportersCommand()); - addCommand(new HelpCommand(jCommander)); - } - - private void addCommand( ICommand command ) { - commands.put(command.getCommand().toLowerCase(), command); - } - - public ICommand getCommand( String key ) { - if ( commands.containsKey(key)) - return commands.get(key.toLowerCase()); - else - return new HelpCommand(jCommander, "Unknown command: '" + key + "'"); - } - - public Stream commands() { - return commands.values().stream(); - } -} diff --git a/src/main/java/org/utplsql/cli/HelpCommand.java b/src/main/java/org/utplsql/cli/HelpCommand.java deleted file mode 100644 index 0925694..0000000 --- a/src/main/java/org/utplsql/cli/HelpCommand.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.utplsql.cli; - -import com.beust.jcommander.JCommander; - -/** Simple Help-Command which outputs an (optional) error message and the command line usage - * @author pesse - */ -public class HelpCommand implements ICommand { - - private final String errorMessage; - private final JCommander jCommander; - - public HelpCommand(JCommander jCommander) { - this.jCommander = jCommander; - this.errorMessage = null; - } - - public HelpCommand( JCommander jCommander, String errorMessage ) { - this.jCommander = jCommander; - this.errorMessage = errorMessage; - } - - @Override - public int run() { - if ( errorMessage != null ) { - System.out.println(errorMessage); - if (jCommander.getParsedCommand() != null) - jCommander.usage(jCommander.getParsedCommand()); - else - jCommander.usage(); - return 1; - } - else { - jCommander.usage(); - return 0; - } - } - - @Override - public String getCommand() { - return "-h"; - } -} diff --git a/src/main/java/org/utplsql/cli/TestRunnerTask.java b/src/main/java/org/utplsql/cli/TestRunnerTask.java deleted file mode 100644 index 4b18f1f..0000000 --- a/src/main/java/org/utplsql/cli/TestRunnerTask.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.utplsql.cli; - -import org.utplsql.api.TestRunner; - -import java.sql.Connection; -import java.util.concurrent.ExecutorService; - -class TestRunnerTask implements Runnable { - - private Connection con; - private TestRunner testRunner; - private ExecutorService executorService; - - TestRunnerTask(Connection con, TestRunner testRunner, ExecutorService executorService ) { - this.con = con; - this.testRunner = testRunner; - this.executorService = executorService; - } - - @Override - public void run() { - - } -} From 5aa4c1d515c5968b78c61e38cccb2aea5f79d8de Mon Sep 17 00:00:00 2001 From: pesse Date: Thu, 13 Jun 2019 17:16:55 +0200 Subject: [PATCH 18/31] We don't need the old RunCommand anymore, time to get rid of it --- src/main/java/org/utplsql/cli/RunCommand.java | 445 ------------------ src/test/java/org/utplsql/cli/TestHelper.java | 10 - 2 files changed, 455 deletions(-) delete mode 100644 src/main/java/org/utplsql/cli/RunCommand.java diff --git a/src/main/java/org/utplsql/cli/RunCommand.java b/src/main/java/org/utplsql/cli/RunCommand.java deleted file mode 100644 index 7a973df..0000000 --- a/src/main/java/org/utplsql/cli/RunCommand.java +++ /dev/null @@ -1,445 +0,0 @@ -package org.utplsql.cli; - -import com.beust.jcommander.Parameter; -import com.beust.jcommander.Parameters; -import com.zaxxer.hikari.HikariDataSource; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.utplsql.api.*; -import org.utplsql.api.compatibility.CompatibilityProxy; -import org.utplsql.api.compatibility.OptionalFeatures; -import org.utplsql.api.db.DefaultDatabaseInformation; -import org.utplsql.api.exception.DatabaseNotCompatibleException; -import org.utplsql.api.exception.OracleCreateStatmenetStuckException; -import org.utplsql.api.exception.SomeTestsFailedException; -import org.utplsql.api.exception.UtPLSQLNotInstalledException; -import org.utplsql.api.reporter.Reporter; -import org.utplsql.api.reporter.ReporterFactory; -import org.utplsql.cli.exception.DatabaseConnectionFailed; -import org.utplsql.cli.exception.ReporterTimeoutException; -import org.utplsql.cli.log.StringBlockFormatter; - -import javax.sql.DataSource; -import java.io.File; -import java.sql.Connection; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.*; - -/** - * Issues a Run-Command with all the options - * - * Uses an executor to start a RunTestRunnerTask and one ReporterGatheringTask per Reporter requested. - * - * @author vinicious moreira - * @author pesse - */ -@Parameters(separators = "=", commandDescription = "run tests") -public class RunCommand implements ICommand, IRunCommand { - - private static final Logger logger = LoggerFactory.getLogger(RunCommand.class); - - @Parameter( - required = true, - converter = ConnectionInfo.ConnectionStringConverter.class, - arity = 1, - description = ConnectionInfo.COMMANDLINE_PARAM_DESCRIPTION) - private List connectionInfoList = new ArrayList<>(); - - @Parameter( - names = {"-p", "--path"}, - description = "run suites/tests by path, format: " + - "-p=[schema|schema:[suite ...][.test]|schema[.suite ...][.test]") - private List testPaths = new ArrayList<>(); - - @Parameter( - names = {"-f", "--format"}, - variableArity = true, - description = "-f=reporter_name [-o=output_file [-s]] - enables specified format reporting to specified " + - "output file (-o) and to screen (-s)") - private List reporterParams = new ArrayList<>(); - - @Parameter( - names = {"-c", "--color"}, - description = "enables printing of test results in colors as defined by ANSICONSOLE standards") - private boolean colorConsole = false; - - @Parameter( - names = {"--failure-exit-code"}, - description = "override the exit code on failure, default = 1") - private int failureExitCode = 1; - - @Parameter( - names = {"-source_path"}, - variableArity = true, - description = "-source_path [-owner=\"owner\" -regex_expression=\"pattern\" " + - "-type_mapping=\"matched_string=TYPE/matched_string=TYPE\" " + - "-owner_subexpression=0 -type_subexpression=0 -name_subexpression=0] - path to project source files") - private List sourcePathParams = new ArrayList<>(); - - @Parameter( - names = {"-test_path"}, - variableArity = true, - description = "-test_path [-regex_expression=\"pattern\" -owner_subexpression=0 -type_subexpression=0 " + - "-name_subexpression=0] - path to project test files") - private List testPathParams = new ArrayList<>(); - - @Parameter( - names = {"-scc", "--skip-compatibility-check"}, - description = "Skips the check for compatibility with database framework. CLI expects the framework to be " + - "most actual. Use this if you use CLI with a development version of utPLSQL-framework") - private boolean skipCompatibilityCheck = false; - - @Parameter( - names = {"-include"}, - description = "Comma-separated object list to include in the coverage report. " + - "Format: [schema.]package[,[schema.]package ...]. See coverage reporting options in framework documentation" - ) - private String includeObjects = null; - - @Parameter( - names = {"-exclude"}, - description = "Comma-separated object list to exclude from the coverage report. " + - "Format: [schema.]package[,[schema.]package ...]. See coverage reporting options in framework documentation" - ) - private String excludeObjects = null; - - @Parameter( - names = {"-q", "--quiet"}, - description = "Does not output the informational messages normally printed to console") - private boolean logSilent = false; - - @Parameter( - names = {"-d", "--debug"}, - description = "Outputs a load of debug information to console") - private boolean logDebug = false; - - @Parameter( - names = {"-t", "--timeout"}, - description = "Sets the timeout in minutes after which the cli will abort. Default 60") - private int timeoutInMinutes = 60; - - @Parameter( - names = {"-dbout", "--dbms_output"}, - description = "Enables DBMS_OUTPUT for the TestRunner (default: DISABLED)" - ) - private boolean enableDbmsOutput = false; - - @Parameter( - names = {"-random", "--random-test-order"}, - description = "Enables random order of test executions (default: DISABLED)" - ) - private boolean randomTestOrder = false; - - @Parameter( - names = {"-seed", "--random-test-order-seed"}, - description = "Sets the seed to use for random test execution order. If set, it sets -random to true" - ) - private Integer randomTestOrderSeed; - - private CompatibilityProxy compatibilityProxy; - private ReporterFactory reporterFactory; - private ReporterManager reporterManager; - - ConnectionInfo getConnectionInfo() { - return connectionInfoList.get(0); - } - - public void initLogger() { - - LoggerConfiguration.ConfigLevel level = LoggerConfiguration.ConfigLevel.BASIC; - if ( logSilent ) { - level = LoggerConfiguration.ConfigLevel.NONE; - } - else if ( logDebug ) { - level = LoggerConfiguration.ConfigLevel.DEBUG; - } - - LoggerConfiguration.configure(level); - } - - public int doRun() throws OracleCreateStatmenetStuckException { - initLogger(); - outputMainInformation(); - - HikariDataSource dataSource = null; - int returnCode = 0; - try { - - final List reporterList; - - dataSource = (HikariDataSource) DataSourceProvider.getDataSource(getConnectionInfo(), getReporterManager().getNumberOfReporters() + 2); - - initDatabase(dataSource); - reporterList = initReporters(dataSource); - - checkForCompatibility(compatibilityProxy.getUtPlsqlVersion()); - - ExecutorService executorService = Executors.newFixedThreadPool(1 + reporterList.size()); - - // Run tests. - Future future = executorService.submit(new RunTestRunnerTask(dataSource, newTestRunner(reporterList), enableDbmsOutput)); - - // Gather each reporter results on a separate thread. - getReporterManager().startReporterGatherers(executorService, dataSource); - - try { - future.get(timeoutInMinutes, TimeUnit.MINUTES); - } catch (TimeoutException e) { - executorService.shutdownNow(); - throw new ReporterTimeoutException(timeoutInMinutes); - } catch (ExecutionException e) { - if (e.getCause() instanceof SomeTestsFailedException) { - returnCode = failureExitCode; - } else { - executorService.shutdownNow(); - throw e.getCause(); - } - } catch (InterruptedException e) { - executorService.shutdownNow(); - throw e; - } - finally { - executorService.shutdown(); - if (!executorService.awaitTermination(timeoutInMinutes, TimeUnit.MINUTES)) { - throw new ReporterTimeoutException(timeoutInMinutes); - } - } - - logger.info("--------------------------------------"); - logger.info("All tests done."); - } catch ( OracleCreateStatmenetStuckException e ) { - throw e; - } catch ( DatabaseNotCompatibleException | UtPLSQLNotInstalledException | DatabaseConnectionFailed | ReporterTimeoutException e ) { - System.out.println(e.getMessage()); - returnCode = Cli.DEFAULT_ERROR_CODE; - } catch (Throwable e) { - e.printStackTrace(); - returnCode = Cli.DEFAULT_ERROR_CODE; - } finally { - if ( dataSource != null ) - dataSource.close(); - } - return returnCode; - } - - public int run() { - for ( int i = 1; i<5; i++ ) { - try { - return doRun(); - } catch (OracleCreateStatmenetStuckException e) { - logger.warn("WARNING: Caught Oracle stuck during creation of Runner-Statement. Retrying ({})", i); - } - } - - return Cli.DEFAULT_ERROR_CODE; - } - - private void checkForCompatibility( Version utPlSqlVersion ) { - if (!OptionalFeatures.FAIL_ON_ERROR.isAvailableFor(utPlSqlVersion) && failureExitCode != 1 ) { - System.out.println("You specified option `--failure-exit-code` but your database framework version (" + - utPlSqlVersion.getNormalizedString() + ") is not able to " + - "redirect failureCodes. Please upgrade to a newer version if you want to use that feature."); - } - - if ( !OptionalFeatures.RANDOM_EXECUTION_ORDER.isAvailableFor(utPlSqlVersion) && randomTestOrder ) { - System.out.println("You specified option `-random` but your database framework version (" + - utPlSqlVersion.getNormalizedString() + ") is not able to " + - "redirect failureCodes. Please upgrade to a newer version if you want to use that feature."); - } - - if ( !OptionalFeatures.RANDOM_EXECUTION_ORDER.isAvailableFor(utPlSqlVersion) && randomTestOrderSeed != null ) { - System.out.println("You specified option `-seed` but your database framework version (" + - utPlSqlVersion.getNormalizedString() + ") is not able to " + - "redirect failureCodes. Please upgrade to a newer version if you want to use that feature."); - } - - } - - @Override - public TestRunner newTestRunner( List reporterList) { - - final File baseDir = new File("").getAbsoluteFile(); - - return new TestRunner() - .addPathList(testPaths) - .addReporterList(reporterList) - .sourceMappingOptions(getFileMapperOptionsByParamListItem(this.sourcePathParams, baseDir)) - .testMappingOptions(getFileMapperOptionsByParamListItem(this.testPathParams, baseDir)) - .colorConsole(this.colorConsole) - .failOnErrors(true) - .skipCompatibilityCheck(skipCompatibilityCheck) - .includeObjects(getObjectList(includeObjects)) - .excludeObjects(getObjectList(excludeObjects)) - .randomTestOrder(randomTestOrder) - .randomTestOrderSeed(randomTestOrderSeed); - } - - private ArrayList getObjectList(String includeObjects) { - ArrayList includeObjectsList; - if (includeObjects != null && !includeObjects.isEmpty()) { - includeObjectsList = new ArrayList<>(Arrays.asList(includeObjects.split(","))); - } else { - includeObjectsList = new ArrayList<>(); - } - return includeObjectsList; - } - - @Override - public String getCommand() { - return "run"; - } - - - private void outputMainInformation() { - - StringBlockFormatter formatter = new StringBlockFormatter("utPLSQL cli"); - formatter.appendLine(CliVersionInfo.getInfo()); - formatter.appendLine(JavaApiVersionInfo.getInfo()); - formatter.appendLine("Java-Version: " + System.getProperty("java.version")); - formatter.appendLine("ORACLE_HOME: " + EnvironmentVariableUtil.getEnvValue("ORACLE_HOME")); - formatter.appendLine("NLS_LANG: " + EnvironmentVariableUtil.getEnvValue("NLS_LANG")); - formatter.appendLine(""); - formatter.appendLine("Thanks for testing!"); - - logger.info(formatter.toString()); - logger.info(""); - } - - private void initDatabase(DataSource dataSource) throws SQLException { - try (Connection conn = dataSource.getConnection()) { - - // Check if orai18n exists if database version is 11g - RunCommandChecker.checkOracleI18nExists(conn); - - // First of all do a compatibility check and fail-fast - compatibilityProxy = checkFrameworkCompatibility(conn); - - logger.info("Successfully connected to database. UtPLSQL core: {}", compatibilityProxy.getVersionDescription()); - logger.info("Oracle-Version: {}", new DefaultDatabaseInformation().getOracleVersion(conn)); - } - catch (SQLException e) { - if (e.getErrorCode() == 1017 || e.getErrorCode() == 12514) { - throw new DatabaseConnectionFailed(e); - } else { - throw e; - } - } - } - - private List initReporters(DataSource dataSource) throws SQLException { - try (Connection conn = dataSource.getConnection()) { - reporterFactory = ReporterFactoryProvider.createReporterFactory(compatibilityProxy); - return getReporterManager().initReporters(conn, reporterFactory, compatibilityProxy); - } - } - - /** Returns FileMapperOptions for the first item of a given param list in a baseDir - * - * @param pathParams - * @param baseDir - * @return FileMapperOptions or null - */ - private FileMapperOptions getFileMapperOptionsByParamListItem(List pathParams, File baseDir ) - { - logger.debug("Getting FileMapperOptions - Params: "); - pathParams.forEach(logger::debug); - - if (!pathParams.isEmpty()) { - String sourcePath = pathParams.get(0); - - logger.debug("BaseDir: {}", baseDir); - logger.debug("SourcePath: {}", sourcePath); - - List files = new FileWalker().getFileList(baseDir, sourcePath); - - logger.debug("Getting FileMapperOptions - Files: "); - files.forEach(logger::debug); - - return getMapperOptions(pathParams, files); - } - - return null; - } - - /** Checks whether cli is compatible with the database framework - * - * @param conn Active Connection - * @throws SQLException - */ - private CompatibilityProxy checkFrameworkCompatibility(Connection conn) throws SQLException { - - CompatibilityProxy proxy = new CompatibilityProxy(conn, skipCompatibilityCheck); - - if ( !skipCompatibilityCheck ) { - proxy.failOnNotCompatible(); - } - else { - System.out.println("Skipping Compatibility check with framework version, expecting the latest version " + - "to be installed in database"); - } - - return proxy; - } - - private FileMapperOptions getMapperOptions(List mappingParams, List filePaths) { - FileMapperOptions mapperOptions = new FileMapperOptions(filePaths); - - final String OPT_OWNER="-owner="; - final String OPT_REGEX="-regex_expression="; - final String OPT_TYPE_MAPPING="-type_mapping="; - final String OPT_OWNER_SUBEX="-owner_subexpression="; - final String OPT_NAME_SUBEX="-name_subexpression="; - final String OPT_TYPE_SUBEX="-type_subexpression="; - - for (String p : mappingParams) { - if (p.startsWith(OPT_OWNER)) { - mapperOptions.setObjectOwner(p.substring(OPT_OWNER.length())); - } - else - if (p.startsWith(OPT_REGEX)) { - mapperOptions.setRegexPattern(p.substring(OPT_REGEX.length())); - } - else - if (p.startsWith(OPT_TYPE_MAPPING)) { - String typeMappingsParam = p.substring(OPT_TYPE_MAPPING.length()); - - List typeMappings = new ArrayList<>(); - for (String mapping : typeMappingsParam.split("/")) { - String[] values = mapping.split("="); - typeMappings.add(new KeyValuePair(values[0], values[1])); - } - - mapperOptions.setTypeMappings(typeMappings); - } - else - if (p.startsWith(OPT_OWNER_SUBEX)) { - mapperOptions.setOwnerSubExpression(Integer.parseInt(p.substring(OPT_OWNER_SUBEX.length()))); - } - else - if (p.startsWith(OPT_NAME_SUBEX)) { - mapperOptions.setNameSubExpression(Integer.parseInt(p.substring(OPT_NAME_SUBEX.length()))); - } - else - if (p.startsWith(OPT_TYPE_SUBEX)) { - mapperOptions.setTypeSubExpression(Integer.parseInt(p.substring("-type_subexpression=".length()))); - } - } - - return mapperOptions; - } - - private ReporterManager getReporterManager() { - if ( reporterManager == null ) - reporterManager = new ReporterManager(reporterParams); - - return reporterManager; - } - - @Override - public List getReporterOptionsList() { - return getReporterManager().getReporterOptionsList(); - } -} diff --git a/src/test/java/org/utplsql/cli/TestHelper.java b/src/test/java/org/utplsql/cli/TestHelper.java index 613e867..fffbf31 100644 --- a/src/test/java/org/utplsql/cli/TestHelper.java +++ b/src/test/java/org/utplsql/cli/TestHelper.java @@ -1,6 +1,5 @@ package org.utplsql.cli; -import com.beust.jcommander.JCommander; import org.utplsql.api.DBHelper; import org.utplsql.api.EnvironmentVariableUtil; import org.utplsql.api.Version; @@ -39,15 +38,6 @@ static IRunCommand createRunCommand(String... args) { newArgs.add("run"); newArgs.addAll(Arrays.asList(args)); return createPicocliRunCommand(newArgs.toArray(new String[0])); - - /*RunCommand runCmd = new RunCommand(); - - JCommander.newBuilder() - .addObject(runCmd) - .args(args) - .build(); - - return runCmd;*/ } static RunCommandConfig parseRunConfig(String... args ) throws Exception { From 60fcfafea28d9a2936ed56af16608cba56fee6ba Mon Sep 17 00:00:00 2001 From: pesse Date: Thu, 13 Jun 2019 22:01:56 +0200 Subject: [PATCH 19/31] Improve help and help-tests --- .../utplsql/cli/UtplsqlPicocliCommand.java | 3 +- .../java/org/utplsql/cli/CliHelpTest.java | 24 +++++++++++- .../java/org/utplsql/cli/HelpCommandTest.java | 6 +-- .../org/utplsql/cli/VersionInfoCommandIT.java | 6 +-- ...emOutCapturer.java => SystemCapturer.java} | 39 +++++++++++++++++-- 5 files changed, 66 insertions(+), 12 deletions(-) rename src/test/java/org/utplsql/cli/util/{SystemOutCapturer.java => SystemCapturer.java} (65%) diff --git a/src/main/java/org/utplsql/cli/UtplsqlPicocliCommand.java b/src/main/java/org/utplsql/cli/UtplsqlPicocliCommand.java index cb6a5d6..45cce6d 100644 --- a/src/main/java/org/utplsql/cli/UtplsqlPicocliCommand.java +++ b/src/main/java/org/utplsql/cli/UtplsqlPicocliCommand.java @@ -8,7 +8,8 @@ subcommands = { RunPicocliCommand.class, VersionInfoCommand.class, - ReportersCommand.class + ReportersCommand.class, + CommandLine.HelpCommand.class }) public class UtplsqlPicocliCommand { diff --git a/src/test/java/org/utplsql/cli/CliHelpTest.java b/src/test/java/org/utplsql/cli/CliHelpTest.java index 23f5c56..89d3cf7 100644 --- a/src/test/java/org/utplsql/cli/CliHelpTest.java +++ b/src/test/java/org/utplsql/cli/CliHelpTest.java @@ -1,11 +1,33 @@ package org.utplsql.cli; import org.junit.jupiter.api.Test; +import org.utplsql.cli.util.SystemCapturer; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; class CliHelpTest { + private SystemCapturer capturer; + @Test - void showBasicHelp() { + void show_basic_help_on_help_command() { + capturer = new SystemCapturer.SystemOutCapturer(); + capturer.start(); TestHelper.runApp("help"); + String output = capturer.stop(); + + assertTrue(output.contains("Usage:")); + } + + @Test + void write_help_to_error_out_on_unknown_command() { + capturer = new SystemCapturer.SystemErrCapturer(); + capturer.start(); + int exitCode = TestHelper.runApp("wtfhappens"); + String output = capturer.stop(); + + assertTrue(output.contains("Usage:")); + assertEquals(1, exitCode); } } diff --git a/src/test/java/org/utplsql/cli/HelpCommandTest.java b/src/test/java/org/utplsql/cli/HelpCommandTest.java index 689560c..fd19bd9 100644 --- a/src/test/java/org/utplsql/cli/HelpCommandTest.java +++ b/src/test/java/org/utplsql/cli/HelpCommandTest.java @@ -3,7 +3,7 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.utplsql.cli.util.SystemOutCapturer; +import org.utplsql.cli.util.SystemCapturer; import java.io.IOException; @@ -13,11 +13,11 @@ class HelpCommandTest { - private SystemOutCapturer capturer; + private SystemCapturer capturer; @BeforeEach void setupCaptureSystemOut() { - capturer = new SystemOutCapturer(); + capturer = new SystemCapturer.SystemOutCapturer(); } @Test diff --git a/src/test/java/org/utplsql/cli/VersionInfoCommandIT.java b/src/test/java/org/utplsql/cli/VersionInfoCommandIT.java index dcedc11..073d50a 100644 --- a/src/test/java/org/utplsql/cli/VersionInfoCommandIT.java +++ b/src/test/java/org/utplsql/cli/VersionInfoCommandIT.java @@ -3,7 +3,7 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.utplsql.cli.util.SystemOutCapturer; +import org.utplsql.cli.util.SystemCapturer; import java.util.Arrays; @@ -11,11 +11,11 @@ class VersionInfoCommandIT { - private SystemOutCapturer capturer; + private SystemCapturer capturer; @BeforeEach void setupCaptureSystemOut() { - capturer = new SystemOutCapturer(); + capturer = new SystemCapturer.SystemOutCapturer(); } private int getNonEmptyLines(String content) { diff --git a/src/test/java/org/utplsql/cli/util/SystemOutCapturer.java b/src/test/java/org/utplsql/cli/util/SystemCapturer.java similarity index 65% rename from src/test/java/org/utplsql/cli/util/SystemOutCapturer.java rename to src/test/java/org/utplsql/cli/util/SystemCapturer.java index 33f60d6..f074ca3 100644 --- a/src/test/java/org/utplsql/cli/util/SystemOutCapturer.java +++ b/src/test/java/org/utplsql/cli/util/SystemCapturer.java @@ -9,25 +9,30 @@ /** All credit to Manasjyoti Sharma: https://stackoverflow.com/a/30665299 */ -public class SystemOutCapturer { +public abstract class SystemCapturer { + private ByteArrayOutputStream baos; private PrintStream previous; private boolean capturing; + protected abstract PrintStream getOriginalStream(); + + protected abstract void setSystemStream( PrintStream stream ); + public void start() { if (capturing) { return; } capturing = true; - previous = System.out; + previous = getOriginalStream(); baos = new ByteArrayOutputStream(); OutputStream outputStreamCombiner = new OutputStreamCombiner(Arrays.asList(previous, baos)); PrintStream custom = new PrintStream(outputStreamCombiner); - System.setOut(custom); + setSystemStream(custom); } public String stop() { @@ -35,7 +40,7 @@ public String stop() { return ""; } - System.setOut(previous); + setSystemStream(previous); String capturedValue = baos.toString(); @@ -71,4 +76,30 @@ public void close() throws IOException { } } } + + public static class SystemOutCapturer extends SystemCapturer { + + @Override + protected PrintStream getOriginalStream() { + return System.out; + } + + @Override + protected void setSystemStream(PrintStream stream) { + System.setOut(stream); + } + } + + public static class SystemErrCapturer extends SystemCapturer { + + @Override + protected PrintStream getOriginalStream() { + return System.err; + } + + @Override + protected void setSystemStream(PrintStream stream) { + System.setErr(stream); + } + } } From a3608b52029e33dca40c3f5f07c400843a87dfa3 Mon Sep 17 00:00:00 2001 From: pesse Date: Thu, 13 Jun 2019 22:07:07 +0200 Subject: [PATCH 20/31] Refactor: Remove unnecessary logic --- .../java/org/utplsql/cli/ReporterManager.java | 25 ------------------- 1 file changed, 25 deletions(-) diff --git a/src/main/java/org/utplsql/cli/ReporterManager.java b/src/main/java/org/utplsql/cli/ReporterManager.java index 2593667..4f057cd 100644 --- a/src/main/java/org/utplsql/cli/ReporterManager.java +++ b/src/main/java/org/utplsql/cli/ReporterManager.java @@ -23,36 +23,11 @@ class ReporterManager { private List reporterGatherErrors; private ExecutorService executorService; - ReporterManager(List reporterParams ) { - parseReporterOptionsList(reporterParams); - initReporterOptionsList(); - } - ReporterManager( ReporterOptions[] reporterOptions ) { this.reporterOptionsList = Arrays.asList(reporterOptions); initReporterOptionsList(); } - private void parseReporterOptionsList( List reporterParams ) { - reporterOptionsList = new ArrayList<>(); - ReporterOptions reporterOptions = null; - - for (String p : reporterParams) { - if (reporterOptions == null || !p.startsWith("-")) { - reporterOptions = new ReporterOptions(p); - reporterOptionsList.add(reporterOptions); - } - else - if (p.startsWith("-o=")) { - reporterOptions.setOutputFileName(p.substring(3)); - } - else - if (p.equals("-s")) { - reporterOptions.forceOutputToScreen(true); - } - } - } - private void initReporterOptionsList( ) { // If no reporter parameters were passed, use default reporter. From 09bf357d76f6c3105d35735d42af4e8bf5647fc2 Mon Sep 17 00:00:00 2001 From: pesse Date: Thu, 13 Jun 2019 22:21:47 +0200 Subject: [PATCH 21/31] Refactor: extract ReporterConfig -> ReporterOption conversion --- .../java/org/utplsql/cli/ReporterManager.java | 31 +++++++++++++------ src/main/java/org/utplsql/cli/RunAction.java | 21 +------------ 2 files changed, 23 insertions(+), 29 deletions(-) diff --git a/src/main/java/org/utplsql/cli/ReporterManager.java b/src/main/java/org/utplsql/cli/ReporterManager.java index 4f057cd..f6c707d 100644 --- a/src/main/java/org/utplsql/cli/ReporterManager.java +++ b/src/main/java/org/utplsql/cli/ReporterManager.java @@ -4,6 +4,7 @@ import org.utplsql.api.reporter.CoreReporters; import org.utplsql.api.reporter.Reporter; import org.utplsql.api.reporter.ReporterFactory; +import org.utplsql.cli.config.ReporterConfig; import org.utplsql.cli.reporters.ReporterOptionsAware; import javax.sql.DataSource; @@ -13,7 +14,6 @@ import java.sql.Connection; import java.sql.SQLException; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.concurrent.ExecutorService; @@ -23,17 +23,30 @@ class ReporterManager { private List reporterGatherErrors; private ExecutorService executorService; - ReporterManager( ReporterOptions[] reporterOptions ) { - this.reporterOptionsList = Arrays.asList(reporterOptions); - initReporterOptionsList(); + ReporterManager(ReporterConfig[] reporterConfigs ) { + reporterOptionsList = new ArrayList<>(); + if ( reporterConfigs != null && reporterConfigs.length > 0 ) { + loadOptionsFromConfigs( reporterConfigs ); + } + else { + reporterOptionsList.add(getDefaultReporterOption()); + } } - private void initReporterOptionsList( ) { + private void loadOptionsFromConfigs( ReporterConfig[] reporterConfigs ) { + boolean printToScreen = false; + for (ReporterConfig reporterConfig : reporterConfigs) { + ReporterOptions option = new ReporterOptions( + reporterConfig.getName(), + reporterConfig.getOutput()); - // If no reporter parameters were passed, use default reporter. - if (reporterOptionsList.isEmpty()) { - reporterOptionsList = new ArrayList<>(); - reporterOptionsList.add(getDefaultReporterOption()); + option.forceOutputToScreen(reporterConfig.isForceToScreen()); + reporterOptionsList.add(option); + + // Check printToScreen validity + if (option.outputToScreen() && printToScreen) + throw new IllegalArgumentException("You cannot configure more than one reporter to output to screen"); + printToScreen = option.outputToScreen(); } } diff --git a/src/main/java/org/utplsql/cli/RunAction.java b/src/main/java/org/utplsql/cli/RunAction.java index 9ebabd0..c51f6f0 100644 --- a/src/main/java/org/utplsql/cli/RunAction.java +++ b/src/main/java/org/utplsql/cli/RunAction.java @@ -14,7 +14,6 @@ import org.utplsql.api.reporter.Reporter; import org.utplsql.api.reporter.ReporterFactory; import org.utplsql.cli.config.FileMapperConfig; -import org.utplsql.cli.config.ReporterConfig; import org.utplsql.cli.config.RunCommandConfig; import org.utplsql.cli.exception.DatabaseConnectionFailed; import org.utplsql.cli.exception.ReporterTimeoutException; @@ -273,25 +272,7 @@ private CompatibilityProxy checkFrameworkCompatibility(Connection conn) throws S private ReporterManager getReporterManager() { if ( reporterManager == null ) { - - ReporterConfig[] reporterConfigs = config.getReporters(); - if ( reporterConfigs != null ) { - ReporterOptions[] options = new ReporterOptions[reporterConfigs.length]; - boolean printToScreen = false; - for (int i = 0; i Date: Thu, 13 Jun 2019 22:36:20 +0200 Subject: [PATCH 22/31] Refactor: getCommand() no longer needed --- src/main/java/org/utplsql/cli/ICommand.java | 10 +++++++--- src/main/java/org/utplsql/cli/ReportersCommand.java | 12 +++++------- src/main/java/org/utplsql/cli/RunPicocliCommand.java | 5 ----- .../java/org/utplsql/cli/VersionInfoCommand.java | 5 ----- 4 files changed, 12 insertions(+), 20 deletions(-) diff --git a/src/main/java/org/utplsql/cli/ICommand.java b/src/main/java/org/utplsql/cli/ICommand.java index 4f039dc..31d2724 100644 --- a/src/main/java/org/utplsql/cli/ICommand.java +++ b/src/main/java/org/utplsql/cli/ICommand.java @@ -1,11 +1,15 @@ package org.utplsql.cli; -/** Interface to decouple JCommander commands +/** This is the very basic interface that should be implemented by all utPLSQL cli commands * * @author pesse */ public interface ICommand { - int run(); - String getCommand(); + /** We expect the command to handle all eventually occuring exceptions + * and return an exit code + * + * @return exit code integer + */ + int run(); } diff --git a/src/main/java/org/utplsql/cli/ReportersCommand.java b/src/main/java/org/utplsql/cli/ReportersCommand.java index b35a42a..4ab17f8 100644 --- a/src/main/java/org/utplsql/cli/ReportersCommand.java +++ b/src/main/java/org/utplsql/cli/ReportersCommand.java @@ -6,12 +6,15 @@ import org.utplsql.api.reporter.inspect.ReporterInfo; import org.utplsql.api.reporter.inspect.ReporterInspector; import org.utplsql.cli.exception.DatabaseConnectionFailed; -import picocli.CommandLine.*; +import picocli.CommandLine.Command; +import picocli.CommandLine.Parameters; import javax.sql.DataSource; import java.io.PrintStream; import java.sql.Connection; -import java.util.*; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; @Command( name = "reporters", description = "prints a list of reporters available in the specified database") public class ReportersCommand implements ICommand { @@ -43,11 +46,6 @@ public int run() { return 0; } - @Override - public String getCommand() { - return "reporters"; - } - private void writeReporters(List reporterInfos, PrintStream out) { reporterInfos.stream() .sorted(Comparator.comparing(ReporterInfo::getName)) diff --git a/src/main/java/org/utplsql/cli/RunPicocliCommand.java b/src/main/java/org/utplsql/cli/RunPicocliCommand.java index 59b7f41..08a9f76 100644 --- a/src/main/java/org/utplsql/cli/RunPicocliCommand.java +++ b/src/main/java/org/utplsql/cli/RunPicocliCommand.java @@ -249,11 +249,6 @@ public int run() { return getRunAction().run(); } - @Override - public String getCommand() { - return null; - } - @Override public TestRunner newTestRunner(List reporterList) { return getRunAction().newTestRunner(reporterList); diff --git a/src/main/java/org/utplsql/cli/VersionInfoCommand.java b/src/main/java/org/utplsql/cli/VersionInfoCommand.java index 37bb546..db599dd 100644 --- a/src/main/java/org/utplsql/cli/VersionInfoCommand.java +++ b/src/main/java/org/utplsql/cli/VersionInfoCommand.java @@ -48,9 +48,4 @@ private void writeUtPlsqlVersion( String connectString ) throws SQLException { } } } - - @Override - public String getCommand() { - return "info"; - } } From 77fd752958606efb45d14571d756f67a8c7c9bbe Mon Sep 17 00:00:00 2001 From: pesse Date: Thu, 13 Jun 2019 22:42:23 +0200 Subject: [PATCH 23/31] Refactor: Include only left check-functionality --- src/main/java/org/utplsql/cli/RunAction.java | 16 ++++++++-- .../org/utplsql/cli/RunCommandChecker.java | 29 ------------------- 2 files changed, 13 insertions(+), 32 deletions(-) delete mode 100644 src/main/java/org/utplsql/cli/RunCommandChecker.java diff --git a/src/main/java/org/utplsql/cli/RunAction.java b/src/main/java/org/utplsql/cli/RunAction.java index c51f6f0..2be0fb8 100644 --- a/src/main/java/org/utplsql/cli/RunAction.java +++ b/src/main/java/org/utplsql/cli/RunAction.java @@ -189,10 +189,8 @@ private void outputMainInformation() { private void initDatabase(DataSource dataSource) throws SQLException { try (Connection conn = dataSource.getConnection()) { - // Check if orai18n exists if database version is 11g - RunCommandChecker.checkOracleI18nExists(conn); + checkOracleI18nExists(conn); - // First of all do a compatibility check and fail-fast compatibilityProxy = checkFrameworkCompatibility(conn); logger.info("Successfully connected to database. UtPLSQL core: {}", compatibilityProxy.getVersionDescription()); @@ -207,6 +205,18 @@ private void initDatabase(DataSource dataSource) throws SQLException { } } + /** Checks that orai18n library exists and show a warning if not + */ + private void checkOracleI18nExists(Connection con) throws SQLException { + + if ( !OracleLibraryChecker.checkOrai18nExists() ) { + System.out.println("WARNING: Could not find Oracle i18n driver in classpath. Depending on the database charset " + + "utPLSQL-cli, especially code coverage, might not run properly. It is recommended you download " + + "the i18n driver from the Oracle website and copy it to the 'lib' folder of your utPLSQL-cli installation."); + System.out.println("Download from http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html"); + } + } + private List initReporters(DataSource dataSource) throws SQLException { try (Connection conn = dataSource.getConnection()) { reporterFactory = ReporterFactoryProvider.createReporterFactory(compatibilityProxy); diff --git a/src/main/java/org/utplsql/cli/RunCommandChecker.java b/src/main/java/org/utplsql/cli/RunCommandChecker.java deleted file mode 100644 index 36c90fc..0000000 --- a/src/main/java/org/utplsql/cli/RunCommandChecker.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.utplsql.cli; - -import org.utplsql.api.DBHelper; -import org.utplsql.api.Version; -import org.utplsql.api.compatibility.OptionalFeatures; - -import java.sql.Connection; -import java.sql.SQLException; - -/** Helper class to check several circumstances with RunCommand. Might need refactoring. - * - * @author pesse - */ -class RunCommandChecker { - - /** Checks that orai18n library exists if database is an oracle 11 - * - */ - static void checkOracleI18nExists(Connection con) throws SQLException { - - if ( !OracleLibraryChecker.checkOrai18nExists() ) - { - System.out.println("WARNING: Could not find Oracle i18n driver in classpath. Depending on the database charset " + - "utPLSQL-cli, especially code coverage, might not run properly. It is recommended you download " + - "the i18n driver from the Oracle website and copy it to the 'lib' folder of your utPLSQL-cli installation."); - System.out.println("Download from http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html"); - } - } -} From e443e3cb3efdad0157164d832bc98ce9480d5c8d Mon Sep 17 00:00:00 2001 From: pesse Date: Thu, 13 Jun 2019 23:38:50 +0200 Subject: [PATCH 24/31] Refactor: Cleanup ReporterManager a bit --- .../java/org/utplsql/cli/ReporterManager.java | 75 ++++++++++++------- 1 file changed, 48 insertions(+), 27 deletions(-) diff --git a/src/main/java/org/utplsql/cli/ReporterManager.java b/src/main/java/org/utplsql/cli/ReporterManager.java index f6c707d..f005ef5 100644 --- a/src/main/java/org/utplsql/cli/ReporterManager.java +++ b/src/main/java/org/utplsql/cli/ReporterManager.java @@ -16,6 +16,7 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; +import java.util.function.Consumer; class ReporterManager { @@ -111,33 +112,9 @@ void startReporterGatherers(ExecutorService executorService, final DataSource da this.executorService = executorService; - // TODO: Implement Init-check - // Gather each reporter results on a separate thread. - for (ReporterOptions ro : reporterOptionsList) { - executorService.submit(() -> { - List printStreams = new ArrayList<>(); - PrintStream fileOutStream = null; - - try (Connection conn = dataSource.getConnection()) { - if (ro.outputToScreen()) { - printStreams.add(System.out); - ro.getReporterObj().getOutputBuffer().setFetchSize(1); - } - - if (ro.outputToFile()) { - fileOutStream = new PrintStream(new FileOutputStream(ro.getOutputFileName())); - printStreams.add(fileOutStream); - } - - ro.getReporterObj().getOutputBuffer().printAvailable(conn, printStreams); - } catch (SQLException | FileNotFoundException e) { - abortGathering(e); - } finally { - if (fileOutStream != null) - fileOutStream.close(); - } - }); - } + reporterOptionsList.forEach((reporterOption) -> executorService.submit( + new GatherReporterOutputTask(dataSource, reporterOption, this::abortGathering) + )); } List getReporterOptionsList() { @@ -145,4 +122,48 @@ List getReporterOptionsList() { } int getNumberOfReporters() { return reporterOptionsList.size(); } + + /** Gathers Reporter Output based on ReporterOptions and prints it to a file, System.out or both + */ + private static class GatherReporterOutputTask implements Runnable { + + private DataSource dataSource; + private ReporterOptions option; + private Consumer abortFunction; + + GatherReporterOutputTask( DataSource dataSource, ReporterOptions reporterOption, Consumer abortFunction ) { + + if ( reporterOption.getReporterObj() == null ) + throw new IllegalArgumentException("Reporter " + reporterOption.getReporterName() + " is not initialized"); + + this.dataSource = dataSource; + this.option = reporterOption; + this.abortFunction = abortFunction; + } + + @Override + public void run() { + List printStreams = new ArrayList<>(); + PrintStream fileOutStream = null; + + try (Connection conn = dataSource.getConnection()) { + if (option.outputToScreen()) { + printStreams.add(System.out); + option.getReporterObj().getOutputBuffer().setFetchSize(1); + } + + if (option.outputToFile()) { + fileOutStream = new PrintStream(new FileOutputStream(option.getOutputFileName())); + printStreams.add(fileOutStream); + } + + option.getReporterObj().getOutputBuffer().printAvailable(conn, printStreams); + } catch (SQLException | FileNotFoundException e) { + abortFunction.accept(e); + } finally { + if (fileOutStream != null) + fileOutStream.close(); + } + } + } } From 0bdca7d6e37070d78e14e153a07ea21285e7b5bd Mon Sep 17 00:00:00 2001 From: pesse Date: Thu, 13 Jun 2019 23:52:54 +0200 Subject: [PATCH 25/31] Get rid of JCommander dependency --- pom.xml | 6 ------ .../java/org/utplsql/cli/ConnectionInfo.java | 19 ------------------- .../org/utplsql/cli/DataSourceProvider.java | 5 ----- src/test/java/org/utplsql/cli/TestHelper.java | 2 +- 4 files changed, 1 insertion(+), 31 deletions(-) diff --git a/pom.xml b/pom.xml index e777689..0bd0853 100644 --- a/pom.xml +++ b/pom.xml @@ -39,12 +39,6 @@ - - com.beust - jcommander - 1.72 - compile - com.zaxxer HikariCP diff --git a/src/main/java/org/utplsql/cli/ConnectionInfo.java b/src/main/java/org/utplsql/cli/ConnectionInfo.java index cada238..3ac0f43 100644 --- a/src/main/java/org/utplsql/cli/ConnectionInfo.java +++ b/src/main/java/org/utplsql/cli/ConnectionInfo.java @@ -1,25 +1,6 @@ package org.utplsql.cli; -import com.beust.jcommander.IStringConverter; - public class ConnectionInfo { public static final String COMMANDLINE_PARAM_DESCRIPTION = "/@//[:]/ OR /@ OR /@::"; - private final String connectionInfo; - - public ConnectionInfo(String connectionInfo) { - this.connectionInfo = connectionInfo; - } - - public String getConnectionString() { - return connectionInfo; - } - - public static class ConnectionStringConverter implements IStringConverter { - - @Override - public ConnectionInfo convert(String s) { - return new ConnectionInfo(s); - } - } } diff --git a/src/main/java/org/utplsql/cli/DataSourceProvider.java b/src/main/java/org/utplsql/cli/DataSourceProvider.java index 9ab8f50..afc6fae 100644 --- a/src/main/java/org/utplsql/cli/DataSourceProvider.java +++ b/src/main/java/org/utplsql/cli/DataSourceProvider.java @@ -1,6 +1,5 @@ package org.utplsql.cli; -import com.zaxxer.hikari.HikariDataSource; import org.utplsql.cli.datasource.TestedDataSourceProvider; import javax.sql.DataSource; @@ -21,10 +20,6 @@ public class DataSourceProvider { } } - public static DataSource getDataSource(ConnectionInfo info, int maxConnections ) throws SQLException { - return getDataSource(info.getConnectionString(), maxConnections); - } - public static DataSource getDataSource(String connectString, int maxConnections ) throws SQLException { requireOjdbc(); diff --git a/src/test/java/org/utplsql/cli/TestHelper.java b/src/test/java/org/utplsql/cli/TestHelper.java index fffbf31..488654e 100644 --- a/src/test/java/org/utplsql/cli/TestHelper.java +++ b/src/test/java/org/utplsql/cli/TestHelper.java @@ -62,7 +62,7 @@ static int runApp(String... args) { } static Version getFrameworkVersion() throws SQLException { - DataSource ds = DataSourceProvider.getDataSource(new ConnectionInfo(TestHelper.getConnectionString()), 1); + DataSource ds = DataSourceProvider.getDataSource(TestHelper.getConnectionString(), 1); try (Connection con = ds.getConnection() ) { return DBHelper.getDatabaseFrameworkVersion(con); } From ae0e9c4e569949cbd281bab6d77620c09e67b191 Mon Sep 17 00:00:00 2001 From: pesse Date: Tue, 18 Jun 2019 23:47:07 +0200 Subject: [PATCH 26/31] Move ConnectionString description to main Utplsql-Command --- src/main/java/org/utplsql/cli/ConnectionInfo.java | 6 ------ src/main/java/org/utplsql/cli/ReportersCommand.java | 2 +- src/main/java/org/utplsql/cli/RunPicocliCommand.java | 2 +- src/main/java/org/utplsql/cli/UtplsqlPicocliCommand.java | 2 ++ src/main/java/org/utplsql/cli/VersionInfoCommand.java | 2 +- 5 files changed, 5 insertions(+), 9 deletions(-) delete mode 100644 src/main/java/org/utplsql/cli/ConnectionInfo.java diff --git a/src/main/java/org/utplsql/cli/ConnectionInfo.java b/src/main/java/org/utplsql/cli/ConnectionInfo.java deleted file mode 100644 index 3ac0f43..0000000 --- a/src/main/java/org/utplsql/cli/ConnectionInfo.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.utplsql.cli; - -public class ConnectionInfo { - - public static final String COMMANDLINE_PARAM_DESCRIPTION = "/@//[:]/ OR /@ OR /@::"; -} diff --git a/src/main/java/org/utplsql/cli/ReportersCommand.java b/src/main/java/org/utplsql/cli/ReportersCommand.java index 4ab17f8..9c9622b 100644 --- a/src/main/java/org/utplsql/cli/ReportersCommand.java +++ b/src/main/java/org/utplsql/cli/ReportersCommand.java @@ -19,7 +19,7 @@ @Command( name = "reporters", description = "prints a list of reporters available in the specified database") public class ReportersCommand implements ICommand { - @Parameters(description = ConnectionInfo.COMMANDLINE_PARAM_DESCRIPTION, arity = "1") + @Parameters(description = UtplsqlPicocliCommand.COMMANDLINE_PARAM_DESCRIPTION, arity = "1") private String connectionString; @Override diff --git a/src/main/java/org/utplsql/cli/RunPicocliCommand.java b/src/main/java/org/utplsql/cli/RunPicocliCommand.java index 08a9f76..03a2456 100644 --- a/src/main/java/org/utplsql/cli/RunPicocliCommand.java +++ b/src/main/java/org/utplsql/cli/RunPicocliCommand.java @@ -15,7 +15,7 @@ @Command( name = "run", description = "run tests") public class RunPicocliCommand implements IRunCommand { - @Parameters(description = ConnectionInfo.COMMANDLINE_PARAM_DESCRIPTION) + @Parameters(description = UtplsqlPicocliCommand.COMMANDLINE_PARAM_DESCRIPTION) private String connectionString; @Option(names = {"-p", "--path"}, diff --git a/src/main/java/org/utplsql/cli/UtplsqlPicocliCommand.java b/src/main/java/org/utplsql/cli/UtplsqlPicocliCommand.java index 45cce6d..c616bf8 100644 --- a/src/main/java/org/utplsql/cli/UtplsqlPicocliCommand.java +++ b/src/main/java/org/utplsql/cli/UtplsqlPicocliCommand.java @@ -13,6 +13,8 @@ }) public class UtplsqlPicocliCommand { + public static final String COMMANDLINE_PARAM_DESCRIPTION = "/@//[:]/ OR /@ OR /@::"; + @CommandLine.Option(names = "-h", usageHelp = true, description = "display this help and exit") boolean help; diff --git a/src/main/java/org/utplsql/cli/VersionInfoCommand.java b/src/main/java/org/utplsql/cli/VersionInfoCommand.java index db599dd..20aafb4 100644 --- a/src/main/java/org/utplsql/cli/VersionInfoCommand.java +++ b/src/main/java/org/utplsql/cli/VersionInfoCommand.java @@ -15,7 +15,7 @@ @Command( name = "info", description = "prints version information of cli, java-api and - if connection is given - database utPLSQL framework") public class VersionInfoCommand implements ICommand { - @Parameters(description = ConnectionInfo.COMMANDLINE_PARAM_DESCRIPTION, arity = "0..1") + @Parameters(description = UtplsqlPicocliCommand.COMMANDLINE_PARAM_DESCRIPTION, arity = "0..1") private String connectionString; public int run() { From f47c0dea1379e0dbcd4dde5aa97c5ae7ba0c81f5 Mon Sep 17 00:00:00 2001 From: pesse Date: Tue, 18 Jun 2019 23:48:17 +0200 Subject: [PATCH 27/31] Fix Typo --- src/main/java/org/utplsql/cli/ICommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/utplsql/cli/ICommand.java b/src/main/java/org/utplsql/cli/ICommand.java index 31d2724..df7171a 100644 --- a/src/main/java/org/utplsql/cli/ICommand.java +++ b/src/main/java/org/utplsql/cli/ICommand.java @@ -6,7 +6,7 @@ */ public interface ICommand { - /** We expect the command to handle all eventually occuring exceptions + /** We expect the command to handle all eventually occurring exceptions * and return an exit code * * @return exit code integer From bb18ea172133553585c31ae654b20254de8dec4b Mon Sep 17 00:00:00 2001 From: pesse Date: Tue, 18 Jun 2019 23:52:46 +0200 Subject: [PATCH 28/31] Some Refactorings and make things final --- .../java/org/utplsql/cli/ReporterManager.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/utplsql/cli/ReporterManager.java b/src/main/java/org/utplsql/cli/ReporterManager.java index f005ef5..c13e6c0 100644 --- a/src/main/java/org/utplsql/cli/ReporterManager.java +++ b/src/main/java/org/utplsql/cli/ReporterManager.java @@ -20,8 +20,8 @@ class ReporterManager { - private List reporterOptionsList; - private List reporterGatherErrors; + private final List reporterOptionsList; + private List reporterGatherErrors; private ExecutorService executorService; ReporterManager(ReporterConfig[] reporterConfigs ) { @@ -55,12 +55,12 @@ private ReporterOptions getDefaultReporterOption() { return new ReporterOptions(CoreReporters.UT_DOCUMENTATION_REPORTER.name()); } - private void abortGathering(Throwable e) { + private void abortGathering(Exception e) { addGatherError(e); executorService.shutdownNow(); } - private void addGatherError( Throwable e ) { + private void addGatherError( Exception e ) { if ( reporterGatherErrors == null ) { reporterGatherErrors = new ArrayList<>(); } @@ -71,7 +71,7 @@ boolean haveGatherErrorsOccured() { return reporterGatherErrors != null && !reporterGatherErrors.isEmpty(); } - List getGatherErrors() { + List getGatherErrors() { return reporterGatherErrors; } @@ -127,11 +127,11 @@ List getReporterOptionsList() { */ private static class GatherReporterOutputTask implements Runnable { - private DataSource dataSource; - private ReporterOptions option; - private Consumer abortFunction; + private final DataSource dataSource; + private final ReporterOptions option; + private final Consumer abortFunction; - GatherReporterOutputTask( DataSource dataSource, ReporterOptions reporterOption, Consumer abortFunction ) { + GatherReporterOutputTask( DataSource dataSource, ReporterOptions reporterOption, Consumer abortFunction ) { if ( reporterOption.getReporterObj() == null ) throw new IllegalArgumentException("Reporter " + reporterOption.getReporterName() + " is not initialized"); From 81e0953149f01e557f790b48ace2d85188e1282e Mon Sep 17 00:00:00 2001 From: pesse Date: Tue, 18 Jun 2019 23:56:41 +0200 Subject: [PATCH 29/31] Reformatting --- src/main/java/org/utplsql/cli/Cli.java | 13 ++-- .../java/org/utplsql/cli/CliVersionInfo.java | 19 +++--- .../org/utplsql/cli/ConnectionConfig.java | 16 ++--- .../org/utplsql/cli/DataSourceProvider.java | 10 ++-- src/main/java/org/utplsql/cli/FileWalker.java | 9 ++- src/main/java/org/utplsql/cli/ICommand.java | 6 +- .../org/utplsql/cli/LocaleInitializer.java | 34 ++++++----- .../org/utplsql/cli/LoggerConfiguration.java | 12 ++-- .../org/utplsql/cli/OracleLibraryChecker.java | 18 +++--- .../utplsql/cli/ReporterFactoryProvider.java | 7 ++- .../java/org/utplsql/cli/ReporterManager.java | 51 +++++++++------- .../java/org/utplsql/cli/ReporterOptions.java | 2 +- .../org/utplsql/cli/ReportersCommand.java | 18 +++--- src/main/java/org/utplsql/cli/RunAction.java | 48 +++++++-------- .../org/utplsql/cli/RunPicocliCommand.java | 59 +++++++++---------- .../org/utplsql/cli/RunTestRunnerTask.java | 15 ++--- .../utplsql/cli/UtplsqlPicocliCommand.java | 6 +- .../org/utplsql/cli/VersionInfoCommand.java | 12 ++-- .../utplsql/cli/config/ReporterConfig.java | 4 +- .../utplsql/cli/config/RunCommandConfig.java | 20 +++++-- .../datasource/TestedDataSourceProvider.java | 19 +++--- .../exception/DatabaseConnectionFailed.java | 4 +- .../exception/ReporterTimeoutException.java | 2 +- .../utplsql/cli/log/StringBlockFormatter.java | 34 ++++++----- .../LocalAssetsCoverageHTMLReporter.java | 14 +++-- .../cli/reporters/ReporterOptionsAware.java | 3 +- 26 files changed, 246 insertions(+), 209 deletions(-) diff --git a/src/main/java/org/utplsql/cli/Cli.java b/src/main/java/org/utplsql/cli/Cli.java index 88ea12e..2671988 100644 --- a/src/main/java/org/utplsql/cli/Cli.java +++ b/src/main/java/org/utplsql/cli/Cli.java @@ -15,7 +15,7 @@ public static void main(String[] args) { System.exit(exitCode); } - static int runPicocliWithExitCode( String[] args ) { + static int runPicocliWithExitCode(String[] args) { LoggerConfiguration.configure(LoggerConfiguration.ConfigLevel.NONE); LocaleInitializer.initLocale(); @@ -30,25 +30,24 @@ static int runPicocliWithExitCode( String[] args ) { List parsedLines = commandLine.parse(args); boolean commandWasRun = false; - for ( CommandLine parsedLine : parsedLines ) { + for (CommandLine parsedLine : parsedLines) { if (parsedLine.isUsageHelpRequested()) { parsedLine.usage(System.out); return 0; - } - else if (parsedLine.isVersionHelpRequested()) { + } else if (parsedLine.isVersionHelpRequested()) { parsedLine.printVersionHelp(System.out); return 0; } Object command = parsedLine.getCommand(); - if ( command instanceof ICommand ) { - exitCode = ((ICommand)command).run(); + if (command instanceof ICommand) { + exitCode = ((ICommand) command).run(); commandWasRun = true; break; } } - if ( !commandWasRun ) { + if (!commandWasRun) { commandLine.usage(System.out); } } catch (CommandLine.ParameterException e) { diff --git a/src/main/java/org/utplsql/cli/CliVersionInfo.java b/src/main/java/org/utplsql/cli/CliVersionInfo.java index 965ae23..72cc407 100644 --- a/src/main/java/org/utplsql/cli/CliVersionInfo.java +++ b/src/main/java/org/utplsql/cli/CliVersionInfo.java @@ -7,7 +7,8 @@ import java.io.InputStream; import java.io.InputStreamReader; -/** This class is getting updated automatically by the build process. +/** + * This class is getting updated automatically by the build process. * Please do not update its constants manually cause they will be overwritten. * * @author pesse @@ -19,18 +20,22 @@ public class CliVersionInfo { static { try { - try ( InputStream in = JavaApiVersionInfo.class.getClassLoader().getResourceAsStream("utplsql-cli.version"); - BufferedReader reader = new BufferedReader(new InputStreamReader(in)) ) { + try (InputStream in = JavaApiVersionInfo.class.getClassLoader().getResourceAsStream("utplsql-cli.version"); + BufferedReader reader = new BufferedReader(new InputStreamReader(in))) { MAVEN_PROJECT_VERSION = reader.readLine(); } - } - catch ( IOException e ) { + } catch (IOException e) { System.out.println("WARNING: Could not get Version information!"); } } - public static String getVersion() { return MAVEN_PROJECT_VERSION; } - public static String getInfo() { return MAVEN_PROJECT_NAME + " " + getVersion(); } + public static String getVersion() { + return MAVEN_PROJECT_VERSION; + } + + public static String getInfo() { + return MAVEN_PROJECT_NAME + " " + getVersion(); + } } diff --git a/src/main/java/org/utplsql/cli/ConnectionConfig.java b/src/main/java/org/utplsql/cli/ConnectionConfig.java index e5d70de..05e2de7 100644 --- a/src/main/java/org/utplsql/cli/ConnectionConfig.java +++ b/src/main/java/org/utplsql/cli/ConnectionConfig.java @@ -9,22 +9,22 @@ public class ConnectionConfig { private final String password; private final String connect; - public ConnectionConfig( String connectString ) { + public ConnectionConfig(String connectString) { Matcher m = Pattern.compile("^(\".+\"|[^/]+)/(\".+\"|[^@]+)@(.*)$").matcher(connectString); - if ( m.find() ) { + if (m.find()) { user = stripEnclosingQuotes(m.group(1)); password = stripEnclosingQuotes(m.group(2)); connect = m.group(3); - } - else + } else { throw new IllegalArgumentException("Not a valid connectString: '" + connectString + "'"); + } } - private String stripEnclosingQuotes( String value ) { - if ( value.length() > 1 + private String stripEnclosingQuotes(String value) { + if (value.length() > 1 && value.startsWith("\"") && value.endsWith("\"")) { - return value.substring(1, value.length()-1); + return value.substring(1, value.length() - 1); } else { return value; } @@ -49,6 +49,6 @@ public String getConnectString() { public boolean isSysDba() { return user != null && (user.toLowerCase().endsWith(" as sysdba") - || user.toLowerCase().endsWith(" as sysoper")); + || user.toLowerCase().endsWith(" as sysoper")); } } diff --git a/src/main/java/org/utplsql/cli/DataSourceProvider.java b/src/main/java/org/utplsql/cli/DataSourceProvider.java index afc6fae..4eee258 100644 --- a/src/main/java/org/utplsql/cli/DataSourceProvider.java +++ b/src/main/java/org/utplsql/cli/DataSourceProvider.java @@ -6,7 +6,8 @@ import java.io.File; import java.sql.SQLException; -/** Helper class to give you a ready-to-use datasource +/** + * Helper class to give you a ready-to-use datasource * * @author pesse */ @@ -20,7 +21,7 @@ public class DataSourceProvider { } } - public static DataSource getDataSource(String connectString, int maxConnections ) throws SQLException { + public static DataSource getDataSource(String connectString, int maxConnections) throws SQLException { requireOjdbc(); @@ -31,8 +32,7 @@ public static DataSource getDataSource(String connectString, int maxConnections } private static void requireOjdbc() { - if ( !OracleLibraryChecker.checkOjdbcExists() ) - { + if (!OracleLibraryChecker.checkOjdbcExists()) { System.out.println("Could not find Oracle JDBC driver in classpath. Please download the jar from Oracle website" + " and copy it to the 'lib' folder of your utPLSQL-cli installation."); System.out.println("Download from http://www.oracle.com/technetwork/database/features/jdbc/jdbc-ucp-122-3110062.html"); @@ -42,7 +42,7 @@ private static void requireOjdbc() { } private static void warnIfSysDba(ConnectionConfig config) { - if ( config.isSysDba() ) { + if (config.isSysDba()) { System.out.println("WARNING: You are connecting to the database as SYSDBA or SYSOPER, which is NOT RECOMMENDED and can put your database at risk!"); } } diff --git a/src/main/java/org/utplsql/cli/FileWalker.java b/src/main/java/org/utplsql/cli/FileWalker.java index 3fec655..3d07ba6 100644 --- a/src/main/java/org/utplsql/cli/FileWalker.java +++ b/src/main/java/org/utplsql/cli/FileWalker.java @@ -16,8 +16,9 @@ public List getFileList(File baseDir, String inspectPath) { public List getFileList(File baseDir, String inspectPath, boolean relative) { File inspectDir = new File(baseDir, inspectPath); - if (!inspectDir.isDirectory()) + if (!inspectDir.isDirectory()) { throw new IllegalArgumentException(inspectPath + " is not a directory."); + } List fileList = new ArrayList<>(); listDirFiles(baseDir, inspectDir, fileList, relative); @@ -28,15 +29,17 @@ public List getFileList(File baseDir, String inspectPath, boolean relati private void listDirFiles(File baseDir, File directory, List fileList, boolean relative) { File[] directoryFiles = directory.listFiles(); - if (directoryFiles == null) + if (directoryFiles == null) { return; + } for (File file : directoryFiles) { if (file.isFile()) { String absolutePath = file.getAbsolutePath(); - if (relative) + if (relative) { absolutePath = absolutePath.substring(baseDir.getAbsolutePath().length() + 1); + } fileList.add(absolutePath); } else { diff --git a/src/main/java/org/utplsql/cli/ICommand.java b/src/main/java/org/utplsql/cli/ICommand.java index df7171a..0ea1813 100644 --- a/src/main/java/org/utplsql/cli/ICommand.java +++ b/src/main/java/org/utplsql/cli/ICommand.java @@ -1,12 +1,14 @@ package org.utplsql.cli; -/** This is the very basic interface that should be implemented by all utPLSQL cli commands +/** + * This is the very basic interface that should be implemented by all utPLSQL cli commands * * @author pesse */ public interface ICommand { - /** We expect the command to handle all eventually occurring exceptions + /** + * We expect the command to handle all eventually occurring exceptions * and return an exit code * * @return exit code integer diff --git a/src/main/java/org/utplsql/cli/LocaleInitializer.java b/src/main/java/org/utplsql/cli/LocaleInitializer.java index 75d5366..44a755a 100644 --- a/src/main/java/org/utplsql/cli/LocaleInitializer.java +++ b/src/main/java/org/utplsql/cli/LocaleInitializer.java @@ -6,54 +6,58 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -/** This class makes sure the java locale is set according to the environment variables LC_ALL and LANG +/** + * This class makes sure the java locale is set according to the environment variables LC_ALL and LANG * We experienced that, in some cases, the locale was not set as expected, therefore this class implements some clear * rules: - * 1. If environment variable LC_ALL is set, we try to parse its content and set locale according to its value if valid - * 2. If environment variable LANG is set, we try to parse its content and set locale according to its value if valid - * 3. Otherwise we use default locale + * 1. If environment variable LC_ALL is set, we try to parse its content and set locale according to its value if valid + * 2. If environment variable LANG is set, we try to parse its content and set locale according to its value if valid + * 3. Otherwise we use default locale * - * @author pesse + * @author pesse */ class LocaleInitializer { private static final Pattern REGEX_LOCALE = Pattern.compile("^([a-zA-Z]+)[_-]([a-zA-Z]+)"); // We only need the very first part and are pretty forgiving in parsing - /** Sets the default locale according to the rules described above - * + /** + * Sets the default locale according to the rules described above */ static void initLocale() { boolean localeChanged = setDefaultLocale(EnvironmentVariableUtil.getEnvValue("LC_ALL")); - if ( !localeChanged ) + if (!localeChanged) { setDefaultLocale(EnvironmentVariableUtil.getEnvValue("LANG")); + } } - /** Set the default locale from a given string like LC_ALL or LANG environment variable + /** + * Set the default locale from a given string like LC_ALL or LANG environment variable * * @param localeString Locale-string from LC_ALL or LANG, e.g "en_US.utf-8" * @return true if successful, false if not */ - private static boolean setDefaultLocale( String localeString ) { - if ( localeString == null || localeString.isEmpty() ) + private static boolean setDefaultLocale(String localeString) { + if (localeString == null || localeString.isEmpty()) { return false; + } try { Matcher m = REGEX_LOCALE.matcher(localeString); if (m.find()) { StringBuilder sb = new StringBuilder(); sb.append(m.group(1)); - if (m.group(2) != null) + if (m.group(2) != null) { sb.append("-").append(m.group(2)); + } Locale l = new Locale.Builder().setLanguageTag(sb.toString()).build(); - if ( l != null ) { + if (l != null) { Locale.setDefault(l); return true; } } - } - catch ( Exception e ) { + } catch (Exception e) { System.out.println("Could not get locale from " + localeString); } diff --git a/src/main/java/org/utplsql/cli/LoggerConfiguration.java b/src/main/java/org/utplsql/cli/LoggerConfiguration.java index abac178..3dcd09b 100644 --- a/src/main/java/org/utplsql/cli/LoggerConfiguration.java +++ b/src/main/java/org/utplsql/cli/LoggerConfiguration.java @@ -16,11 +16,11 @@ public enum ConfigLevel { } private LoggerConfiguration() { - throw new UnsupportedOperationException(); + throw new UnsupportedOperationException(); } static void configure(ConfigLevel level) { - switch ( level ) { + switch (level) { case BASIC: configureInfo(); break; @@ -48,8 +48,8 @@ private static void configureDebug() { setSingleConsoleAppenderWithLayout("%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"); } - private static void setRootLoggerLevel( Level level ) { - Logger root = (Logger)LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); + private static void setRootLoggerLevel(Level level) { + Logger root = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); root.setLevel(level); } @@ -57,8 +57,8 @@ private static void muteHikariLogger() { ((Logger) LoggerFactory.getLogger(HikariDataSource.class)).setLevel(Level.OFF); } - private static void setSingleConsoleAppenderWithLayout( String patternLayout ) { - Logger logger = (Logger)LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); + private static void setSingleConsoleAppenderWithLayout(String patternLayout) { + Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); PatternLayoutEncoder ple = new PatternLayoutEncoder(); diff --git a/src/main/java/org/utplsql/cli/OracleLibraryChecker.java b/src/main/java/org/utplsql/cli/OracleLibraryChecker.java index 24b02f8..d6d8393 100644 --- a/src/main/java/org/utplsql/cli/OracleLibraryChecker.java +++ b/src/main/java/org/utplsql/cli/OracleLibraryChecker.java @@ -1,25 +1,24 @@ package org.utplsql.cli; -/** Simple class to check whether needed Oracle libraries are on classpath or not +/** + * Simple class to check whether needed Oracle libraries are on classpath or not * * @author pesse */ class OracleLibraryChecker { - private static boolean classExists( String classFullName ){ - try - { + private static boolean classExists(String classFullName) { + try { Class.forName(classFullName); return true; - } - catch ( ClassNotFoundException e ) - { + } catch (ClassNotFoundException e) { return false; } } - /** Checks if OJDBC library is on the classpath by searching for oracle.jdbc.OracleDriver class + /** + * Checks if OJDBC library is on the classpath by searching for oracle.jdbc.OracleDriver class * * @return true or false */ @@ -27,7 +26,8 @@ public static boolean checkOjdbcExists() { return classExists("oracle.jdbc.OracleDriver"); } - /** Checks if Orai18n library is on the classpath by searching for oracle.i18n.text.OraCharset + /** + * Checks if Orai18n library is on the classpath by searching for oracle.i18n.text.OraCharset * * @return true or false */ diff --git a/src/main/java/org/utplsql/cli/ReporterFactoryProvider.java b/src/main/java/org/utplsql/cli/ReporterFactoryProvider.java index 828a5a9..40aea11 100644 --- a/src/main/java/org/utplsql/cli/ReporterFactoryProvider.java +++ b/src/main/java/org/utplsql/cli/ReporterFactoryProvider.java @@ -8,20 +8,21 @@ import java.sql.Connection; import java.sql.SQLException; -/** A simple class to provide a ReporterFactory for the RunCommand +/** + * A simple class to provide a ReporterFactory for the RunCommand * * @author pesse */ class ReporterFactoryProvider { - public static ReporterFactory createReporterFactory(CompatibilityProxy proxy ) { + public static ReporterFactory createReporterFactory(CompatibilityProxy proxy) { ReporterFactory reporterFactory = ReporterFactory.createDefault(proxy); reporterFactory.registerReporterFactoryMethod(CoreReporters.UT_COVERAGE_HTML_REPORTER.name(), LocalAssetsCoverageHTMLReporter::new, "Will copy all necessary assets to a folder named after the Output-File"); return reporterFactory; } - public static ReporterFactory createReporterFactory(Connection con ) throws SQLException { + public static ReporterFactory createReporterFactory(Connection con) throws SQLException { return createReporterFactory(new CompatibilityProxy(con)); } } diff --git a/src/main/java/org/utplsql/cli/ReporterManager.java b/src/main/java/org/utplsql/cli/ReporterManager.java index c13e6c0..176ae09 100644 --- a/src/main/java/org/utplsql/cli/ReporterManager.java +++ b/src/main/java/org/utplsql/cli/ReporterManager.java @@ -24,17 +24,16 @@ class ReporterManager { private List reporterGatherErrors; private ExecutorService executorService; - ReporterManager(ReporterConfig[] reporterConfigs ) { + ReporterManager(ReporterConfig[] reporterConfigs) { reporterOptionsList = new ArrayList<>(); - if ( reporterConfigs != null && reporterConfigs.length > 0 ) { - loadOptionsFromConfigs( reporterConfigs ); - } - else { + if (reporterConfigs != null && reporterConfigs.length > 0) { + loadOptionsFromConfigs(reporterConfigs); + } else { reporterOptionsList.add(getDefaultReporterOption()); } } - private void loadOptionsFromConfigs( ReporterConfig[] reporterConfigs ) { + private void loadOptionsFromConfigs(ReporterConfig[] reporterConfigs) { boolean printToScreen = false; for (ReporterConfig reporterConfig : reporterConfigs) { ReporterOptions option = new ReporterOptions( @@ -45,8 +44,9 @@ private void loadOptionsFromConfigs( ReporterConfig[] reporterConfigs ) { reporterOptionsList.add(option); // Check printToScreen validity - if (option.outputToScreen() && printToScreen) + if (option.outputToScreen() && printToScreen) { throw new IllegalArgumentException("You cannot configure more than one reporter to output to screen"); + } printToScreen = option.outputToScreen(); } } @@ -60,8 +60,8 @@ private void abortGathering(Exception e) { executorService.shutdownNow(); } - private void addGatherError( Exception e ) { - if ( reporterGatherErrors == null ) { + private void addGatherError(Exception e) { + if (reporterGatherErrors == null) { reporterGatherErrors = new ArrayList<>(); } reporterGatherErrors.add(e); @@ -75,21 +75,22 @@ List getGatherErrors() { return reporterGatherErrors; } - /** Initializes the reporters so we can use the id to gather results + /** + * Initializes the reporters so we can use the id to gather results * * @param conn Active Connection * @return List of Reporters * @throws SQLException */ - List initReporters(Connection conn, ReporterFactory reporterFactory, CompatibilityProxy compatibilityProxy) throws SQLException - { + List initReporters(Connection conn, ReporterFactory reporterFactory, CompatibilityProxy compatibilityProxy) throws SQLException { final List reporterList = new ArrayList<>(); for (ReporterOptions ro : reporterOptionsList) { Reporter reporter = reporterFactory.createReporter(ro.getReporterName()); - if ( reporter instanceof ReporterOptionsAware) + if (reporter instanceof ReporterOptionsAware) { ((ReporterOptionsAware) reporter).setReporterOptions(ro); + } reporter.init(conn, compatibilityProxy, reporterFactory); @@ -100,15 +101,16 @@ List initReporters(Connection conn, ReporterFactory reporterFactory, C return reporterList; } - /** Starts a separate thread for each Reporter to gather its results + /** + * Starts a separate thread for each Reporter to gather its results * * @param executorService * @param dataSource */ - void startReporterGatherers(ExecutorService executorService, final DataSource dataSource) - { - if ( this.executorService != null && !this.executorService.isShutdown()) + void startReporterGatherers(ExecutorService executorService, final DataSource dataSource) { + if (this.executorService != null && !this.executorService.isShutdown()) { throw new IllegalStateException("There is already a running executor service!"); + } this.executorService = executorService; @@ -121,9 +123,12 @@ List getReporterOptionsList() { return reporterOptionsList; } - int getNumberOfReporters() { return reporterOptionsList.size(); } + int getNumberOfReporters() { + return reporterOptionsList.size(); + } - /** Gathers Reporter Output based on ReporterOptions and prints it to a file, System.out or both + /** + * Gathers Reporter Output based on ReporterOptions and prints it to a file, System.out or both */ private static class GatherReporterOutputTask implements Runnable { @@ -131,10 +136,11 @@ private static class GatherReporterOutputTask implements Runnable { private final ReporterOptions option; private final Consumer abortFunction; - GatherReporterOutputTask( DataSource dataSource, ReporterOptions reporterOption, Consumer abortFunction ) { + GatherReporterOutputTask(DataSource dataSource, ReporterOptions reporterOption, Consumer abortFunction) { - if ( reporterOption.getReporterObj() == null ) + if (reporterOption.getReporterObj() == null) { throw new IllegalArgumentException("Reporter " + reporterOption.getReporterName() + " is not initialized"); + } this.dataSource = dataSource; this.option = reporterOption; @@ -161,8 +167,9 @@ public void run() { } catch (SQLException | FileNotFoundException e) { abortFunction.accept(e); } finally { - if (fileOutStream != null) + if (fileOutStream != null) { fileOutStream.close(); + } } } } diff --git a/src/main/java/org/utplsql/cli/ReporterOptions.java b/src/main/java/org/utplsql/cli/ReporterOptions.java index c64bfbe..b15dd30 100644 --- a/src/main/java/org/utplsql/cli/ReporterOptions.java +++ b/src/main/java/org/utplsql/cli/ReporterOptions.java @@ -14,7 +14,7 @@ public class ReporterOptions { private Reporter reporterObj = null; - public ReporterOptions(String reporterName, String outputFileName ) { + public ReporterOptions(String reporterName, String outputFileName) { setReporterName(reporterName); setOutputFileName(outputFileName); this.outputToScreen = (outputFileName == null); // If outputFileName is null we assume it should be sent to screen diff --git a/src/main/java/org/utplsql/cli/ReportersCommand.java b/src/main/java/org/utplsql/cli/ReportersCommand.java index 9c9622b..f27bb33 100644 --- a/src/main/java/org/utplsql/cli/ReportersCommand.java +++ b/src/main/java/org/utplsql/cli/ReportersCommand.java @@ -16,7 +16,7 @@ import java.util.Comparator; import java.util.List; -@Command( name = "reporters", description = "prints a list of reporters available in the specified database") +@Command(name = "reporters", description = "prints a list of reporters available in the specified database") public class ReportersCommand implements ICommand { @Parameters(description = UtplsqlPicocliCommand.COMMANDLINE_PARAM_DESCRIPTION, arity = "1") @@ -33,12 +33,10 @@ public int run() { writeReporters(ReporterInspector.create(reporterFactory, con).getReporterInfos(), System.out); } - } - catch ( DatabaseNotCompatibleException | UtPLSQLNotInstalledException | DatabaseConnectionFailed | IllegalArgumentException e ) { + } catch (DatabaseNotCompatibleException | UtPLSQLNotInstalledException | DatabaseConnectionFailed | IllegalArgumentException e) { System.out.println(e.getMessage()); return 1; - } - catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); return 1; } @@ -60,14 +58,14 @@ private void writeReporter(ReporterInfo info, int padding, PrintStream out) { out.println(); } - private void writeReporterName( ReporterInfo info, int paddingRight, PrintStream out ) { - out.println(info.getName()+":"); + private void writeReporterName(ReporterInfo info, int paddingRight, PrintStream out) { + out.println(info.getName() + ":"); } - private void writeReporterDescription( ReporterInfo info, int paddingLeft, PrintStream out ) { + private void writeReporterDescription(ReporterInfo info, int paddingLeft, PrintStream out) { String[] lines = info.getDescription().split("\n"); - String paddingLeftStr = String.format("%1$"+paddingLeft+"s", ""); - Arrays.stream(lines).forEach(line -> out.println(paddingLeftStr+line.trim())); + String paddingLeftStr = String.format("%1$" + paddingLeft + "s", ""); + Arrays.stream(lines).forEach(line -> out.println(paddingLeftStr + line.trim())); } } diff --git a/src/main/java/org/utplsql/cli/RunAction.java b/src/main/java/org/utplsql/cli/RunAction.java index 2be0fb8..de960ed 100644 --- a/src/main/java/org/utplsql/cli/RunAction.java +++ b/src/main/java/org/utplsql/cli/RunAction.java @@ -43,7 +43,7 @@ public class RunAction { private ReporterFactory reporterFactory; private ReporterManager reporterManager; - public RunAction( RunCommandConfig config ) { + public RunAction(RunCommandConfig config) { this.config = config; } @@ -95,8 +95,7 @@ public int doRun() throws OracleCreateStatmenetStuckException { } catch (InterruptedException e) { executorService.shutdownNow(); throw e; - } - finally { + } finally { executorService.shutdown(); if (!executorService.awaitTermination(config.getTimeoutInMinutes(), TimeUnit.MINUTES)) { throw new ReporterTimeoutException(config.getTimeoutInMinutes()); @@ -105,23 +104,24 @@ public int doRun() throws OracleCreateStatmenetStuckException { logger.info("--------------------------------------"); logger.info("All tests done."); - } catch ( OracleCreateStatmenetStuckException e ) { + } catch (OracleCreateStatmenetStuckException e) { throw e; - } catch ( DatabaseNotCompatibleException | UtPLSQLNotInstalledException | DatabaseConnectionFailed | ReporterTimeoutException e ) { + } catch (DatabaseNotCompatibleException | UtPLSQLNotInstalledException | DatabaseConnectionFailed | ReporterTimeoutException e) { System.out.println(e.getMessage()); returnCode = Cli.DEFAULT_ERROR_CODE; } catch (Throwable e) { e.printStackTrace(); returnCode = Cli.DEFAULT_ERROR_CODE; } finally { - if ( dataSource != null ) + if (dataSource != null) { dataSource.close(); + } } return returnCode; } public int run() { - for ( int i = 1; i<5; i++ ) { + for (int i = 1; i < 5; i++) { try { return doRun(); } catch (OracleCreateStatmenetStuckException e) { @@ -132,20 +132,20 @@ public int run() { return Cli.DEFAULT_ERROR_CODE; } - private void checkForCompatibility( Version utPlSqlVersion ) { - if (!OptionalFeatures.FAIL_ON_ERROR.isAvailableFor(utPlSqlVersion) && config.getFailureExitCode() != null ) { + private void checkForCompatibility(Version utPlSqlVersion) { + if (!OptionalFeatures.FAIL_ON_ERROR.isAvailableFor(utPlSqlVersion) && config.getFailureExitCode() != null) { System.out.println("You specified option `--failure-exit-code` but your database framework version (" + utPlSqlVersion.getNormalizedString() + ") is not able to " + "redirect failureCodes. Please upgrade to a newer version if you want to use that feature."); } - if ( !OptionalFeatures.RANDOM_EXECUTION_ORDER.isAvailableFor(utPlSqlVersion) && config.isRandomTestOrder() ) { + if (!OptionalFeatures.RANDOM_EXECUTION_ORDER.isAvailableFor(utPlSqlVersion) && config.isRandomTestOrder()) { System.out.println("You specified option `-random` but your database framework version (" + utPlSqlVersion.getNormalizedString() + ") is not able to " + "redirect failureCodes. Please upgrade to a newer version if you want to use that feature."); } - if ( !OptionalFeatures.RANDOM_EXECUTION_ORDER.isAvailableFor(utPlSqlVersion) && config.getRandomTestOrderSeed() != null ) { + if (!OptionalFeatures.RANDOM_EXECUTION_ORDER.isAvailableFor(utPlSqlVersion) && config.getRandomTestOrderSeed() != null) { System.out.println("You specified option `-seed` but your database framework version (" + utPlSqlVersion.getNormalizedString() + ") is not able to " + "redirect failureCodes. Please upgrade to a newer version if you want to use that feature."); @@ -153,7 +153,7 @@ private void checkForCompatibility( Version utPlSqlVersion ) { } - TestRunner newTestRunner( List reporterList) { + TestRunner newTestRunner(List reporterList) { final File baseDir = new File("").getAbsoluteFile(); @@ -195,8 +195,7 @@ private void initDatabase(DataSource dataSource) throws SQLException { logger.info("Successfully connected to database. UtPLSQL core: {}", compatibilityProxy.getVersionDescription()); logger.info("Oracle-Version: {}", new DefaultDatabaseInformation().getOracleVersion(conn)); - } - catch (SQLException e) { + } catch (SQLException e) { if (e.getErrorCode() == 1017 || e.getErrorCode() == 12514) { throw new DatabaseConnectionFailed(e); } else { @@ -205,11 +204,12 @@ private void initDatabase(DataSource dataSource) throws SQLException { } } - /** Checks that orai18n library exists and show a warning if not + /** + * Checks that orai18n library exists and show a warning if not */ private void checkOracleI18nExists(Connection con) throws SQLException { - if ( !OracleLibraryChecker.checkOrai18nExists() ) { + if (!OracleLibraryChecker.checkOrai18nExists()) { System.out.println("WARNING: Could not find Oracle i18n driver in classpath. Depending on the database charset " + "utPLSQL-cli, especially code coverage, might not run properly. It is recommended you download " + "the i18n driver from the Oracle website and copy it to the 'lib' folder of your utPLSQL-cli installation."); @@ -224,14 +224,14 @@ private List initReporters(DataSource dataSource) throws SQLException } } - /** Returns FileMapperOptions for the first item of a given param list in a baseDir + /** + * Returns FileMapperOptions for the first item of a given param list in a baseDir * * @param fileMapperConfig * @param baseDir * @return FileMapperOptions or null */ - private FileMapperOptions getFileMapperOptionsByParamListItem(FileMapperConfig fileMapperConfig, File baseDir ) - { + private FileMapperOptions getFileMapperOptionsByParamListItem(FileMapperConfig fileMapperConfig, File baseDir) { if (fileMapperConfig != null) { String sourcePath = fileMapperConfig.getPath(); @@ -260,7 +260,8 @@ private FileMapperOptions getFileMapperOptionsByParamListItem(FileMapperConfig f return null; } - /** Checks whether cli is compatible with the database framework + /** + * Checks whether cli is compatible with the database framework * * @param conn Active Connection * @throws SQLException @@ -269,10 +270,9 @@ private CompatibilityProxy checkFrameworkCompatibility(Connection conn) throws S CompatibilityProxy proxy = new CompatibilityProxy(conn, config.isSkipCompatibilityCheck()); - if ( !config.isSkipCompatibilityCheck() ) { + if (!config.isSkipCompatibilityCheck()) { proxy.failOnNotCompatible(); - } - else { + } else { System.out.println("Skipping Compatibility check with framework version, expecting the latest version " + "to be installed in database"); } @@ -281,7 +281,7 @@ private CompatibilityProxy checkFrameworkCompatibility(Connection conn) throws S } private ReporterManager getReporterManager() { - if ( reporterManager == null ) { + if (reporterManager == null) { reporterManager = new ReporterManager(config.getReporters()); } diff --git a/src/main/java/org/utplsql/cli/RunPicocliCommand.java b/src/main/java/org/utplsql/cli/RunPicocliCommand.java index 03a2456..8079e73 100644 --- a/src/main/java/org/utplsql/cli/RunPicocliCommand.java +++ b/src/main/java/org/utplsql/cli/RunPicocliCommand.java @@ -12,7 +12,7 @@ import java.util.*; -@Command( name = "run", description = "run tests") +@Command(name = "run", description = "run tests") public class RunPicocliCommand implements IRunCommand { @Parameters(description = UtplsqlPicocliCommand.COMMANDLINE_PARAM_DESCRIPTION) @@ -94,11 +94,11 @@ public class RunPicocliCommand implements IRunCommand { private List reporters = new ArrayList<>(); static class Format { - @Option(names={"-f", "--format"}, required = true, description = "Enables specified format reporting") + @Option(names = {"-f", "--format"}, required = true, description = "Enables specified format reporting") String format; - @Option(names={"-o"}, description = "Outputs format to file") + @Option(names = {"-o"}, description = "Outputs format to file") String outputFile; - @Option(names={"-s"}, description = "Outputs to screen even when an output file is specified") + @Option(names = {"-s"}, description = "Outputs to screen even when an output file is specified") boolean outputToScreen = false; } @@ -115,13 +115,13 @@ static class FileMappingComposite { FileMapping mapping; static class TestOrSourcePath { - @Option(names="-source_path", required = true) + @Option(names = "-source_path", required = true) String sourcePath; - @Option(names="-test_path", required = true) + @Option(names = "-test_path", required = true) String testPath; String getPath() { - return ( isSourcePath() ) ? sourcePath : testPath; + return (isSourcePath()) ? sourcePath : testPath; } boolean isSourcePath() { @@ -130,28 +130,29 @@ boolean isSourcePath() { } static class FileMapping { - @Option(names="-owner") + @Option(names = "-owner") String owner; - @Option(names="-regex_expression") + @Option(names = "-regex_expression") String regexExpression; - @Option(names="-type_mapping") + @Option(names = "-type_mapping") String typeMapping; - @Option(names="-owner_subexpression") + @Option(names = "-owner_subexpression") Integer ownerSubExpression; - @Option(names="-type_subexpression") + @Option(names = "-type_subexpression") Integer typeSubExpression; - @Option(names="-name_subexpression") + @Option(names = "-name_subexpression") Integer nameSubExpression; } FileMapperConfig toFileMapperConfig() { - if ( mapping == null ) + if (mapping == null) { mapping = new FileMapping(); + } Map typeMap = new HashMap<>(); - if ( mapping.typeMapping != null && !mapping.typeMapping.isEmpty()) { - for ( String keyVal : mapping.typeMapping.split("/")) { + if (mapping.typeMapping != null && !mapping.typeMapping.isEmpty()) { + for (String keyVal : mapping.typeMapping.split("/")) { String[] values = keyVal.split("="); typeMap.put(values[1], values[0]); } @@ -175,10 +176,9 @@ FileMapperConfig toFileMapperConfig() { private RunAction runAction; private String[] splitOrEmpty(String value) { - if ( value == null || value.isEmpty() ) { + if (value == null || value.isEmpty()) { return new String[0]; - } - else { + } else { return value.split(","); } } @@ -186,34 +186,32 @@ private String[] splitOrEmpty(String value) { public RunCommandConfig getRunCommandConfig() { // Prepare path elements ArrayList suitePaths = new ArrayList<>(); - for ( String pathElem : paths ) { + for (String pathElem : paths) { suitePaths.addAll(Arrays.asList(pathElem.split(","))); } // Prepare LogLevelConfig LoggerConfiguration.ConfigLevel loggerConfigLevel = LoggerConfiguration.ConfigLevel.BASIC; - if ( logSilent ) { + if (logSilent) { loggerConfigLevel = LoggerConfiguration.ConfigLevel.NONE; - } - else if ( logDebug ) { + } else if (logDebug) { loggerConfigLevel = LoggerConfiguration.ConfigLevel.DEBUG; } // Prepare Reporter configs List reporterConfigs = new ArrayList<>(); - for ( Format format : reporters ) { + for (Format format : reporters) { reporterConfigs.add(new ReporterConfig(format.format, format.outputFile, format.outputToScreen)); } // Prepare TypeMappings FileMapperConfig sourceFileMapping = null; FileMapperConfig testFileMapping = null; - if ( fileMappings != null ) { - for ( FileMappingComposite fmc : fileMappings ) { - if ( fmc.testOrSourcePath.isSourcePath() ) { + if (fileMappings != null) { + for (FileMappingComposite fmc : fileMappings) { + if (fmc.testOrSourcePath.isSourcePath()) { sourceFileMapping = fmc.toFileMapperConfig(); - } - else { + } else { testFileMapping = fmc.toFileMapperConfig(); } } @@ -238,8 +236,9 @@ else if ( logDebug ) { } private RunAction getRunAction() { - if ( runAction == null ) + if (runAction == null) { runAction = new RunAction(getRunCommandConfig()); + } return runAction; } diff --git a/src/main/java/org/utplsql/cli/RunTestRunnerTask.java b/src/main/java/org/utplsql/cli/RunTestRunnerTask.java index 4a293c4..fc72c3d 100644 --- a/src/main/java/org/utplsql/cli/RunTestRunnerTask.java +++ b/src/main/java/org/utplsql/cli/RunTestRunnerTask.java @@ -13,8 +13,9 @@ import java.util.concurrent.Callable; import java.util.concurrent.Executors; -/** Runs the utPLSQL Test-Runner - * +/** + * Runs the utPLSQL Test-Runner + *

* Takes care of its connection. * In case of an OracleCreateStatementStuckException it will abort the connection, otherwise close it. * @@ -36,15 +37,15 @@ public class RunTestRunnerTask implements Callable { @Override public Boolean call() throws Exception { Connection conn = null; - try { + try { conn = dataSource.getConnection(); - if ( enableDmbsOutput ) DBHelper.enableDBMSOutput(conn); + if (enableDmbsOutput) DBHelper.enableDBMSOutput(conn); logger.info("Running tests now."); logger.info("--------------------------------------"); testRunner.run(conn); } catch (SomeTestsFailedException e) { throw e; - } catch (OracleCreateStatmenetStuckException e ) { + } catch (OracleCreateStatmenetStuckException e) { try { conn.abort(Executors.newSingleThreadExecutor()); conn = null; @@ -56,9 +57,9 @@ public Boolean call() throws Exception { System.out.println(e.getMessage()); throw e; } finally { - if ( conn != null ) { + if (conn != null) { try { - if ( enableDmbsOutput ) DBHelper.disableDBMSOutput(conn); + if (enableDmbsOutput) DBHelper.disableDBMSOutput(conn); conn.close(); } catch (SQLException e) { logger.error(e.getMessage(), e); diff --git a/src/main/java/org/utplsql/cli/UtplsqlPicocliCommand.java b/src/main/java/org/utplsql/cli/UtplsqlPicocliCommand.java index c616bf8..ca1b647 100644 --- a/src/main/java/org/utplsql/cli/UtplsqlPicocliCommand.java +++ b/src/main/java/org/utplsql/cli/UtplsqlPicocliCommand.java @@ -13,9 +13,9 @@ }) public class UtplsqlPicocliCommand { - public static final String COMMANDLINE_PARAM_DESCRIPTION = "/@//[:]/ OR /@ OR /@::"; + public static final String COMMANDLINE_PARAM_DESCRIPTION = "/@//[:]/ OR /@ OR /@::"; - @CommandLine.Option(names = "-h", usageHelp = true, description = "display this help and exit") - boolean help; + @CommandLine.Option(names = "-h", usageHelp = true, description = "display this help and exit") + boolean help; } diff --git a/src/main/java/org/utplsql/cli/VersionInfoCommand.java b/src/main/java/org/utplsql/cli/VersionInfoCommand.java index 20aafb4..f3b8378 100644 --- a/src/main/java/org/utplsql/cli/VersionInfoCommand.java +++ b/src/main/java/org/utplsql/cli/VersionInfoCommand.java @@ -12,7 +12,7 @@ import java.sql.Connection; import java.sql.SQLException; -@Command( name = "info", description = "prints version information of cli, java-api and - if connection is given - database utPLSQL framework") +@Command(name = "info", description = "prints version information of cli, java-api and - if connection is given - database utPLSQL framework") public class VersionInfoCommand implements ICommand { @Parameters(description = UtplsqlPicocliCommand.COMMANDLINE_PARAM_DESCRIPTION, arity = "0..1") @@ -25,8 +25,7 @@ public int run() { try { writeUtPlsqlVersion(connectionString); - } - catch (SQLException e) { + } catch (SQLException e) { e.printStackTrace(); return 1; } @@ -34,16 +33,15 @@ public int run() { return 0; } - private void writeUtPlsqlVersion( String connectString ) throws SQLException { - if ( connectString != null ) { + private void writeUtPlsqlVersion(String connectString) throws SQLException { + if (connectString != null) { DataSource dataSource = DataSourceProvider.getDataSource(connectString, 1); try (Connection con = dataSource.getConnection()) { Version v = new DefaultDatabaseInformation().getUtPlsqlFrameworkVersion(con); System.out.println("utPLSQL " + v.getNormalizedString()); - } - catch ( UtPLSQLNotInstalledException e ) { + } catch (UtPLSQLNotInstalledException e) { System.out.println(e.getMessage()); } } diff --git a/src/main/java/org/utplsql/cli/config/ReporterConfig.java b/src/main/java/org/utplsql/cli/config/ReporterConfig.java index 17fb973..e68d6ab 100644 --- a/src/main/java/org/utplsql/cli/config/ReporterConfig.java +++ b/src/main/java/org/utplsql/cli/config/ReporterConfig.java @@ -9,10 +9,10 @@ public class ReporterConfig { private boolean forceToScreen = false; @ConstructorProperties({"name", "output", "forceToScreen"}) - public ReporterConfig( String name, String output, Boolean forceToScreen) { + public ReporterConfig(String name, String output, Boolean forceToScreen) { this.name = name; this.output = output; - if ( forceToScreen != null ) this.forceToScreen = forceToScreen; + if (forceToScreen != null) this.forceToScreen = forceToScreen; } public String getName() { diff --git a/src/main/java/org/utplsql/cli/config/RunCommandConfig.java b/src/main/java/org/utplsql/cli/config/RunCommandConfig.java index cc5fd76..cbe2ab0 100644 --- a/src/main/java/org/utplsql/cli/config/RunCommandConfig.java +++ b/src/main/java/org/utplsql/cli/config/RunCommandConfig.java @@ -77,13 +77,23 @@ public FileMapperConfig getTestMapping() { return testMapping; } - public ConfigLevel getLogConfigLevel() { return logConfigLevel; } + public ConfigLevel getLogConfigLevel() { + return logConfigLevel; + } - public Integer getTimeoutInMinutes() { return timeoutInMinutes; } + public Integer getTimeoutInMinutes() { + return timeoutInMinutes; + } - public boolean isDbmsOutput() { return dbmsOutput; } + public boolean isDbmsOutput() { + return dbmsOutput; + } - public boolean isRandomTestOrder() { return randomTestOrder; } + public boolean isRandomTestOrder() { + return randomTestOrder; + } - public Integer getRandomTestOrderSeed() { return randomTestOrderSeed; } + public Integer getRandomTestOrderSeed() { + return randomTestOrderSeed; + } } diff --git a/src/main/java/org/utplsql/cli/datasource/TestedDataSourceProvider.java b/src/main/java/org/utplsql/cli/datasource/TestedDataSourceProvider.java index 96fb795..8c72c87 100644 --- a/src/main/java/org/utplsql/cli/datasource/TestedDataSourceProvider.java +++ b/src/main/java/org/utplsql/cli/datasource/TestedDataSourceProvider.java @@ -18,6 +18,7 @@ public class TestedDataSourceProvider { interface ConnectStringPossibility { String getConnectString(ConnectionConfig config); + String getMaskedConnectString(ConnectionConfig config); } @@ -46,8 +47,7 @@ public HikariDataSource getDataSource() throws SQLException { return ds; } - private void setThickOrThinJdbcUrl(HikariDataSource ds ) throws SQLException - { + private void setThickOrThinJdbcUrl(HikariDataSource ds) throws SQLException { List errors = new ArrayList<>(); Throwable lastException = null; @@ -69,25 +69,28 @@ private void setThickOrThinJdbcUrl(HikariDataSource ds ) throws SQLException throw new DatabaseConnectionFailed(lastException); } - private void setInitSqlFrom_NLS_LANG(HikariDataSource ds ) { + private void setInitSqlFrom_NLS_LANG(HikariDataSource ds) { String nls_lang = EnvironmentVariableUtil.getEnvValue("NLS_LANG"); - if ( nls_lang != null ) { + if (nls_lang != null) { Pattern pattern = Pattern.compile("^([a-zA-Z ]+)?_?([a-zA-Z ]+)?\\.?([a-zA-Z0-9]+)?$"); Matcher matcher = pattern.matcher(nls_lang); List sqlCommands = new ArrayList<>(2); if (matcher.matches()) { - if ( matcher.group(1) != null) + if (matcher.group(1) != null) { sqlCommands.add(String.format("ALTER SESSION SET NLS_LANGUAGE='%s'", matcher.group(1))); - if ( matcher.group(2) != null) + } + if (matcher.group(2) != null) { sqlCommands.add(String.format("ALTER SESSION SET NLS_TERRITORY='%s'", matcher.group(2))); + } - if ( sqlCommands.size() > 0 ) { + if (sqlCommands.size() > 0) { StringBuilder sb = new StringBuilder(); sb.append("BEGIN\n"); - for (String command : sqlCommands) + for (String command : sqlCommands) { sb.append(String.format("EXECUTE IMMEDIATE q'[%s]';\n", command)); + } sb.append("END;"); logger.debug("NLS settings: {}", sb.toString()); diff --git a/src/main/java/org/utplsql/cli/exception/DatabaseConnectionFailed.java b/src/main/java/org/utplsql/cli/exception/DatabaseConnectionFailed.java index 2a521cd..fe4bf96 100644 --- a/src/main/java/org/utplsql/cli/exception/DatabaseConnectionFailed.java +++ b/src/main/java/org/utplsql/cli/exception/DatabaseConnectionFailed.java @@ -4,7 +4,7 @@ public class DatabaseConnectionFailed extends SQLException { - public DatabaseConnectionFailed(Throwable cause ) { - super( "Could not establish connection to database. Reason: " + cause.getMessage(), cause); + public DatabaseConnectionFailed(Throwable cause) { + super("Could not establish connection to database. Reason: " + cause.getMessage(), cause); } } diff --git a/src/main/java/org/utplsql/cli/exception/ReporterTimeoutException.java b/src/main/java/org/utplsql/cli/exception/ReporterTimeoutException.java index 39ce2b1..5bfdbf9 100644 --- a/src/main/java/org/utplsql/cli/exception/ReporterTimeoutException.java +++ b/src/main/java/org/utplsql/cli/exception/ReporterTimeoutException.java @@ -4,7 +4,7 @@ public class ReporterTimeoutException extends Exception { private final int timeOutInMinutes; - public ReporterTimeoutException( int timeoutInMinutes ) { + public ReporterTimeoutException(int timeoutInMinutes) { super("Timeout while waiting for reporters to finish for " + timeoutInMinutes + " minutes"); this.timeOutInMinutes = timeoutInMinutes; } diff --git a/src/main/java/org/utplsql/cli/log/StringBlockFormatter.java b/src/main/java/org/utplsql/cli/log/StringBlockFormatter.java index beb82a9..370092c 100644 --- a/src/main/java/org/utplsql/cli/log/StringBlockFormatter.java +++ b/src/main/java/org/utplsql/cli/log/StringBlockFormatter.java @@ -5,7 +5,8 @@ public class StringBlockFormatter { private String headline; private final StringBuilder content = new StringBuilder(); - public StringBlockFormatter() {} + public StringBlockFormatter() { + } public StringBlockFormatter(String headline) { setHeadline(headline); @@ -19,40 +20,43 @@ public String getHeadline() { return headline; } - public void append( CharSequence seq ) { + public void append(CharSequence seq) { content.append(seq); } - public void appendLine( CharSequence seq ) { + public void appendLine(CharSequence seq) { content.append(seq).append("\n"); } - private int getMaxLength( String[] lines ) { + private int getMaxLength(String[] lines) { int len = 0; - for ( String line : lines ) { - if (line.length() > len) + for (String line : lines) { + if (line.length() > len) { len = line.length(); + } } - if ( headline.length() > (len+6)) + if (headline.length() > (len + 6)) { len = headline.length(); + } return len; } - public static String getEncapsulatedLine( String line, int maxLength ) { + public static String getEncapsulatedLine(String line, int maxLength) { return String.format("# %-" + maxLength + "s #", line); } - public static String getEncapsulatedHeadline( String headline, int maxLength ) { - String content = new String(new char[maxLength+8]).replace("\0", "#"); - if ( headline == null || headline.isEmpty() ) + public static String getEncapsulatedHeadline(String headline, int maxLength) { + String content = new String(new char[maxLength + 8]).replace("\0", "#"); + if (headline == null || headline.isEmpty()) { return content; + } headline = " " + headline + " "; - int start = (int)Math.floor( - (float)content.length()/2f - -(float)headline.length()/2f + int start = (int) Math.floor( + (float) content.length() / 2f + - (float) headline.length() / 2f ); int end = start + headline.length(); @@ -70,7 +74,7 @@ public String toString() { sb.append(getEncapsulatedHeadline(headline, maxLen)).append("\n"); sb.append(getEncapsulatedLine("", maxLen)).append("\n"); - for ( String line : lines ) { + for (String line : lines) { sb.append(getEncapsulatedLine(line, maxLen)).append("\n"); } sb.append(getEncapsulatedLine("", maxLen)).append("\n"); diff --git a/src/main/java/org/utplsql/cli/reporters/LocalAssetsCoverageHTMLReporter.java b/src/main/java/org/utplsql/cli/reporters/LocalAssetsCoverageHTMLReporter.java index 330d2cc..602ee7c 100644 --- a/src/main/java/org/utplsql/cli/reporters/LocalAssetsCoverageHTMLReporter.java +++ b/src/main/java/org/utplsql/cli/reporters/LocalAssetsCoverageHTMLReporter.java @@ -11,7 +11,8 @@ import java.sql.Connection; import java.sql.SQLException; -/** Simple replacement of the CoverageHTMLReporter which writes the necessary assets to a folder +/** + * Simple replacement of the CoverageHTMLReporter which writes the necessary assets to a folder * named after the Output File's name. * * @author pesse @@ -28,7 +29,7 @@ public LocalAssetsCoverageHTMLReporter(String selfType, Object[] attributes) { public Reporter init(Connection con, CompatibilityProxy compatibilityProxy, ReporterFactory reporterFactory) throws SQLException { super.init(con, compatibilityProxy, reporterFactory); - if ( hasOutputToFile() ) { + if (hasOutputToFile()) { writeReportAssetsTo(getPhysicalAssetPath()); } @@ -37,19 +38,20 @@ public Reporter init(Connection con, CompatibilityProxy compatibilityProxy, Repo private String getNameOfOutputFile() { Path outputPath = Paths.get(options.getOutputFileName()); - return outputPath.getName(outputPath.getNameCount()-1).toString(); + return outputPath.getName(outputPath.getNameCount() - 1).toString(); } private Path getPhysicalAssetPath() { Path outputPath = Paths.get(options.getOutputFileName()); - if ( outputPath.getNameCount() > 1 ) + if (outputPath.getNameCount() > 1) { return outputPath.getParent().resolve(getAssetsPath()); - else + } else { return Paths.get(getAssetsPath()); + } } private void setAssetsPathFromOptions() { - if ( hasOutputToFile() ) { + if (hasOutputToFile()) { setAssetsPath(getNameOfOutputFile() + "_assets/"); } } diff --git a/src/main/java/org/utplsql/cli/reporters/ReporterOptionsAware.java b/src/main/java/org/utplsql/cli/reporters/ReporterOptionsAware.java index a9c25b6..5236715 100644 --- a/src/main/java/org/utplsql/cli/reporters/ReporterOptionsAware.java +++ b/src/main/java/org/utplsql/cli/reporters/ReporterOptionsAware.java @@ -2,7 +2,8 @@ import org.utplsql.cli.ReporterOptions; -/** Reporters implementing this interface will get their specific ReporterOptions before initialization +/** + * Reporters implementing this interface will get their specific ReporterOptions before initialization * * @author pesse */ From a8acbb9122d17a736226e7e0a678a8dafd7f17d5 Mon Sep 17 00:00:00 2001 From: pesse Date: Wed, 19 Jun 2019 00:07:49 +0200 Subject: [PATCH 30/31] Add `-h` option to all commands and cover it with tests --- README.md | 12 +++++++- .../org/utplsql/cli/ReportersCommand.java | 4 +++ .../org/utplsql/cli/VersionInfoCommand.java | 4 +++ .../java/org/utplsql/cli/CliHelpTest.java | 30 +++++++++++++++++++ 4 files changed, 49 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 2afe7de..96b24ee 100644 --- a/README.md +++ b/README.md @@ -55,10 +55,20 @@ ALTER SESSION SET NLS_TERRITORY='AMERICA'; ``` ## Usage -Currently, utPLSQL-cli supports the following commands: +Currently, utPLSQL-cli supports the following sub-commands: - run - info - reporters +- help + +To get more info about a command, use +``` +utplsql -h +``` +Example: +``` +utplsql run -h +``` #### \ diff --git a/src/main/java/org/utplsql/cli/ReportersCommand.java b/src/main/java/org/utplsql/cli/ReportersCommand.java index f27bb33..257f2ca 100644 --- a/src/main/java/org/utplsql/cli/ReportersCommand.java +++ b/src/main/java/org/utplsql/cli/ReportersCommand.java @@ -7,6 +7,7 @@ import org.utplsql.api.reporter.inspect.ReporterInspector; import org.utplsql.cli.exception.DatabaseConnectionFailed; import picocli.CommandLine.Command; +import picocli.CommandLine.Option; import picocli.CommandLine.Parameters; import javax.sql.DataSource; @@ -22,6 +23,9 @@ public class ReportersCommand implements ICommand { @Parameters(description = UtplsqlPicocliCommand.COMMANDLINE_PARAM_DESCRIPTION, arity = "1") private String connectionString; + @Option(names = "-h", usageHelp = true, description = "display this help and exit") + boolean help; + @Override public int run() { diff --git a/src/main/java/org/utplsql/cli/VersionInfoCommand.java b/src/main/java/org/utplsql/cli/VersionInfoCommand.java index f3b8378..d6a40ea 100644 --- a/src/main/java/org/utplsql/cli/VersionInfoCommand.java +++ b/src/main/java/org/utplsql/cli/VersionInfoCommand.java @@ -6,6 +6,7 @@ import org.utplsql.api.db.DefaultDatabaseInformation; import org.utplsql.api.exception.UtPLSQLNotInstalledException; import picocli.CommandLine.Command; +import picocli.CommandLine.Option; import picocli.CommandLine.Parameters; import javax.sql.DataSource; @@ -18,6 +19,9 @@ public class VersionInfoCommand implements ICommand { @Parameters(description = UtplsqlPicocliCommand.COMMANDLINE_PARAM_DESCRIPTION, arity = "0..1") private String connectionString; + @Option(names = "-h", usageHelp = true, description = "display this help and exit") + boolean help; + public int run() { System.out.println(CliVersionInfo.getInfo()); diff --git a/src/test/java/org/utplsql/cli/CliHelpTest.java b/src/test/java/org/utplsql/cli/CliHelpTest.java index 89d3cf7..baaf25f 100644 --- a/src/test/java/org/utplsql/cli/CliHelpTest.java +++ b/src/test/java/org/utplsql/cli/CliHelpTest.java @@ -20,6 +20,36 @@ void show_basic_help_on_help_command() { assertTrue(output.contains("Usage:")); } + @Test + void show_help_for_run_command() { + capturer = new SystemCapturer.SystemOutCapturer(); + capturer.start(); + TestHelper.runApp("run", "-h"); + String output = capturer.stop(); + + assertTrue(output.contains("Usage:")); + } + + @Test + void show_help_for_reporters_command() { + capturer = new SystemCapturer.SystemOutCapturer(); + capturer.start(); + TestHelper.runApp("reporters", "-h"); + String output = capturer.stop(); + + assertTrue(output.contains("Usage:")); + } + + @Test + void show_help_for_info_command() { + capturer = new SystemCapturer.SystemOutCapturer(); + capturer.start(); + TestHelper.runApp("reporters", "-h"); + String output = capturer.stop(); + + assertTrue(output.contains("Usage:")); + } + @Test void write_help_to_error_out_on_unknown_command() { capturer = new SystemCapturer.SystemErrCapturer(); From 10bef7b04a89b75ff8cbf328c86e9d56f463cad7 Mon Sep 17 00:00:00 2001 From: pesse Date: Wed, 19 Jun 2019 00:11:25 +0200 Subject: [PATCH 31/31] Adjust documentation to reflect parameter changes --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 96b24ee..0d5b314 100644 --- a/README.md +++ b/README.md @@ -155,13 +155,13 @@ utplsql run "my/Username"/"myP@ssword"@connectstring -t=timeInMinutes - Sets the timeout in minutes after which the cli will abort. (--timeout) Default 60 --dbout - Enables DBMS_OUTPUT in the TestRunner-Session -(--dbms_output) Default: false +-D - Enables DBMS_OUTPUT in the TestRunner-Session +(--dbms_output) Default: false --random - Enables random order of test executions +-r - Enables random order of test executions (--random-test-order) Default: false --seed - Sets the seed to use for random test execution order. If set, it sets -random to true +-seed - Sets the seed to use for random test execution order. If set, it sets -random to true (--random-test-order-seed) ```