Skip to content

Commit e3701d0

Browse files
committed
Fix 1. iteration_id ordering — Comparator couldn't match baseline vs candidate keys
2. JFR tool not found — missing JAVA_HOME fallback 3. JaCoCo coverage broken — -DargLine was overwriting JaCoCo's agent flag 4. runtime=0 dropped — if result.runtime: was falsy for zero-nanosecond result
1 parent c5b3687 commit e3701d0

4 files changed

Lines changed: 21 additions & 3 deletions

File tree

codeflash-java-runtime/src/main/java/com/codeflash/ReplayHelper.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,9 @@ public void replay(String className, String methodName, String descriptor, int i
8484
private void replayBehavior(Method method, Object instance, Object[] args,
8585
String className, String methodName,
8686
String testClassName, String testMethodName) throws Exception {
87-
String invId = testIteration + "_" + testMethodName;
87+
// testIteration goes at the END so the Comparator's lastUnderscore stripping
88+
// removes it, making baseline (iteration=0) and candidate (iteration=N) keys match.
89+
String invId = testMethodName + "_" + testIteration;
8890

8991
// Print start marker (same format as behavior instrumentation)
9092
System.out.println("!$######" + testClassName + ":" + testClassName + "." + testMethodName

codeflash/languages/java/jfr_parser.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import json
44
import logging
5+
import os
56
import shutil
67
import subprocess
78
from datetime import datetime
@@ -42,6 +43,13 @@ def _find_jfr_tool(self) -> str | None:
4243
candidate = Path(home) / "bin" / "jfr"
4344
if candidate.exists():
4445
return str(candidate)
46+
47+
java_home_env = os.environ.get("JAVA_HOME")
48+
if java_home_env:
49+
candidate = Path(java_home_env) / "bin" / "jfr"
50+
if candidate.exists():
51+
return str(candidate)
52+
4553
return None
4654

4755
def _parse(self) -> None:

codeflash/languages/java/maven_strategy.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -647,7 +647,15 @@ def run_tests_via_build_tool(
647647
" --add-opens java.base/java.net=ALL-UNNAMED"
648648
" --add-opens java.base/java.util.zip=ALL-UNNAMED"
649649
)
650-
if javaagent_arg:
650+
if enable_coverage:
651+
# When coverage is enabled, JaCoCo's prepare-agent goal sets argLine via
652+
# @{argLine}. Overriding -DargLine would clobber the JaCoCo agent flag.
653+
# Pass add-opens and javaagent via JDK_JAVA_OPTIONS instead.
654+
jdk_opts_parts = [add_opens_flags]
655+
if javaagent_arg:
656+
jdk_opts_parts.insert(0, javaagent_arg)
657+
env["JDK_JAVA_OPTIONS"] = " ".join(jdk_opts_parts)
658+
elif javaagent_arg:
651659
cmd.append(f"-DargLine={javaagent_arg} {add_opens_flags}")
652660
else:
653661
cmd.append(f"-DargLine={add_opens_flags}")

codeflash/models/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -949,7 +949,7 @@ def usable_runtime_data_by_test_case(self) -> dict[InvocationId, list[int]]:
949949
by_id: dict[InvocationId, list[int]] = {}
950950
for result in self.test_results:
951951
if result.did_pass:
952-
if result.runtime:
952+
if result.runtime is not None:
953953
by_id.setdefault(result.id, []).append(result.runtime)
954954
else:
955955
msg = (

0 commit comments

Comments
 (0)