Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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++;
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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.*;

Expand Down Expand Up @@ -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 : 해당 문자열이 주어진 일자 형식을 준수하는지의 여부와 존재하는 날짜인지를 검사한다.
*/
Expand Down