From f14d7c64c30ba28f85005ea8653d63434f62fa25 Mon Sep 17 00:00:00 2001 From: Justin Lu Date: Tue, 25 Feb 2025 14:47:33 -0800 Subject: [PATCH 1/3] init --- .../classes/java/util/JapaneseImperialCalendar.java | 9 ++++++++- test/jdk/java/util/Calendar/Builder/BuilderTest.java | 10 ++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/java.base/share/classes/java/util/JapaneseImperialCalendar.java b/src/java.base/share/classes/java/util/JapaneseImperialCalendar.java index d275b09834ab8..2c1565f24207f 100644 --- a/src/java.base/share/classes/java/util/JapaneseImperialCalendar.java +++ b/src/java.base/share/classes/java/util/JapaneseImperialCalendar.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1856,6 +1856,13 @@ protected void computeTime() { if (isSet(ERA)) { era = internalGet(ERA); + // Don't check under, historically we have allowed values under + // BEFORE_MEIJI to be ignored during normalization + // We check against eras.length over Reiwa ERA due to possibility + // of additional eras via "jdk.calendar.japanese.supplemental.era" + if (era >= eras.length) { + throw new IllegalArgumentException("Invalid era"); + } year = isSet(YEAR) ? internalGet(YEAR) : 1; } else { if (isSet(YEAR)) { diff --git a/test/jdk/java/util/Calendar/Builder/BuilderTest.java b/test/jdk/java/util/Calendar/Builder/BuilderTest.java index d74c38c067ac4..4c06cd9073d48 100644 --- a/test/jdk/java/util/Calendar/Builder/BuilderTest.java +++ b/test/jdk/java/util/Calendar/Builder/BuilderTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,8 +23,9 @@ /* * @test - * @bug 4745761 + * @bug 4745761 8350646 * @summary Unit test for Calendar.Builder. + * @run main BuilderTest */ import java.time.LocalDateTime; @@ -245,6 +246,11 @@ private static void testExceptions() { checkException(calb, IllegalArgumentException.class); calb = builder().setCalendarType("japanese").setWeekDate(2013, 1, MONDAY); checkException(calb, IllegalArgumentException.class); + // JDK-8350646 : Ensure IAE (instead of AIOOBE) for ERA over REIWA + calb = builder().setCalendarType("japanese").setFields(ERA, 6); + checkException(calb, IllegalArgumentException.class); + // Note that we don't check ERAs under BEFORE_MEIJI, i.e. -1, -2, ... as + // historically JapaneseImperialCalendar ignores such values when normalizing } private static Calendar.Builder builder() { From e55053aa92d735ec44844b426ebd8996eb24317f Mon Sep 17 00:00:00 2001 From: Justin Lu Date: Wed, 26 Feb 2025 09:56:24 -0800 Subject: [PATCH 2/3] Naoto - correct comment regarding REIWA, add test case for IAE check w/ additional era via sys prop --- .../java/util/JapaneseImperialCalendar.java | 5 +++-- .../util/Calendar/Builder/BuilderTest.java | 2 +- .../Calendar/SupplementalJapaneseEraTest.java | 18 +++++++++++++++++- .../SupplementalJapaneseEraTestRun.java | 4 ++-- 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/java.base/share/classes/java/util/JapaneseImperialCalendar.java b/src/java.base/share/classes/java/util/JapaneseImperialCalendar.java index 2c1565f24207f..755fe1133f5da 100644 --- a/src/java.base/share/classes/java/util/JapaneseImperialCalendar.java +++ b/src/java.base/share/classes/java/util/JapaneseImperialCalendar.java @@ -1858,8 +1858,9 @@ protected void computeTime() { era = internalGet(ERA); // Don't check under, historically we have allowed values under // BEFORE_MEIJI to be ignored during normalization - // We check against eras.length over Reiwa ERA due to possibility - // of additional eras via "jdk.calendar.japanese.supplemental.era" + // We check against eras.length (not the highest constant ERA value) + // due to future added eras, or additional eras via + // "jdk.calendar.japanese.supplemental.era" if (era >= eras.length) { throw new IllegalArgumentException("Invalid era"); } diff --git a/test/jdk/java/util/Calendar/Builder/BuilderTest.java b/test/jdk/java/util/Calendar/Builder/BuilderTest.java index 4c06cd9073d48..34fab9204ed52 100644 --- a/test/jdk/java/util/Calendar/Builder/BuilderTest.java +++ b/test/jdk/java/util/Calendar/Builder/BuilderTest.java @@ -246,7 +246,7 @@ private static void testExceptions() { checkException(calb, IllegalArgumentException.class); calb = builder().setCalendarType("japanese").setWeekDate(2013, 1, MONDAY); checkException(calb, IllegalArgumentException.class); - // JDK-8350646 : Ensure IAE (instead of AIOOBE) for ERA over REIWA + // JDK-8350646 : Ensure IAE (instead of AIOOBE) for ERA over largest supported calb = builder().setCalendarType("japanese").setFields(ERA, 6); checkException(calb, IllegalArgumentException.class); // Note that we don't check ERAs under BEFORE_MEIJI, i.e. -1, -2, ... as diff --git a/test/jdk/java/util/Calendar/SupplementalJapaneseEraTest.java b/test/jdk/java/util/Calendar/SupplementalJapaneseEraTest.java index 010519dc89e1f..4f6313e89ebe1 100644 --- a/test/jdk/java/util/Calendar/SupplementalJapaneseEraTest.java +++ b/test/jdk/java/util/Calendar/SupplementalJapaneseEraTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -67,6 +67,22 @@ public static void main(String[] args) { } private static void testProperty() { + // JDK-8350646: Ensure that IAE is thrown for out of range era, when + // additional era is defined + try { + new Calendar.Builder() + .setCalendarType("japanese") + .setFields(ERA, 7) + .build(); + System.err.println("Out of range era should have thrown IAE"); + errors++; + } catch (Exception e) { + if (!(e instanceof IllegalArgumentException)) { + System.err.printf("Out of range era threw \"%s\" instead of IAE\n", e); + errors++; + } + } + Calendar jcal = new Calendar.Builder() .setCalendarType("japanese") .setFields(ERA, 6, YEAR, 1, DAY_OF_YEAR, 1) diff --git a/test/jdk/java/util/Calendar/SupplementalJapaneseEraTestRun.java b/test/jdk/java/util/Calendar/SupplementalJapaneseEraTestRun.java index 5383d0d124055..8eac4a97ef700 100644 --- a/test/jdk/java/util/Calendar/SupplementalJapaneseEraTestRun.java +++ b/test/jdk/java/util/Calendar/SupplementalJapaneseEraTestRun.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,7 +23,7 @@ /* * @test - * @bug 8048123 8054214 8173423 + * @bug 8048123 8054214 8173423 8350646 * @summary Test for jdk.calendar.japanese.supplemental.era support * @library /test/lib * @build SupplementalJapaneseEraTest From 53a2e3ffdd610b835ba3b8310bcbce1bd37e70d7 Mon Sep 17 00:00:00 2001 From: Justin Lu Date: Wed, 26 Feb 2025 11:43:54 -0800 Subject: [PATCH 3/3] Replace 7 w/ more meaningful value --- test/jdk/java/util/Calendar/SupplementalJapaneseEraTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/jdk/java/util/Calendar/SupplementalJapaneseEraTest.java b/test/jdk/java/util/Calendar/SupplementalJapaneseEraTest.java index 4f6313e89ebe1..411fc528dceef 100644 --- a/test/jdk/java/util/Calendar/SupplementalJapaneseEraTest.java +++ b/test/jdk/java/util/Calendar/SupplementalJapaneseEraTest.java @@ -72,7 +72,7 @@ private static void testProperty() { try { new Calendar.Builder() .setCalendarType("japanese") - .setFields(ERA, 7) + .setFields(ERA, JapaneseEra.values().length + 2) .build(); System.err.println("Out of range era should have thrown IAE"); errors++;