From 019b4f9cfb78d86129f831ba68ecd1c6df95a3d5 Mon Sep 17 00:00:00 2001 From: Vicky Bung Date: Tue, 22 Nov 2022 14:14:49 +0100 Subject: [PATCH 1/7] Added ConfigFailFast check for invalid dateTime configuration --- CHANGELOG.md | 1 + .../ie3/simona/config/ConfigFailFast.scala | 43 +++++++++++++------ .../simona/config/ConfigFailFastSpec.scala | 39 +++++++++++++++-- 3 files changed, 65 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 09faa85e68..2e355f15a4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -49,6 +49,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Adaption of abbreviations in PVModel and adjacent classes to naming convention [#326](https://github.com/ie3-institute/simona/issues/326) - Fixed Latex equations [#264](https://github.com/ie3-institute/simona/issues/264) - Documentation of the simulation configuration [#334](https://github.com/ie3-institute/simona/issues/334) +- Added ConfigFailFast check for invalid dateTime configuration [#344](https://github.com/ie3-institute/simona/issues/344) ### Fixed - Location of `vn_simona` test grid (was partially in Berlin and Dortmund) [#72](https://github.com/ie3-institute/simona/issues/72) diff --git a/src/main/scala/edu/ie3/simona/config/ConfigFailFast.scala b/src/main/scala/edu/ie3/simona/config/ConfigFailFast.scala index 3435ad5281..df14d4a77a 100644 --- a/src/main/scala/edu/ie3/simona/config/ConfigFailFast.scala +++ b/src/main/scala/edu/ie3/simona/config/ConfigFailFast.scala @@ -30,6 +30,8 @@ import edu.ie3.util.{StringUtils, TimeUtil} import tech.units.indriya.quantity.Quantities import tech.units.indriya.unit.Units +import java.time.ZonedDateTime +import java.time.format.DateTimeParseException import java.time.temporal.ChronoUnit import java.util.UUID import scala.util.{Failure, Success, Try} @@ -106,7 +108,7 @@ case object ConfigFailFast extends LazyLogging { def check(simonaConfig: SimonaConfig): Unit = { /* check date and time */ - checkDateTime(simonaConfig.simona.time) + checkTimeConfig(simonaConfig.simona.time) // check if the provided combinations of refSystems provided are valid val refSystems = simonaConfig.simona.gridConfig.refSystems @@ -203,24 +205,37 @@ case object ConfigFailFast extends LazyLogging { * @param timeConfig * the time config */ - private def checkDateTime( + private def checkTimeConfig( timeConfig: SimonaConfig.Simona.Time ): Unit = { - // check if the provided date/time values match the SimonaConstants definition for date/time - val timeAndDates = Map( - "simonaConfig.simona.time.startDateTime" -> timeConfig.startDateTime, - "simonaConfig.simona.time.endDateTime" -> timeConfig.endDateTime - ) - timeAndDates.foreach { case (configParameter, dateTimeString) => - Try { - TimeUtil.withDefaults.toZonedDateTime(dateTimeString) - }.getOrElse( + val startDate = createDateTime(timeConfig.startDateTime) + val endDate = createDateTime(timeConfig.endDateTime) + + if (startDate.isAfter(endDate)) + throw new InvalidConfigParameterException( + s"Invalid time configuration." + + s"Please ensure that the start time of the simulation is before the end time." + ) + } + + /** Check for valid dateTime string + * + * @param dateTimeString + * the dateTimeString that should be checked + */ + private def createDateTime( + dateTimeString: String + ): ZonedDateTime = { + try { + TimeUtil.withDefaults.toZonedDateTime(dateTimeString) + } catch { + case e: DateTimeParseException => throw new InvalidConfigParameterException( - s"Invalid dateTimeString for config parameter $configParameter: $dateTimeString. " + - s"Please ensure that your date/time parameter match the following pattern: ‘yyyy-MM-dd HH:mm:ss'" + s"Invalid dateTimeString: $dateTimeString. " + + s"Please ensure that your date/time parameter match the following pattern: ‘yyyy-MM-dd HH:mm:ss'", + e ) - ) } } diff --git a/src/test/scala/edu/ie3/simona/config/ConfigFailFastSpec.scala b/src/test/scala/edu/ie3/simona/config/ConfigFailFastSpec.scala index 3093cd1ab6..d77d656ad7 100644 --- a/src/test/scala/edu/ie3/simona/config/ConfigFailFastSpec.scala +++ b/src/test/scala/edu/ie3/simona/config/ConfigFailFastSpec.scala @@ -24,11 +24,11 @@ class ConfigFailFastSpec extends UnitSpec with ConfigTestData { "Validating the configs" when { "validating the simona config" when { "Checking date input" should { - val checkDateTime = PrivateMethod[Unit](Symbol("checkDateTime")) + val checkTimeConfig = PrivateMethod[Unit](Symbol("checkTimeConfig")) "let valid input pass" in { noException shouldBe thrownBy { - ConfigFailFast invokePrivate checkDateTime( + ConfigFailFast invokePrivate checkTimeConfig( new Time( "2020-06-18 13:41:00", None, @@ -41,7 +41,38 @@ class ConfigFailFastSpec extends UnitSpec with ConfigTestData { "identify invalid input" in { intercept[InvalidConfigParameterException] { - ConfigFailFast invokePrivate checkDateTime( + ConfigFailFast invokePrivate checkTimeConfig( + new Time( + "2020-06-18 13:41:00", + None, + "2020-07-18 13:41:00", + true + ) + ) + }.getMessage shouldBe "Invalid time configuration." + + "Please ensure that the start time of the simulation is before the end time." + } + } + + "Checking date string" should { + val createDateTime = PrivateMethod[Unit](Symbol("createDateTime")) + + "let valid input pass" in { + noException shouldBe thrownBy { + ConfigFailFast invokePrivate createDateTime( + new Time( + "2020-06-18 13:41:00", + None, + "2020-05-18 13:41:00", + true + ) + ) + } + } + + "identify invalid input" in { + intercept[InvalidConfigParameterException] { + ConfigFailFast invokePrivate createDateTime( new Time( "2020-06-18 13:41:00", None, @@ -49,7 +80,7 @@ class ConfigFailFastSpec extends UnitSpec with ConfigTestData { true ) ) - }.getMessage shouldBe "Invalid dateTimeString for config parameter simonaConfig.simona.time.startDateTime: total non-sense. Please " + + }.getMessage shouldBe "Invalid dateTimeString: total non-sense. Please " + "ensure that your date/time parameter match the following pattern: ‘yyyy-MM-dd HH:mm:ss'" } } From 8ba0ee03202a4a1019519f5781a0e02e0c703416 Mon Sep 17 00:00:00 2001 From: Vicky Bung Date: Tue, 22 Nov 2022 16:21:25 +0100 Subject: [PATCH 2/7] Updatet test input --- .../ie3/simona/config/ConfigFailFast.scala | 2 +- .../simona/config/ConfigFailFastSpec.scala | 23 ++++++++----------- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/src/main/scala/edu/ie3/simona/config/ConfigFailFast.scala b/src/main/scala/edu/ie3/simona/config/ConfigFailFast.scala index df14d4a77a..61eff35e13 100644 --- a/src/main/scala/edu/ie3/simona/config/ConfigFailFast.scala +++ b/src/main/scala/edu/ie3/simona/config/ConfigFailFast.scala @@ -232,7 +232,7 @@ case object ConfigFailFast extends LazyLogging { } catch { case e: DateTimeParseException => throw new InvalidConfigParameterException( - s"Invalid dateTimeString: $dateTimeString. " + + s"Invalid dateTimeString: $dateTimeString." + s"Please ensure that your date/time parameter match the following pattern: ‘yyyy-MM-dd HH:mm:ss'", e ) diff --git a/src/test/scala/edu/ie3/simona/config/ConfigFailFastSpec.scala b/src/test/scala/edu/ie3/simona/config/ConfigFailFastSpec.scala index d77d656ad7..cfb652540e 100644 --- a/src/test/scala/edu/ie3/simona/config/ConfigFailFastSpec.scala +++ b/src/test/scala/edu/ie3/simona/config/ConfigFailFastSpec.scala @@ -17,7 +17,7 @@ import edu.ie3.simona.exceptions.InvalidConfigParameterException import edu.ie3.simona.test.common.{ConfigTestData, UnitSpec} import edu.ie3.simona.util.ConfigUtil.{CsvConfigUtil, NotifierIdentifier} -import java.time.Duration +import java.time.{Duration, ZonedDateTime} import java.time.temporal.ChronoUnit class ConfigFailFastSpec extends UnitSpec with ConfigTestData { @@ -55,16 +55,14 @@ class ConfigFailFastSpec extends UnitSpec with ConfigTestData { } "Checking date string" should { - val createDateTime = PrivateMethod[Unit](Symbol("createDateTime")) + val createDateTime = + PrivateMethod[ZonedDateTime](Symbol("createDateTime")) "let valid input pass" in { noException shouldBe thrownBy { ConfigFailFast invokePrivate createDateTime( - new Time( - "2020-06-18 13:41:00", - None, - "2020-05-18 13:41:00", - true + ( + "2020-05-18 13:41:00" ) ) } @@ -73,15 +71,12 @@ class ConfigFailFastSpec extends UnitSpec with ConfigTestData { "identify invalid input" in { intercept[InvalidConfigParameterException] { ConfigFailFast invokePrivate createDateTime( - new Time( - "2020-06-18 13:41:00", - None, - "total non-sense", - true + ( + "total non-sense" ) ) - }.getMessage shouldBe "Invalid dateTimeString: total non-sense. Please " + - "ensure that your date/time parameter match the following pattern: ‘yyyy-MM-dd HH:mm:ss'" + }.getMessage shouldBe "Invalid dateTimeString: total non-sense." + + "Please ensure that your date/time parameter match the following pattern: ‘yyyy-MM-dd HH:mm:ss'" } } From 8b45c1bc35eeb53c0bb7b38a2070f9e284d09ba5 Mon Sep 17 00:00:00 2001 From: Vicky Bung Date: Sun, 27 Nov 2022 21:34:46 +0100 Subject: [PATCH 3/7] Corrections --- src/main/scala/edu/ie3/simona/config/ConfigFailFast.scala | 2 +- src/test/scala/edu/ie3/simona/config/ConfigFailFastSpec.scala | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/scala/edu/ie3/simona/config/ConfigFailFast.scala b/src/main/scala/edu/ie3/simona/config/ConfigFailFast.scala index 61eff35e13..144f299ebc 100644 --- a/src/main/scala/edu/ie3/simona/config/ConfigFailFast.scala +++ b/src/main/scala/edu/ie3/simona/config/ConfigFailFast.scala @@ -233,7 +233,7 @@ case object ConfigFailFast extends LazyLogging { case e: DateTimeParseException => throw new InvalidConfigParameterException( s"Invalid dateTimeString: $dateTimeString." + - s"Please ensure that your date/time parameter match the following pattern: ‘yyyy-MM-dd HH:mm:ss'", + s"Please ensure that your date/time parameter match the following pattern: 'yyyy-MM-dd HH:mm:ss'", e ) } diff --git a/src/test/scala/edu/ie3/simona/config/ConfigFailFastSpec.scala b/src/test/scala/edu/ie3/simona/config/ConfigFailFastSpec.scala index cfb652540e..7dcdce7148 100644 --- a/src/test/scala/edu/ie3/simona/config/ConfigFailFastSpec.scala +++ b/src/test/scala/edu/ie3/simona/config/ConfigFailFastSpec.scala @@ -39,7 +39,7 @@ class ConfigFailFastSpec extends UnitSpec with ConfigTestData { } } - "identify invalid input" in { + "identify invalid date or time configuration" in { intercept[InvalidConfigParameterException] { ConfigFailFast invokePrivate checkTimeConfig( new Time( @@ -76,7 +76,7 @@ class ConfigFailFastSpec extends UnitSpec with ConfigTestData { ) ) }.getMessage shouldBe "Invalid dateTimeString: total non-sense." + - "Please ensure that your date/time parameter match the following pattern: ‘yyyy-MM-dd HH:mm:ss'" + "Please ensure that your date/time parameter match the following pattern: 'yyyy-MM-dd HH:mm:ss'" } } From e15f09048d14ae1d038446df3d1e36660b530129 Mon Sep 17 00:00:00 2001 From: Vicky Bung Date: Sun, 27 Nov 2022 22:03:44 +0100 Subject: [PATCH 4/7] Update --- src/test/scala/edu/ie3/simona/config/ConfigFailFastSpec.scala | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/test/scala/edu/ie3/simona/config/ConfigFailFastSpec.scala b/src/test/scala/edu/ie3/simona/config/ConfigFailFastSpec.scala index 7dcdce7148..b3a6801cce 100644 --- a/src/test/scala/edu/ie3/simona/config/ConfigFailFastSpec.scala +++ b/src/test/scala/edu/ie3/simona/config/ConfigFailFastSpec.scala @@ -58,11 +58,13 @@ class ConfigFailFastSpec extends UnitSpec with ConfigTestData { val createDateTime = PrivateMethod[ZonedDateTime](Symbol("createDateTime")) + val dateTimeString: String = "2020-05-18 13:41:00" + "let valid input pass" in { noException shouldBe thrownBy { ConfigFailFast invokePrivate createDateTime( ( - "2020-05-18 13:41:00" + dateTimeString ) ) } From 6e6ce9299a3fd14cdcc308bda5ed20e4a87cf5d4 Mon Sep 17 00:00:00 2001 From: Vicky Bung Date: Tue, 24 Jan 2023 11:18:10 +0100 Subject: [PATCH 5/7] Update --- .../scala/edu/ie3/simona/config/ConfigFailFast.scala | 3 ++- .../edu/ie3/simona/config/ConfigFailFastSpec.scala | 11 ++++------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/main/scala/edu/ie3/simona/config/ConfigFailFast.scala b/src/main/scala/edu/ie3/simona/config/ConfigFailFast.scala index 144f299ebc..f6b23239e9 100644 --- a/src/main/scala/edu/ie3/simona/config/ConfigFailFast.scala +++ b/src/main/scala/edu/ie3/simona/config/ConfigFailFast.scala @@ -219,7 +219,8 @@ case object ConfigFailFast extends LazyLogging { ) } - /** Check for valid dateTime string + /** Check for valid dateTime string If a faulty dateTime string is passed, an + * InvalidConfigParameterException is thrown * * @param dateTimeString * the dateTimeString that should be checked diff --git a/src/test/scala/edu/ie3/simona/config/ConfigFailFastSpec.scala b/src/test/scala/edu/ie3/simona/config/ConfigFailFastSpec.scala index b3a6801cce..9e513ea37f 100644 --- a/src/test/scala/edu/ie3/simona/config/ConfigFailFastSpec.scala +++ b/src/test/scala/edu/ie3/simona/config/ConfigFailFastSpec.scala @@ -16,6 +16,7 @@ import edu.ie3.simona.config.SimonaConfig.{BaseCsvParams, ResultKafkaParams} import edu.ie3.simona.exceptions.InvalidConfigParameterException import edu.ie3.simona.test.common.{ConfigTestData, UnitSpec} import edu.ie3.simona.util.ConfigUtil.{CsvConfigUtil, NotifierIdentifier} +import edu.ie3.util.TimeUtil import java.time.{Duration, ZonedDateTime} import java.time.temporal.ChronoUnit @@ -63,19 +64,15 @@ class ConfigFailFastSpec extends UnitSpec with ConfigTestData { "let valid input pass" in { noException shouldBe thrownBy { ConfigFailFast invokePrivate createDateTime( - ( - dateTimeString - ) - ) + dateTimeString + ) shouldBe TimeUtil.withDefaults.toZonedDateTime(dateTimeString) } } "identify invalid input" in { intercept[InvalidConfigParameterException] { ConfigFailFast invokePrivate createDateTime( - ( - "total non-sense" - ) + "total non-sense" ) }.getMessage shouldBe "Invalid dateTimeString: total non-sense." + "Please ensure that your date/time parameter match the following pattern: 'yyyy-MM-dd HH:mm:ss'" From 78bb609781969d59f20153d37fa0afb76522d3a8 Mon Sep 17 00:00:00 2001 From: Vicky Bung Date: Tue, 24 Jan 2023 13:33:55 +0100 Subject: [PATCH 6/7] Update --- .../scala/edu/ie3/simona/config/ConfigFailFast.scala | 4 ++-- .../edu/ie3/simona/config/ConfigFailFastSpec.scala | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/scala/edu/ie3/simona/config/ConfigFailFast.scala b/src/main/scala/edu/ie3/simona/config/ConfigFailFast.scala index f6b23239e9..c1a07e22bf 100644 --- a/src/main/scala/edu/ie3/simona/config/ConfigFailFast.scala +++ b/src/main/scala/edu/ie3/simona/config/ConfigFailFast.scala @@ -219,8 +219,8 @@ case object ConfigFailFast extends LazyLogging { ) } - /** Check for valid dateTime string If a faulty dateTime string is passed, an - * InvalidConfigParameterException is thrown + /** Creates a ZonedDateTime from string If a faulty dateTime string is passed, + * an InvalidConfigParameterException is thrown * * @param dateTimeString * the dateTimeString that should be checked diff --git a/src/test/scala/edu/ie3/simona/config/ConfigFailFastSpec.scala b/src/test/scala/edu/ie3/simona/config/ConfigFailFastSpec.scala index 9e513ea37f..24d6e7781c 100644 --- a/src/test/scala/edu/ie3/simona/config/ConfigFailFastSpec.scala +++ b/src/test/scala/edu/ie3/simona/config/ConfigFailFastSpec.scala @@ -62,11 +62,11 @@ class ConfigFailFastSpec extends UnitSpec with ConfigTestData { val dateTimeString: String = "2020-05-18 13:41:00" "let valid input pass" in { - noException shouldBe thrownBy { - ConfigFailFast invokePrivate createDateTime( - dateTimeString - ) shouldBe TimeUtil.withDefaults.toZonedDateTime(dateTimeString) - } + + ConfigFailFast invokePrivate createDateTime( + dateTimeString + ) shouldBe TimeUtil.withDefaults.toZonedDateTime(dateTimeString) + } "identify invalid input" in { From 0967e881accd5db188e1d57e1e87729cf68755d1 Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Tue, 24 Jan 2023 16:42:00 +0100 Subject: [PATCH 7/7] Tiny improvements in ScalaDoc --- src/main/scala/edu/ie3/simona/config/ConfigFailFast.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/scala/edu/ie3/simona/config/ConfigFailFast.scala b/src/main/scala/edu/ie3/simona/config/ConfigFailFast.scala index c1a07e22bf..8c31bc5611 100644 --- a/src/main/scala/edu/ie3/simona/config/ConfigFailFast.scala +++ b/src/main/scala/edu/ie3/simona/config/ConfigFailFast.scala @@ -219,8 +219,8 @@ case object ConfigFailFast extends LazyLogging { ) } - /** Creates a ZonedDateTime from string If a faulty dateTime string is passed, - * an InvalidConfigParameterException is thrown + /** Creates a ZonedDateTime from String. If a faulty dateTime string is + * passed, an [[InvalidConfigParameterException]] is thrown * * @param dateTimeString * the dateTimeString that should be checked