test: add isolated no-tide PBF retained cache scenario
Some checks failed
validate-scripts / validate-scripts (push) Has been cancelled
Some checks failed
validate-scripts / validate-scripts (push) Has been cancelled
This commit is contained in:
@@ -135,3 +135,14 @@ FAST_OBSERVED 仅表示实际 Fast 数字增长,不代表像素等价、性能
|
||||
本轮只交源码,缺 `tide` 与 Symbol R 缓存准入继续 fail-closed,不能宣称原 STATIC_RC 已出现 Fast。Native AnnotationManager 在后续真实 Symbol Annotation add/update 与 Style loaded 时同步恢复缺失 points;Test App stop 重加原空层,后续 Annotation/Style 变化撤销空层验收条件,不周期删除新内容。原63层和Source定义保留,内部Annotation Source不删除;源码预期STATIC_RC由66层变65层,须以最新设备manifest核验。
|
||||
|
||||
复测脚本现要求至少75秒,在PID出现后等待完整请求时长;建议 `--scenario STATIC_RC --seconds 90`。同generation/lifecycle、plan/base parity、24Gate、mismatch0、计数单调及blocked撤销均为必要条件。summary新增缺源ID/Placement/commands/Source表;120帧仍需用户手动导出。精确命令、用户一次手工build/install、RDC Native定向测试及阴性结果解释见 [STEP-116 专用APP验收](../../docs/60_测试/STEP-116_STEP113原PBF专用APP验收_v1.md)。历史STEP115记录保留为当时事实,不代表本轮设备已验收。
|
||||
|
||||
## STEP-118 用户批准排除 tide 的独立实验
|
||||
|
||||
2026-10-11 用户明确允许删除 tide。正式PBF的 sources 中本就不存在 tide;唯一引用它的是原63基础层中的 tide-spots(Symbol)。只运行removeSource并不能移除这个依赖。新增独立 STATIC_RC_NO_TIDE 实验场景,在 TestApp 的临时Style副本中**只移除这一条孤立Layer**,原五场景、远端PBF Style和Native24 Gate不变。原生产63层及fingerprint完整保留在Parity数据中,派生场景明确标为基础62层(加两天气层总64,SDK空Annotation移除),不允许冒充原63层生产验收。
|
||||
|
||||
派生场景在读取原Style时严格断言当前tide Source不存在、唯一引用层是Symbol tide-spots,否则BLOCKED。旧场景验收器仍检查basePreserved=true;新场景验收器独立要求原63/有效62/总64、唯一排除tide-spots/tide、R[0,62)、Annotation Source保留、24 Gate、SHA同版本约束、真实Native增量。源缺失被解除不代表Symbol Placement、Cache Build或Fast已经成功。
|
||||
|
||||
启动命令:
|
||||
python3 -B tools/particle_android_validation/verify_step113_fast_path.py --scenario STATIC_RC_NO_TIDE --seconds 90
|
||||
|
||||
完整步骤见 docs/60_测试/STEP-118_tide移除Android实机验收_v1.md。
|
||||
|
||||
@@ -18,7 +18,7 @@ APK = ARTIFACTS / "MapLibreAndroidTestApp-validation-opengl-debug-x86_64.apk"
|
||||
BUILD_INFO = ARTIFACTS / "build-info.txt"
|
||||
PACKAGE = "org.maplibre.android.testapp"
|
||||
ACTIVITY = f"{PACKAGE}/{PACKAGE}.activity.particle.ParticleCoreLayerValidationActivity"
|
||||
SCENARIOS = ("STATIC_RC", "PBF63", "PARTICLE_OFF", "PARTIAL_RCRR", "SOURCE_CHANGE")
|
||||
SCENARIOS = ("STATIC_RC", "PBF63", "PARTICLE_OFF", "PARTIAL_RCRR", "SOURCE_CHANGE", "STATIC_RC_NO_TIDE")
|
||||
LOG_ENTRY = re.compile(r"^[A-Z]/STEP113Gate\(\s*(\d+)\):\s*(\{.+\})\s*$")
|
||||
|
||||
|
||||
@@ -106,6 +106,37 @@ def extract(logcat, pid, expected):
|
||||
return [x[1] for x in sorted(result, key=lambda item: item[0])]
|
||||
|
||||
|
||||
def scene_parity_valid(sample, scenario):
|
||||
"""Fail closed on the *declared* base style, not just a loose layer count.
|
||||
|
||||
Original five STEP-113 scenarios require all 63 original base layers.
|
||||
STEP-118 explicitly names a user-approved test-copy exclusion of the
|
||||
orphaned tide-spots layer: 63 remote originals -> 62 copied basics, plus
|
||||
the two known weather layers (and no empty Annotation point layer).
|
||||
It is not equivalent to the unmodified original 63-layer test.
|
||||
"""
|
||||
if not sample.get("planValid"):
|
||||
return False
|
||||
if scenario != "STATIC_RC_NO_TIDE":
|
||||
return sample.get("basePreserved") is True and not sample.get("tideLayerExcluded", False)
|
||||
return (
|
||||
sample.get("basePreserved") is False
|
||||
and sample.get("tideLayerExcluded") is True
|
||||
and sample.get("originalBaseLayerCount") == 63
|
||||
and sample.get("effectiveBaseLayerCount") == 62
|
||||
and sample.get("excludedLayerId") == "tide-spots"
|
||||
and sample.get("excludedLayerSource") == "tide"
|
||||
and sample.get("excludedLayerCount") == 1
|
||||
and sample.get("actualLayers") == 64
|
||||
and sample.get("commands", {}).get("emptyBuiltinAnnotationLayerRemoved") is True
|
||||
and sample.get("commands", {}).get("annotationSourcePreserved") is True
|
||||
and all(source.get("sourceId") != "tide" for source in sample.get("sources", []))
|
||||
and len(sample.get("retained", [])) == 1
|
||||
and sample["retained"][0].get("begin") == 0
|
||||
and sample["retained"][0].get("end") == 62
|
||||
)
|
||||
|
||||
|
||||
def run():
|
||||
parser = argparse.ArgumentParser(description="Check actual STEP-113 PBF on-device Fast frames")
|
||||
parser.add_argument("--serial", default="192.168.200.139:5555")
|
||||
@@ -167,7 +198,7 @@ def run():
|
||||
elif any((s.get("sceneGeneration"), s.get("lifecycle")) !=
|
||||
(start.get("sceneGeneration"), start.get("lifecycle")) for s in samples):
|
||||
status = "SUMMARY_LIFECYCLE_CHANGED"
|
||||
elif any(not s.get("planValid") or not s.get("basePreserved") for s in samples):
|
||||
elif any(not scene_parity_valid(s, args.scenario) for s in samples):
|
||||
status = "INVALID_PLAN_OR_BASE_PARITY"
|
||||
elif any(len(s.get("gateFailureCounts", [])) != 24 for s in samples):
|
||||
status = "INCOMPLETE_GATE_SUMMARY"
|
||||
@@ -188,7 +219,12 @@ def run():
|
||||
"device": args.serial,
|
||||
"appPid": process_id,
|
||||
"scenario": args.scenario,
|
||||
"sourceReport": "STEP-113 original PBF test scene; not STEP-114 smoke",
|
||||
"sourceReport": (
|
||||
"STEP-118 user-approved TEST-APP-ONLY 62-layer derivative; "
|
||||
"original 63-layer PBF Style remains unmodified; not STEP-114 smoke"
|
||||
if args.scenario == "STATIC_RC_NO_TIDE"
|
||||
else "STEP-113 original 63-layer PBF test scene; not STEP-114 smoke"
|
||||
),
|
||||
"durationSecondsRequested": args.seconds,
|
||||
"durationSecondsObservedAfterPid": observation_elapsed,
|
||||
"completeSummarySamples": len(samples),
|
||||
|
||||
Reference in New Issue
Block a user