esp-idf/tools/test_idf_size/test_idf_size.py
Frantisek Hrbata 6f41dee0cd feat: add diff option support to idf.py size commands
This adds a possibility to specify --diff option to idf.py size,
size-components and size-files commands. This can be map file directly,
project directory or build directory.

Usage example:
idf.py size-components --diff ../hello_world2/build/hello_world.map
idf.py size-components --diff ../hello_world2/build
idf.py size-components --diff ../hello_world2

Signed-off-by: Frantisek Hrbata <frantisek.hrbata@espressif.com>
2024-05-24 15:19:37 +08:00

61 lines
2.2 KiB
Python

#!/usr/bin/env python
# SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
# SPDX-License-Identifier: Apache-2.0
import logging
import os
import sys
from pathlib import Path
from shutil import copytree
from subprocess import PIPE
from subprocess import run
from subprocess import STDOUT
from tempfile import TemporaryDirectory
from typing import Any
from typing import Optional
from typing import Tuple
from typing import Union
IDF_PATH = Path(os.environ['IDF_PATH'])
IDF_PY_PATH = IDF_PATH / 'tools' / 'idf.py'
IDF_SIZE_PY_PATH = IDF_PATH / 'tools' / 'idf_size.py'
HELLO_WORLD_PATH = IDF_PATH / 'examples' / 'get-started' / 'hello_world'
PathLike = Union[str, Path]
def run_cmd(*cmd: PathLike, cwd: Optional[PathLike]=None, check: bool=True, text: bool=True) -> Tuple[int, str]:
logging.info('running: {}'.format(' '.join([str(arg) for arg in cmd])))
p = run(cmd, stdout=PIPE, stderr=STDOUT, cwd=cwd, check=check, text=text)
return p.returncode, p.stdout
def run_idf_py(*args: PathLike, **kwargs: Any) -> Tuple[int, str]:
return run_cmd(sys.executable, IDF_PY_PATH, *args, **kwargs)
def run_idf_size_py(*args: PathLike, **kwargs: Any) -> Tuple[int, str]:
return run_cmd(sys.executable, IDF_SIZE_PY_PATH, *args, **kwargs)
def test_idf_size() -> None:
# Simple test to make sure that the idf_size.py wrapper is compatible
# with idf.py minimum required python version.
logging.info('idf_size.py python compatibility check')
run_idf_size_py('--help')
def test_idf_py_size_diff() -> None:
# Test idf.py size with diff option, utilizing the same map file, as the focus
# of the test lies solely on the option, not on the resulting output.
logging.info('idf.py size --diff option test')
tmpdir = TemporaryDirectory()
app_path = Path(tmpdir.name) / 'app'
copytree(HELLO_WORLD_PATH, app_path, symlinks=True)
run_idf_py('fullclean', cwd=app_path)
run_idf_py('build', cwd=app_path)
run_idf_py('size', '--diff', '.', cwd=app_path)
# The diff map file should be found automatically in project or project's build directory
run_idf_py('size', '--diff', 'build', cwd=app_path)
run_idf_py('size', '--diff', Path('build') / 'hello_world.map', cwd=app_path)