From 860a8e23b299477402a2b5c5d639829bdcc5435f Mon Sep 17 00:00:00 2001 From: Mihaly Verhas Date: Thu, 4 Jun 2020 13:22:06 +0200 Subject: [PATCH 1/4] Added ExtensionConfigurationException to DefaultTimeZoneExtension --- .../jupiter/DefaultTimeZoneExtension.java | 5 ++ .../jupiter/RepeatFailedTest.java | 2 +- .../jupiter/DefaultTimeZoneTests.java | 47 ++++++++++++++++++- 3 files changed, 52 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/junitpioneer/jupiter/DefaultTimeZoneExtension.java b/src/main/java/org/junitpioneer/jupiter/DefaultTimeZoneExtension.java index bd24cd39f..ad05539ce 100644 --- a/src/main/java/org/junitpioneer/jupiter/DefaultTimeZoneExtension.java +++ b/src/main/java/org/junitpioneer/jupiter/DefaultTimeZoneExtension.java @@ -16,6 +16,7 @@ import org.junit.jupiter.api.extension.AfterEachCallback; import org.junit.jupiter.api.extension.BeforeAllCallback; import org.junit.jupiter.api.extension.BeforeEachCallback; +import org.junit.jupiter.api.extension.ExtensionConfigurationException; import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.api.extension.ExtensionContext.Namespace; import org.junit.jupiter.api.extension.ExtensionContext.Store; @@ -43,6 +44,10 @@ public void beforeEach(ExtensionContext context) { private void setDefaultTimeZone(Store store, DefaultTimeZone annotation) { storeDefaultTimeZone(store); TimeZone configuredTimeZone = TimeZone.getTimeZone(annotation.value()); + if (configuredTimeZone.equals(TimeZone.getTimeZone("GMT")) && !annotation.value().equals("GMT")) { + throw new ExtensionConfigurationException( + "@DefaultTimeZone not configured correctly. Could not find the specified TimeZone."); + } TimeZone.setDefault(configuredTimeZone); } diff --git a/src/main/java/org/junitpioneer/jupiter/RepeatFailedTest.java b/src/main/java/org/junitpioneer/jupiter/RepeatFailedTest.java index 3f165e4af..7470855de 100644 --- a/src/main/java/org/junitpioneer/jupiter/RepeatFailedTest.java +++ b/src/main/java/org/junitpioneer/jupiter/RepeatFailedTest.java @@ -62,7 +62,7 @@ public @interface RepeatFailedTest { /** - * Specifies how often the test is executed at most. + * Specifies how many times the test is executed at most. */ int value(); diff --git a/src/test/java/org/junitpioneer/jupiter/DefaultTimeZoneTests.java b/src/test/java/org/junitpioneer/jupiter/DefaultTimeZoneTests.java index 88a201729..6c872885d 100644 --- a/src/test/java/org/junitpioneer/jupiter/DefaultTimeZoneTests.java +++ b/src/test/java/org/junitpioneer/jupiter/DefaultTimeZoneTests.java @@ -11,7 +11,9 @@ package org.junitpioneer.jupiter; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.fail; import static org.junitpioneer.testkit.PioneerTestKit.executeTestClass; +import static org.junitpioneer.testkit.PioneerTestKit.executeTestMethod; import java.util.TimeZone; @@ -22,6 +24,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtensionConfigurationException; import org.junitpioneer.testkit.ExecutionResults; @DisplayName("DefaultTimeZone extension") @@ -60,6 +63,18 @@ void doesNothingWhenAnnotationNotPresent() { assertThat(TimeZone.getDefault()).isEqualTo(TEST_DEFAULT_TIMEZONE); } + @Test + @DisplayName("throws exception on bad configuration") + void throwsWhenConfigurationIsBad() { + ExecutionResults results = executeTestMethod(BadMethodLevelConfigurationTestCase.class, "badConfiguration"); + + assertThat(results.numberOfFailedTests()).isEqualTo(1); + assertThat(results.firstFailuresThrowable()).isExactlyInstanceOf(ExtensionConfigurationException.class); + assertThat(results.firstFailuresThrowableMessage()) + .doesNotContain("should never execute") + .contains("@DefaultTimeZone not configured correctly."); + } + @DefaultTimeZone("CET") @Test @DisplayName("sets the default time zone using an abbreviation") @@ -86,13 +101,23 @@ void setUp() { } @Test - @DisplayName("should execute tests with configured TimeZone") + @DisplayName("executes tests with configured TimeZone") void shouldExecuteTestsWithConfiguredTimeZone() { ExecutionResults results = executeTestClass(ClassLevelTestCase.class); assertThat(results.numberOfSucceededTests()).isEqualTo(2); } + @Test + @DisplayName("throws when configuration is bad") + void shouldThrowWithBadConfiguration() { + ExecutionResults results = executeTestClass(BadClassLevelConfigurationTestCase.class); + + assertThat(results.numberOfStartedTests()).isEqualTo(0); + assertThat(results.firstFailuresThrowable()).isExactlyInstanceOf(ExtensionConfigurationException.class); + assertThat(results.firstFailuresThrowableMessage()).contains("@DefaultTimeZone not configured correctly."); + } + @AfterEach void tearDown() { assertThat(TimeZone.getDefault()).isEqualTo(TEST_DEFAULT_TIMEZONE); @@ -155,4 +180,24 @@ public void shouldSetTimeZoneFromMethodOfNestedClass() { } + static class BadMethodLevelConfigurationTestCase { + + @DefaultTimeZone("Gibberish") + @Test + void badConfiguration() { + fail("This test should never execute"); + } + + } + + @DefaultTimeZone("Gibberish") + static class BadClassLevelConfigurationTestCase { + + @Test + void badConfiguration() { + fail("This test should never execute"); + } + + } + } From 812f665504032250a177fcf82d503b0472003b88 Mon Sep 17 00:00:00 2001 From: Mihaly Verhas Date: Fri, 19 Jun 2020 15:45:40 +0200 Subject: [PATCH 2/4] Revert comment change, added explanation comment (as requested) --- .../java/org/junitpioneer/jupiter/DefaultTimeZoneExtension.java | 1 + src/main/java/org/junitpioneer/jupiter/RepeatFailedTest.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/junitpioneer/jupiter/DefaultTimeZoneExtension.java b/src/main/java/org/junitpioneer/jupiter/DefaultTimeZoneExtension.java index ad05539ce..b5ecdcba7 100644 --- a/src/main/java/org/junitpioneer/jupiter/DefaultTimeZoneExtension.java +++ b/src/main/java/org/junitpioneer/jupiter/DefaultTimeZoneExtension.java @@ -44,6 +44,7 @@ public void beforeEach(ExtensionContext context) { private void setDefaultTimeZone(Store store, DefaultTimeZone annotation) { storeDefaultTimeZone(store); TimeZone configuredTimeZone = TimeZone.getTimeZone(annotation.value()); + // TimeZone::getTimeZone returns with GMT as fallback if the given ID cannot be understood if (configuredTimeZone.equals(TimeZone.getTimeZone("GMT")) && !annotation.value().equals("GMT")) { throw new ExtensionConfigurationException( "@DefaultTimeZone not configured correctly. Could not find the specified TimeZone."); diff --git a/src/main/java/org/junitpioneer/jupiter/RepeatFailedTest.java b/src/main/java/org/junitpioneer/jupiter/RepeatFailedTest.java index 7470855de..f71bcb5f0 100644 --- a/src/main/java/org/junitpioneer/jupiter/RepeatFailedTest.java +++ b/src/main/java/org/junitpioneer/jupiter/RepeatFailedTest.java @@ -62,7 +62,7 @@ public @interface RepeatFailedTest { /** - * Specifies how many times the test is executed at most. + * Specifies often times the test is executed at most. */ int value(); From 5475fd578aae743780124312cf769df23376a796 Mon Sep 17 00:00:00 2001 From: Mihaly Verhas Date: Fri, 19 Jun 2020 16:01:29 +0200 Subject: [PATCH 3/4] Improve code coverage, fix embarrassing typo mistake --- .../jupiter/RepeatFailedTest.java | 2 +- .../jupiter/DefaultTimeZoneTests.java | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/junitpioneer/jupiter/RepeatFailedTest.java b/src/main/java/org/junitpioneer/jupiter/RepeatFailedTest.java index f71bcb5f0..3f165e4af 100644 --- a/src/main/java/org/junitpioneer/jupiter/RepeatFailedTest.java +++ b/src/main/java/org/junitpioneer/jupiter/RepeatFailedTest.java @@ -62,7 +62,7 @@ public @interface RepeatFailedTest { /** - * Specifies often times the test is executed at most. + * Specifies how often the test is executed at most. */ int value(); diff --git a/src/test/java/org/junitpioneer/jupiter/DefaultTimeZoneTests.java b/src/test/java/org/junitpioneer/jupiter/DefaultTimeZoneTests.java index 6c872885d..2282e2d7c 100644 --- a/src/test/java/org/junitpioneer/jupiter/DefaultTimeZoneTests.java +++ b/src/test/java/org/junitpioneer/jupiter/DefaultTimeZoneTests.java @@ -75,6 +75,13 @@ void throwsWhenConfigurationIsBad() { .contains("@DefaultTimeZone not configured correctly."); } + @DefaultTimeZone("GMT") + @Test + @DisplayName("does not throw when explicitly set to GMT") + void doesNotThrowForExplicitGmt() { + assertThat(TimeZone.getDefault()).isEqualTo(TimeZone.getTimeZone("GMT")); + } + @DefaultTimeZone("CET") @Test @DisplayName("sets the default time zone using an abbreviation") @@ -118,6 +125,14 @@ void shouldThrowWithBadConfiguration() { assertThat(results.firstFailuresThrowableMessage()).contains("@DefaultTimeZone not configured correctly."); } + @Test + @DisplayName("does not throw when explicitly set to GMT") + void shouldNotThrowForExplicitGmt() { + ExecutionResults results = executeTestClass(ExplicitGmtClassLevelTestCase.class); + + assertThat(results.numberOfSucceededTests()).isEqualTo(1); + } + @AfterEach void tearDown() { assertThat(TimeZone.getDefault()).isEqualTo(TEST_DEFAULT_TIMEZONE); @@ -200,4 +215,14 @@ void badConfiguration() { } + @DefaultTimeZone("GMT") + static class ExplicitGmtClassLevelTestCase { + + @Test + void explicitGmt() { + assertThat(TimeZone.getDefault()).isEqualTo(TimeZone.getTimeZone("GMT")); + } + + } + } From 09cee25f3b5a8769ecc3e8f4cfaa6698d6dc1e3f Mon Sep 17 00:00:00 2001 From: Nicolai Parlog Date: Sat, 20 Jun 2020 12:49:34 +0200 Subject: [PATCH 4/4] Improve error message for invalid time zone ID --- .../jupiter/DefaultTimeZoneExtension.java | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/junitpioneer/jupiter/DefaultTimeZoneExtension.java b/src/main/java/org/junitpioneer/jupiter/DefaultTimeZoneExtension.java index b5ecdcba7..a18690af1 100644 --- a/src/main/java/org/junitpioneer/jupiter/DefaultTimeZoneExtension.java +++ b/src/main/java/org/junitpioneer/jupiter/DefaultTimeZoneExtension.java @@ -43,13 +43,21 @@ public void beforeEach(ExtensionContext context) { private void setDefaultTimeZone(Store store, DefaultTimeZone annotation) { storeDefaultTimeZone(store); - TimeZone configuredTimeZone = TimeZone.getTimeZone(annotation.value()); + String timeZoneId = annotation.value(); + TimeZone.setDefault(getTimeZone(timeZoneId)); + } + + private TimeZone getTimeZone(String timeZoneId) { + TimeZone configuredTimeZone = TimeZone.getTimeZone(timeZoneId); // TimeZone::getTimeZone returns with GMT as fallback if the given ID cannot be understood - if (configuredTimeZone.equals(TimeZone.getTimeZone("GMT")) && !annotation.value().equals("GMT")) { - throw new ExtensionConfigurationException( - "@DefaultTimeZone not configured correctly. Could not find the specified TimeZone."); + if (configuredTimeZone.equals(TimeZone.getTimeZone("GMT")) && !timeZoneId.equals("GMT")) { + throw new ExtensionConfigurationException(String + .format("@DefaultTimeZone not configured correctly. " + + "Could not find the specified time zone + '%s'. " + + "Please use correct identifiers, e.g. \"GMT\" for Greenwich Mean Time.", + timeZoneId)); } - TimeZone.setDefault(configuredTimeZone); + return configuredTimeZone; } private void storeDefaultTimeZone(Store store) {