# build-aux/measurestack/test_app_plugins.py - Tests for app_plugins.py # # Copyright (C) 2025 Luke T. Shumaker # SPDX-License-Identifier: AGPL-3.0-or-later # pylint: disable=unused-variable import typing from . import analyze, app_plugins, testutil, util from .analyze import QName def test_fct() -> None: # 1. | a + | b + | # 2. | fmt_vsnprintf + | vprintf + | # 3. | fmt_vfctprintf + | fmt_vfctprintf + | # 4. | fmt_state_putchar + | fmt_state_putchar + | # 5. | _out_buffer + | stdio_buffered_printer + | max_call_depth = 5 exp_a = ["a", "fmt_vsnprintf", "fmt_vfctprintf", "fmt_state_putchar", "_out_buffer"] exp_b = [ "b", "__wrap_vprintf", "fmt_vfctprintf", "fmt_state_putchar", "stdio_buffered_printer", ] graph: typing.Sequence[tuple[str, typing.Collection[str]]] = [ # main.c ("a", {"fmt_vsnprintf"}), # _out_buffer ("b", {"vprintf"}), # stdio_buffered_printer # wrappers ("fmt_vsnprintf", {"fmt_vfctprintf"}), ("__wrap_vprintf", {"fmt_vfctprintf"}), # printf.c ("fmt_vfctprintf", {"fmt_state_putchar"}), ("fmt_state_putchar", {"_out_buffer", "stdio_buffered_printer"}), # fcts ("_out_buffer", {}), ("stdio_buffered_printer", {}), ] graph_plugin = testutil.GraphProviderPlugin(max_call_depth, graph) plugins: list[util.Plugin] = [ graph_plugin, app_plugins.LibMiscPlugin(arg_c_fnames=[]), # fmt_vsnprintf => fct=_out_buffer # if rp2040: # __wrap_vprintf => fct=stdio_buffered_printer # stdio_vprintf => fct=stdio_buffered_printer app_plugins.PicoFmtPlugin("rp2040", []), ] def test_filter(name: QName) -> tuple[int, bool]: if str(name.base()) in ["a", "b", "c"]: return 1, True return 0, False result = analyze.analyze( ci_fnames=[], app_func_filters={ "Main": test_filter, }, app=util.PluginApplication(testutil.nop_location_xform, plugins), cfg_max_call_depth=max_call_depth, ) graph_plugin.assert_nstatic(result.groups["Main"].rows[QName("a")].nstatic, exp_a) graph_plugin.assert_nstatic(result.groups["Main"].rows[QName("b")].nstatic, exp_b)