Skip to content

Thread safety regression in AbstractDateAssert #3873

@kelunik

Description

@kelunik

Describe the bug

97b642a breaks thread safety of AbstractDateAssert by removing synchronized (DEFAULT_DATE_FORMATS) {. The introduced synchronized on the method doesn't work if there are multiple instances because defaultDateFormats is static.

  • assertj core version: 3.27.3
  • java version: 21.0.8
  • test framework version: junit 5.13.4
  • os (if relevant): not relevant

Test case reproducing the bug

Add a test case showing the bug that we can run

assertThat(someDate).isNotNull().isEqualTo("2022-01-08");

Run with:

-Djunit.jupiter.execution.parallel.enabled=true
-Djunit.jupiter.execution.parallel.mode.default=concurrent
-Djunit.jupiter.execution.parallel.mode.classes.default=concurrent

The exceptions seen vary:

java.lang.NumberFormatException: For input string: ".11E11E1"

	at java.base/jdk.internal.math.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2054)
	at java.base/jdk.internal.math.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
	at java.base/java.lang.Double.parseDouble(Double.java:792)
	at java.base/java.text.DigitList.getDouble(DigitList.java:164)
	at java.base/java.text.DecimalFormat.parse(DecimalFormat.java:2233)
	at java.base/java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1937)
	at java.base/java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1545)
	at java.base/java.text.DateFormat.parse(DateFormat.java:397)
	at org.assertj.core.api.AbstractDateAssert.parseDateWith(AbstractDateAssert.java:3616)
	at org.assertj.core.api.AbstractDateAssert.parseDateWithDefaultDateFormats(AbstractDateAssert.java:3604)
	at org.assertj.core.api.AbstractDateAssert.parse(AbstractDateAssert.java:3596)
	at org.assertj.core.api.AbstractDateAssert.isEqualTo(AbstractDateAssert.java:164)
java.lang.NumberFormatException: For input string: ""

	at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67)
	at java.base/java.lang.Long.parseLong(Long.java:719)
	at java.base/java.lang.Long.parseLong(Long.java:832)
	at java.base/java.text.DigitList.getLong(DigitList.java:196)
	at java.base/java.text.DecimalFormat.parse(DecimalFormat.java:2228)
	at java.base/java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1937)
	at java.base/java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1545)
	at java.base/java.text.DateFormat.parse(DateFormat.java:397)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions