diff --git a/README.md b/README.md index 8e397c3..ba9fe0f 100644 --- a/README.md +++ b/README.md @@ -182,6 +182,8 @@ utplsql run "my/Username"/"myP@ssword"@connectstring --coverage-schemes - A comma separated list of schemas on which coverage should be gathered Format: --coverage-schemes=schema1[,schema2[,schema3]] + +--ora-stuck-timeout - Sets a timeout around Reporter creation and retries when not ready after a while. 0 = no timeout. ``` Parameters -f, -o, -s are correlated. That is parameters -o and -s are controlling outputs for reporter specified by the preceding -f parameter. diff --git a/src/main/java/org/utplsql/cli/RunAction.java b/src/main/java/org/utplsql/cli/RunAction.java index d91108a..de1be33 100644 --- a/src/main/java/org/utplsql/cli/RunAction.java +++ b/src/main/java/org/utplsql/cli/RunAction.java @@ -166,7 +166,8 @@ TestRunner newTestRunner(List reporterList) { .randomTestOrder(config.isRandomTestOrder()) .randomTestOrderSeed(config.getRandomTestOrderSeed()) .addTags(Arrays.asList(config.getTags())) - .addCoverageSchemes(Arrays.asList(config.getCoverageSchemes())); + .addCoverageSchemes(Arrays.asList(config.getCoverageSchemes())) + .oraStuckTimeout(config.getOraStuckTimeout()); } private void outputMainInformation() { diff --git a/src/main/java/org/utplsql/cli/RunPicocliCommand.java b/src/main/java/org/utplsql/cli/RunPicocliCommand.java index a90ffd9..0bdf33c 100644 --- a/src/main/java/org/utplsql/cli/RunPicocliCommand.java +++ b/src/main/java/org/utplsql/cli/RunPicocliCommand.java @@ -183,6 +183,9 @@ FileMapperConfig toFileMapperConfig() { @Option(names = "-h", usageHelp = true, description = "display this help and exit") boolean help; + @Option(names = "--ora-stuck-timeout", description = "Sets a timeout around Reporter creation and retries when not ready after a while. 0 = no timeout.") + Integer oraStuckTimeout = 0; + private RunAction runAction; private String[] splitOrEmpty(String value) { @@ -245,6 +248,7 @@ public RunCommandConfig getRunCommandConfig() { .randomTestOrderSeed(randomTestOrderSeed) .tags(tags.toArray(new String[0])) .coverageSchemes(coverageSchemes.toArray(new String[0])) + .oraStuckTimeout(oraStuckTimeout) .create(); } diff --git a/src/main/java/org/utplsql/cli/config/RunCommandConfig.java b/src/main/java/org/utplsql/cli/config/RunCommandConfig.java index ea66ffd..218466b 100644 --- a/src/main/java/org/utplsql/cli/config/RunCommandConfig.java +++ b/src/main/java/org/utplsql/cli/config/RunCommandConfig.java @@ -23,9 +23,10 @@ public class RunCommandConfig extends ConnectionConfig { private final Integer randomTestOrderSeed; private final String[] tags; private final String[] coverageSchemes; + private final Integer oraStuckTimeout; - @ConstructorProperties({"connectString", "suitePaths", "reporters", "outputAnsiColor", "failureExitCode", "skipCompatibilityCheck", "includePackages", "excludePackages", "sourceMapping", "testMapping", "logConfigLevel", "timeoutInMinutes", "dbmsOutput", "randomTestOrder", "randomTestOrderSeed", "tags", "coverageSchemes"}) - 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, String[] tags, String[] coverageSchemes) { + @ConstructorProperties({"connectString", "suitePaths", "reporters", "outputAnsiColor", "failureExitCode", "skipCompatibilityCheck", "includePackages", "excludePackages", "sourceMapping", "testMapping", "logConfigLevel", "timeoutInMinutes", "dbmsOutput", "randomTestOrder", "randomTestOrderSeed", "tags", "coverageSchemes", "oraStuckTimeout"}) + 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, String[] tags, String[] coverageSchemes, Integer oraStuckTimeout) { super(connectString); this.suitePaths = suitePaths; this.reporters = reporters; @@ -43,6 +44,7 @@ public RunCommandConfig(String connectString, String[] suitePaths, ReporterConfi this.randomTestOrderSeed = randomTestOrderSeed; this.tags = tags; this.coverageSchemes = coverageSchemes; + this.oraStuckTimeout = oraStuckTimeout; } public String[] getSuitePaths() { @@ -109,6 +111,8 @@ public String[] getCoverageSchemes() { return coverageSchemes; } + public Integer getOraStuckTimeout() { return oraStuckTimeout; } + public static class Builder { private String connectString; @@ -128,6 +132,7 @@ public static class Builder { private Integer randomTestOrderSeed; private String[] tags = new String[0]; private String[] coverageSchemes = new String[0]; + private Integer oraStuckTimeout; public Builder connectString(String connectString) { this.connectString = connectString; @@ -214,8 +219,13 @@ public Builder coverageSchemes(String[] coverageSchemes) { return this; } + public Builder oraStuckTimeout(Integer oraStuckTimeout) { + this.oraStuckTimeout = oraStuckTimeout; + return this; + } + public RunCommandConfig create() { - return new RunCommandConfig(connectString, suitePaths, reporters, outputAnsiColor, failureExitCode, skipCompatibilityCheck, includePackages, excludePackages, sourceMapping, testMapping, logConfigLevel, timeoutInMinutes, dbmsOutput, randomTestOrder, randomTestOrderSeed, tags, coverageSchemes); + return new RunCommandConfig(connectString, suitePaths, reporters, outputAnsiColor, failureExitCode, skipCompatibilityCheck, includePackages, excludePackages, sourceMapping, testMapping, logConfigLevel, timeoutInMinutes, dbmsOutput, randomTestOrder, randomTestOrderSeed, tags, coverageSchemes, oraStuckTimeout); } } } diff --git a/src/test/java/org/utplsql/cli/RunCommandArgumentsTest.java b/src/test/java/org/utplsql/cli/RunCommandArgumentsTest.java index d280c2e..63be6e2 100644 --- a/src/test/java/org/utplsql/cli/RunCommandArgumentsTest.java +++ b/src/test/java/org/utplsql/cli/RunCommandArgumentsTest.java @@ -41,7 +41,8 @@ public void allArgumentsAreRecognized() { "-type_mapping=\"sql=PACKAGE BODY\"", "-owner_subexpression=0", "-type_subexpression=0", - "-name_subexpression=0" + "-name_subexpression=0", + "--ora-stuck-timeout=2" ); TestRunner testRunner = runCmd.newTestRunner(new ArrayList<>()); diff --git a/src/test/java/org/utplsql/cli/RunCommandConfigParamsArePassedToTestRunnerTest.java b/src/test/java/org/utplsql/cli/RunCommandConfigParamsArePassedToTestRunnerTest.java index b1b34d4..95d146a 100644 --- a/src/test/java/org/utplsql/cli/RunCommandConfigParamsArePassedToTestRunnerTest.java +++ b/src/test/java/org/utplsql/cli/RunCommandConfigParamsArePassedToTestRunnerTest.java @@ -8,6 +8,8 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.equalTo; +import static org.junit.jupiter.api.Assertions.assertTrue; public class RunCommandConfigParamsArePassedToTestRunnerTest { @@ -28,4 +30,13 @@ void coverageSchemes() { TestRunner testRunner = new RunAction(config).newTestRunner(new ArrayList<>()); assertThat( testRunner.getOptions().coverageSchemes, contains("schema1", "another_schema", "and-another-one") ); } + + @Test + void oraStuckTimeout() { + RunCommandConfig config = new RunCommandConfig.Builder() + .oraStuckTimeout(2) + .create(); + TestRunner testRunner = new RunAction(config).newTestRunner(new ArrayList<>()); + assertThat( testRunner.getOptions().oraStuckTimeout, equalTo(2) ); + } } diff --git a/src/test/java/org/utplsql/cli/RunCommandIT.java b/src/test/java/org/utplsql/cli/RunCommandIT.java index e6ac671..95effad 100644 --- a/src/test/java/org/utplsql/cli/RunCommandIT.java +++ b/src/test/java/org/utplsql/cli/RunCommandIT.java @@ -89,4 +89,14 @@ void run_withOutputButNoReporterDefined() throws Exception { assertValidReturnCode(result); } + + @Test + void run_withOraStuckTimeout() throws Exception { + int result = TestHelper.runApp("run", + TestHelper.getConnectionString(), + "--ora-stuck-timeout=2", + "--failure-exit-code=2"); + + assertValidReturnCode(result); + } } diff --git a/src/test/java/org/utplsql/cli/RunCommandIssue20IT.java b/src/test/java/org/utplsql/cli/RunCommandIssue20IT.java index 0976706..8162fc9 100644 --- a/src/test/java/org/utplsql/cli/RunCommandIssue20IT.java +++ b/src/test/java/org/utplsql/cli/RunCommandIssue20IT.java @@ -24,7 +24,8 @@ void runLoop() { IRunCommand runCmd = TestHelper.createRunCommand( TestHelper.getConnectionString(), "-p=TEST_BETWNSTR.normal_case", - "-f=ut_documentation_reporter"); + "-f=ut_documentation_reporter", + "--ora-stuck-timeout=3"); List reporterOptionsList = runCmd.getReporterOptionsList(); ReporterOptions reporterOptions1 = reporterOptionsList.get(0); assertEquals(CoreReporters.UT_DOCUMENTATION_REPORTER.name(), reporterOptions1.getReporterName());