刘光辉
昨天 bb638871a7fb692d80f1b7a758f991dc0879002c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
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() {
    }
}