From f078f4425a4f6575f2179cb8138e91d8f379ba8e Mon Sep 17 00:00:00 2001 From: Krishnan Mahadevan Date: Wed, 19 Jan 2022 23:03:58 +0530 Subject: [PATCH] Minor refactoring --- .../main/java/org/testng/util/Strings.java | 36 ++++++++----------- .../java/org/testng/reporters/XMLUtils.java | 4 +-- .../main/java/org/testng/internal/Yaml.java | 3 +- .../internal/annotations/IgnoreListener.java | 3 +- .../invokers/MethodInvocationHelper.java | 32 ++++++++++------- .../FailedInformationOnConsoleReporter.java | 15 ++++---- .../kotlin/org/testng/util/StringsTest.kt | 26 +++++++------- 7 files changed, 58 insertions(+), 61 deletions(-) diff --git a/testng-collections/src/main/java/org/testng/util/Strings.java b/testng-collections/src/main/java/org/testng/util/Strings.java index 57a72ba233..d4ce9c2b1d 100644 --- a/testng-collections/src/main/java/org/testng/util/Strings.java +++ b/testng-collections/src/main/java/org/testng/util/Strings.java @@ -1,6 +1,8 @@ package org.testng.util; import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; import org.testng.collections.Maps; public final class Strings { @@ -13,29 +15,29 @@ private Strings() { // because now this method is present in JDK11 as part of the JDK itself. // See // https://hg.openjdk.java.net/jdk/jdk/file/fc16b5f193c7/src/java.base/share/classes/java/lang/String.java#l2984 + /** @deprecated - This method stands deprecated as of TestNG 7.6.0 */ + @Deprecated public static String repeat(String text, int count) { - StringBuilder builder = new StringBuilder(); - for (int i = 0; i < count; i++) { - builder.append(text); - } - return builder.toString(); + return text.repeat(count); } public static boolean isNullOrEmpty(String string) { - return string == null || string.trim().isEmpty(); + return Optional.ofNullable(string).orElse("").trim().isEmpty(); } public static boolean isNotNullAndNotEmpty(String string) { - return !(isNullOrEmpty(string)); + return !isNullOrEmpty(string); } /** * @param string - The input String. * @return - Returns an empty string if the input String is null (or) empty, else it * returns back the input string. + * @deprecated - This method stands deprecated as of TestNG 7.6.0 */ + @Deprecated public static String getValueOrEmpty(String string) { - return isNotNullAndNotEmpty(string) ? string : ""; + return Optional.ofNullable(string).orElse(""); } private static final Map ESCAPE_HTML_MAP = Maps.newLinkedHashMap(); @@ -55,22 +57,12 @@ public static String escapeHtml(String text) { } public static String valueOf(Map m) { - StringBuilder result = new StringBuilder(); - for (Object o : m.values()) { - result.append(o).append(" "); - } - - return result.toString(); + return m.values().stream().map(Object::toString).collect(Collectors.joining(" ")); } + /** @deprecated - This is deprecated of TestNG 7.6.0 */ + @Deprecated public static String join(String delimiter, String[] parts) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < parts.length - 1; i++) { - sb.append(parts[i]).append(delimiter); - } - if (parts.length > 0) { - sb.append(parts[parts.length - 1]); - } - return sb.toString(); + return String.join(delimiter, parts); } } diff --git a/testng-core-api/src/main/java/org/testng/reporters/XMLUtils.java b/testng-core-api/src/main/java/org/testng/reporters/XMLUtils.java index 0340e474a6..6f29acdc64 100644 --- a/testng-core-api/src/main/java/org/testng/reporters/XMLUtils.java +++ b/testng-core-api/src/main/java/org/testng/reporters/XMLUtils.java @@ -3,9 +3,9 @@ import java.text.CharacterIterator; import java.text.StringCharacterIterator; import java.util.Map.Entry; +import java.util.Optional; import java.util.Properties; import javax.annotation.Nullable; -import org.testng.util.Strings; /** * Static helpers for XML. @@ -121,7 +121,7 @@ public static void xmlClose(IBuffer result, String indent, String tag, String co .append("") - .append(Strings.getValueOrEmpty(comment)) + .append(Optional.ofNullable(comment).orElse("")) .append(EOL); } diff --git a/testng-core/src/main/java/org/testng/internal/Yaml.java b/testng-core/src/main/java/org/testng/internal/Yaml.java index cd737972e1..ef5006e8b3 100644 --- a/testng-core/src/main/java/org/testng/internal/Yaml.java +++ b/testng-core/src/main/java/org/testng/internal/Yaml.java @@ -9,7 +9,6 @@ import java.util.function.Consumer; import org.testng.TestNGException; import org.testng.internal.objects.InstanceCreator; -import org.testng.util.Strings; import org.testng.xml.XmlClass; import org.testng.xml.XmlInclude; import org.testng.xml.XmlPackage; @@ -140,7 +139,7 @@ public static StringBuilder toYaml(XmlSuite suite) { /** Convert a XmlTest into YAML */ private static void toYaml(StringBuilder result, XmlTest t) { - String sp2 = Strings.repeat(" ", 2); + String sp2 = " ".repeat(2); result.append(" ").append("- name: ").append(t.getName()).append("\n"); maybeAdd(result, sp2, "junit", t.isJUnit(), XmlSuite.DEFAULT_JUNIT); diff --git a/testng-core/src/main/java/org/testng/internal/annotations/IgnoreListener.java b/testng-core/src/main/java/org/testng/internal/annotations/IgnoreListener.java index 66a9c992a0..8af2a78903 100644 --- a/testng-core/src/main/java/org/testng/internal/annotations/IgnoreListener.java +++ b/testng-core/src/main/java/org/testng/internal/annotations/IgnoreListener.java @@ -6,7 +6,6 @@ import org.testng.annotations.ITestAnnotation; import org.testng.annotations.Ignore; import org.testng.internal.reflect.ReflectionHelper; -import org.testng.util.Strings; public class IgnoreListener implements IAnnotationTransformer { @@ -77,7 +76,7 @@ private static Ignore findAnnotation(Package testPackage) { } String[] parts = testPackage.getName().split("\\."); String[] parentParts = Arrays.copyOf(parts, parts.length - 1); - String parentPackageName = Strings.join(".", parentParts); + String parentPackageName = String.join(".", parentParts); if (parentPackageName.isEmpty()) { return null; } diff --git a/testng-core/src/main/java/org/testng/internal/invokers/MethodInvocationHelper.java b/testng-core/src/main/java/org/testng/internal/invokers/MethodInvocationHelper.java index b1dab83b5e..d521aed39b 100644 --- a/testng-core/src/main/java/org/testng/internal/invokers/MethodInvocationHelper.java +++ b/testng-core/src/main/java/org/testng/internal/invokers/MethodInvocationHelper.java @@ -10,6 +10,7 @@ import java.util.Collection; import java.util.Iterator; import java.util.List; +import java.util.Optional; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; @@ -18,6 +19,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Consumer; import org.testng.IConfigurable; import org.testng.IConfigureCallBack; import org.testng.IHookCallBack; @@ -309,6 +311,12 @@ private static boolean invokeWithTimeoutWithNoExecutor( ITestResult testResult, IHookable hookable) { + Consumer failureMarker = + t -> { + testResult.setThrowable(t); + testResult.setStatus(ITestResult.FAILURE); + }; + InvokeMethodRunnable imr = new InvokeMethodRunnable(tm, instance, parameterValues, hookable, testResult); long startTime = System.currentTimeMillis(); @@ -339,29 +347,27 @@ private static boolean invokeWithTimeoutWithNoExecutor( if (notTimedout) { testResult.setStatus(ITestResult.SUCCESS); } else { - testResult.setThrowable(new ThreadTimeoutException(tm, realTimeOut)); - testResult.setStatus(ITestResult.FAILURE); + failureMarker.accept(new ThreadTimeoutException(tm, realTimeOut)); } return wasInvoked; + } catch (TestNotInvokedException e) { + failureMarker.accept(e.getCause()); + return wasInvoked; } catch (Exception ex) { - if (notTimedout && !interruptByMonitor.get()) { - Throwable e = ex.getCause(); + Throwable e = ex.getCause(); + boolean wasTimedOut = !(notTimedout && !interruptByMonitor.get()); + if (wasTimedOut) { + e = new ThreadTimeoutException(tm, realTimeOut); + } else { if (e instanceof TestNGRuntimeException) { e = e.getCause(); } - testResult.setThrowable(e); - } else { - if (!(ex instanceof TestNotInvokedException)) { - testResult.setThrowable(new ThreadTimeoutException(tm, realTimeOut)); - } } - testResult.setStatus(ITestResult.FAILURE); + failureMarker.accept(e); return wasInvoked; } finally { finished.set(true); - if (monitorThread != null && monitorThread.isAlive()) { - monitorThread.interrupt(); - } + Optional.ofNullable(monitorThread).filter(Thread::isAlive).ifPresent(Thread::interrupt); } } diff --git a/testng-core/src/test/java/org/testng/reporters/FailedInformationOnConsoleReporter.java b/testng-core/src/test/java/org/testng/reporters/FailedInformationOnConsoleReporter.java index 7dd946e198..4949225b40 100644 --- a/testng-core/src/test/java/org/testng/reporters/FailedInformationOnConsoleReporter.java +++ b/testng-core/src/test/java/org/testng/reporters/FailedInformationOnConsoleReporter.java @@ -9,7 +9,6 @@ import org.testng.ITestContext; import org.testng.ITestResult; import org.testng.internal.Utils; -import org.testng.util.Strings; import org.testng.xml.XmlSuite; public class FailedInformationOnConsoleReporter implements IReporter { @@ -35,30 +34,30 @@ private static void generateReport(String name, ISuiteResult suiteResult) { } if (hasFailedConfigs) { - System.err.println(Strings.repeat("=", 100)); + System.err.println("=".repeat(100)); System.err.println( "::::::Failed Configurations for Suite ::: [" + name + "] ::: Test name [" + ctx.getName() + "]::::::"); - System.err.println(Strings.repeat("=", 100)); + System.err.println("=".repeat(100)); failedConfigs.getAllResults().forEach(FailedInformationOnConsoleReporter::generateReport); - System.err.println(Strings.repeat("=", 100)); + System.err.println("=".repeat(100)); System.err.println("\n\n"); } if (hasFailedTests) { - System.err.println(Strings.repeat("=", 100)); + System.err.println("=".repeat(100)); System.err.println( "::::::Failed Tests for Suite ::: [" + name + "] ::: Test name [" + ctx.getName() + "]::::::"); - System.err.println(Strings.repeat("=", 100)); + System.err.println("=".repeat(100)); failedTests.getAllResults().forEach(FailedInformationOnConsoleReporter::generateReport); - System.err.println(Strings.repeat("=", 100)); + System.err.println("=".repeat(100)); System.err.println("\n\n"); } } @@ -76,6 +75,6 @@ private static void generateReport(ITestResult result) { builder.append("\nException:\n"); builder.append(Utils.shortStackTrace(throwable, false)); builder.append("\n\n"); - System.err.println(builder.toString()); + System.err.println(builder); } } diff --git a/testng-core/src/test/kotlin/org/testng/util/StringsTest.kt b/testng-core/src/test/kotlin/org/testng/util/StringsTest.kt index 923e70316b..78aecfd8fc 100644 --- a/testng-core/src/test/kotlin/org/testng/util/StringsTest.kt +++ b/testng-core/src/test/kotlin/org/testng/util/StringsTest.kt @@ -5,20 +5,22 @@ import org.testng.annotations.Test class StringsTest { @Test - fun joinEmptyArray() { - val emptyArray = arrayOf() - assertThat(Strings.join(",", emptyArray)).isEmpty() + fun testValueOf() { + val input = mapOf( + Pair("skill", "Kung-Fu"), + Pair("expertise-level", "Master"), + Pair("name", "Po") + ) + val expected = "Kung-Fu Master Po" + val actual = Strings.valueOf(input) + assertThat(actual).isEqualTo(expected) } @Test - fun joinArrayWithOneElement() { - val array = arrayOf("one") - assertThat(Strings.join(",", array)).isEqualTo("one") - } - - @Test - fun joinArrayWithTwoElements() { - val array = arrayOf("one", "two") - assertThat(Strings.join(",", array)).isEqualTo("one,two") + fun testEscapeHtml() { + val input = "&<>" + val expected = "&<>" + val actual = Strings.escapeHtml(input) + assertThat(actual).isEqualTo(expected) } }