firmware-base/scripts/test_upload.py

198 lines
6.0 KiB
Python

#!/usr/bin/env python3
"""
Test script to verify upload settings match PlatformIO configuration
Based on output from: pio run -t uploadfs -e waveshare -v
"""
import os
import subprocess
def test_mklittlefs_command():
"""Test that mklittlefs command matches PlatformIO"""
print("=== Testing mklittlefs command ===")
expected_cmd = 'mklittlefs -c data -s 1572864 -p 256 -b 4096 littlefs.bin'
print(f"Expected: {expected_cmd}")
# Test if data directory exists
if not os.path.exists('data'):
print("❌ Data directory not found")
return False
# Find mklittlefs
mklittlefs_paths = [
"mklittlefs.exe",
os.path.expanduser("~/.platformio/packages/tool-mklittlefs/mklittlefs.exe"),
"C:/Users/%USERNAME%/.platformio/packages/tool-mklittlefs/mklittlefs.exe"
]
mklittlefs = None
for path in mklittlefs_paths:
if os.path.exists(path):
mklittlefs = path
break
if not mklittlefs:
print("❌ mklittlefs.exe not found")
return False
print(f"✅ Found mklittlefs: {mklittlefs}")
return True
def test_esptool_command():
"""Test that esptool command matches PlatformIO"""
print("\n=== Testing esptool command ===")
expected_params = {
'chip': 'esp32s3',
'port': 'COM17',
'baud': '115200',
'flash_mode': 'dio',
'flash_freq': '80m',
'flash_size': '8MB'
}
expected_addresses = {
'bootloader': '0x0000',
'partitions': '0x8000',
'boot_app0': '0xe000',
'firmware': '0x10000',
'littlefs': '0x670000'
}
print("Expected parameters:")
for key, value in expected_params.items():
print(f" {key}: {value}")
print("Expected flash addresses:")
for key, value in expected_addresses.items():
print(f" {key}: {value}")
# Test esptool availability
try:
result = subprocess.run(['python', '-m', 'esptool', 'version'],
capture_output=True, text=True, check=True)
print(f"✅ esptool available: {result.stdout.strip()}")
return True
except (subprocess.CalledProcessError, FileNotFoundError):
print("❌ esptool not available")
return False
def test_flash_addresses():
"""Verify flash address calculations"""
print("\n=== Testing flash addresses ===")
# From PlatformIO firmware upload output
addresses = {
'bootloader': (0x0000, '0x0000'),
'partitions': (0x8000, '0x8000'),
'boot_app0': (0xe000, '0xe000'),
'firmware': (0x10000, '0x10000'),
'littlefs': (6750208, '0x670000') # From uploadfs output
}
all_match = True
for name, (decimal, expected_hex) in addresses.items():
actual_hex = hex(decimal)
match = actual_hex == expected_hex
status = "" if match else ""
print(f"{status} {name}: {decimal} = {actual_hex} (expected {expected_hex})")
if not match:
all_match = False
return all_match
def test_partition_size():
"""Verify partition size calculations"""
print("\n=== Testing partition size ===")
# From PlatformIO output: 1572864 bytes
size_bytes = 1572864
size_kb = size_bytes // 1024
size_mb = size_kb // 1024
size_hex = hex(size_bytes)
print(f"Partition size: {size_bytes} bytes = {size_kb} KB = {size_mb:.1f} MB = {size_hex}")
# Should be 1.5 MB
if size_mb == 1: # 1.5 rounds to 1
print("✅ Partition size matches (~1.5 MB)")
return True
else:
print("❌ Partition size unexpected")
return False
def main():
"""Run all tests"""
print("Testing upload configuration against PlatformIO settings...")
print()
def test_platformio_files():
"""Test that PlatformIO build files exist"""
print("\n=== Testing PlatformIO files ===")
required_files = {
'firmware': '.pio/build/waveshare/firmware.bin',
'bootloader': '.pio/build/waveshare/bootloader.bin',
'partitions': '.pio/build/waveshare/partitions.bin'
}
boot_app0_paths = [
os.path.expanduser("~/.platformio/packages/framework-arduinoespressif32/tools/partitions/boot_app0.bin"),
"C:/Users/%USERNAME%/.platformio/packages/framework-arduinoespressif32/tools/partitions/boot_app0.bin"
]
all_exist = True
for name, path in required_files.items():
exists = os.path.exists(path)
status = "" if exists else ""
print(f"{status} {name}: {path}")
if not exists:
all_exist = False
# Check boot_app0
boot_app0_found = False
for path in boot_app0_paths:
if os.path.exists(path):
print(f"✅ boot_app0: {path}")
boot_app0_found = True
break
if not boot_app0_found:
print("❌ boot_app0: not found in PlatformIO packages")
all_exist = False
return all_exist
tests = [
test_mklittlefs_command,
test_esptool_command,
test_flash_addresses,
test_partition_size,
test_platformio_files
]
results = []
for test in tests:
try:
results.append(test())
except Exception as e:
print(f"❌ Test failed with error: {e}")
results.append(False)
print("\n=== Test Summary ===")
passed = sum(results)
total = len(results)
if passed == total:
print(f"✅ All {total} tests passed!")
print("Upload scripts should work correctly.")
else:
print(f"{total - passed} of {total} tests failed")
print("Check the configuration before uploading.")
return passed == total
if __name__ == "__main__":
success = main()
exit(0 if success else 1)