Validate preview sessions against real classpath and module-path fixtures

This commit is contained in:
2026-11-12 09:47:59 +01:00
parent e97af99412
commit 28c1e47c95
52 changed files with 1867 additions and 9 deletions
+1
View File
@@ -37,6 +37,7 @@ version = subprocess.run([str(target_java), "-version"], capture_output=True, te
if not re.search(r'version "21[.\"]', version.stderr):
sys.exit("Target linkage gate requires Java 21")
run([target_java, "-cp", classpath, "de.neitzel.fxdesigner.target.TargetToolInfo"])
run([sys.executable, ROOT / "scripts/check-preview-fixtures.py", "--target-java-home", args.target_java_home])
run([wrapper, "-B", "-ntp", "-pl", "designer-standalone", "org.apache.maven.plugins:maven-dependency-plugin:3.6.1:build-classpath", "-DincludeScope=test", "-Dmdep.outputFile=target/smoke-classpath.txt"])
smoke_classpath = os.pathsep.join([str(ROOT / "designer-standalone/target/test-classes"), str(ROOT / "designer-standalone/target/classes"), (ROOT / "designer-standalone/target/smoke-classpath.txt").read_text().strip()])
run([Path(os.environ["JAVA_HOME"]) / "bin/java", "-cp", smoke_classpath, "de.neitzel.fxdesigner.build.BuildRefreshSmoke", ROOT, args.target_java_home])
+83
View File
@@ -0,0 +1,83 @@
#!/usr/bin/env python3
"""Qualify real NeitzelLib preview sessions on classpath and named module path."""
import argparse
import json
import os
from pathlib import Path
import re
import shutil
import subprocess
import tempfile
ROOT = Path(__file__).resolve().parent.parent
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--target-java-home", required=True)
args = parser.parse_args()
java_home = Path(args.target_java_home).resolve()
env = dict(os.environ, JAVA_HOME=str(java_home))
output = ROOT / "designer-target-tools/target/preview-fixtures"
output.mkdir(parents=True, exist_ok=True)
results = []
def run(label, command, timeout=180):
result = subprocess.run([str(x) for x in command], env=env, cwd=ROOT,
capture_output=True, text=True, timeout=timeout)
log = result.stdout + result.stderr
(output / (label + ".log")).write_text(log)
if result.returncode:
raise RuntimeError(label + "\n" + log[-12000:])
return log
def build(path, label):
run(label, [ROOT / "mvnw", "-B", "-ntp", "-f", path / "pom.xml", "package",
"org.apache.maven.plugins:maven-dependency-plugin:3.6.1:build-classpath",
"-DincludeScope=test", "-Dmdep.outputFile=target/runtime.txt"])
def launch(path, arrangement, mode, label):
if arrangement == "classpath":
target = path / "app/target"
cp = os.pathsep.join([str(target / "test-classes"), str(target / "classes"),
(target / "runtime.txt").read_text().strip()])
command = ["-cp", cp, "fixture.checks.PreviewChecks"]
else:
target = path / "checks/target"
cp = str(target / "checks-modulepath-1.jar") + os.pathsep + (target / "runtime.txt").read_text().strip()
command = ["--module-path", cp, "--add-modules", "ALL-MODULE-PATH",
"-m", "fixture.checks/fixture.checks.PreviewChecks"]
log = run(label, [java_home / "bin/java", *command, mode], timeout=30)
match = re.search(r"PASS " + re.escape(mode) + r" (\d+)", log)
assert match, log
results.append({"scenario": label, "checks": int(match[1])})
print(label + ": " + match[0], flush=True)
return log
with tempfile.TemporaryDirectory(prefix="designer-preview-") as temp:
for arrangement in ("classpath", "modulepath"):
path = Path(temp) / arrangement
shutil.copytree(ROOT / "integration-fixtures/preview" / arrangement, path,
ignore=shutil.ignore_patterns("target"))
build(path, arrangement + "-build")
first = None
for mode in ("discovery", "standard", "async", "timeout", "cancel",
"readiness-failure", "wrong-model", "invalid-attribute",
"cleanup-failure", "factory-failure"):
log = launch(path, arrangement, mode, arrangement + "-" + mode)
if mode == "standard":
first = re.search(r"SESSION (\S+) models=1", log)[1]
repeat = launch(path, arrangement, "standard", arrangement + "-fresh-process")
assert first != re.search(r"SESSION (\S+) models=1", repeat)[1], "Service identity reused"
if arrangement == "modulepath":
descriptor = path / "app/src/main/java/module-info.java"
original = descriptor.read_text()
for mode, declaration in (("missing-components", "opens fixture.components;"),
("missing-model", "opens fixture.model to fx;")):
descriptor.write_text(re.sub(r"\s+".join(map(re.escape, declaration.split())), "", original))
build(path, mode + "-build")
launch(path, arrangement, mode, mode)
descriptor.write_text(original)
(output / "results.json").write_text(json.dumps(results, indent=2) + "\n")
print(f"PASS {len(results)} target processes, {sum(r['checks'] for r in results)} fixture checks")