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

118 lines
10 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Проверка 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()