package jnpf.limsService.support;
|
|
import jnpf.limsEntity.LimsSignUsageTarget;
|
import jnpf.limsEntity.SignOpType;
|
|
import java.util.Arrays;
|
import java.util.Collections;
|
import java.util.List;
|
import java.util.Map;
|
|
/** SIGN_USED 的幂等、分组与批量部分成功纯 JVM 探针。 */
|
public final class LimsSignUsageSupportProbe {
|
|
private static int passed;
|
private static int failed;
|
|
public static void main(String[] args) {
|
LimsSignUsageTarget a = target("A", "LS-001");
|
LimsSignUsageTarget b = target("B", "LS-001");
|
LimsSignUsageTarget c = target("C", "LS-002");
|
|
LimsSignUsageSupport.UsageGroup ordered =
|
LimsSignUsageSupport.groupByBizCode(Arrays.asList(a, b)).get(0);
|
LimsSignUsageSupport.UsageGroup reordered =
|
LimsSignUsageSupport.groupByBizCode(Arrays.asList(b, a, a)).get(0);
|
String key1 = LimsSignUsageSupport.clientEventId(
|
"sign-1", SignOpType.JIANCE_AUDIT_PASS, ordered);
|
String key2 = LimsSignUsageSupport.clientEventId(
|
"sign-1", SignOpType.JIANCE_AUDIT_PASS, reordered);
|
check("目标顺序和重复项不改变幂等键", key1.equals(key2), key1 + " vs " + key2);
|
check("幂等键长度固定为 67", key1.length() == 67, key1);
|
|
String changed = LimsSignUsageSupport.clientEventId(
|
"sign-1", SignOpType.JIANCE_AUDIT_PASS,
|
LimsSignUsageSupport.groupByBizCode(Collections.singletonList(a)).get(0));
|
check("实际目标变化时幂等键变化", !key1.equals(changed), changed);
|
check("业务模块进入事件分组", "LIMS-检测任务".equals(ordered.getBizModule()),
|
ordered.getBizModule());
|
|
LimsSignUsageTarget otherModule = target("A", "LS-001");
|
otherModule.setBizModule("LIMS-其他模块");
|
String changedModule = LimsSignUsageSupport.clientEventId(
|
"sign-1", SignOpType.JIANCE_AUDIT_PASS,
|
LimsSignUsageSupport.groupByBizCode(Collections.singletonList(otherModule)).get(0));
|
check("业务模块变化时幂等键变化", !key1.equals(changedModule), changedModule);
|
|
Map<String, Object> partial = LimsSignUsageSupport.signExtra(
|
Arrays.asList("A", "B"), Collections.singletonList(a));
|
List<?> requested = (List<?>) partial.get("requestedTargets");
|
List<?> affected = (List<?>) partial.get("affectedTargets");
|
check("请求摘要保留 A/B", requested.size() == 2, String.valueOf(requested));
|
check("部分成功只记实际 A", affected.size() == 1
|
&& String.valueOf(affected.get(0)).contains("targetId=A")
|
&& !String.valueOf(affected.get(0)).contains("targetId=B"), String.valueOf(affected));
|
check("affected 与实际目标数一致", Integer.valueOf(1).equals(partial.get("affected")),
|
String.valueOf(partial));
|
check("实际结果摘要携带业务模块", String.valueOf(affected.get(0))
|
.contains("bizModule=LIMS-检测任务"), String.valueOf(affected));
|
|
Map<String, Object> canonical1 = LimsSignUsageSupport.signExtra(
|
Arrays.asList("B", "A", "A"), Arrays.asList(b, a, a));
|
Map<String, Object> canonical2 = LimsSignUsageSupport.signExtra(
|
Arrays.asList("A", "B"), Arrays.asList(a, b));
|
check("签名使用摘要不受目标顺序和重复项影响",
|
canonical1.equals(canonical2), canonical1 + " vs " + canonical2);
|
|
List<LimsSignUsageSupport.UsageGroup> groups =
|
LimsSignUsageSupport.groupByBizCode(Arrays.asList(a, b, c));
|
check("跨两个 bizCode 生成两个事件组", groups.size() == 2, String.valueOf(groups.size()));
|
check("同 bizCode 的两个目标在同一组", groups.get(0).getTargets().size() == 2,
|
String.valueOf(groups.get(0).getTargets().size()));
|
check("affected=0 不产生事件组",
|
LimsSignUsageSupport.groupByBizCode(Collections.emptyList()).isEmpty(), "仍有分组");
|
|
System.out.println("=== SIGN_USED 断言:" + passed + " 通过 / " + failed + " 失败 ===");
|
System.exit(failed == 0 ? 0 : 1);
|
}
|
|
private static LimsSignUsageTarget target(String id, String bizCode) {
|
return LimsSignUsageTarget.builder()
|
.targetTable("lims_jianyan_xiang")
|
.targetId(id)
|
.bizType("JIANCE_TASK")
|
.bizModule("LIMS-检测任务")
|
.bizCode(bizCode)
|
.build();
|
}
|
|
private static void check(String name, boolean ok, String detail) {
|
if (ok) {
|
passed++;
|
System.out.println(" [PASS] " + name);
|
} else {
|
failed++;
|
System.out.println(" [FAIL] " + name + " -- " + detail);
|
}
|
}
|
|
private LimsSignUsageSupportProbe() {
|
}
|
}
|