From 841c3a38c3e1828aa87cb6bb7822431f530e7c53 Mon Sep 17 00:00:00 2001 From: "Brian S. Stephan" Date: Wed, 3 Jan 2024 19:16:00 -0600 Subject: [PATCH] s/get_storage_section/get_user_storage_section/ more renaming to make room for future methods Signed-off-by: Brian S. Stephan --- gp2040ce_bintools/storage.py | 33 +++++++++++++++++++++++---------- tests/test_builder.py | 19 ++++++++++--------- tests/test_storage.py | 4 ++-- 3 files changed, 35 insertions(+), 21 deletions(-) diff --git a/gp2040ce_bintools/storage.py b/gp2040ce_bintools/storage.py index 7431f35..61093bb 100644 --- a/gp2040ce_bintools/storage.py +++ b/gp2040ce_bintools/storage.py @@ -143,7 +143,7 @@ def get_config_from_file(filename: str, whole_board: bool = False, allow_no_file return config_pb2.Config() if whole_board: - return get_config(get_storage_section(content)) + return get_config(get_user_storage_section(content)) else: return get_config(content) @@ -173,9 +173,29 @@ def get_user_config_from_usb() -> tuple[Message, object, object]: return get_config_from_usb(USER_CONFIG_BOOTSEL_ADDRESS) -def get_storage_section(content: bytes) -> bytes: +def get_storage_section(content: bytes, address: int) -> bytes: """Pull out what should be the GP2040-CE storage section from a whole board dump. + Args: + content: bytes of a GP2040-CE whole board dump + address: location of the binary file to start reading from + Returns: + the presumed storage section from the binary + Raises: + ConfigLengthError: if the provided bytes don't appear to have a storage section + """ + # a whole board must be at least as big as the known fences + logger.debug("length of content to look for storage in: %s", len(content)) + if len(content) < address + STORAGE_SIZE: + raise ConfigLengthError("provided content is not large enough to have a storage section!") + + logger.debug("returning bytes from %s to %s", hex(address), hex(address + STORAGE_SIZE)) + return content[address:(address + STORAGE_SIZE)] + + +def get_user_storage_section(content: bytes) -> bytes: + """Get the user storage area from what should be a whole board GP2040-CE dump. + Args: content: bytes of a GP2040-CE whole board dump Returns: @@ -183,14 +203,7 @@ def get_storage_section(content: bytes) -> bytes: Raises: ConfigLengthError: if the provided bytes don't appear to have a storage section """ - # a whole board must be at least as big as the known fences - logger.debug("length of content to look for storage in: %s", len(content)) - if len(content) < USER_CONFIG_BINARY_LOCATION + STORAGE_SIZE: - raise ConfigLengthError("provided content is not large enough to have a storage section!") - - logger.debug("returning bytes from %s to %s", hex(USER_CONFIG_BINARY_LOCATION), - hex(USER_CONFIG_BINARY_LOCATION + STORAGE_SIZE)) - return content[USER_CONFIG_BINARY_LOCATION:(USER_CONFIG_BINARY_LOCATION + STORAGE_SIZE)] + return get_storage_section(content, USER_CONFIG_BINARY_LOCATION) def get_new_config() -> Message: diff --git a/tests/test_builder.py b/tests/test_builder.py index e517bf0..860e161 100644 --- a/tests/test_builder.py +++ b/tests/test_builder.py @@ -15,7 +15,8 @@ from gp2040ce_bintools.builder import (FirmwareLengthError, combine_firmware_and concatenate_firmware_and_storage_files, get_gp2040ce_from_usb, pad_binary_up_to_user_config, replace_config_in_binary, write_new_config_to_filename, write_new_config_to_usb) -from gp2040ce_bintools.storage import get_config, get_config_footer, get_storage_section, serialize_config_with_footer +from gp2040ce_bintools.storage import (get_config, get_config_footer, get_user_storage_section, + serialize_config_with_footer) HERE = os.path.dirname(os.path.abspath(__file__)) @@ -93,7 +94,7 @@ def test_firmware_plus_storage(firmware_binary, storage_dump): """Test that combining firmware and storage produces a valid combined binary.""" whole_board = combine_firmware_and_config(firmware_binary, storage_dump) # if this is valid, we should be able to find the storage and footer again - storage = get_storage_section(whole_board) + storage = get_user_storage_section(whole_board) footer_size, _, _ = get_config_footer(storage) assert footer_size == 3309 @@ -102,7 +103,7 @@ def test_firmware_plus_config_binary(firmware_binary, config_binary): """Test that combining firmware and storage produces a valid combined binary.""" whole_board = combine_firmware_and_config(firmware_binary, config_binary) # if this is valid, we should be able to find the storage and footer again - storage = get_storage_section(whole_board) + storage = get_user_storage_section(whole_board) footer_size, _, _ = get_config_footer(storage) assert footer_size == 3309 @@ -111,7 +112,7 @@ def test_chunky_firmware_plus_config_binary(config_binary): """Test that combining giant firmware and storage produces a valid combined binary.""" whole_board = combine_firmware_and_config(bytearray(b'\x00' * 4 * 1024 * 1024), config_binary, replace_extra=True) # if this is valid, we should be able to find the storage and footer again - storage = get_storage_section(whole_board) + storage = get_user_storage_section(whole_board) footer_size, _, _ = get_config_footer(storage) assert footer_size == 3309 @@ -121,7 +122,7 @@ def test_replace_config_in_binary(config_binary): whole_board = replace_config_in_binary(bytearray(b'\x00' * 3 * 1024 * 1024), config_binary) assert len(whole_board) == 3 * 1024 * 1024 # if this is valid, we should be able to find the storage and footer again - storage = get_storage_section(whole_board) + storage = get_user_storage_section(whole_board) footer_size, _, _ = get_config_footer(storage) assert footer_size == 3309 @@ -131,7 +132,7 @@ def test_replace_config_in_binary_not_big_enough(config_binary): whole_board = replace_config_in_binary(bytearray(b'\x00' * 1 * 1024 * 1024), config_binary) assert len(whole_board) == 2 * 1024 * 1024 # if this is valid, we should be able to find the storage and footer again - storage = get_storage_section(whole_board) + storage = get_user_storage_section(whole_board) footer_size, _, _ = get_config_footer(storage) assert footer_size == 3309 @@ -152,7 +153,7 @@ def test_write_new_config_to_whole_board(whole_board_dump, tmp_path): with open(tmp_file, 'rb') as file: board_dump = file.read() - config = get_config(get_storage_section(board_dump)) + config = get_config(get_user_storage_section(board_dump)) assert config.boardVersion == 'v0.7.5' config.boardVersion = 'v0.7.5-COOL' write_new_config_to_filename(config, tmp_file, inject=True) @@ -160,7 +161,7 @@ def test_write_new_config_to_whole_board(whole_board_dump, tmp_path): # read new file with open(tmp_file, 'rb') as file: new_board_dump = file.read() - config = get_config(get_storage_section(new_board_dump)) + config = get_config(get_user_storage_section(new_board_dump)) assert config.boardVersion == 'v0.7.5-COOL' assert len(board_dump) == len(new_board_dump) @@ -180,7 +181,7 @@ def test_write_new_config_to_firmware(firmware_binary, tmp_path): # read new file with open(tmp_file, 'rb') as file: new_board_dump = file.read() - config = get_config(get_storage_section(new_board_dump)) + config = get_config(get_user_storage_section(new_board_dump)) assert config.boardVersion == 'v0.7.5-COOL' assert len(new_board_dump) == 2 * 1024 * 1024 diff --git a/tests/test_storage.py b/tests/test_storage.py index b5f6a70..48f6548 100644 --- a/tests/test_storage.py +++ b/tests/test_storage.py @@ -50,7 +50,7 @@ def test_config_footer_too_small(storage_dump): def test_whole_board_too_small(whole_board_dump): """Test that a storage section isn't detected if the size is too small to contain where it should be.""" with pytest.raises(storage.ConfigLengthError): - _, _, _ = storage.get_storage_section(whole_board_dump[-100000:]) + _, _, _ = storage.get_user_storage_section(whole_board_dump[-100000:]) def test_config_footer_bad_magic(storage_dump): @@ -121,7 +121,7 @@ def test_config_parses(storage_dump): @with_pb2s def test_config_from_whole_board_parses(whole_board_dump): """Test that we can read in a whole board and still find the config section.""" - config = storage.get_config(storage.get_storage_section(whole_board_dump)) + config = storage.get_config(storage.get_user_storage_section(whole_board_dump)) assert config.boardVersion == 'v0.7.5' assert config.hotkeyOptions.hotkey01.dpadMask == 0 assert config.hotkeyOptions.hotkey02.dpadMask == 1