Skip to content

Commit a810e6f

Browse files
committed
fixed timezone parsing test to work with other jdks
1 parent 5b3cb79 commit a810e6f

1 file changed

Lines changed: 28 additions & 7 deletions

File tree

mail/src/test/scala/spinoco/protocol/mail/header/ReceivedSpec.scala

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,34 @@ object ReceivedSpec extends Properties("Received") {
4545
}
4646

4747
property("single-entry.non-rfc") = protect {
48-
49-
verify(
50-
"by filter0527p1iad2.sendgrid.net with SMTP id filter0527p1iad2-22563-5A8AD67A-5 2018-02-19 13:51:54.319416103 +0000 UTC"
51-
, Received("by filter0527p1iad2.sendgrid.net with SMTP id filter0527p1iad2-22563-5A8AD67A-5", ZonedDateTime.of(2018, 2, 19, 13, 51, 54, 319416103, ZoneId.of("UTC")))
52-
, "by filter0527p1iad2.sendgrid.net with SMTP id filter0527p1iad2-22563-5A8AD67A-5;\r\n Mon, 19 Feb 2018 13:51:54 +0000"
53-
)
54-
48+
// Note: This test uses custom timezone normalization instead of the standard verify() helper
49+
// because the input "+0000 UTC" is parsed as a named timezone (ZoneId.of("UTC") or ZoneId.of("Etc/UTC"))
50+
// which varies across JDK versions and system configurations, while other tests with "+0000 (UTC)"
51+
// format produce consistent ZoneOffset.UTC. To ensure cross-platform compatibility, we normalize
52+
// both the parsed and expected times to the same timezone representation for comparison.
53+
import scodec.bits.{BitVector, ByteVector}
54+
import scodec.{Attempt, DecodeResult}
55+
import org.scalacheck.Prop._
56+
57+
val encoded = "by filter0527p1iad2.sendgrid.net with SMTP id filter0527p1iad2-22563-5A8AD67A-5 2018-02-19 13:51:54.319416103 +0000 UTC"
58+
val expectedText = "by filter0527p1iad2.sendgrid.net with SMTP id filter0527p1iad2-22563-5A8AD67A-5"
59+
val expectedTime = ZonedDateTime.of(2018, 2, 19, 13, 51, 54, 319416103, ZoneOffset.UTC)
60+
val expectedEncoded = "by filter0527p1iad2.sendgrid.net with SMTP id filter0527p1iad2-22563-5A8AD67A-5;\r\n Mon, 19 Feb 2018 13:51:54 +0000"
61+
62+
val decoded = HeaderCodec.decode(ByteVector.view(encoded.getBytes).bits)
63+
64+
decoded match {
65+
case Attempt.Successful(DecodeResult(Received(text, time), BitVector.empty)) =>
66+
// Normalize both times to UTC offset for comparison to handle JDK timezone variations
67+
val normalizedActual = time.withZoneSameInstant(ZoneOffset.UTC)
68+
val normalizedExpected = expectedTime.withZoneSameInstant(ZoneOffset.UTC)
69+
70+
(text ?= expectedText) &&
71+
(normalizedActual ?= normalizedExpected) &&
72+
(HeaderCodec.encode(Received(expectedText, expectedTime)).map(_.bytes) ?= Attempt.Successful(ByteVector.view(expectedEncoded.getBytes)))
73+
case other =>
74+
falsified :| s"Expected successful decode but got: $other"
75+
}
5576
}
5677

5778
property("single-entry.non-rfc-date") = protect {

0 commit comments

Comments
 (0)