diff --git a/samcli/commands/logs/logs_context.py b/samcli/commands/logs/logs_context.py index 46bffab3f2..92f666c6de 100644 --- a/samcli/commands/logs/logs_context.py +++ b/samcli/commands/logs/logs_context.py @@ -25,6 +25,12 @@ class InvalidTimestampError(UserException): """ +class TimeParseError(UserException): + """ + Used to throw if parsing of the given time string or UTC conversion is failed + """ + + def parse_time(time_str: str, property_name: str): """ Parse the time from the given string, convert to UTC, and return the datetime object @@ -47,14 +53,20 @@ def parse_time(time_str: str, property_name: str): InvalidTimestampError If the string cannot be parsed as a timestamp """ - if not time_str: - return None - - parsed = parse_date(time_str) - if not parsed: - raise InvalidTimestampError("Unable to parse the time provided by '{}'".format(property_name)) - - return to_utc(parsed) + try: + if not time_str: + return None + + parsed = parse_date(time_str) + if not parsed: + raise InvalidTimestampError(f"Unable to parse the time provided by '{property_name}'") + + return to_utc(parsed) + except InvalidTimestampError as ex: + raise ex + except Exception as ex: + LOG.error("Failed to parse given time information %s", time_str, exc_info=ex) + raise TimeParseError(f"Unable to parse the time information '{property_name}': '{time_str}'") from ex class ResourcePhysicalIdResolver: diff --git a/tests/unit/commands/logs/test_logs_context.py b/tests/unit/commands/logs/test_logs_context.py index 61e8f5052f..90d19377d6 100644 --- a/tests/unit/commands/logs/test_logs_context.py +++ b/tests/unit/commands/logs/test_logs_context.py @@ -47,6 +47,16 @@ def test_parse_time_raises_exception(self, parse_date_mock): self.assertEqual(str(ctx.exception), "Unable to parse the time provided by 'some prop'") + @patch("samcli.commands.logs.logs_context.parse_date") + def test_parse_time_internal_call_raises_exception(self, parse_date_mock): + given_input = "some time" + parse_date_mock.side_effect = ValueError("Invalid date time") + + with self.assertRaises(UserException) as ctx: + parse_time(given_input, "some prop") + + self.assertEqual(str(ctx.exception), "Unable to parse the time information 'some prop': 'some time'") + def test_parse_time_empty_time(self): result = parse_time(None, "some prop") self.assertIsNone(result)