Replace the substring with the entire codebase.

This commit is contained in:
HeshamHM28 2026-02-17 23:23:51 +02:00
parent fb6de47c1f
commit 22541e085a
2 changed files with 1326 additions and 355 deletions

View file

@ -131,23 +131,70 @@ public class CalculatorTest {
test_path=test_file,
)
assert success is True
expected = """import org.junit.jupiter.api.Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
# Behavior mode now adds SQLite instrumentation
# Verify key elements are present
assert "import java.sql.Connection;" in result
assert "import java.sql.DriverManager;" in result
assert "import java.sql.PreparedStatement;" in result
# Note: java.sql.Statement is used fully qualified to avoid conflicts with other Statement classes
assert "java.sql.Statement" in result
assert "class CalculatorTest__perfinstrumented" in result
assert "CODEFLASH_OUTPUT_FILE" in result
assert "CREATE TABLE IF NOT EXISTS test_results" in result
assert "INSERT INTO test_results VALUES" in result
assert "_cf_loop1" in result
assert "_cf_iter1" in result
assert "System.nanoTime()" in result
assert "com.codeflash.Serializer.serialize((Object)" in result
public class CalculatorTest__perfinstrumented {
@Test
public void testAdd() {
// Codeflash behavior instrumentation
int _cf_loop1 = Integer.parseInt(System.getenv("CODEFLASH_LOOP_INDEX"));
int _cf_iter1 = 1;
String _cf_mod1 = "CalculatorTest";
String _cf_cls1 = "CalculatorTest";
String _cf_fn1 = "add";
String _cf_outputFile1 = System.getenv("CODEFLASH_OUTPUT_FILE");
String _cf_testIteration1 = System.getenv("CODEFLASH_TEST_ITERATION");
if (_cf_testIteration1 == null) _cf_testIteration1 = "0";
System.out.println("!$######" + _cf_mod1 + ":" + _cf_cls1 + ":" + _cf_fn1 + ":" + _cf_loop1 + ":" + _cf_iter1 + "######$!");
long _cf_start1 = System.nanoTime();
byte[] _cf_serializedResult1 = null;
try {
Calculator calc = new Calculator();
var _cf_result1_1 = calc.add(2, 2);
_cf_serializedResult1 = com.codeflash.Serializer.serialize((Object) _cf_result1_1);
assertEquals(4, _cf_result1_1);
} finally {
long _cf_end1 = System.nanoTime();
long _cf_dur1 = _cf_end1 - _cf_start1;
System.out.println("!######" + _cf_mod1 + ":" + _cf_cls1 + ":" + _cf_fn1 + ":" + _cf_loop1 + ":" + _cf_iter1 + ":" + _cf_dur1 + "######!");
// Write to SQLite if output file is set
if (_cf_outputFile1 != null && !_cf_outputFile1.isEmpty()) {
try {
Class.forName("org.sqlite.JDBC");
try (Connection _cf_conn1 = DriverManager.getConnection("jdbc:sqlite:" + _cf_outputFile1)) {
try (java.sql.Statement _cf_stmt1 = _cf_conn1.createStatement()) {
_cf_stmt1.execute("CREATE TABLE IF NOT EXISTS test_results (" +
"test_module_path TEXT, test_class_name TEXT, test_function_name TEXT, " +
"function_getting_tested TEXT, loop_index INTEGER, iteration_id TEXT, " +
"runtime INTEGER, return_value BLOB, verification_type TEXT)");
}
String _cf_sql1 = "INSERT INTO test_results VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";
try (PreparedStatement _cf_pstmt1 = _cf_conn1.prepareStatement(_cf_sql1)) {
_cf_pstmt1.setString(1, _cf_mod1);
_cf_pstmt1.setString(2, _cf_cls1);
_cf_pstmt1.setString(3, "CalculatorTestTest");
_cf_pstmt1.setString(4, _cf_fn1);
_cf_pstmt1.setInt(5, _cf_loop1);
_cf_pstmt1.setString(6, _cf_iter1 + "_" + _cf_testIteration1);
_cf_pstmt1.setLong(7, _cf_dur1);
_cf_pstmt1.setBytes(8, _cf_serializedResult1);
_cf_pstmt1.setString(9, "function_call");
_cf_pstmt1.executeUpdate();
}
}
} catch (Exception _cf_e1) {
System.err.println("CodeflashHelper: SQLite error: " + _cf_e1.getMessage());
}
}
}
}
}
"""
assert success is True
assert result == expected
def test_instrument_behavior_mode_assert_throws_expression_lambda(self, tmp_path: Path):
"""Test that assertThrows expression lambdas are not broken by behavior instrumentation.
@ -191,11 +238,122 @@ public class FibonacciTest {
test_path=test_file,
)
expected = """import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
public class FibonacciTest__perfinstrumented {
@Test
void testNegativeInput_ThrowsIllegalArgumentException() {
// Codeflash behavior instrumentation
int _cf_loop1 = Integer.parseInt(System.getenv("CODEFLASH_LOOP_INDEX"));
int _cf_iter1 = 1;
String _cf_mod1 = "FibonacciTest";
String _cf_cls1 = "FibonacciTest";
String _cf_fn1 = "fibonacci";
String _cf_outputFile1 = System.getenv("CODEFLASH_OUTPUT_FILE");
String _cf_testIteration1 = System.getenv("CODEFLASH_TEST_ITERATION");
if (_cf_testIteration1 == null) _cf_testIteration1 = "0";
System.out.println("!$######" + _cf_mod1 + ":" + _cf_cls1 + ":" + _cf_fn1 + ":" + _cf_loop1 + ":" + _cf_iter1 + "######$!");
long _cf_start1 = System.nanoTime();
byte[] _cf_serializedResult1 = null;
try {
assertThrows(IllegalArgumentException.class, () -> Fibonacci.fibonacci(-1));
} finally {
long _cf_end1 = System.nanoTime();
long _cf_dur1 = _cf_end1 - _cf_start1;
System.out.println("!######" + _cf_mod1 + ":" + _cf_cls1 + ":" + _cf_fn1 + ":" + _cf_loop1 + ":" + _cf_iter1 + ":" + _cf_dur1 + "######!");
// Write to SQLite if output file is set
if (_cf_outputFile1 != null && !_cf_outputFile1.isEmpty()) {
try {
Class.forName("org.sqlite.JDBC");
try (Connection _cf_conn1 = DriverManager.getConnection("jdbc:sqlite:" + _cf_outputFile1)) {
try (java.sql.Statement _cf_stmt1 = _cf_conn1.createStatement()) {
_cf_stmt1.execute("CREATE TABLE IF NOT EXISTS test_results (" +
"test_module_path TEXT, test_class_name TEXT, test_function_name TEXT, " +
"function_getting_tested TEXT, loop_index INTEGER, iteration_id TEXT, " +
"runtime INTEGER, return_value BLOB, verification_type TEXT)");
}
String _cf_sql1 = "INSERT INTO test_results VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";
try (PreparedStatement _cf_pstmt1 = _cf_conn1.prepareStatement(_cf_sql1)) {
_cf_pstmt1.setString(1, _cf_mod1);
_cf_pstmt1.setString(2, _cf_cls1);
_cf_pstmt1.setString(3, "FibonacciTestTest");
_cf_pstmt1.setString(4, _cf_fn1);
_cf_pstmt1.setInt(5, _cf_loop1);
_cf_pstmt1.setString(6, _cf_iter1 + "_" + _cf_testIteration1);
_cf_pstmt1.setLong(7, _cf_dur1);
_cf_pstmt1.setBytes(8, _cf_serializedResult1);
_cf_pstmt1.setString(9, "function_call");
_cf_pstmt1.executeUpdate();
}
}
} catch (Exception _cf_e1) {
System.err.println("CodeflashHelper: SQLite error: " + _cf_e1.getMessage());
}
}
}
}
@Test
void testZeroInput_ReturnsZero() {
// Codeflash behavior instrumentation
int _cf_loop2 = Integer.parseInt(System.getenv("CODEFLASH_LOOP_INDEX"));
int _cf_iter2 = 2;
String _cf_mod2 = "FibonacciTest";
String _cf_cls2 = "FibonacciTest";
String _cf_fn2 = "fibonacci";
String _cf_outputFile2 = System.getenv("CODEFLASH_OUTPUT_FILE");
String _cf_testIteration2 = System.getenv("CODEFLASH_TEST_ITERATION");
if (_cf_testIteration2 == null) _cf_testIteration2 = "0";
System.out.println("!$######" + _cf_mod2 + ":" + _cf_cls2 + ":" + _cf_fn2 + ":" + _cf_loop2 + ":" + _cf_iter2 + "######$!");
long _cf_start2 = System.nanoTime();
byte[] _cf_serializedResult2 = null;
try {
var _cf_result2_1 = Fibonacci.fibonacci(0);
_cf_serializedResult2 = com.codeflash.Serializer.serialize((Object) _cf_result2_1);
assertEquals(0L, _cf_result2_1);
} finally {
long _cf_end2 = System.nanoTime();
long _cf_dur2 = _cf_end2 - _cf_start2;
System.out.println("!######" + _cf_mod2 + ":" + _cf_cls2 + ":" + _cf_fn2 + ":" + _cf_loop2 + ":" + _cf_iter2 + ":" + _cf_dur2 + "######!");
// Write to SQLite if output file is set
if (_cf_outputFile2 != null && !_cf_outputFile2.isEmpty()) {
try {
Class.forName("org.sqlite.JDBC");
try (Connection _cf_conn2 = DriverManager.getConnection("jdbc:sqlite:" + _cf_outputFile2)) {
try (java.sql.Statement _cf_stmt2 = _cf_conn2.createStatement()) {
_cf_stmt2.execute("CREATE TABLE IF NOT EXISTS test_results (" +
"test_module_path TEXT, test_class_name TEXT, test_function_name TEXT, " +
"function_getting_tested TEXT, loop_index INTEGER, iteration_id TEXT, " +
"runtime INTEGER, return_value BLOB, verification_type TEXT)");
}
String _cf_sql2 = "INSERT INTO test_results VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";
try (PreparedStatement _cf_pstmt2 = _cf_conn2.prepareStatement(_cf_sql2)) {
_cf_pstmt2.setString(1, _cf_mod2);
_cf_pstmt2.setString(2, _cf_cls2);
_cf_pstmt2.setString(3, "FibonacciTestTest");
_cf_pstmt2.setString(4, _cf_fn2);
_cf_pstmt2.setInt(5, _cf_loop2);
_cf_pstmt2.setString(6, _cf_iter2 + "_" + _cf_testIteration2);
_cf_pstmt2.setLong(7, _cf_dur2);
_cf_pstmt2.setBytes(8, _cf_serializedResult2);
_cf_pstmt2.setString(9, "function_call");
_cf_pstmt2.executeUpdate();
}
}
} catch (Exception _cf_e2) {
System.err.println("CodeflashHelper: SQLite error: " + _cf_e2.getMessage());
}
}
}
}
}
"""
assert success is True
# The assertThrows lambda line should remain unchanged (not wrapped in variable assignment)
assert "() -> Fibonacci.fibonacci(-1)" in result
# The non-lambda call should still be wrapped
assert "_cf_result" in result
assert result == expected
def test_instrument_behavior_mode_assert_throws_block_lambda(self, tmp_path: Path):
"""Test that assertThrows block lambdas are not broken by behavior instrumentation.
@ -240,11 +398,124 @@ public class FibonacciTest {
test_path=test_file,
)
expected = """import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
public class FibonacciTest__perfinstrumented {
@Test
void testNegativeInput_ThrowsIllegalArgumentException() {
// Codeflash behavior instrumentation
int _cf_loop1 = Integer.parseInt(System.getenv("CODEFLASH_LOOP_INDEX"));
int _cf_iter1 = 1;
String _cf_mod1 = "FibonacciTest";
String _cf_cls1 = "FibonacciTest";
String _cf_fn1 = "fibonacci";
String _cf_outputFile1 = System.getenv("CODEFLASH_OUTPUT_FILE");
String _cf_testIteration1 = System.getenv("CODEFLASH_TEST_ITERATION");
if (_cf_testIteration1 == null) _cf_testIteration1 = "0";
System.out.println("!$######" + _cf_mod1 + ":" + _cf_cls1 + ":" + _cf_fn1 + ":" + _cf_loop1 + ":" + _cf_iter1 + "######$!");
long _cf_start1 = System.nanoTime();
byte[] _cf_serializedResult1 = null;
try {
assertThrows(IllegalArgumentException.class, () -> {
Fibonacci.fibonacci(-1);
});
} finally {
long _cf_end1 = System.nanoTime();
long _cf_dur1 = _cf_end1 - _cf_start1;
System.out.println("!######" + _cf_mod1 + ":" + _cf_cls1 + ":" + _cf_fn1 + ":" + _cf_loop1 + ":" + _cf_iter1 + ":" + _cf_dur1 + "######!");
// Write to SQLite if output file is set
if (_cf_outputFile1 != null && !_cf_outputFile1.isEmpty()) {
try {
Class.forName("org.sqlite.JDBC");
try (Connection _cf_conn1 = DriverManager.getConnection("jdbc:sqlite:" + _cf_outputFile1)) {
try (java.sql.Statement _cf_stmt1 = _cf_conn1.createStatement()) {
_cf_stmt1.execute("CREATE TABLE IF NOT EXISTS test_results (" +
"test_module_path TEXT, test_class_name TEXT, test_function_name TEXT, " +
"function_getting_tested TEXT, loop_index INTEGER, iteration_id TEXT, " +
"runtime INTEGER, return_value BLOB, verification_type TEXT)");
}
String _cf_sql1 = "INSERT INTO test_results VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";
try (PreparedStatement _cf_pstmt1 = _cf_conn1.prepareStatement(_cf_sql1)) {
_cf_pstmt1.setString(1, _cf_mod1);
_cf_pstmt1.setString(2, _cf_cls1);
_cf_pstmt1.setString(3, "FibonacciTestTest");
_cf_pstmt1.setString(4, _cf_fn1);
_cf_pstmt1.setInt(5, _cf_loop1);
_cf_pstmt1.setString(6, _cf_iter1 + "_" + _cf_testIteration1);
_cf_pstmt1.setLong(7, _cf_dur1);
_cf_pstmt1.setBytes(8, _cf_serializedResult1);
_cf_pstmt1.setString(9, "function_call");
_cf_pstmt1.executeUpdate();
}
}
} catch (Exception _cf_e1) {
System.err.println("CodeflashHelper: SQLite error: " + _cf_e1.getMessage());
}
}
}
}
@Test
void testZeroInput_ReturnsZero() {
// Codeflash behavior instrumentation
int _cf_loop2 = Integer.parseInt(System.getenv("CODEFLASH_LOOP_INDEX"));
int _cf_iter2 = 2;
String _cf_mod2 = "FibonacciTest";
String _cf_cls2 = "FibonacciTest";
String _cf_fn2 = "fibonacci";
String _cf_outputFile2 = System.getenv("CODEFLASH_OUTPUT_FILE");
String _cf_testIteration2 = System.getenv("CODEFLASH_TEST_ITERATION");
if (_cf_testIteration2 == null) _cf_testIteration2 = "0";
System.out.println("!$######" + _cf_mod2 + ":" + _cf_cls2 + ":" + _cf_fn2 + ":" + _cf_loop2 + ":" + _cf_iter2 + "######$!");
long _cf_start2 = System.nanoTime();
byte[] _cf_serializedResult2 = null;
try {
var _cf_result2_1 = Fibonacci.fibonacci(0);
_cf_serializedResult2 = com.codeflash.Serializer.serialize((Object) _cf_result2_1);
assertEquals(0L, _cf_result2_1);
} finally {
long _cf_end2 = System.nanoTime();
long _cf_dur2 = _cf_end2 - _cf_start2;
System.out.println("!######" + _cf_mod2 + ":" + _cf_cls2 + ":" + _cf_fn2 + ":" + _cf_loop2 + ":" + _cf_iter2 + ":" + _cf_dur2 + "######!");
// Write to SQLite if output file is set
if (_cf_outputFile2 != null && !_cf_outputFile2.isEmpty()) {
try {
Class.forName("org.sqlite.JDBC");
try (Connection _cf_conn2 = DriverManager.getConnection("jdbc:sqlite:" + _cf_outputFile2)) {
try (java.sql.Statement _cf_stmt2 = _cf_conn2.createStatement()) {
_cf_stmt2.execute("CREATE TABLE IF NOT EXISTS test_results (" +
"test_module_path TEXT, test_class_name TEXT, test_function_name TEXT, " +
"function_getting_tested TEXT, loop_index INTEGER, iteration_id TEXT, " +
"runtime INTEGER, return_value BLOB, verification_type TEXT)");
}
String _cf_sql2 = "INSERT INTO test_results VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";
try (PreparedStatement _cf_pstmt2 = _cf_conn2.prepareStatement(_cf_sql2)) {
_cf_pstmt2.setString(1, _cf_mod2);
_cf_pstmt2.setString(2, _cf_cls2);
_cf_pstmt2.setString(3, "FibonacciTestTest");
_cf_pstmt2.setString(4, _cf_fn2);
_cf_pstmt2.setInt(5, _cf_loop2);
_cf_pstmt2.setString(6, _cf_iter2 + "_" + _cf_testIteration2);
_cf_pstmt2.setLong(7, _cf_dur2);
_cf_pstmt2.setBytes(8, _cf_serializedResult2);
_cf_pstmt2.setString(9, "function_call");
_cf_pstmt2.executeUpdate();
}
}
} catch (Exception _cf_e2) {
System.err.println("CodeflashHelper: SQLite error: " + _cf_e2.getMessage());
}
}
}
}
}
"""
assert success is True
assert "Fibonacci.fibonacci(-1);" in result
assert "() -> {" in result
lines_with_cf_result = [l for l in result.split("\n") if "var _cf_result" in l and "Fibonacci.fibonacci(0)" in l]
assert len(lines_with_cf_result) > 0, "Non-lambda call to fibonacci(0) should be wrapped"
assert result == expected
def test_instrument_performance_mode_simple(self, tmp_path: Path):
"""Test instrumenting a simple test in performance mode with inner loop."""
@ -295,7 +566,7 @@ public class CalculatorTest__perfonlyinstrumented {
long _cf_start1 = System.nanoTime();
try {
Calculator calc = new Calculator();
Object _cf_result1 = calc.add(2, 2);
assertEquals(4, calc.add(2, 2));
} finally {
long _cf_end1 = System.nanoTime();
long _cf_dur1 = _cf_end1 - _cf_start1;
@ -360,6 +631,7 @@ public class MathTest__perfonlyinstrumented {
System.out.println("!$######" + _cf_mod1 + ":" + _cf_cls1 + ":" + _cf_fn1 + ":" + _cf_loop1 + ":" + _cf_i1 + "######$!");
long _cf_start1 = System.nanoTime();
try {
assertEquals(4, add(2, 2));
} finally {
long _cf_end1 = System.nanoTime();
long _cf_dur1 = _cf_end1 - _cf_start1;
@ -381,6 +653,7 @@ public class MathTest__perfonlyinstrumented {
System.out.println("!$######" + _cf_mod2 + ":" + _cf_cls2 + ":" + _cf_fn2 + ":" + _cf_loop2 + ":" + _cf_i2 + "######$!");
long _cf_start2 = System.nanoTime();
try {
assertEquals(0, subtract(2, 2));
} finally {
long _cf_end2 = System.nanoTime();
long _cf_dur2 = _cf_end2 - _cf_start2;
@ -513,9 +786,7 @@ public class ServiceTest__perfonlyinstrumented {
class TestKryoSerializerUsage:
"""Tests for Kryo Serializer usage in behavior mode."""
def test_serializer_used_for_return_values(self):
"""Test that captured return values use com.codeflash.Serializer.serialize()."""
source = """import org.junit.jupiter.api.Test;
KRYO_SOURCE = """import org.junit.jupiter.api.Test;
public class MyTest {
@Test
@ -524,91 +795,125 @@ public class MyTest {
}
}
"""
result = _add_behavior_instrumentation(source, "MyTest", "foo")
assert "com.codeflash.Serializer.serialize((Object)" in result
# Should NOT use old _cfSerialize helper
assert "_cfSerialize" not in result
BEHAVIOR_EXPECTED = """import org.junit.jupiter.api.Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
public class MyTest {
@Test
public void testFoo() {
// Codeflash behavior instrumentation
int _cf_loop1 = Integer.parseInt(System.getenv("CODEFLASH_LOOP_INDEX"));
int _cf_iter1 = 1;
String _cf_mod1 = "MyTest";
String _cf_cls1 = "MyTest";
String _cf_fn1 = "foo";
String _cf_outputFile1 = System.getenv("CODEFLASH_OUTPUT_FILE");
String _cf_testIteration1 = System.getenv("CODEFLASH_TEST_ITERATION");
if (_cf_testIteration1 == null) _cf_testIteration1 = "0";
System.out.println("!$######" + _cf_mod1 + ":" + _cf_cls1 + ":" + _cf_fn1 + ":" + _cf_loop1 + ":" + _cf_iter1 + "######$!");
long _cf_start1 = System.nanoTime();
byte[] _cf_serializedResult1 = null;
try {
var _cf_result1_1 = obj.foo();
_cf_serializedResult1 = com.codeflash.Serializer.serialize((Object) _cf_result1_1);
assertEquals(0, _cf_result1_1);
} finally {
long _cf_end1 = System.nanoTime();
long _cf_dur1 = _cf_end1 - _cf_start1;
System.out.println("!######" + _cf_mod1 + ":" + _cf_cls1 + ":" + _cf_fn1 + ":" + _cf_loop1 + ":" + _cf_iter1 + ":" + _cf_dur1 + "######!");
// Write to SQLite if output file is set
if (_cf_outputFile1 != null && !_cf_outputFile1.isEmpty()) {
try {
Class.forName("org.sqlite.JDBC");
try (Connection _cf_conn1 = DriverManager.getConnection("jdbc:sqlite:" + _cf_outputFile1)) {
try (java.sql.Statement _cf_stmt1 = _cf_conn1.createStatement()) {
_cf_stmt1.execute("CREATE TABLE IF NOT EXISTS test_results (" +
"test_module_path TEXT, test_class_name TEXT, test_function_name TEXT, " +
"function_getting_tested TEXT, loop_index INTEGER, iteration_id TEXT, " +
"runtime INTEGER, return_value BLOB, verification_type TEXT)");
}
String _cf_sql1 = "INSERT INTO test_results VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";
try (PreparedStatement _cf_pstmt1 = _cf_conn1.prepareStatement(_cf_sql1)) {
_cf_pstmt1.setString(1, _cf_mod1);
_cf_pstmt1.setString(2, _cf_cls1);
_cf_pstmt1.setString(3, "MyTestTest");
_cf_pstmt1.setString(4, _cf_fn1);
_cf_pstmt1.setInt(5, _cf_loop1);
_cf_pstmt1.setString(6, _cf_iter1 + "_" + _cf_testIteration1);
_cf_pstmt1.setLong(7, _cf_dur1);
_cf_pstmt1.setBytes(8, _cf_serializedResult1);
_cf_pstmt1.setString(9, "function_call");
_cf_pstmt1.executeUpdate();
}
}
} catch (Exception _cf_e1) {
System.err.println("CodeflashHelper: SQLite error: " + _cf_e1.getMessage());
}
}
}
}
}
"""
TIMING_EXPECTED = """import org.junit.jupiter.api.Test;
public class MyTest {
@Test
public void testFoo() {
// Codeflash timing instrumentation with inner loop for JIT warmup
int _cf_loop1 = Integer.parseInt(System.getenv("CODEFLASH_LOOP_INDEX"));
int _cf_innerIterations1 = Integer.parseInt(System.getenv().getOrDefault("CODEFLASH_INNER_ITERATIONS", "100"));
String _cf_mod1 = "MyTest";
String _cf_cls1 = "MyTest";
String _cf_fn1 = "foo";
for (int _cf_i1 = 0; _cf_i1 < _cf_innerIterations1; _cf_i1++) {
System.out.println("!$######" + _cf_mod1 + ":" + _cf_cls1 + ":" + _cf_fn1 + ":" + _cf_loop1 + ":" + _cf_i1 + "######$!");
long _cf_start1 = System.nanoTime();
try {
assertEquals(0, obj.foo());
} finally {
long _cf_end1 = System.nanoTime();
long _cf_dur1 = _cf_end1 - _cf_start1;
System.out.println("!######" + _cf_mod1 + ":" + _cf_cls1 + ":" + _cf_fn1 + ":" + _cf_loop1 + ":" + _cf_i1 + ":" + _cf_dur1 + "######!");
}
}
}
}
"""
def test_serializer_used_for_return_values(self):
"""Test that captured return values use com.codeflash.Serializer.serialize()."""
result = _add_behavior_instrumentation(self.KRYO_SOURCE, "MyTest", "foo")
assert result == self.BEHAVIOR_EXPECTED
def test_byte_array_result_variable(self):
"""Test that the serialized result variable is byte[] not String."""
source = """import org.junit.jupiter.api.Test;
public class MyTest {
@Test
public void testFoo() {
assertEquals(0, obj.foo());
}
}
"""
result = _add_behavior_instrumentation(source, "MyTest", "foo")
assert "byte[] _cf_serializedResult" in result
assert "String _cf_serializedResult" not in result
result = _add_behavior_instrumentation(self.KRYO_SOURCE, "MyTest", "foo")
assert result == self.BEHAVIOR_EXPECTED
def test_blob_column_in_schema(self):
"""Test that the SQLite schema uses BLOB for return_value column."""
source = """import org.junit.jupiter.api.Test;
public class MyTest {
@Test
public void testFoo() {
assertEquals(0, obj.foo());
}
}
"""
result = _add_behavior_instrumentation(source, "MyTest", "foo")
assert "return_value BLOB" in result
assert "return_value TEXT" not in result
result = _add_behavior_instrumentation(self.KRYO_SOURCE, "MyTest", "foo")
assert result == self.BEHAVIOR_EXPECTED
def test_set_bytes_for_blob_write(self):
"""Test that setBytes is used to write BLOB data to SQLite."""
source = """import org.junit.jupiter.api.Test;
public class MyTest {
@Test
public void testFoo() {
assertEquals(0, obj.foo());
}
}
"""
result = _add_behavior_instrumentation(source, "MyTest", "foo")
assert "setBytes(8, _cf_serializedResult" in result
# Should NOT use setString for return value
assert "setString(8, _cf_serializedResult" not in result
result = _add_behavior_instrumentation(self.KRYO_SOURCE, "MyTest", "foo")
assert result == self.BEHAVIOR_EXPECTED
def test_no_inline_helper_injected(self):
"""Test that no inline _cfSerialize helper method is injected."""
source = """import org.junit.jupiter.api.Test;
public class MyTest {
@Test
public void testFoo() {
assertEquals(0, obj.foo());
}
}
"""
result = _add_behavior_instrumentation(source, "MyTest", "foo")
assert "private static String _cfSerialize" not in result
result = _add_behavior_instrumentation(self.KRYO_SOURCE, "MyTest", "foo")
assert result == self.BEHAVIOR_EXPECTED
def test_serializer_not_used_in_performance_mode(self):
"""Test that Serializer is NOT used in performance mode (only behavior)."""
source = """import org.junit.jupiter.api.Test;
public class MyTest {
@Test
public void testFoo() {
assertEquals(0, obj.foo());
}
}
"""
result = _add_timing_instrumentation(source, "MyTest", "foo")
assert "Serializer.serialize" not in result
assert "_cfSerialize" not in result
result = _add_timing_instrumentation(self.KRYO_SOURCE, "MyTest", "foo")
assert result == self.TIMING_EXPECTED
class TestAddTimingInstrumentation:
@ -931,12 +1236,68 @@ public class CalculatorTest {
function_to_optimize=func,
)
# Behavior mode now adds full instrumentation (SQLite, timing markers, etc.)
assert "CalculatorTest__perfinstrumented" in result
assert "_cf_result" in result
assert "com.codeflash.Serializer.serialize" in result
assert "CODEFLASH_OUTPUT_FILE" in result
assert "CREATE TABLE IF NOT EXISTS test_results" in result
expected = """import org.junit.jupiter.api.Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
public class CalculatorTest__perfinstrumented {
@Test
public void testAdd() {
// Codeflash behavior instrumentation
int _cf_loop1 = Integer.parseInt(System.getenv("CODEFLASH_LOOP_INDEX"));
int _cf_iter1 = 1;
String _cf_mod1 = "CalculatorTest";
String _cf_cls1 = "CalculatorTest";
String _cf_fn1 = "add";
String _cf_outputFile1 = System.getenv("CODEFLASH_OUTPUT_FILE");
String _cf_testIteration1 = System.getenv("CODEFLASH_TEST_ITERATION");
if (_cf_testIteration1 == null) _cf_testIteration1 = "0";
System.out.println("!$######" + _cf_mod1 + ":" + _cf_cls1 + ":" + _cf_fn1 + ":" + _cf_loop1 + ":" + _cf_iter1 + "######$!");
long _cf_start1 = System.nanoTime();
byte[] _cf_serializedResult1 = null;
try {
var _cf_result1_1 = new Calculator().add(2, 2);
_cf_serializedResult1 = com.codeflash.Serializer.serialize((Object) _cf_result1_1);
Object _cf_result1 = _cf_result1_1;
} finally {
long _cf_end1 = System.nanoTime();
long _cf_dur1 = _cf_end1 - _cf_start1;
System.out.println("!######" + _cf_mod1 + ":" + _cf_cls1 + ":" + _cf_fn1 + ":" + _cf_loop1 + ":" + _cf_iter1 + ":" + _cf_dur1 + "######!");
// Write to SQLite if output file is set
if (_cf_outputFile1 != null && !_cf_outputFile1.isEmpty()) {
try {
Class.forName("org.sqlite.JDBC");
try (Connection _cf_conn1 = DriverManager.getConnection("jdbc:sqlite:" + _cf_outputFile1)) {
try (java.sql.Statement _cf_stmt1 = _cf_conn1.createStatement()) {
_cf_stmt1.execute("CREATE TABLE IF NOT EXISTS test_results (" +
"test_module_path TEXT, test_class_name TEXT, test_function_name TEXT, " +
"function_getting_tested TEXT, loop_index INTEGER, iteration_id TEXT, " +
"runtime INTEGER, return_value BLOB, verification_type TEXT)");
}
String _cf_sql1 = "INSERT INTO test_results VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";
try (PreparedStatement _cf_pstmt1 = _cf_conn1.prepareStatement(_cf_sql1)) {
_cf_pstmt1.setString(1, _cf_mod1);
_cf_pstmt1.setString(2, _cf_cls1);
_cf_pstmt1.setString(3, "CalculatorTestTest");
_cf_pstmt1.setString(4, _cf_fn1);
_cf_pstmt1.setInt(5, _cf_loop1);
_cf_pstmt1.setString(6, _cf_iter1 + "_" + _cf_testIteration1);
_cf_pstmt1.setLong(7, _cf_dur1);
_cf_pstmt1.setBytes(8, _cf_serializedResult1);
_cf_pstmt1.setString(9, "function_call");
_cf_pstmt1.executeUpdate();
}
}
} catch (Exception _cf_e1) {
System.err.println("CodeflashHelper: SQLite error: " + _cf_e1.getMessage());
}
}
}
}
}
"""
assert result == expected
def test_instrument_generated_test_performance_mode(self):
"""Test instrumenting generated test in performance mode with inner loop."""
@ -1254,7 +1615,7 @@ public class ImportTest__perfonlyinstrumented {
long _cf_start1 = System.nanoTime();
try {
List<String> list = new ArrayList<>();
Object _cf_result1 = list.size();
assertEquals(0, list.size());
} finally {
long _cf_end1 = System.nanoTime();
long _cf_dur1 = _cf_end1 - _cf_start1;
@ -1758,9 +2119,37 @@ public class MathUtilsTest {
)
assert success
# Verify instrumented code contains inner loop for JIT warmup
assert "CODEFLASH_INNER_ITERATIONS" in instrumented, "Performance mode should use inner loop"
assert "for (int _cf_i1 = 0; _cf_i1 < _cf_innerIterations1; _cf_i1++)" in instrumented
expected_instrumented = """package com.example;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class MathUtilsTest__perfonlyinstrumented {
@Test
public void testMultiply() {
// Codeflash timing instrumentation with inner loop for JIT warmup
int _cf_loop1 = Integer.parseInt(System.getenv("CODEFLASH_LOOP_INDEX"));
int _cf_innerIterations1 = Integer.parseInt(System.getenv().getOrDefault("CODEFLASH_INNER_ITERATIONS", "100"));
String _cf_mod1 = "MathUtilsTest";
String _cf_cls1 = "MathUtilsTest";
String _cf_fn1 = "multiply";
for (int _cf_i1 = 0; _cf_i1 < _cf_innerIterations1; _cf_i1++) {
System.out.println("!$######" + _cf_mod1 + ":" + _cf_cls1 + ":" + _cf_fn1 + ":" + _cf_loop1 + ":" + _cf_i1 + "######$!");
long _cf_start1 = System.nanoTime();
try {
MathUtils math = new MathUtils();
assertEquals(6, math.multiply(2, 3));
} finally {
long _cf_end1 = System.nanoTime();
long _cf_dur1 = _cf_end1 - _cf_start1;
System.out.println("!######" + _cf_mod1 + ":" + _cf_cls1 + ":" + _cf_fn1 + ":" + _cf_loop1 + ":" + _cf_i1 + ":" + _cf_dur1 + "######!");
}
}
}
}
"""
assert instrumented == expected_instrumented
instrumented_file = test_dir / "MathUtilsTest__perfonlyinstrumented.java"
instrumented_file.write_text(instrumented, encoding="utf-8")
@ -2103,15 +2492,72 @@ public class CounterTest {
)
assert success
# Verify SQLite imports were added
assert "import java.sql.Connection;" in instrumented
assert "import java.sql.DriverManager;" in instrumented
assert "import java.sql.PreparedStatement;" in instrumented
expected_instrumented = """package com.example;
# Verify SQLite writing code was added
assert "CODEFLASH_OUTPUT_FILE" in instrumented
assert "CREATE TABLE IF NOT EXISTS test_results" in instrumented
assert "INSERT INTO test_results VALUES" in instrumented
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
public class CounterTest__perfinstrumented {
@Test
public void testIncrement() {
// Codeflash behavior instrumentation
int _cf_loop1 = Integer.parseInt(System.getenv("CODEFLASH_LOOP_INDEX"));
int _cf_iter1 = 1;
String _cf_mod1 = "CounterTest";
String _cf_cls1 = "CounterTest";
String _cf_fn1 = "increment";
String _cf_outputFile1 = System.getenv("CODEFLASH_OUTPUT_FILE");
String _cf_testIteration1 = System.getenv("CODEFLASH_TEST_ITERATION");
if (_cf_testIteration1 == null) _cf_testIteration1 = "0";
System.out.println("!$######" + _cf_mod1 + ":" + _cf_cls1 + ":" + _cf_fn1 + ":" + _cf_loop1 + ":" + _cf_iter1 + "######$!");
long _cf_start1 = System.nanoTime();
byte[] _cf_serializedResult1 = null;
try {
Counter counter = new Counter();
var _cf_result1_1 = counter.increment();
_cf_serializedResult1 = com.codeflash.Serializer.serialize((Object) _cf_result1_1);
assertEquals(1, _cf_result1_1);
} finally {
long _cf_end1 = System.nanoTime();
long _cf_dur1 = _cf_end1 - _cf_start1;
System.out.println("!######" + _cf_mod1 + ":" + _cf_cls1 + ":" + _cf_fn1 + ":" + _cf_loop1 + ":" + _cf_iter1 + ":" + _cf_dur1 + "######!");
// Write to SQLite if output file is set
if (_cf_outputFile1 != null && !_cf_outputFile1.isEmpty()) {
try {
Class.forName("org.sqlite.JDBC");
try (Connection _cf_conn1 = DriverManager.getConnection("jdbc:sqlite:" + _cf_outputFile1)) {
try (java.sql.Statement _cf_stmt1 = _cf_conn1.createStatement()) {
_cf_stmt1.execute("CREATE TABLE IF NOT EXISTS test_results (" +
"test_module_path TEXT, test_class_name TEXT, test_function_name TEXT, " +
"function_getting_tested TEXT, loop_index INTEGER, iteration_id TEXT, " +
"runtime INTEGER, return_value BLOB, verification_type TEXT)");
}
String _cf_sql1 = "INSERT INTO test_results VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";
try (PreparedStatement _cf_pstmt1 = _cf_conn1.prepareStatement(_cf_sql1)) {
_cf_pstmt1.setString(1, _cf_mod1);
_cf_pstmt1.setString(2, _cf_cls1);
_cf_pstmt1.setString(3, "CounterTestTest");
_cf_pstmt1.setString(4, _cf_fn1);
_cf_pstmt1.setInt(5, _cf_loop1);
_cf_pstmt1.setString(6, _cf_iter1 + "_" + _cf_testIteration1);
_cf_pstmt1.setLong(7, _cf_dur1);
_cf_pstmt1.setBytes(8, _cf_serializedResult1);
_cf_pstmt1.setString(9, "function_call");
_cf_pstmt1.executeUpdate();
}
}
} catch (Exception _cf_e1) {
System.err.println("CodeflashHelper: SQLite error: " + _cf_e1.getMessage());
}
}
}
}
}
"""
assert instrumented == expected_instrumented
instrumented_file = test_dir / "CounterTest__perfinstrumented.java"
instrumented_file.write_text(instrumented, encoding="utf-8")
@ -2265,9 +2711,37 @@ public class FibonacciTest {
)
assert success
# Verify instrumented code contains inner loop
assert "CODEFLASH_INNER_ITERATIONS" in instrumented
assert "for (int _cf_i1 = 0; _cf_i1 < _cf_innerIterations1; _cf_i1++)" in instrumented
expected_instrumented = """package com.example;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class FibonacciTest__perfonlyinstrumented {
@Test
public void testFib() {
// Codeflash timing instrumentation with inner loop for JIT warmup
int _cf_loop1 = Integer.parseInt(System.getenv("CODEFLASH_LOOP_INDEX"));
int _cf_innerIterations1 = Integer.parseInt(System.getenv().getOrDefault("CODEFLASH_INNER_ITERATIONS", "100"));
String _cf_mod1 = "FibonacciTest";
String _cf_cls1 = "FibonacciTest";
String _cf_fn1 = "fib";
for (int _cf_i1 = 0; _cf_i1 < _cf_innerIterations1; _cf_i1++) {
System.out.println("!$######" + _cf_mod1 + ":" + _cf_cls1 + ":" + _cf_fn1 + ":" + _cf_loop1 + ":" + _cf_i1 + "######$!");
long _cf_start1 = System.nanoTime();
try {
Fibonacci fib = new Fibonacci();
assertEquals(5, fib.fib(5));
} finally {
long _cf_end1 = System.nanoTime();
long _cf_dur1 = _cf_end1 - _cf_start1;
System.out.println("!######" + _cf_mod1 + ":" + _cf_cls1 + ":" + _cf_fn1 + ":" + _cf_loop1 + ":" + _cf_i1 + ":" + _cf_dur1 + "######!");
}
}
}
}
"""
assert instrumented == expected_instrumented
instrumented_file = test_dir / "FibonacciTest__perfonlyinstrumented.java"
instrumented_file.write_text(instrumented, encoding="utf-8")

File diff suppressed because it is too large Load diff