feat(tools): fw_info/fw_pack 镜像解析重打包(CRC32验证+字节级往返),112 测试全绿
This commit is contained in:
1 parent
0e2a6a351f
commit
7079053dde
10 files changed
+987
-1
No files matched your search
@@ -0,0 +1,64 @@
|
||||
"""固件工具测试 — 以原始镜像为黄金样本(app/ 只读)。"""
|
||||
import zlib
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
from tools import fw
|
||||
|
||||
SAMPLE = Path(__file__).parent.parent / "app" / "firmware-PP_da14585_4.2_CH.img"
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def sample():
|
||||
return SAMPLE.read_bytes()
|
||||
|
||||
|
||||
class TestParse:
|
||||
def test_header_fields(self, sample):
|
||||
info = fw.parse_image(sample)
|
||||
assert info["magic"] == 0x7051 # 'pQ'
|
||||
assert info["flags"] == 0x01AA
|
||||
assert info["body_size"] == len(sample) - 64
|
||||
assert info["crc_stored"] == zlib.crc32(sample[64:]) & 0xFFFFFFFF
|
||||
|
||||
def test_crc_valid(self, sample):
|
||||
assert fw.parse_image(sample)["crc_valid"] is True
|
||||
|
||||
def test_vector_table(self, sample):
|
||||
info = fw.parse_image(sample)
|
||||
assert info["initial_sp"] == 0x07FD2B58
|
||||
assert info["reset_handler"] == 0x07FC0525
|
||||
assert info["load_base"] == 0x07FC0000
|
||||
|
||||
def test_bad_magic_rejected(self):
|
||||
with pytest.raises(ValueError):
|
||||
fw.parse_image(b"\x00" * 128)
|
||||
|
||||
def test_bad_crc_reported(self, sample):
|
||||
corrupted = bytearray(sample)
|
||||
corrupted[100] ^= 0xFF
|
||||
assert fw.parse_image(bytes(corrupted))["crc_valid"] is False
|
||||
|
||||
|
||||
class TestPack:
|
||||
def test_repack_roundtrip_byte_identical(self, sample):
|
||||
"""解包→重打包 == 原文件(字节级)"""
|
||||
body = fw.unpack_body(sample)
|
||||
assert fw.pack_image(body, flags=0x01AA) == sample
|
||||
|
||||
def test_pack_computes_crc(self):
|
||||
body = b"\x58\x2b\xfd\x07" + b"\x00" * 100
|
||||
img = fw.pack_image(body)
|
||||
info = fw.parse_image(img)
|
||||
assert info["crc_valid"] is True
|
||||
assert info["body_size"] == len(body)
|
||||
|
||||
def test_patch_and_repack(self, sample):
|
||||
"""修改体→重打包→CRC 更新且可解析"""
|
||||
body = bytearray(fw.unpack_body(sample))
|
||||
body[0x1000] ^= 0xAA
|
||||
img = fw.pack_image(bytes(body))
|
||||
info = fw.parse_image(img)
|
||||
assert info["crc_valid"] is True
|
||||
assert img != sample
|
||||
Reference in new issue
Block a user