Accept optional saved-state smoke skips
This commit is contained in:
@@ -686,7 +686,14 @@ def validate_saved_state_form(
|
|||||||
if status not in {"skipped_no_saved_state", "verified_and_rolled_back"}:
|
if status not in {"skipped_no_saved_state", "verified_and_rolled_back"}:
|
||||||
failures.append({"code": "saved_state_form_status_unexpected", "path": str(path), "status": status})
|
failures.append({"code": "saved_state_form_status_unexpected", "path": str(path), "status": status})
|
||||||
if status in {"skipped_no_saved_state", "verified_and_rolled_back"}:
|
if status in {"skipped_no_saved_state", "verified_and_rolled_back"}:
|
||||||
validate_saved_state_preflight(preflight, failures, "saved_state_form", path, expected_count_keys=("forms", "scanned", "limit"))
|
expected_count_keys = ("forms", "limit") if status == "skipped_no_saved_state" else ("forms", "scanned", "limit")
|
||||||
|
validate_saved_state_preflight(
|
||||||
|
preflight,
|
||||||
|
failures,
|
||||||
|
"saved_state_form",
|
||||||
|
path,
|
||||||
|
expected_count_keys=expected_count_keys,
|
||||||
|
)
|
||||||
if status == "skipped_no_saved_state":
|
if status == "skipped_no_saved_state":
|
||||||
if report.get("skipped") is not True:
|
if report.get("skipped") is not True:
|
||||||
failures.append({"code": "saved_state_form_skip_flag_missing", "path": str(path), "skipped": report.get("skipped")})
|
failures.append({"code": "saved_state_form_skip_flag_missing", "path": str(path), "skipped": report.get("skipped")})
|
||||||
@@ -745,7 +752,8 @@ def validate_saved_state_module(
|
|||||||
write_plan = report.get("write_plan") if isinstance(report.get("write_plan"), dict) else {}
|
write_plan = report.get("write_plan") if isinstance(report.get("write_plan"), dict) else {}
|
||||||
preflight = report.get("saved_state_preflight") if isinstance(report.get("saved_state_preflight"), dict) else {}
|
preflight = report.get("saved_state_preflight") if isinstance(report.get("saved_state_preflight"), dict) else {}
|
||||||
preflight_counts = preflight.get("counts") if isinstance(preflight.get("counts"), dict) else {}
|
preflight_counts = preflight.get("counts") if isinstance(preflight.get("counts"), dict) else {}
|
||||||
table = table_from_module_ref(report.get("module_ref"))
|
table = report.get("table") or report.get("saved_state_table") or table_from_module_ref(report.get("module_ref"))
|
||||||
|
skip_statuses = {"skipped_no_saved_state", "skipped_no_saved_state_candidate"}
|
||||||
summary = {
|
summary = {
|
||||||
"path": str(path),
|
"path": str(path),
|
||||||
"status": report.get("status"),
|
"status": report.get("status"),
|
||||||
@@ -763,15 +771,26 @@ def validate_saved_state_module(
|
|||||||
expect_report_identity(report, failures, label, path, expected_base_id=base_id)
|
expect_report_identity(report, failures, label, path, expected_base_id=base_id)
|
||||||
if table not in SAVED_STATE_TABLES:
|
if table not in SAVED_STATE_TABLES:
|
||||||
failures.append({"code": "saved_state_module_table_unexpected", "path": str(path), "module_ref": report.get("module_ref")})
|
failures.append({"code": "saved_state_module_table_unexpected", "path": str(path), "module_ref": report.get("module_ref")})
|
||||||
if require_write and report.get("status") == "skipped_no_saved_state":
|
if require_write and report.get("status") in skip_statuses:
|
||||||
failures.append({"code": "saved_state_module_write_required", "path": str(path)})
|
failures.append({"code": "saved_state_module_write_required", "path": str(path)})
|
||||||
if report.get("status") not in {"skipped_no_saved_state", "verified_and_rolled_back"}:
|
if report.get("status") not in skip_statuses | {"verified_and_rolled_back"}:
|
||||||
failures.append({"code": "saved_state_module_status_unexpected", "path": str(path), "status": report.get("status")})
|
failures.append({"code": "saved_state_module_status_unexpected", "path": str(path), "status": report.get("status")})
|
||||||
if report.get("status") in {"skipped_no_saved_state", "verified_and_rolled_back"}:
|
if report.get("status") in {"skipped_no_saved_state", "verified_and_rolled_back"}:
|
||||||
validate_saved_state_preflight(preflight, failures, "saved_state_module", path, expected_count_keys=("modules", "scanned", "limit"))
|
expected_count_keys = ("modules", "limit") if report.get("status") == "skipped_no_saved_state" else ("modules", "scanned", "limit")
|
||||||
if report.get("status") == "skipped_no_saved_state":
|
validate_saved_state_preflight(
|
||||||
|
preflight,
|
||||||
|
failures,
|
||||||
|
"saved_state_module",
|
||||||
|
path,
|
||||||
|
expected_count_keys=expected_count_keys,
|
||||||
|
)
|
||||||
|
if report.get("status") in skip_statuses:
|
||||||
if report.get("skipped") is not True:
|
if report.get("skipped") is not True:
|
||||||
failures.append({"code": "saved_state_module_skip_flag_missing", "path": str(path), "skipped": report.get("skipped")})
|
failures.append({"code": "saved_state_module_skip_flag_missing", "path": str(path), "skipped": report.get("skipped")})
|
||||||
|
if report.get("status") == "skipped_no_saved_state_candidate":
|
||||||
|
diagnostics = report.get("diagnostics") if isinstance(report.get("diagnostics"), dict) else {}
|
||||||
|
if not str(diagnostics.get("message") or "").strip():
|
||||||
|
failures.append({"code": "saved_state_module_skip_diagnostics_missing", "path": str(path)})
|
||||||
if report.get("status") == "verified_and_rolled_back":
|
if report.get("status") == "verified_and_rolled_back":
|
||||||
if write_plan.get("allowed") is not True:
|
if write_plan.get("allowed") is not True:
|
||||||
failures.append({"code": "saved_state_module_write_plan_not_allowed", "path": str(path), "write_plan": write_plan})
|
failures.append({"code": "saved_state_module_write_plan_not_allowed", "path": str(path), "write_plan": write_plan})
|
||||||
@@ -1906,6 +1925,40 @@ def run_self_test() -> dict[str, Any]:
|
|||||||
if soft["failures"]:
|
if soft["failures"]:
|
||||||
failures.append({"code": "self_test_soft_unexpected_failures", "failures": soft["failures"]})
|
failures.append({"code": "self_test_soft_unexpected_failures", "failures": soft["failures"]})
|
||||||
|
|
||||||
|
public_skip_dir = reports_root / "public_skip"
|
||||||
|
write_self_test_reports(public_skip_dir, base_id="public_skip", composed=False, saved_state_written=False)
|
||||||
|
public_form_path = public_skip_dir / "saved-state-write-routes-smoke.json"
|
||||||
|
public_form_report = json.loads(public_form_path.read_text(encoding="utf-8"))
|
||||||
|
public_form_report["saved_state_preflight"]["counts"].pop("scanned", None)
|
||||||
|
write_json(public_form_path, public_form_report)
|
||||||
|
public_module_path = public_skip_dir / "module-stream-write-smoke-script.json"
|
||||||
|
public_module_report = json.loads(public_module_path.read_text(encoding="utf-8"))
|
||||||
|
public_module_report.update({
|
||||||
|
"status": "skipped_no_saved_state_candidate",
|
||||||
|
"table": "ConfigCASSave",
|
||||||
|
"diagnostics": {"message": "no safe saved-state BSL module stream candidates found"},
|
||||||
|
})
|
||||||
|
public_module_report.pop("module_ref", None)
|
||||||
|
public_module_report.pop("saved_state_preflight", None)
|
||||||
|
public_module_report.pop("write_plan", None)
|
||||||
|
public_module_report.pop("metadata_write", None)
|
||||||
|
write_json(public_module_path, public_module_report)
|
||||||
|
public_skip = validate_base("public_skip", public_skip_dir, validator_args())
|
||||||
|
if public_skip["failures"]:
|
||||||
|
failures.append({"code": "self_test_public_skip_unexpected_failures", "failures": public_skip["failures"]})
|
||||||
|
public_skip_strict = validate_base(
|
||||||
|
"public_skip",
|
||||||
|
public_skip_dir,
|
||||||
|
validator_args(require_saved_state_write_smoke=True),
|
||||||
|
)
|
||||||
|
public_skip_strict_codes = {str(failure.get("code")) for failure in public_skip_strict["failures"]}
|
||||||
|
if "saved_state_module_write_required" not in public_skip_strict_codes:
|
||||||
|
failures.append({
|
||||||
|
"code": "self_test_public_skip_strict_expected_failure_missing",
|
||||||
|
"expected": "saved_state_module_write_required",
|
||||||
|
"actual": sorted(public_skip_strict_codes),
|
||||||
|
})
|
||||||
|
|
||||||
strict_skip = validate_base(
|
strict_skip = validate_base(
|
||||||
base_id,
|
base_id,
|
||||||
report_dir,
|
report_dir,
|
||||||
@@ -2339,6 +2392,8 @@ def run_self_test() -> dict[str, Any]:
|
|||||||
"schema": "onec_verify_reports_self_test.v1",
|
"schema": "onec_verify_reports_self_test.v1",
|
||||||
"passed": not failures,
|
"passed": not failures,
|
||||||
"soft": soft,
|
"soft": soft,
|
||||||
|
"public_skip": public_skip,
|
||||||
|
"public_skip_strict_failure_codes": sorted(public_skip_strict_codes),
|
||||||
"strict_skip_failure_codes": sorted(strict_codes),
|
"strict_skip_failure_codes": sorted(strict_codes),
|
||||||
"coverage_failure_codes": sorted(coverage_codes),
|
"coverage_failure_codes": sorted(coverage_codes),
|
||||||
"consistency_failure_codes": sorted(consistency_codes),
|
"consistency_failure_codes": sorted(consistency_codes),
|
||||||
|
|||||||
@@ -171,6 +171,10 @@ def check_adapter_verify_wiring(scripts: list[Path], executable: str) -> list[st
|
|||||||
failures.append("verify_1c_adapter_deployment.ps1 must pass --require-write-plan-composition to both REST and MCP selector-chain smoke commands.")
|
failures.append("verify_1c_adapter_deployment.ps1 must pass --require-write-plan-composition to both REST and MCP selector-chain smoke commands.")
|
||||||
if "--allow-empty-saved-state" not in verify_text or "if (-not $RequireSavedStateWriteSmoke)" not in verify_text:
|
if "--allow-empty-saved-state" not in verify_text or "if (-not $RequireSavedStateWriteSmoke)" not in verify_text:
|
||||||
failures.append("verify_1c_adapter_deployment.ps1 must allow empty saved-state only when -RequireSavedStateWriteSmoke is not set.")
|
failures.append("verify_1c_adapter_deployment.ps1 must allow empty saved-state only when -RequireSavedStateWriteSmoke is not set.")
|
||||||
|
if '"skipped_no_saved_state_candidate"' not in verify_text:
|
||||||
|
failures.append("verify_1c_adapter_deployment.ps1 must accept a missing safe module candidate in optional saved-state smoke mode.")
|
||||||
|
if "$RequireWrite -and $report.status -in $skipStatuses" not in verify_text:
|
||||||
|
failures.append("verify_1c_adapter_deployment.ps1 must reject all saved-state module skip statuses in strict mode.")
|
||||||
if "function Get-DuplicateValues" not in verify_text or "Duplicate BaseId value(s)" not in verify_text:
|
if "function Get-DuplicateValues" not in verify_text or "Duplicate BaseId value(s)" not in verify_text:
|
||||||
failures.append("verify_1c_adapter_deployment.ps1 must reject duplicate -BaseId values before writing reports.")
|
failures.append("verify_1c_adapter_deployment.ps1 must reject duplicate -BaseId values before writing reports.")
|
||||||
if "function Normalize-BaseIds" not in verify_text or '-split ","' not in verify_text:
|
if "function Normalize-BaseIds" not in verify_text or '-split ","' not in verify_text:
|
||||||
|
|||||||
@@ -99,6 +99,7 @@ def main() -> int:
|
|||||||
"status": "skipped_no_saved_state_candidate",
|
"status": "skipped_no_saved_state_candidate",
|
||||||
"skipped": True,
|
"skipped": True,
|
||||||
"base_id": args.base_id,
|
"base_id": args.base_id,
|
||||||
|
"table": args.table,
|
||||||
"saved_state_table": args.table,
|
"saved_state_table": args.table,
|
||||||
"diagnostics": {"message": str(exc)},
|
"diagnostics": {"message": str(exc)},
|
||||||
}
|
}
|
||||||
@@ -127,6 +128,7 @@ def main() -> int:
|
|||||||
"status": "skipped_no_saved_state",
|
"status": "skipped_no_saved_state",
|
||||||
"skipped": True,
|
"skipped": True,
|
||||||
"base_id": args.base_id,
|
"base_id": args.base_id,
|
||||||
|
"table": args.table,
|
||||||
"module_ref": module_ref,
|
"module_ref": module_ref,
|
||||||
"saved_state_preflight": {"status": saved_state.get("status"), "counts": saved_state.get("counts")},
|
"saved_state_preflight": {"status": saved_state.get("status"), "counts": saved_state.get("counts")},
|
||||||
}
|
}
|
||||||
@@ -181,6 +183,7 @@ def main() -> int:
|
|||||||
"schema": "onec_module_stream_write_smoke.v1",
|
"schema": "onec_module_stream_write_smoke.v1",
|
||||||
"status": "verified_and_rolled_back",
|
"status": "verified_and_rolled_back",
|
||||||
"base_id": args.base_id,
|
"base_id": args.base_id,
|
||||||
|
"table": args.table,
|
||||||
"module_ref": module_ref,
|
"module_ref": module_ref,
|
||||||
**({"saved_state_preflight": auto_target.get("discovery")} if auto_target else {}),
|
**({"saved_state_preflight": auto_target.get("discovery")} if auto_target else {}),
|
||||||
"write_plan": {
|
"write_plan": {
|
||||||
|
|||||||
@@ -336,10 +336,11 @@ function Assert-SavedStateModuleWriteReport {
|
|||||||
[switch]$RequireWrite
|
[switch]$RequireWrite
|
||||||
)
|
)
|
||||||
$report = Read-JsonReport -Label $Label -Path $Path
|
$report = Read-JsonReport -Label $Label -Path $Path
|
||||||
if ($RequireWrite -and $report.status -eq "skipped_no_saved_state") {
|
$skipStatuses = @("skipped_no_saved_state", "skipped_no_saved_state_candidate")
|
||||||
|
if ($RequireWrite -and $report.status -in $skipStatuses) {
|
||||||
throw "$Label report skipped saved-state module write in strict mode: $Path"
|
throw "$Label report skipped saved-state module write in strict mode: $Path"
|
||||||
}
|
}
|
||||||
if ($report.status -notin @("skipped_no_saved_state", "verified_and_rolled_back")) {
|
if ($report.status -notin ($skipStatuses + @("verified_and_rolled_back"))) {
|
||||||
throw "$Label report has unexpected status '$($report.status)': $Path"
|
throw "$Label report has unexpected status '$($report.status)': $Path"
|
||||||
}
|
}
|
||||||
if ($report.status -eq "verified_and_rolled_back" -and $report.write_plan.allowed -ne $true) {
|
if ($report.status -eq "verified_and_rolled_back" -and $report.write_plan.allowed -ne $true) {
|
||||||
|
|||||||
Reference in New Issue
Block a user