- SQL 基线 V1__flight_state_baseline.sql 整体取代 V1.0.0–V1.4.0: PIPELINE_LOCK/PROC_STATE/MSG_EVENT/REQ_TRACK/BACKFILL_TODO/FLIGHT_SCHD + 8 张资源明细表 + FLIGHT_ROUTE_POINT + SCHD_SNAP_LOG 留痕层 - 废除 FDAY 日代/SCHD_GEN/名单差删:OPERATION_DAY 不可变(应用层校验 + 条件更新强化 §7.4),STATE 仅 ACTIVE/DELETED,物理清除只在历史归档后 - 处理器化:applyScheduleRecords(§5.1 七步同一事务,重放判定/整包 DEAD(PROTOCOL)/归属冲突不落地)+ FLOP/FDEL/ADFT(tombstone 仅 ACTIVE→DELETED,重复 FDEL 幂等不推进版本) - 投递:KAFKA_SCHD 同 FLID 按最新 STATE_VERSION 合并,被压掉事件关闭, TOMBSTONE 发 null 值消息(键缺失=删除旧值 §7.3) - 回填待办改为业务事务内预登记,消除提交后写待办的崩溃窗口(§7.2/§10) - XML 解码改为 jackson-dataformat-xml 数据类直接映射(SIS 信封强类型, FLTR 开放标签泛型承载) - 历史归档/物理清除顺序不可颠倒:归档确认成功集才物理删除,未接通删 0 条 - 移除 PUMP_JOB 队列/ReferenceService/FlightStoreDiffTool 等旧机制与测试, 新增运营日/引擎/快照/FDEL/归档顺序不变性回归测试
95 lines
3.2 KiB
Kotlin
95 lines
3.2 KiB
Kotlin
package com.gzzn.omms.msgexchange.codec
|
|
|
|
import com.gzzn.omms.msgexchange.domain.MsgKind
|
|
import org.junit.jupiter.api.Assertions.assertEquals
|
|
import org.junit.jupiter.api.Assertions.assertInstanceOf
|
|
import org.junit.jupiter.api.Assertions.assertTrue
|
|
import org.junit.jupiter.api.Test
|
|
|
|
class JacksonXmlCodecTest {
|
|
|
|
private val codec = JacksonXmlCodec()
|
|
|
|
@Test
|
|
fun `decode AODBGTDT sample extracts META and three gates`() {
|
|
val raw = """
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
<MSG>
|
|
<META>
|
|
<SNDR>AODB</SNDR>
|
|
<SEQN>1243</SEQN>
|
|
<DTTM>20021010090311</DTTM>
|
|
<TYPE>FLOP</TYPE>
|
|
<STYP>GTDT</STYP>
|
|
</META>
|
|
<FLOP>
|
|
<FLID>121112312</FLID>
|
|
<FFID>CA-CA101-A-12DEC261345-D</FFID>
|
|
<GTDT GTNO="1">
|
|
<GATE>G28</GATE>
|
|
<PGOT>15DEC261805</PGOT>
|
|
<PGCT>15DEC261925</PGCT>
|
|
<GOTM>15DEC261825</GOTM>
|
|
<GTYP>D</GTYP>
|
|
</GTDT>
|
|
<GTDT GTNO="2">
|
|
<GATE>G33</GATE>
|
|
<PGOT>15DEC261805</PGOT>
|
|
<PGCT>15DEC261925</PGCT>
|
|
<GTYP>I</GTYP>
|
|
</GTDT>
|
|
<GTDT GTNO="3">
|
|
<GATE>G23</GATE>
|
|
<PGOT>15DEC261805</PGOT>
|
|
<PGCT>15DEC261925</PGCT>
|
|
<GTYP>D</GTYP>
|
|
</GTDT>
|
|
</FLOP>
|
|
</MSG>
|
|
""".trimIndent()
|
|
|
|
val result = codec.decode(raw)
|
|
assertInstanceOf(DecodeResult.Ok::class.java, result)
|
|
val msg = (result as DecodeResult.Ok).message
|
|
assertEquals(MsgKind.Flop("GTDT"), msg.kind)
|
|
assertEquals("AODB", msg.meta.sndr)
|
|
assertEquals(1243L, msg.meta.seqn)
|
|
|
|
val body = msg.body as FlopPayload
|
|
assertEquals("121112312", body.flid)
|
|
assertEquals("CA-CA101-A-12DEC261345-D", body.scalars["FFID"])
|
|
assertEquals(3, body.collections["GTDT"]!!.size)
|
|
assertEquals("G28", body.collections["GTDT"]!![0]["GATE"])
|
|
assertEquals("1", body.collections["GTDT"]!![0]["GTNO"])
|
|
assertEquals("G33", body.collections["GTDT"]!![1]["GATE"])
|
|
assertEquals("3", body.collections["GTDT"]!![2]["GTNO"])
|
|
}
|
|
|
|
@Test
|
|
fun `decode GTNO zero marks gate clear snapshot`() {
|
|
val raw = """
|
|
<MSG>
|
|
<META>
|
|
<SNDR>AODB</SNDR><SEQN>1</SEQN><DTTM>20021010090311</DTTM>
|
|
<TYPE>FLOP</TYPE><STYP>GTDT</STYP>
|
|
</META>
|
|
<FLOP>
|
|
<FLID>F_CLEAR</FLID>
|
|
<GTDT GTNO="0"></GTDT>
|
|
</FLOP>
|
|
</MSG>
|
|
""".trimIndent()
|
|
|
|
val msg = (codec.decode(raw) as DecodeResult.Ok).message
|
|
val body = msg.body as FlopPayload
|
|
assertEquals(listOf(mapOf("GTNO" to "0")), body.collections["GTDT"])
|
|
}
|
|
|
|
@Test
|
|
fun `malformed xml returns MALFORMED not CODEC_ERROR`() {
|
|
val err = codec.decode("not-xml") as DecodeResult.Err
|
|
assertEquals(com.gzzn.omms.msgexchange.domain.ErrorClass.MALFORMED, err.failure.errorClass)
|
|
assertTrue(err.failure.detail.contains("empty-or-non-xml"))
|
|
}
|
|
}
|