package com.eactive.eai.manage.inflow; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; import java.util.List; import org.junit.jupiter.api.Test; import com.eactive.eai.common.inflow.InflowTargetVO; import com.eactive.eai.common.inflow.dual.DualInflowControlManager; /** * InflowTargetMetricService 단위 테스트. * *
어댑터/인터페이스 테스트는 getDualManager()를 오버라이드하여 DualInflowControlManager 주입.
*/
class InflowTargetMetricServiceTest {
// -------------------------------------------------------------------------
// 테스트용 서브클래스 — 어댑터/인터페이스용
// -------------------------------------------------------------------------
private static InflowTargetMetricService serviceWith(DualInflowControlManager manager) {
return new InflowTargetMetricService() {
@Override
protected DualInflowControlManager getDualManager() { return manager; }
};
}
// -------------------------------------------------------------------------
// Helpers
// -------------------------------------------------------------------------
private InflowTargetVO makeVO(String name) {
InflowTargetVO vo = new InflowTargetVO();
vo.setName(name);
vo.setActivate(true);
return vo;
}
private DualInflowControlManager.TargetMetrics makeMetrics(long allowed, long rejPs, long rejTh) {
DualInflowControlManager.TargetMetrics m = new DualInflowControlManager.TargetMetrics();
m.allowed.set(allowed);
m.rejectedPerSecond.set(rejPs);
m.rejectedThreshold.set(rejTh);
return m;
}
// =========================================================================
// DualManager null (비활성 환경)
// =========================================================================
@Test
void getAdapterMetric_managerIsNull_returnsNull() {
assertNull(serviceWith(null).getAdapterMetric("A1"));
}
@Test
void getAllAdapterMetrics_managerIsNull_returnsEmptyList() {
assertTrue(serviceWith(null).getAllAdapterMetrics().isEmpty());
}
@Test
void resetAdapterMetric_managerIsNull_returnsFalse() {
assertFalse(serviceWith(null).resetAdapterMetric("A1"));
}
@Test
void resetAllAdapterMetrics_managerIsNull_noException() {
assertDoesNotThrow(() -> serviceWith(null).resetAllAdapterMetrics());
}
@Test
void getInterfaceMetric_managerIsNull_returnsNull() {
assertNull(serviceWith(null).getInterfaceMetric("IF1"));
}
// =========================================================================
// 어댑터 — 단일 조회
// =========================================================================
@Test
void getAdapterMetric_notRegistered_returnsNull() {
DualInflowControlManager manager = mock(DualInflowControlManager.class);
when(manager.getAdapterInflowThreashold("A1")).thenReturn(null);
assertNull(serviceWith(manager).getAdapterMetric("A1"));
}
@Test
void getAdapterMetric_found_mapsFields() {
DualInflowControlManager manager = mock(DualInflowControlManager.class);
when(manager.getAdapterInflowThreashold("A1")).thenReturn(makeVO("A1"));
when(manager.getAdapterMetrics("A1")).thenReturn(makeMetrics(900, 60, 40));
TargetMetricDTO dto = serviceWith(manager).getAdapterMetric("A1");
assertNotNull(dto);
assertEquals("A1", dto.getTargetId());
assertEquals("ADAPTER", dto.getTargetType());
assertTrue(dto.isActivate());
assertEquals(900, dto.getAllowed());
assertEquals(60, dto.getRejectedPerSecond());
assertEquals(40, dto.getRejectedThreshold());
assertEquals(1000, dto.getTotalRequests());
}
@Test
void getAdapterMetric_noMetricsYet_returnsZeroCounters() {
DualInflowControlManager manager = mock(DualInflowControlManager.class);
when(manager.getAdapterInflowThreashold("A1")).thenReturn(makeVO("A1"));
when(manager.getAdapterMetrics("A1")).thenReturn(null);
TargetMetricDTO dto = serviceWith(manager).getAdapterMetric("A1");
assertNotNull(dto);
assertEquals(0, dto.getAllowed());
assertEquals(0, dto.getTotalRequests());
assertEquals(0.0, dto.getRejectRatio(), 0.001);
}
@Test
void getAdapterMetric_rejectRatioCalculation() {
DualInflowControlManager manager = mock(DualInflowControlManager.class);
when(manager.getAdapterInflowThreashold("A1")).thenReturn(makeVO("A1"));
// allowed=90, rejPs=5, rejTh=5 → reject=10/100 = 10.00%
when(manager.getAdapterMetrics("A1")).thenReturn(makeMetrics(90, 5, 5));
TargetMetricDTO dto = serviceWith(manager).getAdapterMetric("A1");
assertEquals(10.0, dto.getRejectRatio(), 0.01);
}
@Test
void getAdapterMetric_zeroTotal_rejectRatioIsZero() {
DualInflowControlManager manager = mock(DualInflowControlManager.class);
when(manager.getAdapterInflowThreashold("A1")).thenReturn(makeVO("A1"));
when(manager.getAdapterMetrics("A1")).thenReturn(makeMetrics(0, 0, 0));
TargetMetricDTO dto = serviceWith(manager).getAdapterMetric("A1");
assertEquals(0.0, dto.getRejectRatio(), 0.0001);
}
// =========================================================================
// 어댑터 — 전체 조회
// =========================================================================
@Test
void getAllAdapterMetrics_twoEntries_returnsBoth() {
DualInflowControlManager manager = mock(DualInflowControlManager.class);
when(manager.getAdapterAllKeys()).thenReturn(new String[]{"A1", "A2"});
when(manager.getAdapterInflowThreashold("A1")).thenReturn(makeVO("A1"));
when(manager.getAdapterInflowThreashold("A2")).thenReturn(makeVO("A2"));
when(manager.getAdapterMetrics("A1")).thenReturn(makeMetrics(10, 0, 0));
when(manager.getAdapterMetrics("A2")).thenReturn(makeMetrics(20, 5, 0));
List