Files
ai-security-xdr/haobang-security-dm/syslog-consumer/src/test/java/com/common/service/AnalysisCheckpointServiceTest.java
T
王绍宏 29445c6825 feat(syslog): 完成高吞吐可靠链路与统计存储优化
- 新增接入 WAL、检查点、背压恢复及可靠分发机制,完善 Kafka 幂等发布、分区、重试、DLT 和补偿流程
- 引入规则预编译、批内快照及 JetCache/Caffeine 两级缓存,支持缓存失效广播、影子对账和执行指标
- 升级 InfluxDB V2 原始日志模型,统一接收时间与 Point 时间,支持按日 measurement、UUID 分桶及 V1/V2 双读
- 重构达梦标准化批量写入与统计链路,支持事务内直写、增量投影、幂等控制、窗口水位和日期切换
- 完善告警处理、配置校验、运行监控及测试覆盖
2026-08-20 00:18:33 +08:00

56 lines
2.6 KiB
Java

package com.common.service;
import org.junit.jupiter.api.Test;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.util.ReflectionTestUtils;
import org.springframework.transaction.annotation.Transactional;
import java.lang.reflect.Method;
import java.time.LocalDateTime;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.mockingDetails;
import static org.mockito.Mockito.when;
class AnalysisCheckpointServiceTest {
@Test
void ruleLeaseUsesFractionalDayInsteadOfIntegerDivision() {
JdbcTemplate jdbcTemplate = mock(JdbcTemplate.class);
when(jdbcTemplate.update(anyString(), any(Object[].class))).thenReturn(1);
AnalysisCheckpointService service = new AnalysisCheckpointService(jdbcTemplate);
ReflectionTestUtils.setField(service, "leaseSeconds", 600);
service.claimRuleWindow("rule-1", "1:window-v2",
LocalDateTime.of(2026, 8, 10, 17, 35),
LocalDateTime.of(2026, 8, 10, 17, 42));
assertTrue(mockingDetails(jdbcTemplate).getInvocations().stream()
.map(invocation -> String.valueOf(invocation.getRawArguments()[0]))
.anyMatch(sql -> sql.contains("lease_until=SYSDATE+(?/86400.0)")));
}
@Test
void terminalCheckpointUpdatesAreTransactional() throws Exception {
assertTransactional("completeRuleWindow", String.class, String.class,
LocalDateTime.class, LocalDateTime.class, long.class, long.class);
assertTransactional("failRuleWindow", String.class, String.class,
LocalDateTime.class, LocalDateTime.class, String.class, String.class);
assertTransactional("completeAlgorithmWindow", String.class, String.class,
LocalDateTime.class, LocalDateTime.class, long.class, long.class);
assertTransactional("failAlgorithmWindow", String.class, String.class,
LocalDateTime.class, LocalDateTime.class, String.class, String.class);
}
private void assertTransactional(String methodName, Class<?>... parameterTypes) throws Exception {
Method method = AnalysisCheckpointService.class.getMethod(methodName, parameterTypes);
Transactional annotation = method.getAnnotation(Transactional.class);
assertNotNull(annotation, methodName + " must commit when Hikari auto-commit is disabled");
assertTrue(annotation.rollbackFor().length == 0);
}
}