diff --git a/Foundation/org.egovframe.rte.fdl.string/src/main/java/org/egovframe/rte/fdl/string/EgovDateUtil.java b/Foundation/org.egovframe.rte.fdl.string/src/main/java/org/egovframe/rte/fdl/string/EgovDateUtil.java index 4c7bcb5f..7512277c 100755 --- a/Foundation/org.egovframe.rte.fdl.string/src/main/java/org/egovframe/rte/fdl/string/EgovDateUtil.java +++ b/Foundation/org.egovframe.rte.fdl.string/src/main/java/org/egovframe/rte/fdl/string/EgovDateUtil.java @@ -415,10 +415,23 @@ public static int getDayOfWeekCount(String from, String to, String yoil) throws int dayOfWeek = cd.get(Calendar.DAY_OF_WEEK); // 요일이 3자리이면 첫자리만 취한다. - if (yoil.length() == 3) { + if (yoil != null && yoil.length() == 3) { yoil = yoil.substring(0, 1); } + // 정규화된 요일이 유효 요일집합에 속하는지 검증한다. + // 미인식 요일이 들어오면 아래 while 루프가 영원히 일치하지 못해 무한루프에 빠지므로 사전에 차단한다. + boolean validYoil = false; + for (String s : sYoil) { + if (s.equals(yoil)) { + validYoil = true; + break; + } + } + if (!validYoil) { + throw new IllegalArgumentException("요일 인자는 [일, 월, 화, 수, 목, 금, 토] 또는 3자리 형식(예: 월요일)이어야 합니다. 입력값: " + yoil); + } + while (!sYoil[(dayOfWeek - 1) % 7].equals(yoil)) { dayOfWeek += 1; first++; diff --git a/Foundation/org.egovframe.rte.fdl.string/src/test/java/org/egovframe/rte/fdl/string/EgovDateUtilTest.java b/Foundation/org.egovframe.rte.fdl.string/src/test/java/org/egovframe/rte/fdl/string/EgovDateUtilTest.java index 90bad814..09c72a17 100755 --- a/Foundation/org.egovframe.rte.fdl.string/src/test/java/org/egovframe/rte/fdl/string/EgovDateUtilTest.java +++ b/Foundation/org.egovframe.rte.fdl.string/src/test/java/org/egovframe/rte/fdl/string/EgovDateUtilTest.java @@ -1,6 +1,7 @@ package org.egovframe.rte.fdl.string; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.Timeout; import org.junit.jupiter.api.extension.ExtendWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -9,6 +10,7 @@ import java.text.ParseException; import java.util.Calendar; import java.util.Date; +import java.util.concurrent.TimeUnit; import static org.junit.jupiter.api.Assertions.*; @@ -245,6 +247,35 @@ public void testDayOfWeekCount() throws Exception { assertEquals(52, EgovDateUtil.getDayOfWeekCount("20090101", "20091231", "토")); } + /** + * [Flow #-7-1] Negative Case : 미인식 요일이 입력되면 무한루프 대신 IllegalArgumentException 을 던진다. + * (수정 전에는 sYoil 집합에 없는 요일이 들어오면 while 루프가 영원히 종료되지 않아 무한루프에 빠졌다.) + * 무한루프 회귀를 막기 위해 timeout 을 건다. + */ + @Test + @Timeout(value = 5, unit = TimeUnit.SECONDS) + public void testDayOfWeekCountInvalidYoil() { + // 영문 입력(substring 후 "M") + assertThrows(IllegalArgumentException.class, + () -> EgovDateUtil.getDayOfWeekCount("20090301", "20090331", "Mon")); + + // length 2 입력("월요") + assertThrows(IllegalArgumentException.class, + () -> EgovDateUtil.getDayOfWeekCount("20090301", "20090331", "월요")); + + // 빈 문자열 + assertThrows(IllegalArgumentException.class, + () -> EgovDateUtil.getDayOfWeekCount("20090301", "20090331", "")); + + // 오타(3자리이지만 정규화 후 미인식) + assertThrows(IllegalArgumentException.class, + () -> EgovDateUtil.getDayOfWeekCount("20090301", "20090331", "ABC")); + + // null + assertThrows(IllegalArgumentException.class, + () -> EgovDateUtil.getDayOfWeekCount("20090301", "20090331", null)); + } + /** * [Flow #-8] Positive Case : 해당 문자열이 주어진 일자 형식을 준수하는지의 여부와 존재하는 날짜인지를 검사한다. */