diff --git a/.github/scripts/ci_testing/test_conftest_fixtures.py b/.github/scripts/ci_testing/test_conftest_fixtures.py new file mode 100644 index 00000000000..ef1d495afa6 --- /dev/null +++ b/.github/scripts/ci_testing/test_conftest_fixtures.py @@ -0,0 +1,285 @@ +#!/usr/bin/env python3 +# SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: Apache-2.0 + +""" +Tests for the coverage_capture and save_perf_result fixtures in conftest.py. + +These tests mock the ``dut`` and ``request`` objects to avoid requiring +real hardware or pytest-embedded. + +Usage: + python3 -m pytest .github/scripts/ci_testing/test_conftest_fixtures.py -v -p no:pytest_embedded +""" + +import json +import os +from pathlib import Path +from types import SimpleNamespace +from unittest import mock +import importlib +import importlib.util + +import pytest + + +# --------------------------------------------------------------------------- +# Import fixture functions, stripping the @pytest.fixture marker so they +# can be called as plain functions from our tests. +# --------------------------------------------------------------------------- + +_conftest_path = Path(__file__).resolve().parent.parent.parent.parent / "tests" / "conftest.py" + +_orig_fixture = pytest.fixture + +def _passthrough_fixture(*args, **kwargs): + """Replace @pytest.fixture with a no-op decorator during module load.""" + if args and callable(args[0]): + return args[0] + return lambda f: f + +pytest.fixture = _passthrough_fixture +try: + _spec = importlib.util.spec_from_file_location("tests_conftest", _conftest_path) + _conftest = importlib.util.module_from_spec(_spec) + _spec.loader.exec_module(_conftest) +finally: + pytest.fixture = _orig_fixture + +coverage_capture_fn = _conftest.coverage_capture +gcov_dump_capture_fn = _conftest.gcov_dump_capture +save_perf_result_fn = _conftest.save_perf_result +wait_for_gcov_dump_fn = _conftest.wait_for_gcov_dump +_get_coverage_log_path_fn = _conftest._get_coverage_log_path + +GCOV_START = _conftest.GCOV_START +GCOV_END = _conftest.GCOV_END +GCOV_START_TIMEOUT = _conftest.GCOV_START_TIMEOUT +GCOV_DUMP_TIMEOUT = _conftest.GCOV_DUMP_TIMEOUT + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + +def _make_request(xmlpath=None, fspath="/fake/tests/test_example.py"): + """Create a mock request object.""" + req = mock.MagicMock() + req.config.getoption.return_value = xmlpath + req.fspath = fspath + req.path = Path(fspath) + req.node = SimpleNamespace() + return req + + +def _run_coverage_capture(dut, request): + """Execute the coverage_capture generator (yield-fixture pattern).""" + gen = coverage_capture_fn(dut, request) + next(gen) # run up to yield + try: + next(gen) # run teardown + except StopIteration: + pass + + +def _make_dut(capture_return=True): + """Create a mock dut with capture_payload_to_file stubbed.""" + dut = mock.MagicMock() + dut.capture_payload_to_file.return_value = capture_return + return dut + + +# --------------------------------------------------------------------------- +# _get_coverage_log_path tests +# --------------------------------------------------------------------------- + +class TestGetCoverageLogPath: + def test_derives_from_xmlpath(self, tmp_path): + req = _make_request(xmlpath=str(tmp_path / "results.xml")) + assert _get_coverage_log_path_fn(req) == str(tmp_path / "results_coverage.log") + + def test_falls_back_to_fspath(self, tmp_path): + req = _make_request(xmlpath=None, fspath=str(tmp_path / "test_foo.py")) + assert _get_coverage_log_path_fn(req) == str(tmp_path / "coverage_serial.log") + + def test_indexed_xml_path(self, tmp_path): + req = _make_request(xmlpath=str(tmp_path / "nvs0.xml")) + assert _get_coverage_log_path_fn(req) == str(tmp_path / "nvs0_coverage.log") + + +# --------------------------------------------------------------------------- +# wait_for_gcov_dump tests +# --------------------------------------------------------------------------- + +class TestWaitForGcovDump: + def test_delegates_to_capture_payload_to_file(self, tmp_path): + dut = _make_dut(capture_return=True) + out = str(tmp_path / "cov.log") + assert wait_for_gcov_dump_fn(dut, out) is True + dut.capture_payload_to_file.assert_called_once_with( + start=GCOV_START, + end=GCOV_END, + filepath=out, + start_timeout=GCOV_START_TIMEOUT, + timeout=GCOV_DUMP_TIMEOUT, + ) + + def test_returns_false_on_failure(self, tmp_path): + dut = _make_dut(capture_return=False) + out = str(tmp_path / "cov.log") + assert wait_for_gcov_dump_fn(dut, out) is False + + def test_returns_true_on_success(self, tmp_path): + dut = _make_dut(capture_return=True) + out = str(tmp_path / "cov.log") + assert wait_for_gcov_dump_fn(dut, out) is True + + +# --------------------------------------------------------------------------- +# coverage_capture fixture tests +# --------------------------------------------------------------------------- + +class TestCoverageCapture: + def test_no_capture_when_payload_missing(self, tmp_path): + """When firmware has no coverage, capture_payload_to_file returns False.""" + dut = _make_dut(capture_return=False) + req = _make_request(xmlpath=str(tmp_path / "results.xml")) + + _run_coverage_capture(dut, req) + + dut.capture_payload_to_file.assert_called_once() + + def test_captures_data(self, tmp_path): + """Full flow: capture_payload_to_file is called with correct args.""" + dut = _make_dut(capture_return=True) + req = _make_request(xmlpath=str(tmp_path / "results.xml")) + + _run_coverage_capture(dut, req) + + dut.capture_payload_to_file.assert_called_once() + + def test_skips_when_gcov_captured_flag_set(self, tmp_path): + """Autouse fixture does nothing when test used gcov_dump_capture.""" + dut = _make_dut(capture_return=True) + req = _make_request(xmlpath=str(tmp_path / "results.xml")) + req.node._gcov_captured = True + + _run_coverage_capture(dut, req) + + dut.capture_payload_to_file.assert_not_called() + + +# --------------------------------------------------------------------------- +# gcov_dump_capture fixture tests +# --------------------------------------------------------------------------- + +class TestGcovDumpCapture: + def test_returns_callable(self, tmp_path): + dut = _make_dut(capture_return=True) + req = _make_request(xmlpath=str(tmp_path / "results.xml")) + gen = gcov_dump_capture_fn(dut, req) + capture = next(gen) + assert callable(capture) + + def test_callable_sets_flag(self, tmp_path): + dut = _make_dut(capture_return=True) + req = _make_request(xmlpath=str(tmp_path / "results.xml")) + gen = gcov_dump_capture_fn(dut, req) + capture = next(gen) + assert not getattr(req.node, "_gcov_captured", False) + capture() + assert req.node._gcov_captured is True + + def test_multiple_calls_invoke_capture(self, tmp_path): + """Calling the capture callable multiple times invokes capture_payload_to_file each time.""" + dut = _make_dut(capture_return=True) + req = _make_request(xmlpath=str(tmp_path / "results.xml")) + gen = gcov_dump_capture_fn(dut, req) + capture = next(gen) + + assert capture() is True + assert capture() is True + + assert dut.capture_payload_to_file.call_count == 2 + + +# --------------------------------------------------------------------------- +# save_perf_result tests +# --------------------------------------------------------------------------- + +class TestSavePerfResult: + def _make_save_fixture(self, tmp_path, target="esp32"): + """Create the save callable from the fixture.""" + dut = mock.MagicMock() + dut.app.target = target + req = mock.MagicMock() + req.path = tmp_path / "test_perf.py" + return save_perf_result_fn(dut, req) + + def test_saves_json_file(self, tmp_path): + save = self._make_save_fixture(tmp_path) + results = { + "test_name": "coremark", + "runs": 3, + "settings": "", + "metrics": [{"name": "score", "value": 1000.0, "unit": "iterations/s"}], + } + save(results) + + out_file = tmp_path / "esp32" / "result_coremark0.json" + assert out_file.exists() + data = json.loads(out_file.read_text()) + assert data["test_name"] == "coremark" + assert data["runs"] == 3 + + def test_increments_index_on_collision(self, tmp_path): + save = self._make_save_fixture(tmp_path) + target_dir = tmp_path / "esp32" + target_dir.mkdir(parents=True) + (target_dir / "result_bench0.json").write_text("{}") + + results = {"test_name": "bench", "runs": 1, "settings": "", "metrics": []} + save(results) + + assert (target_dir / "result_bench1.json").exists() + + def test_multiple_increments(self, tmp_path): + save = self._make_save_fixture(tmp_path) + target_dir = tmp_path / "esp32" + target_dir.mkdir(parents=True) + (target_dir / "result_x0.json").write_text("{}") + (target_dir / "result_x1.json").write_text("{}") + + results = {"test_name": "x", "runs": 1, "settings": "", "metrics": []} + save(results) + + assert (target_dir / "result_x2.json").exists() + + def test_default_test_name(self, tmp_path): + save = self._make_save_fixture(tmp_path) + results = {"runs": 1, "settings": "", "metrics": []} + save(results) + + out_file = tmp_path / "esp32" / "result_unknown0.json" + assert out_file.exists() + + def test_creates_target_dir(self, tmp_path): + save = self._make_save_fixture(tmp_path, target="esp32s3") + results = {"test_name": "test", "runs": 1, "settings": "", "metrics": []} + save(results) + + assert (tmp_path / "esp32s3" / "result_test0.json").exists() + + def test_json_content_matches(self, tmp_path): + save = self._make_save_fixture(tmp_path) + results = { + "test_name": "perf", + "runs": 10, + "settings": "opt=O2", + "metrics": [{"name": "latency", "value": 5.5, "unit": "ms"}], + } + save(results) + + out_file = tmp_path / "esp32" / "result_perf0.json" + data = json.loads(out_file.read_text()) + assert data == results diff --git a/.github/scripts/ci_testing/test_coverage_collector.py b/.github/scripts/ci_testing/test_coverage_collector.py new file mode 100644 index 00000000000..2fbe86dc059 --- /dev/null +++ b/.github/scripts/ci_testing/test_coverage_collector.py @@ -0,0 +1,721 @@ +#!/usr/bin/env python3 +# SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: Apache-2.0 + +""" +Tests for coverage_collector.py + +Usage: + python3 -m pytest .github/scripts/ci_testing/test_coverage_collector.py -v +""" + +import base64 +import json +import os +import subprocess +import sys +from pathlib import Path +from unittest import mock + +import pytest + +sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) + +from coverage_collector import ( + _demangle_names, + _match_build_dir, + extract_gcov_files, + find_gcno, + generate_uncovered_report, + parse_lcov_summary, + parse_tracefile_functions, + place_gcda_files, + run_lcov, + strip_ansi, +) + +FIXTURE_DIR = Path(__file__).resolve().parent.parent.parent.parent / "tests" / "validation" / "unity" / "esp32" +COVERAGE_LOG = FIXTURE_DIR / "unity_coverage.log" + + +# --------------------------------------------------------------------------- +# strip_ansi +# --------------------------------------------------------------------------- + +class TestStripAnsi: + def test_removes_color_codes(self): + assert strip_ansi("\x1b[32mPASS\x1b[0m") == "PASS" + + def test_removes_multiple_codes(self): + assert strip_ansi("\x1b[1;31mERROR\x1b[0m: \x1b[33mwarning\x1b[0m") == "ERROR: warning" + + def test_passthrough_plain_text(self): + assert strip_ansi("hello world") == "hello world" + + def test_empty_string(self): + assert strip_ansi("") == "" + + +# --------------------------------------------------------------------------- +# extract_gcov_files +# --------------------------------------------------------------------------- + +class TestExtractGcovFiles: + def test_single_file_roundtrip(self): + payload = b"\x01\x02\x03\x04\x05" + b64 = base64.b64encode(payload).decode() + log = ( + "<<>>\n" + f"{b64}\n" + "<<>>\n" + ) + files = extract_gcov_files(log) + assert len(files) == 1 + assert files["/tmp/test.gcda"] == payload + + def test_multiple_files(self): + p1, p2 = b"data1", b"data2" + log = ( + "<<>>\n" + f"{base64.b64encode(p1).decode()}\n" + "<<>>\n" + "<<>>\n" + f"{base64.b64encode(p2).decode()}\n" + "<<>>\n" + ) + files = extract_gcov_files(log) + assert len(files) == 2 + assert files["/a.gcda"] == p1 + assert files["/b.gcda"] == p2 + + def test_strips_ansi_in_markers(self): + payload = b"\xff" + b64 = base64.b64encode(payload).decode() + log = ( + "\x1b[32m<<>>\x1b[0m\n" + f"{b64}\n" + "\x1b[32m<<>>\x1b[0m\n" + ) + files = extract_gcov_files(log) + assert "/ansi.gcda" in files + assert files["/ansi.gcda"] == payload + + def test_multiline_independently_encoded(self): + """Each serial line is encoded independently by base64_encode_chars.""" + part1 = b"first chunk data!!" + part2 = b"second chunk data!" + log = ( + "<<>>\n" + f"{base64.b64encode(part1).decode()}\n" + f"{base64.b64encode(part2).decode()}\n" + "<<>>\n" + ) + files = extract_gcov_files(log) + assert files["/multi.gcda"] == part1 + part2 + + def test_chunked_base64_with_intermediate_padding(self): + """libb64 may emit '=' padding at the end of each chunk.""" + chunk1 = b"\x01\x02\x03\x04\x05" # 5 bytes -> padded b64 + chunk2 = b"\x06\x07\x08\x09\x0a\x0b" # 6 bytes -> no padding + chunk3 = b"\x0c\x0d" # 2 bytes -> padded b64 + b1 = base64.b64encode(chunk1).decode() # "AQIDBAU=" + b2 = base64.b64encode(chunk2).decode() # "BgcICQoL" + b3 = base64.b64encode(chunk3).decode() # "DA0=" + assert "=" in b1 and "=" in b3 + log = ( + "<<>>\n" + f"{b1}\n{b2}\n{b3}\n" + "<<>>\n" + ) + files = extract_gcov_files(log) + assert files["/padded.gcda"] == chunk1 + chunk2 + chunk3 + + def test_noise_lines_skipped_valid_lines_kept(self): + """Noise lines that fail b64 decode are skipped; valid lines are kept.""" + payload = b"clean data here" + b64 = base64.b64encode(payload).decode() + log = ( + "<<>>\n" + "X\n" # 1 char -> invalid b64 length -> skipped + f"{b64}\n" + "<<>>\n" + ) + files = extract_gcov_files(log) + assert files["/noisy.gcda"] == payload + + def test_empty_base64_skipped(self): + log = ( + "<<>>\n" + "<<>>\n" + ) + files = extract_gcov_files(log) + assert len(files) == 0 + + def test_no_markers_returns_empty(self): + files = extract_gcov_files("just some random test output\nnothing here\n") + assert files == {} + + def test_unclosed_file_ignored(self): + log = ( + "<<>>\n" + f"{base64.b64encode(b'data').decode()}\n" + ) + files = extract_gcov_files(log) + assert len(files) == 0 + + def test_real_log_fixture(self): + if not COVERAGE_LOG.exists(): + pytest.skip("unity_coverage.log fixture not found") + log_text = COVERAGE_LOG.read_text(errors="replace") + files = extract_gcov_files(log_text) + assert len(files) > 0 + for path, data in files.items(): + assert path.endswith(".gcda"), f"Expected .gcda path, got {path}" + assert len(data) > 128, f"Suspiciously small data for {path}: {len(data)} bytes" + assert data[:4] == b"adcg", f"Bad gcda magic for {path}" + + def test_all_lines_invalid_base64_skips_file(self): + """When every b64 line fails to decode, the file is not emitted.""" + log = ( + "<<>>\n" + "X\n" # 1 char after cleaning -> 1 mod 4 -> invalid + "<<>>\n" + ) + files = extract_gcov_files(log) + assert "/bad.gcda" not in files + + def test_duplicate_paths_concatenated(self): + """Multiple dump sessions with the same .gcda path concatenate bytes.""" + boot1 = b"boot1_data_record" + boot2 = b"boot2_data_record" + log = ( + "<<>>\n" + f"{base64.b64encode(boot1).decode()}\n" + "<<>>\n" + "<<>>\n" + f"{base64.b64encode(boot2).decode()}\n" + "<<>>\n" + ) + files = extract_gcov_files(log) + assert len(files) == 1 + assert files["/build/sketch.cpp.gcda"] == boot1 + boot2 + + def test_duplicate_and_unique_paths_mixed(self): + """A mix of duplicate and unique paths: duplicates merge, unique stays.""" + d1 = b"dup_part1" + d2 = b"dup_part2" + u = b"unique_data" + log = ( + "<<>>\n" + f"{base64.b64encode(d1).decode()}\n" + "<<>>\n" + "<<>>\n" + f"{base64.b64encode(u).decode()}\n" + "<<>>\n" + "<<>>\n" + f"{base64.b64encode(d2).decode()}\n" + "<<>>\n" + ) + files = extract_gcov_files(log) + assert len(files) == 2 + assert files["/dup.gcda"] == d1 + d2 + assert files["/uniq.gcda"] == u + + +# --------------------------------------------------------------------------- +# find_gcno +# --------------------------------------------------------------------------- + +class TestFindGcno: + def test_finds_matching_gcno(self, tmp_path): + gcno = tmp_path / "build" / "gcov" / "Esp.cpp.gcno" + gcno.parent.mkdir(parents=True) + gcno.write_bytes(b"\x00") + result = find_gcno("Esp.cpp.gcda", [str(tmp_path / "build")]) + assert result == str(gcno) + + def test_returns_none_when_missing(self, tmp_path): + result = find_gcno("Missing.cpp.gcda", [str(tmp_path)]) + assert result is None + + def test_searches_multiple_dirs(self, tmp_path): + dir1 = tmp_path / "dir1" + dir2 = tmp_path / "dir2" / "sub" + dir2.mkdir(parents=True) + dir1.mkdir() + gcno = dir2 / "Stream.cpp.gcno" + gcno.write_bytes(b"\x00") + result = find_gcno("Stream.cpp.gcda", [str(dir1), str(tmp_path / "dir2")]) + assert result == str(gcno) + + def test_empty_build_dirs(self): + assert find_gcno("anything.gcda", []) is None + + +# --------------------------------------------------------------------------- +# _match_build_dir +# --------------------------------------------------------------------------- + +class TestMatchBuildDir: + def test_matches_path_containing_build_dir(self, tmp_path): + bd = tmp_path / "build0.tmp" + bd.mkdir() + gcda_path = str(bd / "objects" / "sketch.cpp.gcda") + assert _match_build_dir(gcda_path, [str(bd)]) == str(bd) + + def test_returns_none_for_external_path(self, tmp_path): + bd = tmp_path / "build0.tmp" + bd.mkdir() + assert _match_build_dir("/tmp/acmake_cache/core/Esp.cpp.gcda", [str(bd)]) is None + + def test_selects_correct_dir_among_multiple(self, tmp_path): + bd0 = tmp_path / "build0.tmp" + bd1 = tmp_path / "build1.tmp" + bd0.mkdir() + bd1.mkdir() + gcda0 = str(bd0 / "objects" / "sketch.cpp.gcda") + gcda1 = str(bd1 / "objects" / "sketch.cpp.gcda") + assert _match_build_dir(gcda0, [str(bd0), str(bd1)]) == str(bd0) + assert _match_build_dir(gcda1, [str(bd0), str(bd1)]) == str(bd1) + + +# --------------------------------------------------------------------------- +# place_gcda_files +# --------------------------------------------------------------------------- + +class TestPlaceGcdaFiles: + def test_places_gcda_next_to_gcno(self, tmp_path): + gcno = tmp_path / "gcov" / "Esp.cpp.gcno" + gcno.parent.mkdir(parents=True) + gcno.write_bytes(b"gcno content") + gcov_files = {"/some/path/Esp.cpp.gcda": b"gcda content"} + written = place_gcda_files(gcov_files, [str(tmp_path)]) + assert len(written) == 1 + gcda = tmp_path / "gcov" / "Esp.cpp.gcda" + assert gcda.exists() + assert gcda.read_bytes() == b"gcda content" + + def test_skips_when_no_gcno_match(self, tmp_path, capsys): + gcov_files = {"/missing/NoMatch.cpp.gcda": b"data"} + written = place_gcda_files(gcov_files, [str(tmp_path)]) + assert len(written) == 0 + captured = capsys.readouterr() + assert "WARNING" in captured.err + + def test_multiple_files(self, tmp_path): + for name in ("A.cpp.gcno", "B.cpp.gcno"): + f = tmp_path / name + f.write_bytes(b"\x00") + gcov_files = { + "/x/A.cpp.gcda": b"A", + "/y/B.cpp.gcda": b"B", + } + written = place_gcda_files(gcov_files, [str(tmp_path)]) + assert len(written) == 2 + assert (tmp_path / "A.cpp.gcda").read_bytes() == b"A" + assert (tmp_path / "B.cpp.gcda").read_bytes() == b"B" + + def test_multi_config_same_basename_no_overwrite(self, tmp_path): + """Two configs with same .gcno basenames get separate .gcda files.""" + bd0 = tmp_path / "build0.tmp" + bd1 = tmp_path / "build1.tmp" + for bd in (bd0, bd1): + gcno = bd / "gcov" / "core" / "main.cpp.gcno" + gcno.parent.mkdir(parents=True) + gcno.write_bytes(b"\x00") + sketch_gcno = bd / "gcov" / "sketch" / "sketch.cpp.gcno" + sketch_gcno.parent.mkdir(parents=True) + sketch_gcno.write_bytes(b"\x00") + + gcov_files = { + str(bd0 / "objects/sketch.cpp.gcda"): b"sketch0", + str(bd1 / "objects/sketch.cpp.gcda"): b"sketch1", + "/cache/hash0/core/main.cpp.gcda": b"core0", + "/cache/hash1/core/main.cpp.gcda": b"core1", + } + written = place_gcda_files(gcov_files, [str(bd0), str(bd1)]) + assert len(written) == 4 + + s0 = bd0 / "gcov" / "sketch" / "sketch.cpp.gcda" + s1 = bd1 / "gcov" / "sketch" / "sketch.cpp.gcda" + assert s0.read_bytes() == b"sketch0" + assert s1.read_bytes() == b"sketch1" + + c0 = bd0 / "gcov" / "core" / "main.cpp.gcda" + c1 = bd1 / "gcov" / "core" / "main.cpp.gcda" + assert c0.exists() and c1.exists() + assert {c0.read_bytes(), c1.read_bytes()} == {b"core0", b"core1"} + + +# --------------------------------------------------------------------------- +# run_lcov +# --------------------------------------------------------------------------- + +class TestRunLcov: + def test_single_dir_success(self, tmp_path): + bd = tmp_path / "build" + bd.mkdir() + tracefile = str(tmp_path / "out.info") + part0 = f"{tracefile}.part0" + + def fake_run(cmd, **kwargs): + Path(part0).write_text("TN:\nSF:/src/test.c\nend_of_record\n") + return mock.Mock(returncode=0, stderr="") + + with mock.patch("coverage_collector.subprocess.run", side_effect=fake_run): + ok = run_lcov([str(bd)], "xtensa-esp-elf-gcov", tracefile) + assert ok + assert Path(tracefile).exists() + + def test_capture_failure_returns_false(self, tmp_path): + bd = tmp_path / "build" + bd.mkdir() + tracefile = str(tmp_path / "out.info") + + def fake_run(cmd, **kwargs): + return mock.Mock(returncode=1, stderr="lcov error") + + with mock.patch("coverage_collector.subprocess.run", side_effect=fake_run): + ok = run_lcov([str(bd)], None, tracefile) + assert not ok + + def test_multiple_dirs_merge(self, tmp_path): + bd1 = tmp_path / "b1" + bd2 = tmp_path / "b2" + bd1.mkdir() + bd2.mkdir() + tracefile = str(tmp_path / "merged.info") + + call_count = [0] + + def fake_run(cmd, **kwargs): + nonlocal call_count + if "--capture" in cmd: + idx = call_count[0] + call_count[0] += 1 + part = f"{tracefile}.part{idx}" + Path(part).write_text(f"SF:test{idx}.c\nend_of_record\n") + return mock.Mock(returncode=0, stderr="") + elif "--add-tracefile" in cmd: + Path(tracefile).write_text("merged\n") + return mock.Mock(returncode=0) + return mock.Mock(returncode=1, stderr="unexpected") + + with mock.patch("coverage_collector.subprocess.run", side_effect=fake_run): + ok = run_lcov([str(bd1), str(bd2)], None, tracefile) + assert ok + + def test_gcov_tool_passed_to_cmd(self, tmp_path): + bd = tmp_path / "build" + bd.mkdir() + tracefile = str(tmp_path / "out.info") + captured_cmds = [] + + def fake_run(cmd, **kwargs): + captured_cmds.append(cmd) + Path(f"{tracefile}.part0").write_text("data\n") + return mock.Mock(returncode=0, stderr="") + + with mock.patch("coverage_collector.subprocess.run", side_effect=fake_run): + run_lcov([str(bd)], "my-gcov-tool", tracefile) + + assert any("--gcov-tool" in cmd and "my-gcov-tool" in cmd for cmd in captured_cmds) + + def test_no_gcov_tool_omitted(self, tmp_path): + bd = tmp_path / "build" + bd.mkdir() + tracefile = str(tmp_path / "out.info") + captured_cmds = [] + + def fake_run(cmd, **kwargs): + captured_cmds.append(cmd) + Path(f"{tracefile}.part0").write_text("data\n") + return mock.Mock(returncode=0, stderr="") + + with mock.patch("coverage_collector.subprocess.run", side_effect=fake_run): + run_lcov([str(bd)], None, tracefile) + + assert all("--gcov-tool" not in cmd for cmd in captured_cmds) + + +# --------------------------------------------------------------------------- +# parse_lcov_summary +# --------------------------------------------------------------------------- + +class TestParseLcovSummary: + def test_parses_typical_output(self, tmp_path): + tracefile = str(tmp_path / "cov.info") + fake_output = ( + "Reading tracefile cov.info\n" + "Summary coverage rate:\n" + " lines......: 45.2% (1234 of 2731 lines)\n" + " functions..: 30.0% (50 of 167 functions)\n" + ) + + def fake_run(cmd, **kwargs): + return mock.Mock(returncode=0, stdout=fake_output, stderr="") + + with mock.patch("coverage_collector.subprocess.run", side_effect=fake_run): + covered, total = parse_lcov_summary(tracefile) + assert covered == 1234 + assert total == 2731 + + def test_output_on_stderr(self, tmp_path): + tracefile = str(tmp_path / "cov.info") + fake_stderr = " lines......: 80.0% (400 of 500 lines)\n" + + def fake_run(cmd, **kwargs): + return mock.Mock(returncode=0, stdout="", stderr=fake_stderr) + + with mock.patch("coverage_collector.subprocess.run", side_effect=fake_run): + covered, total = parse_lcov_summary(tracefile) + assert covered == 400 + assert total == 500 + + def test_no_match_returns_zeros(self, tmp_path): + tracefile = str(tmp_path / "cov.info") + + def fake_run(cmd, **kwargs): + return mock.Mock(returncode=0, stdout="no coverage data\n", stderr="") + + with mock.patch("coverage_collector.subprocess.run", side_effect=fake_run): + covered, total = parse_lcov_summary(tracefile) + assert covered == 0 + assert total == 0 + + +# --------------------------------------------------------------------------- +# main() integration (mocking subprocess) +# --------------------------------------------------------------------------- + +class TestMainIntegration: + def test_no_gcov_data_produces_zero_json(self, tmp_path): + log_file = tmp_path / "empty.log" + log_file.write_text("no coverage data here\n") + output = tmp_path / "coverage.json" + + sys.argv = [ + "coverage_collector.py", + "--log", str(log_file), + "--build-dir", str(tmp_path), + "--output", str(output), + ] + + from coverage_collector import main + main() + + data = json.loads(output.read_text()) + assert data["lines_total"] == 0 + assert data["lines_covered"] == 0 + assert data["coverage_pct"] == 0.0 + + def test_log_directory_scan(self, tmp_path): + log_dir = tmp_path / "logs" + log_dir.mkdir() + + payload = b"testdata" + b64 = base64.b64encode(payload).decode() + (log_dir / "test1_coverage.log").write_text( + f"<<>>\n{b64}\n<<>>\n" + ) + (log_dir / "test2_coverage.log").write_text( + f"<<>>\n{b64}\n<<>>\n" + ) + + build = tmp_path / "build" + build.mkdir() + (build / "A.cpp.gcno").write_bytes(b"\x00") + (build / "B.cpp.gcno").write_bytes(b"\x00") + + output = tmp_path / "coverage.json" + tracefile = tmp_path / "coverage.info" + + fake_summary = " lines......: 50.0% (10 of 20 lines)\n" + + def fake_run(cmd, **kwargs): + if "--capture" in cmd: + for i, c in enumerate(cmd): + if c == "--output-file": + Path(cmd[i + 1]).write_text("TN:\nend_of_record\n") + break + return mock.Mock(returncode=0, stderr="") + if "--summary" in cmd: + return mock.Mock(returncode=0, stdout=fake_summary, stderr="") + return mock.Mock(returncode=0, stdout="", stderr="") + + sys.argv = [ + "coverage_collector.py", + "--log", str(log_dir), + "--build-dir", str(build), + "--output", str(output), + "--tracefile", str(tracefile), + ] + + with mock.patch("coverage_collector.subprocess.run", side_effect=fake_run): + from coverage_collector import main + main() + + data = json.loads(output.read_text()) + assert data["lines_covered"] == 10 + assert data["lines_total"] == 20 + assert data["coverage_pct"] == 50.0 + + +# --------------------------------------------------------------------------- +# parse_tracefile_functions +# --------------------------------------------------------------------------- + +SAMPLE_TRACEFILE = ( + "TN:\n" + "SF:/src/Esp.cpp\n" + "FNL:0,10,20\n" + "FNA:0,0,_ZN8EspClass9deepSleepEy\n" + "FNL:1,30,40\n" + "FNA:1,5,_ZN8EspClass7restartEv\n" + "end_of_record\n" + "TN:\n" + "SF:/src/main.cpp\n" + "FNL:0,1,5\n" + "FNA:0,3,main\n" + "FNL:1,10,15\n" + "FNA:1,0,unusedHelper\n" + "end_of_record\n" +) + + +class TestParseTracefileFunctions: + def test_parses_functions(self, tmp_path): + tf = tmp_path / "cov.info" + tf.write_text(SAMPLE_TRACEFILE) + result = parse_tracefile_functions(str(tf)) + assert "/src/Esp.cpp" in result + assert "/src/main.cpp" in result + assert len(result["/src/Esp.cpp"]) == 2 + assert len(result["/src/main.cpp"]) == 2 + + def test_function_attributes(self, tmp_path): + tf = tmp_path / "cov.info" + tf.write_text(SAMPLE_TRACEFILE) + result = parse_tracefile_functions(str(tf)) + funcs = {f["name"]: f for f in result["/src/Esp.cpp"]} + assert funcs["_ZN8EspClass9deepSleepEy"]["hits"] == 0 + assert funcs["_ZN8EspClass9deepSleepEy"]["line"] == 10 + assert funcs["_ZN8EspClass7restartEv"]["hits"] == 5 + assert funcs["_ZN8EspClass7restartEv"]["line"] == 30 + + def test_empty_tracefile(self, tmp_path): + tf = tmp_path / "empty.info" + tf.write_text("") + assert parse_tracefile_functions(str(tf)) == {} + + +# --------------------------------------------------------------------------- +# _demangle_names +# --------------------------------------------------------------------------- + +class TestDemangleNames: + def test_empty_list(self): + assert _demangle_names([]) == {} + + def test_fallback_when_tool_missing(self): + result = _demangle_names( + ["_ZN8EspClass7restartEv"], + gcov_tool="/nonexistent/path/to/gcov", + ) + assert "_ZN8EspClass7restartEv" in result + + def test_uses_system_cxxfilt(self): + names = ["_ZN8EspClass7restartEv", "main"] + result = _demangle_names(names) + assert "main" in result + assert result["main"] == "main" + + def test_derives_cxxfilt_from_gcov_tool(self): + captured_cmds = [] + original_run = subprocess.run + + def spy_run(cmd, **kwargs): + captured_cmds.append(cmd[0]) + return original_run(cmd, **kwargs) + + with mock.patch("coverage_collector.subprocess.run", side_effect=spy_run): + _demangle_names(["main"], gcov_tool="/usr/bin/some-gcov") + if captured_cmds: + assert "c++filt" in captured_cmds[0] + + +# --------------------------------------------------------------------------- +# generate_uncovered_report +# --------------------------------------------------------------------------- + +class TestGenerateUncoveredReport: + def test_returns_counts(self, tmp_path): + tf = tmp_path / "cov.info" + tf.write_text(SAMPLE_TRACEFILE) + total, untested = generate_uncovered_report(str(tf)) + assert total == 4 + assert untested == 2 + + def test_writes_markdown(self, tmp_path): + tf = tmp_path / "cov.info" + tf.write_text(SAMPLE_TRACEFILE) + out = tmp_path / "report.md" + generate_uncovered_report(str(tf), output_path=str(out)) + content = out.read_text() + assert "# Uncovered Functions Report" in content + assert "2 of 4 functions untested" in content + assert "/src/Esp.cpp" in content + assert "unusedHelper" in content + + def test_tested_functions_excluded(self, tmp_path): + tf = tmp_path / "cov.info" + tf.write_text(SAMPLE_TRACEFILE) + out = tmp_path / "report.md" + generate_uncovered_report(str(tf), output_path=str(out)) + content = out.read_text() + assert "restartEv" not in content + assert "main" not in content or "main.cpp" in content + + def test_core_root_relativizes_paths(self, tmp_path): + tf = tmp_path / "cov.info" + tf.write_text(SAMPLE_TRACEFILE) + out = tmp_path / "report.md" + generate_uncovered_report(str(tf), output_path=str(out), core_root="/src") + content = out.read_text() + assert "## Esp.cpp" in content or "## ./Esp.cpp" in content + assert "/src/Esp.cpp" not in content + + def test_empty_tracefile(self, tmp_path): + tf = tmp_path / "empty.info" + tf.write_text("") + out = tmp_path / "report.md" + total, untested = generate_uncovered_report(str(tf), output_path=str(out)) + assert total == 0 + assert untested == 0 + assert "No function data found" in out.read_text() + + def test_all_functions_tested(self, tmp_path): + tracefile_text = ( + "TN:\nSF:/src/a.cpp\n" + "FNL:0,1,5\nFNA:0,3,funcA\n" + "FNL:1,10,15\nFNA:1,1,funcB\n" + "end_of_record\n" + ) + tf = tmp_path / "cov.info" + tf.write_text(tracefile_text) + out = tmp_path / "report.md" + total, untested = generate_uncovered_report(str(tf), output_path=str(out)) + assert total == 2 + assert untested == 0 + content = out.read_text() + assert "0 of 2 functions untested" in content + assert "| Line |" not in content + + def test_markdown_table_format(self, tmp_path): + tf = tmp_path / "cov.info" + tf.write_text(SAMPLE_TRACEFILE) + out = tmp_path / "report.md" + generate_uncovered_report(str(tf), output_path=str(out)) + content = out.read_text() + assert "| Line | Function |" in content + assert "|------|----------|" in content diff --git a/.github/scripts/test_runtime_table_generator.py b/.github/scripts/ci_testing/test_runtime_table_generator.py similarity index 77% rename from .github/scripts/test_runtime_table_generator.py rename to .github/scripts/ci_testing/test_runtime_table_generator.py index a3c7a276796..85909d4cfb8 100644 --- a/.github/scripts/test_runtime_table_generator.py +++ b/.github/scripts/ci_testing/test_runtime_table_generator.py @@ -3,7 +3,7 @@ Local test script for runtime_table_generator.py Usage: - python3 .github/scripts/test_runtime_table_generator.py + python3 .github/scripts/ci_testing/test_runtime_table_generator.py Each test case sets up input fixtures in a temporary directory, runs the generator, and asserts expected patterns in the markdown output and in the @@ -30,6 +30,14 @@ 18. Performance test – runner unavailable, cache miss → "Error :fire:", no asterisk 19. Wokwi-only target not in HW list → not shown under Hardware section 20. Target in env but not in results → shown as "-" (dash) + 21. --coverage 85.0 → brightgreen badge + 22. --coverage 70.0 → yellow badge + 23. --coverage 45.5 → red badge + 24. --coverage 80.0 → brightgreen (boundary) + 25. --coverage 60.0 → yellow (boundary) + 26. --coverage 59.9 → red (just below 60) + 27. No --coverage → no badge, no coverage_pct in JSON + 28. --coverage 79.666 → rounded in JSON, 1 decimal in URL """ import json @@ -41,7 +49,7 @@ from datetime import datetime, timezone, timedelta from pathlib import Path -SCRIPT = Path(__file__).parent / "runtime_table_generator.py" +SCRIPT = Path(__file__).resolve().parent.parent / "runtime_table_generator.py" PASS = "\033[32mPASS\033[0m" FAIL = "\033[31mFAIL\033[0m" _failures = [] @@ -90,7 +98,7 @@ def _test_results(cache=None, perf_cache=None, commit_sha="prev"): } -def run_generator(tmpdir, unity, env_extra=None, prev_results=None, sha="abc123", perf_dir=None): +def run_generator(tmpdir, unity, env_extra=None, prev_results=None, sha="abc123", perf_dir=None, coverage=None): """ Run runtime_table_generator.py inside *tmpdir*. Returns (stdout, stderr, returncode, saved_cache). @@ -114,6 +122,8 @@ def run_generator(tmpdir, unity, env_extra=None, prev_results=None, sha="abc123" cmd += ["--previous-results", prev_path] if perf_dir: cmd += ["--perf-dir", perf_dir] + if coverage is not None: + cmd += ["--coverage", str(coverage)] env = {**os.environ, "HW_TARGETS": "[]", "WOKWI_TARGETS": "[]", "QEMU_TARGETS": "[]"} if env_extra: @@ -128,13 +138,14 @@ def run_generator(tmpdir, unity, env_extra=None, prev_results=None, sha="abc123" ) saved_cache = {} + saved_full = {} out_path = os.path.join(tmpdir, "test_results.json") if os.path.exists(out_path): with open(out_path) as f: - saved = json.load(f) - saved_cache = saved.get("cache", {}) + saved_full = json.load(f) + saved_cache = saved_full.get("cache", {}) - return result.stdout, result.stderr, result.returncode, saved_cache + return result.stdout, result.stderr, result.returncode, saved_cache, saved_full def assert_test(name, condition, detail=""): @@ -167,7 +178,7 @@ def test_01_first_run_all_pass(): _suite("validation_hardware_esp32s3_Blink", tests=2), ]) env = {"HW_TARGETS": '["esp32","esp32s3","esp32c3"]', "WOKWI_TARGETS": "[]", "QEMU_TARGETS": "[]"} - out, _, rc, cache = run_generator(d, unity, env_extra=env) + out, _, rc, cache, _ = run_generator(d, unity, env_extra=env) assert_test("exit code 0", rc == 0) assert_test("shows ESP32 3/3 pass", "3/3 :white_check_mark:" in out) @@ -187,7 +198,7 @@ def test_02_first_run_some_fail(): _suite("validation_hardware_esp32s3_Blink", tests=2, failures=2), ]) env = {"HW_TARGETS": '["esp32","esp32s3"]', "WOKWI_TARGETS": "[]", "QEMU_TARGETS": "[]"} - out, _, rc, cache = run_generator(d, unity, env_extra=env) + out, _, rc, cache, _ = run_generator(d, unity, env_extra=env) assert_test("exit code 0", rc == 0) assert_test("shows failure symbol for esp32", ":x:" in out) @@ -206,7 +217,7 @@ def test_03_first_run_runner_error(): _suite("validation_hardware_esp32c3_Blink", tests=0, errors=1), # runner unavailable ]) env = {"HW_TARGETS": '["esp32","esp32c3"]', "WOKWI_TARGETS": "[]", "QEMU_TARGETS": "[]"} - out, _, rc, cache = run_generator(d, unity, env_extra=env) + out, _, rc, cache, _ = run_generator(d, unity, env_extra=env) assert_test("exit code 0", rc == 0) assert_test("shows Error :fire: for esp32c3", "Error :fire:" in out) @@ -231,7 +242,7 @@ def test_04_cache_hit_runner_unavailable(): _suite("validation_hardware_esp32s3_Blink", tests=2, failures=1), ]) env = {"HW_TARGETS": '["esp32","esp32s3","esp32c3"]', "WOKWI_TARGETS": "[]", "QEMU_TARGETS": "[]"} - out, _, rc, cache = run_generator(d, unity, env_extra=env, prev_results=prev) + out, _, rc, cache, _ = run_generator(d, unity, env_extra=env, prev_results=prev) assert_test("exit code 0", rc == 0) assert_test("esp32c3 shows cached 3/3 with asterisk", "3/3 :white_check_mark:\\*" in out) @@ -259,7 +270,7 @@ def test_05_cache_miss_runner_was_already_unavailable(): _suite("validation_hardware_esp32s3_Blink", tests=2), ]) env = {"HW_TARGETS": '["esp32","esp32s3","esp32c3"]', "WOKWI_TARGETS": "[]", "QEMU_TARGETS": "[]"} - out, _, rc, _ = run_generator(d, unity, env_extra=env, prev_results=prev) + out, _, rc, _, _ = run_generator(d, unity, env_extra=env, prev_results=prev) assert_test("exit code 0", rc == 0) assert_test("esp32c3 shows Error :fire: (no cached result)", "Error :fire:" in out) @@ -281,7 +292,7 @@ def test_06_result_changed_no_asterisk(): _suite("validation_hardware_esp32s3_Blink", tests=2, failures=1), # now 1/2 ]) env = {"HW_TARGETS": '["esp32","esp32s3"]', "WOKWI_TARGETS": "[]", "QEMU_TARGETS": "[]"} - out, _, rc, cache = run_generator(d, unity, env_extra=env, prev_results=prev) + out, _, rc, cache, _ = run_generator(d, unity, env_extra=env, prev_results=prev) assert_test("exit code 0", rc == 0) assert_test("esp32s3 shows 1/2 :x:", "1/2 :x:" in out) @@ -304,7 +315,7 @@ def test_07_stale_cache(): _suite("validation_hardware_esp32c3_Blink", tests=0, errors=1), ]) env = {"HW_TARGETS": '["esp32c3"]', "WOKWI_TARGETS": "[]", "QEMU_TARGETS": "[]"} - out, _, rc, _ = run_generator(d, unity, env_extra=env, prev_results=prev) + out, _, rc, _, _ = run_generator(d, unity, env_extra=env, prev_results=prev) assert_test("exit code 0", rc == 0) assert_test("shows Error :fire: (stale cache ignored)", "Error :fire:" in out) @@ -330,14 +341,14 @@ def test_08_cache_propagation_three_runs(): unity_errors = _unity([ _suite("validation_hardware_esp32c3_Blink", tests=0, errors=1), ]) - out_b, _, _, cache_b = run_generator(d, unity_errors, env_extra=env, prev_results=results_a, sha="runB") + out_b, _, _, cache_b, _ = run_generator(d, unity_errors, env_extra=env, prev_results=results_a, sha="runB") assert_test("Run B: shows asterisk (cache from A)", "\\*" in out_b) assert_test("Run B: esp32c3 cache propagated", "esp32c3" in cache_b.get("hardware", {}).get("Blink", {})) # Run C: esp32c3 still errors → reads Run B cache → still shows asterisk with open(os.path.join(d, "test_results.json")) as f: results_b = json.load(f) - out_c, _, _, _ = run_generator(d, unity_errors, env_extra=env, prev_results=results_b, sha="runC") + out_c, _, _, _, _ = run_generator(d, unity_errors, env_extra=env, prev_results=results_b, sha="runC") assert_test("Run C: asterisk still shown (cache from A via B)", "\\*" in out_c) @@ -367,7 +378,7 @@ def test_10_corrupt_previous_results(): with tempfile.TemporaryDirectory() as d: unity = _unity([_suite("validation_hardware_esp32_Blink", tests=3)]) env = {"HW_TARGETS": '["esp32"]', "WOKWI_TARGETS": "[]", "QEMU_TARGETS": "[]"} - out, _, rc, cache = run_generator(d, unity, env_extra=env, prev_results="{not valid json!!!") + out, _, rc, cache, _ = run_generator(d, unity, env_extra=env, prev_results="{not valid json!!!") assert_test("exit code 0 (no crash on corrupt file)", rc == 0) assert_test("output contains Hardware section", "Hardware" in out) assert_test("no asterisk in output", "\\*" not in out) @@ -379,7 +390,7 @@ def test_11_previous_results_not_a_dict(): unity = _unity([_suite("validation_hardware_esp32_Blink", tests=3)]) env = {"HW_TARGETS": '["esp32"]', "WOKWI_TARGETS": "[]", "QEMU_TARGETS": "[]"} # Write a valid JSON list (not a dict) - out, _, rc, _ = run_generator(d, unity, env_extra=env, prev_results="[1, 2, 3]") + out, _, rc, _, _ = run_generator(d, unity, env_extra=env, prev_results="[1, 2, 3]") assert_test("exit code 0 (no crash)", rc == 0) assert_test("no asterisk", "\\*" not in out) @@ -398,7 +409,7 @@ def test_12_multiple_sketches(): _suite("validation_hardware_esp32c3_UART", tests=0, errors=1), ]) env = {"HW_TARGETS": '["esp32c3"]', "WOKWI_TARGETS": "[]", "QEMU_TARGETS": "[]"} - out, _, rc, cache = run_generator(d, unity, env_extra=env, prev_results=prev) + out, _, rc, cache, _ = run_generator(d, unity, env_extra=env, prev_results=prev) assert_test("exit code 0", rc == 0) assert_test("Blink cached result shown with asterisk", "3/3 :white_check_mark:\\*" in out) @@ -415,7 +426,7 @@ def test_13_multi_fqbn_builds(): _suite("validation_hardware_esp32_Blink1", tests=3, failures=1), ]) env = {"HW_TARGETS": '["esp32"]', "WOKWI_TARGETS": "[]", "QEMU_TARGETS": "[]"} - out, _, rc, cache = run_generator(d, unity, env_extra=env) + out, _, rc, cache, _ = run_generator(d, unity, env_extra=env) assert_test("exit code 0", rc == 0) assert_test("Blink shows accumulated 5/6", "5/6 :x:" in out) @@ -436,7 +447,7 @@ def test_14_multi_fqbn_partial_error(): _suite("validation_hardware_esp32_Blink1", tests=0, failures=0, errors=1), ]) env = {"HW_TARGETS": '["esp32"]', "WOKWI_TARGETS": "[]", "QEMU_TARGETS": "[]"} - out, _, rc, _ = run_generator(d, unity, env_extra=env, prev_results=prev) + out, _, rc, _, _ = run_generator(d, unity, env_extra=env, prev_results=prev) assert_test("exit code 0", rc == 0) # Accumulated: total=3, failures=0, errors=1 → errors>0 → use cache @@ -455,7 +466,7 @@ def test_15_multiple_platforms(): "WOKWI_TARGETS": '["esp32s3"]', "QEMU_TARGETS": "[]", } - out, _, rc, cache = run_generator(d, unity, env_extra=env) + out, _, rc, cache, _ = run_generator(d, unity, env_extra=env) assert_test("exit code 0", rc == 0) assert_test("Hardware section present", "#### Hardware" in out) @@ -483,7 +494,7 @@ def test_16_perf_runner_ok(): json.dump(perf_data, f) env = {"HW_TARGETS": '["esp32"]', "WOKWI_TARGETS": "[]", "QEMU_TARGETS": "[]"} - out, _, rc, _ = run_generator(d, unity, env_extra=env, + out, _, rc, _, _ = run_generator(d, unity, env_extra=env, perf_dir=os.path.join(d, "perf_artifacts")) assert_test("exit code 0", rc == 0) @@ -511,7 +522,7 @@ def test_17_perf_cache_hit_runner_unavailable(): _suite("performance_hardware_esp32_SpeedTest", tests=0, errors=1), ]) env = {"HW_TARGETS": '["esp32"]', "WOKWI_TARGETS": "[]", "QEMU_TARGETS": "[]"} - out, _, rc, _ = run_generator(d, unity, env_extra=env, prev_results=prev) + out, _, rc, _, _ = run_generator(d, unity, env_extra=env, prev_results=prev) assert_test("exit code 0", rc == 0) assert_test("Performance Tests section present", "### Performance Tests" in out) @@ -528,7 +539,7 @@ def test_18_perf_cache_miss_runner_unavailable(): _suite("performance_hardware_esp32_SpeedTest", tests=0, errors=1), ]) env = {"HW_TARGETS": '["esp32"]', "WOKWI_TARGETS": "[]", "QEMU_TARGETS": "[]"} - out, _, rc, _ = run_generator(d, unity, env_extra=env, prev_results=prev) + out, _, rc, _, _ = run_generator(d, unity, env_extra=env, prev_results=prev) assert_test("exit code 0", rc == 0) # Performance error format is "Error - :fire:" (list item, not table cell) @@ -548,7 +559,7 @@ def test_19_wokwi_target_not_in_hw_list(): "WOKWI_TARGETS": '["esp32s2"]', "QEMU_TARGETS": "[]", } - out, _, rc, _ = run_generator(d, unity, env_extra=env) + out, _, rc, _, _ = run_generator(d, unity, env_extra=env) assert_test("exit code 0", rc == 0) hw_section = out.split("#### Wokwi")[0] if "#### Wokwi" in out else out @@ -565,12 +576,109 @@ def test_20_target_in_env_but_not_in_results(): _suite("validation_hardware_esp32_Blink", tests=3), ]) env = {"HW_TARGETS": '["esp32","esp32c3"]', "WOKWI_TARGETS": "[]", "QEMU_TARGETS": "[]"} - out, _, rc, _ = run_generator(d, unity, env_extra=env) + out, _, rc, _, _ = run_generator(d, unity, env_extra=env) assert_test("exit code 0", rc == 0) assert_test("dash shown for missing esp32c3", "|-" in out) +def test_21_coverage_badge_green(): + section("Test 21 – --coverage 85.0 → brightgreen badge") + with tempfile.TemporaryDirectory() as d: + unity = _unity([_suite("validation_hardware_esp32_Blink", tests=3)]) + env = {"HW_TARGETS": '["esp32"]', "WOKWI_TARGETS": "[]", "QEMU_TARGETS": "[]"} + out, _, rc, _, full = run_generator(d, unity, env_extra=env, coverage=85.0) + + assert_test("exit code 0", rc == 0) + assert_test("badge URL contains brightgreen", "brightgreen" in out) + assert_test("badge URL contains 85.0%25", "85.0%25" in out) + assert_test("badge rendered as markdown image", "![Code Coverage]" in out) + assert_test("coverage_pct in JSON", full.get("coverage_pct") == 85.0) + + +def test_22_coverage_badge_yellow(): + section("Test 22 – --coverage 70.0 → yellow badge") + with tempfile.TemporaryDirectory() as d: + unity = _unity([_suite("validation_hardware_esp32_Blink", tests=3)]) + env = {"HW_TARGETS": '["esp32"]', "WOKWI_TARGETS": "[]", "QEMU_TARGETS": "[]"} + out, _, rc, _, full = run_generator(d, unity, env_extra=env, coverage=70.0) + + assert_test("exit code 0", rc == 0) + assert_test("badge URL contains yellow", "yellow" in out) + assert_test("badge URL contains 70.0%25", "70.0%25" in out) + assert_test("coverage_pct in JSON is 70.0", full.get("coverage_pct") == 70.0) + + +def test_23_coverage_badge_red(): + section("Test 23 – --coverage 45.5 → red badge") + with tempfile.TemporaryDirectory() as d: + unity = _unity([_suite("validation_hardware_esp32_Blink", tests=3)]) + env = {"HW_TARGETS": '["esp32"]', "WOKWI_TARGETS": "[]", "QEMU_TARGETS": "[]"} + out, _, rc, _, full = run_generator(d, unity, env_extra=env, coverage=45.5) + + assert_test("exit code 0", rc == 0) + assert_test("badge URL contains red", "-red)" in out) + assert_test("badge URL contains 45.5%25", "45.5%25" in out) + assert_test("coverage_pct in JSON is 45.5", full.get("coverage_pct") == 45.5) + + +def test_24_coverage_boundary_80(): + section("Test 24 – --coverage 80.0 → brightgreen (boundary)") + with tempfile.TemporaryDirectory() as d: + unity = _unity([_suite("validation_hardware_esp32_Blink", tests=3)]) + env = {"HW_TARGETS": '["esp32"]', "WOKWI_TARGETS": "[]", "QEMU_TARGETS": "[]"} + out, _, rc, _, _ = run_generator(d, unity, env_extra=env, coverage=80.0) + + assert_test("exit code 0", rc == 0) + assert_test("80.0 is brightgreen", "brightgreen" in out) + + +def test_25_coverage_boundary_60(): + section("Test 25 – --coverage 60.0 → yellow (boundary)") + with tempfile.TemporaryDirectory() as d: + unity = _unity([_suite("validation_hardware_esp32_Blink", tests=3)]) + env = {"HW_TARGETS": '["esp32"]', "WOKWI_TARGETS": "[]", "QEMU_TARGETS": "[]"} + out, _, rc, _, _ = run_generator(d, unity, env_extra=env, coverage=60.0) + + assert_test("exit code 0", rc == 0) + assert_test("60.0 is yellow", "yellow" in out) + + +def test_26_coverage_boundary_59_9(): + section("Test 26 – --coverage 59.9 → red (just below 60)") + with tempfile.TemporaryDirectory() as d: + unity = _unity([_suite("validation_hardware_esp32_Blink", tests=3)]) + env = {"HW_TARGETS": '["esp32"]', "WOKWI_TARGETS": "[]", "QEMU_TARGETS": "[]"} + out, _, rc, _, _ = run_generator(d, unity, env_extra=env, coverage=59.9) + + assert_test("exit code 0", rc == 0) + assert_test("59.9 is red", "-red)" in out) + + +def test_27_no_coverage_flag(): + section("Test 27 – No --coverage → no badge, no coverage_pct in JSON") + with tempfile.TemporaryDirectory() as d: + unity = _unity([_suite("validation_hardware_esp32_Blink", tests=3)]) + env = {"HW_TARGETS": '["esp32"]', "WOKWI_TARGETS": "[]", "QEMU_TARGETS": "[]"} + out, _, rc, _, full = run_generator(d, unity, env_extra=env) + + assert_test("exit code 0", rc == 0) + assert_test("no badge in output", "![Code Coverage]" not in out) + assert_test("no coverage_pct in JSON", "coverage_pct" not in full) + + +def test_28_coverage_pct_rounded(): + section("Test 28 – --coverage 79.666 → rounded to 79.67 in JSON") + with tempfile.TemporaryDirectory() as d: + unity = _unity([_suite("validation_hardware_esp32_Blink", tests=3)]) + env = {"HW_TARGETS": '["esp32"]', "WOKWI_TARGETS": "[]", "QEMU_TARGETS": "[]"} + out, _, rc, _, full = run_generator(d, unity, env_extra=env, coverage=79.666) + + assert_test("exit code 0", rc == 0) + assert_test("coverage_pct rounded to 79.67", full.get("coverage_pct") == 79.67) + assert_test("badge shows 79.7 (1 decimal in URL)", "79.7%25" in out) + + # --------------------------------------------------------------------------- # Main # --------------------------------------------------------------------------- @@ -598,9 +706,17 @@ def test_20_target_in_env_but_not_in_results(): test_18_perf_cache_miss_runner_unavailable() test_19_wokwi_target_not_in_hw_list() test_20_target_in_env_but_not_in_results() + test_21_coverage_badge_green() + test_22_coverage_badge_yellow() + test_23_coverage_badge_red() + test_24_coverage_boundary_80() + test_25_coverage_boundary_60() + test_26_coverage_boundary_59_9() + test_27_no_coverage_flag() + test_28_coverage_pct_rounded() print(f"\n{'='*60}") - total = 20 + total = 28 failed = len(set(_failures)) # deduplicate section names passed_count = total - failed diff --git a/.github/scripts/coverage_collector.py b/.github/scripts/coverage_collector.py new file mode 100755 index 00000000000..14744bbf7c9 --- /dev/null +++ b/.github/scripts/coverage_collector.py @@ -0,0 +1,409 @@ +#!/usr/bin/env python3 +# SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: Apache-2.0 + +""" +Parse test serial logs for gcov data dumped by esp32-hal-gcov.c, +reconstruct .gcda files alongside the .gcno files in the build tree, +run lcov to produce a tracefile, and emit a JSON coverage summary. + +Usage: + python coverage_collector.py \ + --log tests_output.log \ + --build-dir ~/.arduino/tests/esp32 \ + --gcov-tool xtensa-esp-elf-gcov \ + --output coverage.json +""" + +import argparse +import base64 +import json +import os +import re +import subprocess +import sys +from pathlib import Path + +ANSI_RE = re.compile(r"\x1b\[[0-9;]*m") +GCOV_FILE_RE = re.compile(r"<<>>") +B64_CHAR_RE = re.compile(r"[A-Za-z0-9+/=]") +LCOV_LINE_RE = re.compile(r"lines\.*:\s*([\d.]+)%\s*\((\d+)\s*of\s*(\d+)") + + +def strip_ansi(line): + return ANSI_RE.sub("", line) + + +def extract_gcov_files(log_text): + """Return dict {gcda_path: bytes} extracted from the serial dump markers. + + Each base64 line in the serial dump is independently encoded by + ``base64_encode_chars`` on the ESP32, so lines must be decoded + individually and the resulting bytes concatenated. + """ + files = {} + current_file = None + decoded_parts = [] + + for raw_line in log_text.splitlines(): + line = strip_ansi(raw_line).strip() + + m = GCOV_FILE_RE.search(line) + if m: + current_file = m.group(1) + decoded_parts = [] + continue + + if "<<>>" in line and current_file is not None: + if decoded_parts: + chunk = b"".join(decoded_parts) + if current_file in files: + files[current_file] += chunk + else: + files[current_file] = chunk + current_file = None + decoded_parts = [] + continue + + if current_file is not None: + clean = "".join(B64_CHAR_RE.findall(line)) + if clean: + try: + decoded_parts.append(base64.b64decode(clean)) + except Exception: + pass # skip noisy lines that aren't valid base64 + + return files + + +def find_gcno(basename, build_dirs): + """Walk *build_dirs* looking for *basename* with .gcno extension.""" + gcno = basename.replace(".gcda", ".gcno") + for bd in build_dirs: + for root, _dirs, fnames in os.walk(bd): + if gcno in fnames: + return os.path.join(root, gcno) + return None + + +def _match_build_dir(gcda_path, build_dirs): + """Return the build dir whose path appears in *gcda_path*, or ``None``. + + When the firmware records the .gcda path it embeds the compile-time + build directory (e.g. ``build0.tmp/objects/sketch.cpp.gcda``). + We resolve both paths so that symlinks and ``/private/var`` vs + ``/var`` mismatches do not prevent a match. + """ + try: + gcda_resolved = os.path.realpath(gcda_path) + except (OSError, ValueError): + gcda_resolved = gcda_path + for bd in build_dirs: + try: + bd_resolved = os.path.realpath(bd) + except (OSError, ValueError): + bd_resolved = bd + if bd_resolved in gcda_resolved or bd in gcda_path: + return bd + return None + + +def place_gcda_files(gcov_files, build_dirs): + """Write each .gcda next to its matching .gcno. Return list of written paths. + + When multiple build directories contain a ``.gcno`` with the same + basename (common for multi-FQBN builds), the original ``.gcda`` + path from the firmware log is used to pick the correct build dir. + If that heuristic fails, the first build dir with an unoccupied + slot is chosen so that data from different configs is not + overwritten. + """ + written = set() + for gcda_path, data in gcov_files.items(): + basename = os.path.basename(gcda_path) + + preferred_bd = _match_build_dir(gcda_path, build_dirs) + if preferred_bd is not None: + gcno = find_gcno(basename, [preferred_bd]) + else: + gcno = None + + if gcno is None: + gcno = find_gcno(basename, build_dirs) + + if gcno is None: + print(f"WARNING: no .gcno match for {gcda_path} (basename {basename})", file=sys.stderr) + continue + + dest = gcno.replace(".gcno", ".gcda") + + if dest in written: + for bd in build_dirs: + alt = find_gcno(basename, [bd]) + if alt is not None: + alt_dest = alt.replace(".gcno", ".gcda") + if alt_dest not in written: + dest = alt_dest + break + + os.makedirs(os.path.dirname(dest), exist_ok=True) + with open(dest, "wb") as f: + f.write(data) + written.add(dest) + return list(written) + + +def run_lcov(build_dirs, gcov_tool, tracefile): + """Run lcov --capture over every build dir and merge into *tracefile*.""" + partial_files = [] + for idx, bd in enumerate(build_dirs): + part = f"{tracefile}.part{idx}" + cmd = [ + "lcov", + "--capture", + "--directory", str(bd), + "--output-file", part, + "--ignore-errors", "gcov,source,empty", + "--rc", "no_exception_branch=1", + "--rc", "geninfo_unexecuted_blocks=1", + ] + if gcov_tool: + cmd += ["--gcov-tool", gcov_tool] + print(f"$ {' '.join(cmd)}", file=sys.stderr) + result = subprocess.run(cmd, capture_output=True, text=True) + if result.returncode == 0 and os.path.exists(part): + partial_files.append(part) + else: + print(f"WARNING: lcov capture failed for {bd}:\n{result.stderr}", file=sys.stderr) + + if not partial_files: + return False + + if len(partial_files) == 1: + os.rename(partial_files[0], tracefile) + else: + merge_cmd = ["lcov"] + for pf in partial_files: + merge_cmd += ["--add-tracefile", pf] + merge_cmd += ["--output-file", tracefile, "--ignore-errors", "empty"] + print(f"$ {' '.join(merge_cmd)}", file=sys.stderr) + subprocess.run(merge_cmd, check=True) + for pf in partial_files: + os.remove(pf) + + return os.path.exists(tracefile) + + +def parse_lcov_summary(tracefile): + """Run lcov --summary and return (lines_covered, lines_total).""" + result = subprocess.run( + ["lcov", "--summary", tracefile, "--ignore-errors", "empty"], + capture_output=True, text=True, + ) + for line in (result.stdout + result.stderr).splitlines(): + m = LCOV_LINE_RE.search(line) + if m: + return int(m.group(2)), int(m.group(3)) + return 0, 0 + + +def _demangle_names(mangled, gcov_tool=None): + """Demangle a list of C++ symbol names via ``c++filt``. + + Derives the ``c++filt`` path from *gcov_tool* (e.g. + ``xtensa-esp-elf-gcov`` -> ``xtensa-esp-elf-c++filt``). + Falls back to the system ``c++filt``, then to returning the + original mangled names if neither is available. + """ + if not mangled: + return {} + + cxxfilt = None + if gcov_tool: + candidate = gcov_tool.replace("gcov", "c++filt") + if os.path.isfile(candidate) or os.sep not in candidate: + cxxfilt = candidate + if cxxfilt is None: + cxxfilt = "c++filt" + + try: + result = subprocess.run( + [cxxfilt], input="\n".join(mangled), + capture_output=True, text=True, timeout=30, + ) + if result.returncode == 0: + demangled = result.stdout.strip().splitlines() + if len(demangled) == len(mangled): + return dict(zip(mangled, demangled)) + except (FileNotFoundError, subprocess.TimeoutExpired): + pass + + return {n: n for n in mangled} + + +def parse_tracefile_functions(tracefile): + """Parse an lcov tracefile and return per-file function coverage data. + + Returns ``{source_file: [{"name": str, "hits": int, "line": int}]}``. + """ + files = {} + current_sf = None + fn_lines = {} + + for raw in Path(tracefile).read_text().splitlines(): + if raw.startswith("SF:"): + current_sf = raw[3:] + fn_lines = {} + continue + if raw.startswith("FNL:"): + parts = raw[4:].split(",") + if len(parts) >= 2: + fn_lines[parts[0]] = int(parts[1]) + continue + if raw.startswith("FNA:"): + parts = raw[4:].split(",", 2) + if len(parts) >= 3 and current_sf is not None: + idx, hits, name = parts[0], int(parts[1]), parts[2] + line = fn_lines.get(idx, 0) + files.setdefault(current_sf, []).append( + {"name": name, "hits": hits, "line": line} + ) + continue + if raw == "end_of_record": + current_sf = None + fn_lines = {} + + return files + + +def generate_uncovered_report(tracefile, gcov_tool=None, output_path=None, core_root=None): + """Write a markdown report of functions with zero hits. + + Returns ``(total_functions, untested_count)`` for summary purposes. + """ + all_functions = parse_tracefile_functions(tracefile) + if not all_functions: + if output_path: + Path(output_path).write_text("# Uncovered Functions Report\n\nNo function data found.\n") + return 0, 0 + + all_names = set() + for funcs in all_functions.values(): + for f in funcs: + all_names.add(f["name"]) + + demangled = _demangle_names(sorted(all_names), gcov_tool) + + total = 0 + untested = 0 + per_file = {} + + for sf, funcs in all_functions.items(): + display_path = sf + if core_root: + try: + display_path = os.path.relpath(sf, core_root) + except ValueError: + pass + + file_total = len(funcs) + file_untested = [f for f in funcs if f["hits"] == 0] + total += file_total + untested += len(file_untested) + + if file_untested: + file_untested.sort(key=lambda f: f["line"]) + per_file[display_path] = { + "total": file_total, + "untested": file_untested, + } + + if output_path: + pct = (untested / total * 100.0) if total > 0 else 0.0 + lines = [ + "# Uncovered Functions Report\n", + f"**{untested} of {total} functions untested ({pct:.1f}%)**\n", + ] + + for sf in sorted(per_file, key=lambda s: s.lower()): + info = per_file[sf] + n_untested = len(info["untested"]) + lines.append(f"\n## {sf} ({n_untested}/{info['total']} untested)\n") + lines.append("| Line | Function |") + lines.append("|------|----------|") + for f in info["untested"]: + name = demangled.get(f["name"], f["name"]) + lines.append(f"| {f['line']} | {name} |") + lines.append("") + + Path(output_path).write_text("\n".join(lines) + "\n") + print(f"Uncovered functions report written to {output_path}") + + return total, untested + + +def main(): + parser = argparse.ArgumentParser(description="Collect gcov coverage from serial logs") + parser.add_argument("--log", required=True, action="append", help="Log file or directory to scan (repeatable)") + parser.add_argument("--build-dir", required=True, action="append", help="Build directory with .gcno files (repeatable)") + parser.add_argument("--gcov-tool", default=None, help="Path to cross-compiler gcov") + parser.add_argument("--output", default="coverage.json", help="Output JSON summary") + parser.add_argument("--tracefile", default="coverage.info", help="Output lcov tracefile") + parser.add_argument("--uncovered-report", default=None, help="Path for markdown uncovered-functions report") + parser.add_argument("--core-root", default=None, help="Root path for making source paths relative in the report") + args = parser.parse_args() + + # Collect log text from all sources + log_text = "" + for src in args.log: + p = Path(src) + if p.is_file(): + log_text += p.read_text(errors="replace") + "\n" + elif p.is_dir(): + for lf in sorted(p.rglob("*.log")): + log_text += lf.read_text(errors="replace") + "\n" + else: + print(f"WARNING: {src} not found, skipping", file=sys.stderr) + + # Extract gcov data + gcov_files = extract_gcov_files(log_text) + if not gcov_files: + print("No gcov data found in logs.") + summary = {"lines_total": 0, "lines_covered": 0, "coverage_pct": 0.0} + Path(args.output).write_text(json.dumps(summary, indent=2)) + return + + print(f"Extracted {len(gcov_files)} .gcda files from logs.") + + # Place .gcda next to .gcno + written = place_gcda_files(gcov_files, args.build_dir) + print(f"Placed {len(written)} .gcda files in build tree.") + + if not written: + print("ERROR: Could not place any .gcda files (no matching .gcno found).", file=sys.stderr) + summary = {"lines_total": 0, "lines_covered": 0, "coverage_pct": 0.0} + Path(args.output).write_text(json.dumps(summary, indent=2)) + sys.exit(1) + + # Run lcov + if run_lcov(args.build_dir, args.gcov_tool, args.tracefile): + covered, total = parse_lcov_summary(args.tracefile) + pct = (covered / total * 100.0) if total > 0 else 0.0 + print(f"Coverage: {covered}/{total} lines ({pct:.1f}%)") + else: + print("WARNING: lcov failed; reporting 0% coverage.", file=sys.stderr) + covered, total, pct = 0, 0, 0.0 + + summary = {"lines_total": total, "lines_covered": covered, "coverage_pct": round(pct, 2)} + Path(args.output).write_text(json.dumps(summary, indent=2)) + print(f"Summary written to {args.output}") + + if args.uncovered_report and os.path.exists(args.tracefile): + generate_uncovered_report( + args.tracefile, args.gcov_tool, + args.uncovered_report, args.core_root, + ) + + +if __name__ == "__main__": + main() diff --git a/.github/scripts/runtime_table_generator.py b/.github/scripts/runtime_table_generator.py index cab4b8dc099..738a070ab22 100644 --- a/.github/scripts/runtime_table_generator.py +++ b/.github/scripts/runtime_table_generator.py @@ -226,6 +226,12 @@ def _collect_and_aggregate_performance(perf_dir): default=None, help="Path to build_failure_cells.json (cells with no build artifact; show errors, not cache)", ) +parser.add_argument( + "--coverage", + type=float, + default=None, + help="Code coverage percentage from runtime tests (displayed as a badge)", +) args = parser.parse_args() with open(args.results, "r") as f: @@ -250,6 +256,18 @@ def _collect_and_aggregate_performance(perf_dir): print("## Runtime Test Results") print("") +if args.coverage is not None: + cov = args.coverage + if cov >= 80: + color = "brightgreen" + elif cov >= 60: + color = "yellow" + else: + color = "red" + badge_url = f"https://img.shields.io/badge/coverage-{cov:.1f}%25-{color}" + print(f"![Code Coverage]({badge_url})") + print("") + try: if os.environ["IS_FAILING"] == "true": print(f"{FAILURE_SYMBOL} **The test workflows are failing. Please check the run logs.** {FAILURE_SYMBOL}") @@ -475,6 +493,8 @@ def _collect_and_aggregate_performance(perf_dir): "cache": result_cache, "perf_cache": perf_cache, } +if args.coverage is not None: + results_data["coverage_pct"] = round(args.coverage, 2) if tests_with_targets: perf_out = {} for test_name, targets in tests_with_targets.items(): diff --git a/.github/scripts/tests_build.sh b/.github/scripts/tests_build.sh index 739da11c11b..66549f0d9a3 100755 --- a/.github/scripts/tests_build.sh +++ b/.github/scripts/tests_build.sh @@ -168,6 +168,9 @@ while [ -n "$1" ]; do --arduino-cli ) use_arduino_cli=1 ;; + --coverage ) + enable_coverage=1 + ;; * ) break ;; @@ -175,6 +178,16 @@ while [ -n "$1" ]; do shift done +coverage_args=() +if [ "${enable_coverage:-0}" -eq 1 ]; then + echo "Coverage enabled: adding --coverage build properties" + coverage_args+=( + "--build-property" "compiler.c.extra_flags=--coverage -DCOVERAGE_ENABLED" + "--build-property" "compiler.cpp.extra_flags=--coverage -DCOVERAGE_ENABLED" + "--build-property" "compiler.libraries.ldflags=-lgcov" + ) +fi + set -e source "${SCRIPTS_DIR}/install-arduino-cli.sh" source "${SCRIPTS_DIR}/install-arduino-core-esp32.sh" @@ -237,7 +250,7 @@ for current_target in "${targets_to_build[@]}"; do if [ -d "$test_folder" ]; then for test_dir in "$test_folder"/*; do if [ -d "$test_dir" ] && [ "$(is_multi_device_test "$test_dir")" -eq 1 ]; then - build_multi_device_test "$test_dir" "$current_target" "${args[@]}" "-t" "$current_target" "$@" + build_multi_device_test "$test_dir" "$current_target" "${args[@]}" "-t" "$current_target" "$@" "${coverage_args[@]}" result=$? if [ $result -ne 0 ]; then multi_device_error=$result @@ -250,7 +263,7 @@ for current_target in "${targets_to_build[@]}"; do local_args=("${args[@]}") BUILD_CMD="${SKETCH_UTILS} chunk_build" local_args+=("-p" "$test_folder" "-i" "0" "-m" "1" "-t" "$current_target") - ${BUILD_CMD} "${local_args[@]}" "$@" + ${BUILD_CMD} "${local_args[@]}" "$@" "${coverage_args[@]}" regular_error=$? # Return error if either multi-device or regular builds failed @@ -278,12 +291,12 @@ for current_target in "${targets_to_build[@]}"; do # Check if this is a multi-device test test_dir="$sketch_test_folder/$current_sketch" if [ -d "$test_dir" ] && [ "$(is_multi_device_test "$test_dir")" -eq 1 ]; then - build_multi_device_test "$test_dir" "$current_target" "${args[@]}" "-t" "$current_target" "$@" + build_multi_device_test "$test_dir" "$current_target" "${args[@]}" "-t" "$current_target" "$@" "${coverage_args[@]}" else local_args=("${args[@]}") BUILD_CMD="${SCRIPTS_DIR}/sketch_utils.sh build" local_args+=("-s" "$sketch_test_folder/$current_sketch" "-t" "$current_target") - ${BUILD_CMD} "${local_args[@]}" "$@" + ${BUILD_CMD} "${local_args[@]}" "$@" "${coverage_args[@]}" fi done fi diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 3d1a76915c1..c55bd9216a9 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -91,6 +91,7 @@ jobs: with: type: ${{ matrix.type }} chip: ${{ matrix.chip }} + coverage: ${{ github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' }} call-qemu-tests: name: QEMU diff --git a/.github/workflows/tests_build.yml b/.github/workflows/tests_build.yml index 12a30da47f7..8b62afdf10a 100644 --- a/.github/workflows/tests_build.yml +++ b/.github/workflows/tests_build.yml @@ -11,6 +11,11 @@ on: type: string description: "Chip to build tests for" required: true + coverage: + type: boolean + description: "Enable code coverage instrumentation" + required: false + default: false permissions: contents: read @@ -32,6 +37,7 @@ jobs: ~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/*.bin ~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/*.elf ~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/*.json + ~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/**/*.gcno ~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/sdkconfig ~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/ci.yml ~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/flash_args @@ -70,7 +76,7 @@ jobs: - name: Build sketches if: ${{ steps.check-build.outputs.enabled == 'true' }} run: | - bash .github/scripts/tests_build.sh -c -type ${{ inputs.type }} -t ${{ inputs.chip }} + bash .github/scripts/tests_build.sh -c -type ${{ inputs.type }} -t ${{ inputs.chip }} ${{ inputs.coverage && '--coverage' || '' }} - name: Upload ${{ inputs.chip }} ${{ inputs.type }} binaries as cache uses: actions/cache/save@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 @@ -81,6 +87,7 @@ jobs: ~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/*.bin ~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/*.elf ~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/*.json + ~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/**/*.gcno ~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/sdkconfig ~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/ci.yml ~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/flash_args @@ -94,6 +101,7 @@ jobs: ~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/*.bin ~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/*.elf ~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/*.json + ~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/**/*.gcno ~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/sdkconfig ~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/ci.yml ~/.arduino/tests/${{ inputs.chip }}/**/build*.tmp/flash_args diff --git a/.github/workflows/tests_hw_wokwi.yml b/.github/workflows/tests_hw_wokwi.yml index 3232ec547b8..b744694fe1f 100644 --- a/.github/workflows/tests_hw_wokwi.yml +++ b/.github/workflows/tests_hw_wokwi.yml @@ -481,6 +481,7 @@ jobs: path: | tests/**/*.xml tests/**/result_*.json + tests/**/*_coverage.log - name: Upload hardware results as artifacts uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 @@ -491,6 +492,7 @@ jobs: path: | tests/**/*.xml tests/**/result_*.json + tests/**/*_coverage.log - name: Report conclusion uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 @@ -644,6 +646,7 @@ jobs: path: | tests/**/*.xml tests/**/result_*.json + tests/**/*_coverage.log - name: Upload ${{ matrix.chip }} ${{ matrix.type }} Wokwi results as artifacts uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 @@ -654,6 +657,7 @@ jobs: path: | tests/**/*.xml tests/**/result_*.json + tests/**/*_coverage.log - name: Report conclusion uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 diff --git a/.github/workflows/tests_results.yml b/.github/workflows/tests_results.yml index d652f278036..342268ba2b4 100644 --- a/.github/workflows/tests_results.yml +++ b/.github/workflows/tests_results.yml @@ -232,6 +232,80 @@ jobs: })).data; core.info(`${name} is ${state}`); + - name: Restore libs cache for gcov tool + id: restore-libs + if: | + (!cancelled() && + needs.get-artifacts.outputs.original_conclusion != 'cancelled' && + github.event.workflow_run.conclusion != 'cancelled') && + (needs.get-artifacts.outputs.original_event == 'schedule' || + needs.get-artifacts.outputs.original_event == 'workflow_dispatch') + uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 + with: + key: libs-${{ runner.os }}-${{ runner.arch }}- + restore-keys: libs-${{ runner.os }}-${{ runner.arch }}- + path: | + ./tools/dist + ./tools/esp32-arduino-libs + ./tools/esptool + ./tools/mk* + ./tools/openocd-esp32 + ./tools/riscv32-* + ./tools/xtensa-* + + - name: Process coverage data + id: coverage + if: | + (!cancelled() && + needs.get-artifacts.outputs.original_conclusion != 'cancelled' && + github.event.workflow_run.conclusion != 'cancelled') && + (needs.get-artifacts.outputs.original_event == 'schedule' || + needs.get-artifacts.outputs.original_event == 'workflow_dispatch') + continue-on-error: true + run: | + sudo apt-get update && sudo apt-get install -y lcov + + # Collect coverage logs from test results artifacts (Wokwi + HW) + COVERAGE_LOGS="" + for log_file in $(find ./artifacts -name "*_coverage.log" -type f 2>/dev/null); do + COVERAGE_LOGS="$COVERAGE_LOGS --log $log_file" + done + + if [ -z "$COVERAGE_LOGS" ]; then + echo "No coverage logs found" + echo "coverage_pct=" >> $GITHUB_OUTPUT + exit 0 + fi + + # Collect build directories with .gcno files + BUILD_DIRS="" + for bin_dir in ./build_artifacts/test-bin-*/; do + if [ -d "$bin_dir" ]; then + BUILD_DIRS="$BUILD_DIRS --build-dir $bin_dir" + fi + done + + # Find gcov tool from the trusted libs cache (not from artifacts, to prevent tampering) + GCOV_TOOL_FLAG="" + GCOV_TOOL=$(find ./tools -name "*-gcov" -type f 2>/dev/null | head -1) + if [ -n "$GCOV_TOOL" ]; then + chmod +x "$GCOV_TOOL" + GCOV_TOOL_FLAG="--gcov-tool $(realpath $GCOV_TOOL)" + fi + + wget https://raw.githubusercontent.com/${{ github.repository }}/master/.github/scripts/coverage_collector.py -O ./coverage_collector.py + python3 ./coverage_collector.py $COVERAGE_LOGS $BUILD_DIRS $GCOV_TOOL_FLAG \ + --output ./coverage.json \ + --tracefile ./coverage.info \ + --uncovered-report ./runtime-test-results/UNCOVERED_FUNCTIONS.md || true + + if [ -f ./coverage.json ]; then + COVERAGE_PCT=$(python3 -c "import json; d=json.load(open('./coverage.json')); print(d.get('coverage_pct', ''))") + echo "coverage_pct=$COVERAGE_PCT" >> $GITHUB_OUTPUT + else + echo "coverage_pct=" >> $GITHUB_OUTPUT + fi + - name: Generate report if: | (!cancelled() && @@ -255,6 +329,7 @@ jobs: RESULTS_RUN_ID: ${{ github.run_id }} REPORT_FILE: ./runtime-test-results/RUNTIME_TEST_RESULTS.md ORIGINAL_SHA: ${{ needs.get-artifacts.outputs.original_sha }} + COVERAGE_PCT: ${{ steps.coverage.outputs.coverage_pct }} IS_FAILING: >- ${{ needs.get-artifacts.outputs.original_conclusion == 'failure' || @@ -273,8 +348,12 @@ jobs: if [ -f ./test_errors/build_failure_cells.json ]; then BUILD_FAILURE_CELLS="--build-failure-cells ./test_errors/build_failure_cells.json" fi + COVERAGE_ARG="" + if [ -n "$COVERAGE_PCT" ]; then + COVERAGE_ARG="--coverage $COVERAGE_PCT" + fi wget https://raw.githubusercontent.com/${{ github.repository }}/master/.github/scripts/runtime_table_generator.py -O ./runtime-test-results/runtime_table_generator.py - python3 ./runtime-test-results/runtime_table_generator.py --results ./runtime-test-results/unity_results.json --sha $ORIGINAL_SHA --perf-dir ./artifacts --previous-results ./runtime-test-results/test_results.json $BUILD_FAILURE_CELLS >> $REPORT_FILE + python3 ./runtime-test-results/runtime_table_generator.py --results ./runtime-test-results/unity_results.json --sha $ORIGINAL_SHA --perf-dir ./artifacts --previous-results ./runtime-test-results/test_results.json $BUILD_FAILURE_CELLS $COVERAGE_ARG >> $REPORT_FILE mv -f ./test_results.json ./runtime-test-results/test_results.json rm -rf artifacts @@ -305,6 +384,10 @@ jobs: git config user.email "41898282+github-actions[bot]@users.noreply.github.com" if [[ `git status --porcelain` ]]; then git add runtime-test-results/RUNTIME_TEST_RESULTS.md runtime-test-results/badge.svg runtime-test-results/test_results.json runtime-test-results/unity_results.json + # Add uncovered functions report if it was generated + if [ -f runtime-test-results/UNCOVERED_FUNCTIONS.md ]; then + git add runtime-test-results/UNCOVERED_FUNCTIONS.md + fi git commit -m "Updated runtime test results" git push origin HEAD:gh-pages fi diff --git a/CMakeLists.txt b/CMakeLists.txt index 84ae7873160..f0ef13e6e6c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,6 +31,7 @@ set(CORE_SRCS cores/esp32/esp32-hal-bt.c cores/esp32/esp32-hal-cpu.c cores/esp32/esp32-hal-dac.c + cores/esp32/esp32-hal-gcov.c cores/esp32/esp32-hal-gpio.c cores/esp32/esp32-hal-hosted.c cores/esp32/esp32-hal-i2c.c diff --git a/cores/esp32/esp32-hal-gcov.c b/cores/esp32/esp32-hal-gcov.c new file mode 100644 index 00000000000..be7b15375e0 --- /dev/null +++ b/cores/esp32/esp32-hal-gcov.c @@ -0,0 +1,169 @@ +// SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD +// SPDX-License-Identifier: Apache-2.0 + +/* + * GCC gcov serial dump for embedded targets (ESP32). + * + * Problem: GCC's --coverage instrumentation expects a POSIX filesystem to + * persist .gcda profiling data when the program exits. ESP32 targets running + * in Wokwi or on real hardware have no such filesystem, and no normal + * "program exit" to trigger the dump. + * + * Solution: We use the GCC freestanding gcov API (__gcov_info_to_gcda from + * ) to serialise each translation unit's coverage data into binary + * .gcda format through callbacks -- zero file I/O, no fopen() interception. + * + * At startup the normal --coverage constructors register every TU's + * gcov_info into the libgcov linked list rooted at __gcov_root. At dump + * time we walk that list and call __gcov_info_to_gcda() for each entry. + * The filename callback emits a serial marker and the dump callback + * base64-encodes the binary data over the ROM UART. + * + * A host-side script (coverage_collector.py) parses the serial output, + * reconstructs the .gcda files, and produces an lcov report. + * + * ROM UART output (esp_rom_output_to_channels) is used instead of printf/ + * Serial to guarantee output even if higher-level I/O is unavailable. + * + * The entire mechanism is compiled in only when COVERAGE_ENABLED is defined + * AND CORE_DEBUG_LEVEL == 0, so that no debug log messages can corrupt the + * base64 data stream on the serial channel. + * + * Build flags required (injected by tests_build.sh --coverage): + * compiler.c.extra_flags = --coverage -DCOVERAGE_ENABLED + * compiler.cpp.extra_flags = --coverage -DCOVERAGE_ENABLED + * compiler.libraries.ldflags = -lgcov + * + * Serial protocol: + * <<>> -- marks the beginning of a dump session + * <<>>-- header for each .gcda file + * -- 192-byte input chunks -> 256-char lines + * <<>> -- footer for each .gcda file + * <<>> -- marks the end of the dump session + */ + +#include "sdkconfig.h" + +#if defined(COVERAGE_ENABLED) && CORE_DEBUG_LEVEL == 0 + +#include +#include +#include +#include +#include "esp_rom_sys.h" +#include "libb64/cencode.h" + +/* + * libgcov internal: linked-list root of all gcov_info objects registered by + * the --coverage constructors. The first field is a pointer to the head of + * the gcov_info chain. + * + * Layout of struct gcov_root (stable since GCC 10): + * void *list; -- head of gcov_info linked list + * unsigned dumped : 1; + * unsigned run_counted : 1; + * void *prev, *next; -- root chain (unused here) + */ +extern char __gcov_root[]; + +/* + * Advance to the next gcov_info in the chain. + * + * struct gcov_info layout (first two fields, stable since GCC 4.7): + * gcov_unsigned_t version; -- offset 0 + * struct gcov_info *next; -- offset sizeof(uint32_t) + */ +static const struct gcov_info *gcov_info_next(const struct gcov_info *info) { + const struct gcov_info *const *pnext = + (const struct gcov_info *const *)((const char *)info + sizeof(uint32_t)); + return *pnext; +} + +/* --- Low-level ROM UART helpers (bypass all stdio) --- */ + +static void rom_putc(char c) { + esp_rom_output_to_channels(c); +} + +static void rom_puts(const char *s) { + while (*s) { + rom_putc(*s++); + } +} + +/* + * Base64-encode and emit binary data in fixed-size chunks. + * 192 bytes in -> 256 base64 chars out per chunk; the input size being a + * multiple of 3 avoids mid-stream padding characters ('='). + */ +#define B64_CHUNK_IN 192 +#define B64_CHUNK_OUT (B64_CHUNK_IN * 4 / 3 + 4) + +static void rom_write_base64(const uint8_t *data, size_t len) { + char buf[B64_CHUNK_OUT + 1]; + const char *src = (const char *)data; + size_t remaining = len; + + while (remaining > 0) { + int chunk = (remaining > B64_CHUNK_IN) ? B64_CHUNK_IN : (int)remaining; + int enc_len = base64_encode_chars(src, chunk, buf); + for (int i = 0; i < enc_len; i++) { + rom_putc(buf[i]); + } + rom_putc('\n'); + src += chunk; + remaining -= chunk; + } +} + +/* --- __gcov_info_to_gcda() callbacks --- */ + +static void gcov_filename_cb(const char *filename, void *arg) { + (void)arg; + rom_puts("<<>>\n"); +} + +static void gcov_dump_cb(const void *data, unsigned len, void *arg) { + (void)arg; + rom_write_base64((const uint8_t *)data, (size_t)len); +} + +static void *gcov_allocate_cb(unsigned len, void *arg) { + (void)arg; + return malloc(len); +} + +/* + * Public entry point -- called from test sketches after UNITY_END(). + * Walks the constructor-registered gcov_info linked list and serialises + * each entry via __gcov_info_to_gcda(). Brackets the dump session with + * START/END markers so the host can reliably delimit gcov output from + * other serial traffic. + */ +void gcov_dump_serial(void) { + const struct gcov_info *info; + + /* __gcov_root is declared as char[] so we can read its first pointer-sized + field (the list head) without including the internal struct definition. */ + const struct gcov_info *const *plist = + (const struct gcov_info *const *)(void *)__gcov_root; + info = *plist; + + rom_puts("\n<<>>\n"); + while (info) { + __gcov_info_to_gcda(info, gcov_filename_cb, gcov_dump_cb, + gcov_allocate_cb, NULL); + rom_puts("<<>>\n"); + info = gcov_info_next(info); + } + rom_puts("<<>>\n"); +} + +#else /* !COVERAGE_ENABLED || CORE_DEBUG_LEVEL != 0 */ + +/* No-op stub so test sketches can call gcov_dump_serial() unconditionally */ +void gcov_dump_serial(void) {} + +#endif diff --git a/cores/esp32/esp32-hal.h b/cores/esp32/esp32-hal.h index 2fa78173df0..f9d268b9f8d 100644 --- a/cores/esp32/esp32-hal.h +++ b/cores/esp32/esp32-hal.h @@ -192,6 +192,8 @@ void set_arduino_panic_handler(arduino_panic_handler_t handler, void *arg); arduino_panic_handler_t get_arduino_panic_handler(void); void *get_arduino_panic_handler_arg(void); +void gcov_dump_serial(void); + #ifdef __cplusplus } #endif diff --git a/tests/conftest.py b/tests/conftest.py index da4c7991110..794219060b1 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,11 +1,18 @@ import pytest +import json import os +import logging import ipaddress import random import string REGEX_IPV4 = r"(\b(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\b)" +GCOV_START = "<<>>" +GCOV_END = "<<>>" +GCOV_START_TIMEOUT = 5 +GCOV_DUMP_TIMEOUT = 60 + # Pytest arguments def pytest_addoption(parser): @@ -29,6 +36,103 @@ def ci_job_id(request): return os.environ.get("CI_JOB_ID") +@pytest.fixture +def mute_patterns(): + """Auto-mute gcov dump output in the listener so it never reaches stdout.""" + return [(GCOV_START, GCOV_END)] + + +def _get_coverage_log_path(request): + """Derive the coverage log path from the pytest *request* object.""" + xml_path = request.config.getoption("xmlpath", default=None) + if xml_path: + return xml_path.rsplit(".xml", 1)[0] + "_coverage.log" + return os.path.join(os.path.dirname(str(request.fspath)), "coverage_serial.log") + + +def wait_for_gcov_dump(dut, output_path): + """Capture one gcov dump session from *dut* and **append** it to *output_path*. + + Delegates to ``dut.capture_payload_to_file()`` which waits for the + start/end markers, mutes stdout echo during the capture, and writes + the result to *output_path* in append mode. + + Returns ``True`` if a dump was captured, ``False`` otherwise. + """ + return dut.capture_payload_to_file( + start=GCOV_START, + end=GCOV_END, + filepath=output_path, + start_timeout=GCOV_START_TIMEOUT, + timeout=GCOV_DUMP_TIMEOUT, + ) + + +@pytest.fixture(autouse=True) +def coverage_capture(dut, request): + """After each test, wait for one gcov serial dump and save it. + + Skipped when the test already captured dumps explicitly via the + ``gcov_dump_capture`` fixture. + + Takes ``dut`` as a direct parameter so that this fixture is torn down + *before* the dut fixture (pytest tears down in reverse dependency order).""" + yield + if getattr(request.node, "_gcov_captured", False): + return + wait_for_gcov_dump(dut, _get_coverage_log_path(request)) + + +@pytest.fixture +def gcov_dump_capture(dut, request): + """Yield a callable that captures one gcov dump session. + + Call it after each reboot to accumulate coverage data from every boot + into the same log file. Using this fixture prevents the autouse + ``coverage_capture`` fixture from waiting for an additional dump after + the test ends. + + Example:: + + def test_rebooting(dut, gcov_dump_capture): + dut.expect_exact("boot 1 output") + gcov_dump_capture() + + dut.expect_exact("boot 2 output") + gcov_dump_capture() + """ + output_path = _get_coverage_log_path(request) + + def _capture(): + request.node._gcov_captured = True + return wait_for_gcov_dump(dut, output_path) + + yield _capture + + +@pytest.fixture +def save_perf_result(dut, request): + """Return a callable that persists a performance result dict to JSON. + + The canonical dict has keys ``test_name``, ``runs``, ``settings``, and + ``metrics`` (see ``.github/CI_README.md``). The file is written to + ``//result_.json``, incrementing + *index* to avoid overwriting previous results from other FQBN configs.""" + def _save(results): + test_name = results.get("test_name", "unknown") + target_dir = os.path.join(os.path.dirname(request.path), dut.app.target) + os.makedirs(target_dir, exist_ok=True) + file_index = 0 + report_file = os.path.join(target_dir, f"result_{test_name}{file_index}.json") + while os.path.exists(report_file): + file_index += 1 + report_file = os.path.join(target_dir, f"result_{test_name}{file_index}.json") + with open(report_file, "w") as f: + f.write(json.dumps(results)) + logging.info("Performance result saved to %s", report_file) + return _save + + # Helper functions def is_valid_ipv4(ip): # Check if the IP address is a valid IPv4 address diff --git a/tests/performance/coremark/test_coremark.py b/tests/performance/coremark/test_coremark.py index 758c79723bb..f4020652275 100644 --- a/tests/performance/coremark/test_coremark.py +++ b/tests/performance/coremark/test_coremark.py @@ -1,9 +1,7 @@ -import json import logging -import os -def test_coremark(dut, request): +def test_coremark(dut, save_perf_result): LOGGER = logging.getLogger(__name__) # Match "Runs: %d" @@ -47,16 +45,4 @@ def test_coremark(dut, request): "metrics": [{"name": "avg_score", "value": avg_score}], } - current_folder = os.path.dirname(request.path) - os.makedirs(os.path.join(current_folder, dut.app.target), exist_ok=True) - file_index = 0 - report_file = os.path.join(current_folder, dut.app.target, "result_coremark" + str(file_index) + ".json") - while os.path.exists(report_file): - report_file = report_file.replace(str(file_index) + ".json", str(file_index + 1) + ".json") - file_index += 1 - - with open(report_file, "w+") as f: - try: - f.write(json.dumps(results)) - except Exception as e: - LOGGER.warning("Failed to write results to file: {}".format(e)) + save_perf_result(results) diff --git a/tests/performance/fibonacci/test_fibonacci.py b/tests/performance/fibonacci/test_fibonacci.py index 40d2816ce94..6232b27b102 100644 --- a/tests/performance/fibonacci/test_fibonacci.py +++ b/tests/performance/fibonacci/test_fibonacci.py @@ -1,6 +1,4 @@ -import json import logging -import os fib_results = {} @@ -15,7 +13,7 @@ def fib(n): return fib_results[str(n)] -def test_fibonacci(dut, request): +def test_fibonacci(dut, save_perf_result): LOGGER = logging.getLogger(__name__) # Match "Runs: %d" @@ -69,16 +67,4 @@ def test_fibonacci(dut, request): "metrics": [{"name": "avg_time", "value": avg_time, "unit": "s"}], } - current_folder = os.path.dirname(request.path) - os.makedirs(os.path.join(current_folder, dut.app.target), exist_ok=True) - file_index = 0 - report_file = os.path.join(current_folder, dut.app.target, "result_fibonacci" + str(file_index) + ".json") - while os.path.exists(report_file): - report_file = report_file.replace(str(file_index) + ".json", str(file_index + 1) + ".json") - file_index += 1 - - with open(report_file, "w+") as f: - try: - f.write(json.dumps(results)) - except Exception as e: - LOGGER.warning("Failed to write results to file: {}".format(e)) + save_perf_result(results) diff --git a/tests/performance/linpack_double/test_linpack_double.py b/tests/performance/linpack_double/test_linpack_double.py index cb5d8376cb8..ee0030c81b0 100644 --- a/tests/performance/linpack_double/test_linpack_double.py +++ b/tests/performance/linpack_double/test_linpack_double.py @@ -1,9 +1,7 @@ -import json import logging -import os -def test_linpack_double(dut, request): +def test_linpack_double(dut, save_perf_result): LOGGER = logging.getLogger(__name__) # Match "Runs: %d" @@ -61,16 +59,4 @@ def test_linpack_double(dut, request): ], } - current_folder = os.path.dirname(request.path) - os.makedirs(os.path.join(current_folder, dut.app.target), exist_ok=True) - file_index = 0 - report_file = os.path.join(current_folder, dut.app.target, "result_linpack_double" + str(file_index) + ".json") - while os.path.exists(report_file): - report_file = report_file.replace(str(file_index) + ".json", str(file_index + 1) + ".json") - file_index += 1 - - with open(report_file, "w+") as f: - try: - f.write(json.dumps(results)) - except Exception as e: - LOGGER.warning("Failed to write results to file: {}".format(e)) + save_perf_result(results) diff --git a/tests/performance/linpack_float/test_linpack_float.py b/tests/performance/linpack_float/test_linpack_float.py index 1e6b0dd1927..ec878a25c61 100644 --- a/tests/performance/linpack_float/test_linpack_float.py +++ b/tests/performance/linpack_float/test_linpack_float.py @@ -1,9 +1,7 @@ -import json import logging -import os -def test_linpack_float(dut, request): +def test_linpack_float(dut, save_perf_result): LOGGER = logging.getLogger(__name__) # Match "Runs: %d" @@ -61,16 +59,4 @@ def test_linpack_float(dut, request): ], } - current_folder = os.path.dirname(request.path) - os.makedirs(os.path.join(current_folder, dut.app.target), exist_ok=True) - file_index = 0 - report_file = os.path.join(current_folder, dut.app.target, "result_linpack_float" + str(file_index) + ".json") - while os.path.exists(report_file): - report_file = report_file.replace(str(file_index) + ".json", str(file_index + 1) + ".json") - file_index += 1 - - with open(report_file, "w+") as f: - try: - f.write(json.dumps(results)) - except Exception as e: - LOGGER.warning("Failed to write results to file: {}".format(e)) + save_perf_result(results) diff --git a/tests/performance/psramspeed/test_psramspeed.py b/tests/performance/psramspeed/test_psramspeed.py index 94c0a9021a2..3eb73243feb 100644 --- a/tests/performance/psramspeed/test_psramspeed.py +++ b/tests/performance/psramspeed/test_psramspeed.py @@ -1,11 +1,9 @@ -import json import logging -import os from collections import defaultdict -def test_psramspeed(dut, request): +def test_psramspeed(dut, save_perf_result): LOGGER = logging.getLogger(__name__) runs_results = [] @@ -113,16 +111,4 @@ def test_psramspeed(dut, request): "metrics": metrics, } - current_folder = os.path.dirname(request.path) - os.makedirs(os.path.join(current_folder, dut.app.target), exist_ok=True) - file_index = 0 - report_file = os.path.join(current_folder, dut.app.target, "result_psramspeed" + str(file_index) + ".json") - while os.path.exists(report_file): - report_file = report_file.replace(str(file_index) + ".json", str(file_index + 1) + ".json") - file_index += 1 - - with open(report_file, "w+") as f: - try: - f.write(json.dumps(results)) - except Exception as e: - LOGGER.warning("Failed to write results to file: {}".format(e)) + save_perf_result(results) diff --git a/tests/performance/ramspeed/test_ramspeed.py b/tests/performance/ramspeed/test_ramspeed.py index 81e0844d51c..e3bf6197f8a 100644 --- a/tests/performance/ramspeed/test_ramspeed.py +++ b/tests/performance/ramspeed/test_ramspeed.py @@ -1,11 +1,9 @@ -import json import logging -import os from collections import defaultdict -def test_ramspeed(dut, request): +def test_ramspeed(dut, save_perf_result): LOGGER = logging.getLogger(__name__) runs_results = [] @@ -113,16 +111,4 @@ def test_ramspeed(dut, request): "metrics": metrics, } - current_folder = os.path.dirname(request.path) - os.makedirs(os.path.join(current_folder, dut.app.target), exist_ok=True) - file_index = 0 - report_file = os.path.join(current_folder, dut.app.target, "result_ramspeed" + str(file_index) + ".json") - while os.path.exists(report_file): - report_file = report_file.replace(str(file_index) + ".json", str(file_index + 1) + ".json") - file_index += 1 - - with open(report_file, "w+") as f: - try: - f.write(json.dumps(results)) - except Exception as e: - LOGGER.warning("Failed to write results to file: {}".format(e)) + save_perf_result(results) diff --git a/tests/performance/superpi/test_superpi.py b/tests/performance/superpi/test_superpi.py index e5ca606d170..22dc806589a 100644 --- a/tests/performance/superpi/test_superpi.py +++ b/tests/performance/superpi/test_superpi.py @@ -1,9 +1,7 @@ -import json import logging -import os -def test_superpi(dut, request): +def test_superpi(dut, save_perf_result): LOGGER = logging.getLogger(__name__) # Match "Runs: %d" @@ -42,16 +40,4 @@ def test_superpi(dut, request): "metrics": [{"name": "avg_time", "value": avg_time, "unit": "s"}], } - current_folder = os.path.dirname(request.path) - os.makedirs(os.path.join(current_folder, dut.app.target), exist_ok=True) - file_index = 0 - report_file = os.path.join(current_folder, dut.app.target, "result_superpi" + str(file_index) + ".json") - while os.path.exists(report_file): - report_file = report_file.replace(str(file_index) + ".json", str(file_index + 1) + ".json") - file_index += 1 - - with open(report_file, "w+") as f: - try: - f.write(json.dumps(results)) - except Exception as e: - LOGGER.warning("Failed to write results to file: {}".format(e)) + save_perf_result(results) diff --git a/tests/validation/console/console.ino b/tests/validation/console/console.ino index 4c4e0fc73ab..e83ce4145a4 100644 --- a/tests/validation/console/console.ino +++ b/tests/validation/console/console.ino @@ -12,6 +12,7 @@ #include #include #include + #include "linenoise/linenoise.h" #include "argtable3/argtable3.h" @@ -474,6 +475,9 @@ void loop() { RUN_TEST(test_history_load_from_file); RUN_TEST(test_attach_to_serial); UNITY_END(); +#ifdef COVERAGE_ENABLED + gcov_dump_serial(); +#endif vTaskDelete(NULL); } diff --git a/tests/validation/fs/fs.ino b/tests/validation/fs/fs.ino index 423d0490707..827babd7773 100644 --- a/tests/validation/fs/fs.ino +++ b/tests/validation/fs/fs.ino @@ -840,6 +840,9 @@ void setup() { run_suite_for(FS_LFS); UNITY_END(); +#ifdef COVERAGE_ENABLED + gcov_dump_serial(); +#endif } void loop() {} diff --git a/tests/validation/gpio/gpio.ino b/tests/validation/gpio/gpio.ino index 20c62fcd351..f558e1e3187 100644 --- a/tests/validation/gpio/gpio.ino +++ b/tests/validation/gpio/gpio.ino @@ -225,6 +225,9 @@ void setup() { RUN_TEST(test_interrupt_with_arg); UNITY_END(); +#ifdef COVERAGE_ENABLED + gcov_dump_serial(); +#endif Serial.println("GPIO test END"); } diff --git a/tests/validation/hash/hash.ino b/tests/validation/hash/hash.ino index d7b4871d7d4..9732d0be8c3 100644 --- a/tests/validation/hash/hash.ino +++ b/tests/validation/hash/hash.ino @@ -729,6 +729,9 @@ void setup() { RUN_TEST(test_sha256_10000a); UNITY_END(); +#ifdef COVERAGE_ENABLED + gcov_dump_serial(); +#endif } void loop() {} diff --git a/tests/validation/i2c_master/i2c_master.ino b/tests/validation/i2c_master/i2c_master.ino index ae6d569a0a9..aa78870a83f 100644 --- a/tests/validation/i2c_master/i2c_master.ino +++ b/tests/validation/i2c_master/i2c_master.ino @@ -328,6 +328,9 @@ void setup() { RUN_TEST(swap_pins); RUN_TEST(test_api); UNITY_END(); +#ifdef COVERAGE_ENABLED + gcov_dump_serial(); +#endif } void loop() { diff --git a/tests/validation/keyboard_layout/keyboard_layout.ino b/tests/validation/keyboard_layout/keyboard_layout.ino index a882361fbd1..e18a0ee229d 100644 --- a/tests/validation/keyboard_layout/keyboard_layout.ino +++ b/tests/validation/keyboard_layout/keyboard_layout.ino @@ -227,6 +227,9 @@ void setup() { RUN_TEST(test_digits_mapped); RUN_TEST(test_unique_letter_scancodes); UNITY_END(); +#ifdef COVERAGE_ENABLED + gcov_dump_serial(); +#endif } void loop() {} diff --git a/tests/validation/nvs/nvs.ino b/tests/validation/nvs/nvs.ino index 95f22b0296d..baf9111e056 100644 --- a/tests/validation/nvs/nvs.ino +++ b/tests/validation/nvs/nvs.ino @@ -140,9 +140,12 @@ void setup() { // Validate the types of the keys validate_types(); - // Close the Preferences, wait and restart + // Close the Preferences, dump coverage data, wait and restart preferences.end(); Serial.flush(); +#ifdef COVERAGE_ENABLED + gcov_dump_serial(); +#endif delay(1000); ESP.restart(); } diff --git a/tests/validation/nvs/test_nvs.py b/tests/validation/nvs/test_nvs.py index d7cb98104d7..e4aea915a91 100644 --- a/tests/validation/nvs/test_nvs.py +++ b/tests/validation/nvs/test_nvs.py @@ -1,20 +1,23 @@ import logging -def test_nvs(dut): +def test_nvs(dut, gcov_dump_capture): LOGGER = logging.getLogger(__name__) LOGGER.info("Expecting default values from Preferences") dut.expect_exact("Values from Preferences: char: A | uchar: 0 | short: 0 | ushort: 0 | int: 0 | uint: 0") dut.expect_exact("long: 0 | ulong: 0 | long64: 0 | ulong64: 0 | float: 0.00 | double: 0.00") dut.expect_exact("bool: false | str: str0 | strLen: strLen0 | struct: {id:1,val:100}") + gcov_dump_capture() LOGGER.info("Expecting updated preferences for the first time") dut.expect_exact("Values from Preferences: char: B | uchar: 1 | short: 1 | ushort: 1 | int: 1 | uint: 1") dut.expect_exact("long: 1 | ulong: 1 | long64: 1 | ulong64: 1 | float: 1.10 | double: 1.10") dut.expect_exact("bool: true | str: str1 | strLen: strLen1 | struct: {id:2,val:110}") + gcov_dump_capture() LOGGER.info("Expecting updated preferences for the second time") dut.expect_exact("Values from Preferences: char: C | uchar: 2 | short: 2 | ushort: 2 | int: 2 | uint: 2") dut.expect_exact("long: 2 | ulong: 2 | long64: 2 | ulong64: 2 | float: 2.20 | double: 2.20") dut.expect_exact("bool: false | str: str2 | strLen: strLen2 | struct: {id:3,val:120}") + gcov_dump_capture() diff --git a/tests/validation/psram/psram.ino b/tests/validation/psram/psram.ino index 7bf7bc11c5d..e416e1796fd 100644 --- a/tests/validation/psram/psram.ino +++ b/tests/validation/psram/psram.ino @@ -106,6 +106,9 @@ void setup() { if (psram_size == 0) { UNITY_END(); +#ifdef COVERAGE_ENABLED + gcov_dump_serial(); +#endif return; } @@ -123,6 +126,9 @@ void setup() { RUN_TEST(test_memcpy); #endif UNITY_END(); +#ifdef COVERAGE_ENABLED + gcov_dump_serial(); +#endif } void loop() {} diff --git a/tests/validation/sdcard/sdcard.ino b/tests/validation/sdcard/sdcard.ino index cff1819fa92..e2634fb37fa 100644 --- a/tests/validation/sdcard/sdcard.ino +++ b/tests/validation/sdcard/sdcard.ino @@ -548,6 +548,9 @@ void setup() { RUN_TEST(test_sd_large_file_operations); UNITY_END(); +#ifdef COVERAGE_ENABLED + gcov_dump_serial(); +#endif Serial.println("SPI test END"); } diff --git a/tests/validation/timer/timer.ino b/tests/validation/timer/timer.ino index 429b82f3ca8..c71cad43b5b 100644 --- a/tests/validation/timer/timer.ino +++ b/tests/validation/timer/timer.ino @@ -128,6 +128,9 @@ void setup() { RUN_TEST(timer_clock_select_test); #endif UNITY_END(); +#ifdef COVERAGE_ENABLED + gcov_dump_serial(); +#endif } void loop() {} diff --git a/tests/validation/touch/touch.ino b/tests/validation/touch/touch.ino index 8b2e7ed9e8c..0a1190d7d8d 100644 --- a/tests/validation/touch/touch.ino +++ b/tests/validation/touch/touch.ino @@ -171,6 +171,9 @@ void setup() { RUN_TEST(test_touch_interrtupt); RUN_TEST(test_touch_errors); UNITY_END(); +#ifdef COVERAGE_ENABLED + gcov_dump_serial(); +#endif } void loop() { diff --git a/tests/validation/uart/uart.ino b/tests/validation/uart/uart.ino index 8346aec26bd..92ac1c6f3e2 100644 --- a/tests/validation/uart/uart.ino +++ b/tests/validation/uart/uart.ino @@ -853,6 +853,9 @@ void setup() { RUN_TEST(end_when_stopped_test); RUN_TEST(hardware_flow_control_test); UNITY_END(); +#ifdef COVERAGE_ENABLED + gcov_dump_serial(); +#endif } void loop() {} diff --git a/tests/validation/unity/unity.ino b/tests/validation/unity/unity.ino index 85390deaca6..ef4a23de6b9 100644 --- a/tests/validation/unity/unity.ino +++ b/tests/validation/unity/unity.ino @@ -24,6 +24,9 @@ void setup() { RUN_TEST(test_pass); RUN_TEST(test_fail); UNITY_END(); +#ifdef COVERAGE_ENABLED + gcov_dump_serial(); +#endif } void loop() {} diff --git a/tools/arduino_cmake.py b/tools/arduino_cmake.py index 99c5a74ece3..c3cd4b69df7 100755 --- a/tools/arduino_cmake.py +++ b/tools/arduino_cmake.py @@ -46,961 +46,974 @@ "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", ) # codespell:ignore-end