summaryrefslogtreecommitdiff
path: root/build-aux/measurestack/test_app_plugins.py
blob: aed0bb47854221495eed52bf5c56247c06402a7d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# build-aux/measurestack/test_app_plugins.py - Tests for app_plugins.py
#
# Copyright (C) 2025  Luke T. Shumaker <lukeshu@lukeshu.com>
# 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)