2024-05-08 07:38:19 -04:00
|
|
|
#!/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
|
2024-05-06 06:13:16 -04:00
|
|
|
from shutil import copytree
|
|
|
|
from subprocess import PIPE
|
2024-05-08 07:38:19 -04:00
|
|
|
from subprocess import run
|
2024-05-06 06:13:16 -04:00
|
|
|
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)
|
2024-05-08 07:38:19 -04:00
|
|
|
|
|
|
|
|
|
|
|
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')
|
2024-05-06 06:13:16 -04:00
|
|
|
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)
|