Files
Balsam_167/tests/gas167/run_test.py
T
Andrey f741741cf8 Сохранить русские комментарии и настройки проекта в UTF-8
Добавить пояснения к исходникам, заголовкам TI, настройкам CCS и существующим проверкам. Зафиксировать правила кодировки, обзор модулей и аудит комментариев.
2026-10-12 12:24:48 +03:00

98 lines
10 KiB
Python

# Проверка gas167 на модели пк. Комментарии и исходный текст в UTF-8.
# Продолжает текущий вызов, список или выражение: """Exercise the production GAS provider and extracted production RTU/CAN routes."""; порядок аргументов сохраняется.
"""Exercise the production GAS provider and extracted production RTU/CAN routes."""
# Подключает модуль os для этой проверки или подготовки сборки.
import os
# Импортирует необходимые имена: from pathlib import Path.
from pathlib import Path
# Подключает модуль re для этой проверки или подготовки сборки.
import re
# Подключает модуль shutil для этой проверки или подготовки сборки.
import shutil
# Подключает модуль subprocess для этой проверки или подготовки сборки.
import subprocess
# Подключает модуль tempfile для этой проверки или подготовки сборки.
import tempfile
# Задаёт root по выражению справа; значение используется последующими операциями.
root = Path(__file__).resolve().parents[2]
# Задаёт templates по выражению справа; значение используется последующими операциями.
templates = Path(os.environ.get("TEMPLATES_ROOT", root.parent / "newProject/SETGUI/third_party/templates"))
# Задаёт protocol по выражению справа; значение используется последующими операциями.
protocol = templates / "c/set-protocol"
# Задаёт compiler по выражению справа; значение используется последующими операциями.
compiler = os.environ.get("CC") or shutil.which("gcc") or "C:/msys64/mingw64/bin/gcc.exe"
# Задаёт os.environ["PATH"] по выражению справа; значение используется последующими операциями.
os.environ["PATH"] = str(Path(compiler).resolve().parent) + os.pathsep + os.environ["PATH"]
# Объявляет функцию function и её входные параметры.
def function(text, name):
# Задаёт match по выражению справа; значение используется последующими операциями.
match = re.search(r"^(?:static )?(?:void|int) " + name + r"\(", text, re.M)
# Проверяет условие if not match перед выполнением следующего блока.
if not match:
# Останавливает текущую операцию с исключением ValueError(f"Production function {name} missing").
raise ValueError(f"Production function {name} missing")
# Задаёт end по выражению справа; значение используется последующими операциями.
end = re.search(r"^}", text[match.start():], re.M)
# Проверяет условие if not end перед выполнением следующего блока.
if not end:
# Останавливает текущую операцию с исключением ValueError(f"Production function {name} incomplete").
raise ValueError(f"Production function {name} incomplete")
# Возвращает text[match.start():match.start() + end.end()] + "\n" вызывающему коду и завершает функцию.
return text[match.start():match.start() + end.end()] + "\n"
# Читает исходный файл или образ для последующей проверки и разбора.
message = (root / "Source/Internal/message.c").read_text(encoding="utf-8")
# Читает исходный файл или образ для последующей проверки и разбора.
ecan = (root / "Source/Internal/ecan.c").read_text(encoding="utf-8")
# Задаёт can_globals по выражению справа; значение используется последующими операциями.
can_globals = ecan[ecan.index("static volatile unsigned int ump_can_pending;"):
# Продолжает текущий вызов, список или выражение: ecan.index("static unsigned long ump_can_sent_at;") + len("static unsigned long ump_can_sent_at;")]; порядок аргументов сохраняется.
ecan.index("static unsigned long ump_can_sent_at;") + len("static unsigned long ump_can_sent_at;")]
# On C28x unsigned int is uint16_t. Preserve that target word layout on GCC.
# Задаёт can_globals по выражению справа; значение используется последующими операциями.
can_globals = can_globals.replace("static unsigned int ump_can_reply[",
# Продолжает текущий вызов, список или выражение: "static uint16_t ump_can_reply["); порядок аргументов сохраняется.
"static uint16_t ump_can_reply[")
# Задаёт routes по выражению справа; значение используется последующими операциями.
routes = can_globals + "\n" + "".join(function(message, name) for name in
# Продолжает текущий вызов, список или выражение: ("modbus_exception", "receive_ump", "ReceiveCommandModbus3", "ReceiveCommandModbus6")); порядок аргументов сохраняется.
("modbus_exception", "receive_ump", "ReceiveCommandModbus3", "ReceiveCommandModbus6"))
# Задаёт routes + по выражению справа; значение используется последующими операциями.
routes += function(ecan, "UMP_CAN_service")
# Открывает управляемый ресурс tempfile.TemporaryDirectory(prefix="gas167-test-") as tmp с автоматическим освобождением.
with tempfile.TemporaryDirectory(prefix="gas167-test-") as tmp:
# Задаёт directory по выражению справа; значение используется последующими операциями.
directory = Path(tmp)
# Сохраняет подготовленный файл в указанном формате для следующего шага.
(directory / "production_routes.inc").write_text(routes, encoding="utf-8")
# Перебирает profile in (0, 1) в указанном порядке.
for profile in (0, 1):
# Задаёт exe по выражению справа; значение используется последующими операциями.
exe = directory / f"gas167_{profile}.exe"
# Запускает внешний компилятор, генератор или тест; ненулевой результат проверяется параметрами вызова.
subprocess.run([compiler, "-std=c99", "-Wall", "-Wextra",
# Продолжает текущий вызов, список или выражение: "-Wno-unused-function", "-Wno-unused-parameter",; порядок аргументов сохраняется.
"-Wno-unused-function", "-Wno-unused-parameter",
# Задаёт f"-DEEPROM_M95M02 по выражению справа; значение используется последующими операциями.
f"-DEEPROM_M95M02={profile}", "-I" + str(directory),
# Продолжает текущий вызов, список или выражение: "-ISource/Internal/Include", "-I" + str(protocol),; порядок аргументов сохраняется.
"-ISource/Internal/Include", "-I" + str(protocol),
# Продолжает текущий вызов, список или выражение: "-I" + str(protocol / "include"),; порядок аргументов сохраняется.
"-I" + str(protocol / "include"),
# Продолжает текущий вызов, список или выражение: "-I" + str(protocol / "ports/tms320f28335"),; порядок аргументов сохраняется.
"-I" + str(protocol / "ports/tms320f28335"),
# Продолжает текущий вызов, список или выражение: "tests/gas167/gas167_test.c", "Source/Internal/gas167.c",; порядок аргументов сохраняется.
"tests/gas167/gas167_test.c", "Source/Internal/gas167.c",
# Продолжает текущий вызов, список или выражение: str(protocol / "src/ump_protocol.c"),; порядок аргументов сохраняется.
str(protocol / "src/ump_protocol.c"),
# Продолжает текущий вызов, список или выражение: str(protocol / "ports/tms320f28335/ump_tms28335.c"),; порядок аргументов сохраняется.
str(protocol / "ports/tms320f28335/ump_tms28335.c"),
# Задаёт "-o", str(exe)], cwd по выражению справа; значение используется последующими операциями.
"-o", str(exe)], cwd=root, check=True)
# Запускает внешний компилятор, генератор или тест; ненулевой результат проверяется параметрами вызова.
subprocess.run([str(exe)], check=True, timeout=10)