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

118 lines
10 KiB
Python

# Проверка ump_logger на модели пк. Комментарии и исходный текст в UTF-8.
# Продолжает текущий вызов, список или выражение: """Exercise the current board-specific SCI8 gate without TI tools or hardware."""; порядок аргументов сохраняется.
"""Exercise the current board-specific SCI8 gate without TI tools or hardware."""
# Импортирует необходимые имена: from pathlib import Path.
from pathlib import Path
# Подключает модуль struct для этой проверки или подготовки сборки.
import struct
# Подключает модуль subprocess для этой проверки или подготовки сборки.
import subprocess
# Подключает модуль sys для этой проверки или подготовки сборки.
import sys
# Подключает модуль tempfile для этой проверки или подготовки сборки.
import tempfile
# Подключает модуль unittest для этой проверки или подготовки сборки.
import unittest
# Задаёт ROOT по выражению справа; значение используется последующими операциями.
ROOT = Path(__file__).resolve().parents[2]
# Задаёт LIMIT по выражению справа; значение используется последующими операциями.
LIMIT = (0x3FFF - (128 + 1)) * 2
# Объявляет функцию image и её входные параметры.
def image(size):
# Задаёт header по выражению справа; значение используется последующими операциями.
header = struct.pack('<H', 0x08AA) + bytes(16) + struct.pack('<HH', 0, 0x8000)
# Задаёт blocks по выражению справа; значение используется последующими операциями.
blocks = max(1, (size-24+131075)//131076)
# Задаёт remaining по выражению справа; значение используется последующими операциями.
remaining = (size-24-blocks*6)//2
# Задаёт result по выражению справа; значение используется последующими операциями.
result = bytearray(header)
# Перебирает _ in range(blocks) в указанном порядке.
for _ in range(blocks):
# Задаёт words по выражению справа; значение используется последующими операциями.
words = min(65535, remaining)
# Задаёт result + по выражению справа; значение используется последующими операциями.
result += struct.pack('<HHH', words, 0, 0x8000) + bytes(words*2)
# Задаёт remaining - по выражению справа; значение используется последующими операциями.
remaining -= words
# Возвращает bytes(result)+bytes(2) вызывающему коду и завершает функцию.
return bytes(result)+bytes(2)
# Объявляет класс FirmwareGateTest для группировки проверок.
class FirmwareGateTest(unittest.TestCase):
# Объявляет функцию check_image и её входные параметры.
def check_image(self, data, success, profile="AT25256B"):
# Открывает управляемый ресурс tempfile.TemporaryDirectory() as directory с автоматическим освобождением.
with tempfile.TemporaryDirectory() as directory:
# Задаёт source по выражению справа; значение используется последующими операциями.
source = Path(directory) / 'candidate.bin'
# Сохраняет подготовленный файл в указанном формате для следующего шага.
source.write_bytes(data)
# Запускает внешний компилятор, генератор или тест; ненулевой результат проверяется параметрами вызова.
result = subprocess.run([
# Продолжает текущий вызов, список или выражение: sys.executable, str(ROOT / 'tests/gas167/check_image.py'),; порядок аргументов сохраняется.
sys.executable, str(ROOT / 'tests/gas167/check_image.py'),
# Продолжает текущий вызов, список или выражение: str(source), '--eeprom', profile,; порядок аргументов сохраняется.
str(source), '--eeprom', profile,
# Задаёт ], capture_output по выражению справа; значение используется последующими операциями.
], capture_output=True)
# Задаёт self.assertEqual(result.returncode по выражению справа; значение используется последующими операциями.
self.assertEqual(result.returncode == 0, success,
# Задаёт result.stderr.decode(errors по выражению справа; значение используется последующими операциями.
result.stderr.decode(errors='replace'))
# Читает исходный файл или образ для последующей проверки и разбора.
self.assertEqual(source.read_bytes(), data)
# Возвращает result.stdout + result.stderr вызывающему коду и завершает функцию.
return result.stdout + result.stderr
# Объявляет функцию test_exact_boundary_is_accepted и её входные параметры.
def test_exact_boundary_is_accepted(self):
# Продолжает текущий вызов, список или выражение: self.check_image(image(LIMIT), True); порядок аргументов сохраняется.
self.check_image(image(LIMIT), True)
# Объявляет функцию test_34a95bc5_size_is_rejected и её входные параметры.
def test_34a95bc5_size_is_rejected(self):
# Продолжает текущий вызов, список или выражение: self.check_image(image(32518), False); порядок аргументов сохраняется.
self.check_image(image(32518), False)
# Объявляет функцию test_missing_boot_terminator_is_rejected и её входные параметры.
def test_missing_boot_terminator_is_rejected(self):
# Продолжает текущий вызов, список или выражение: self.check_image(image(100)[:-2], False); порядок аргументов сохраняется.
self.check_image(image(100)[:-2], False)
# Объявляет функцию test_partial_block_is_rejected и её входные параметры.
def test_partial_block_is_rejected(self):
# Продолжает текущий вызов, список или выражение: self.check_image(image(100)[:-10], False); порядок аргументов сохраняется.
self.check_image(image(100)[:-10], False)
# Объявляет функцию test_m95_capacity_does_not_expand_code_ram и её входные параметры.
def test_m95_capacity_does_not_expand_code_ram(self):
# Задаёт diagnostic по выражению справа; значение используется последующими операциями.
diagnostic = self.check_image(image(261884), False, "M95M02")
# Продолжает текущий вызов, список или выражение: self.assertIn(b'outside code RAM', diagnostic); порядок аргументов сохраняется.
self.assertIn(b'outside code RAM', diagnostic)
# Продолжает текущий вызов, список или выражение: self.check_image(image(261886), False, "M95M02"); порядок аргументов сохраняется.
self.check_image(image(261886), False, "M95M02")
# Объявляет функцию test_m95_image_rejected_for_small_part и её входные параметры.
def test_m95_image_rejected_for_small_part(self):
# Продолжает текущий вызов, список или выражение: self.check_image(image(32734), True, "M95M02"); порядок аргументов сохраняется.
self.check_image(image(32734), True, "M95M02")
# Продолжает текущий вызов, список или выражение: self.check_image(image(32734), False, "AT25256B"); порядок аргументов сохраняется.
self.check_image(image(32734), False, "AT25256B")
# Объявляет функцию test_wrong_format_is_rejected и её входные параметры.
def test_wrong_format_is_rejected(self):
# Продолжает текущий вызов, список или выражение: self.check_image(bytes(100), False); порядок аргументов сохраняется.
self.check_image(bytes(100), False)
# Проверяет условие if __name__ == '__main__' перед выполнением следующего блока.
if __name__ == '__main__':
# Продолжает текущий вызов, список или выражение: unittest.main(); порядок аргументов сохраняется.
unittest.main()