From 19b1dc8d652be857f471b7e802deb4aa2e2db9ed Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Fri, 9 May 2025 09:56:07 +0200 Subject: [PATCH] Add backup tests showing that unknown files are not ciphered (#144529) --- .../c0cb53bd.tar.decrypted_skip_core2 | Bin 0 -> 10240 bytes .../c0cb53bd.tar.encrypted_skip_core2 | Bin 0 -> 10240 bytes tests/components/backup/test_util.py | 74 ++++++++++++++---- 3 files changed, 58 insertions(+), 16 deletions(-) create mode 100644 tests/components/backup/fixtures/test_backups/c0cb53bd.tar.decrypted_skip_core2 create mode 100644 tests/components/backup/fixtures/test_backups/c0cb53bd.tar.encrypted_skip_core2 diff --git a/tests/components/backup/fixtures/test_backups/c0cb53bd.tar.decrypted_skip_core2 b/tests/components/backup/fixtures/test_backups/c0cb53bd.tar.decrypted_skip_core2 new file mode 100644 index 0000000000000000000000000000000000000000..ba53b103b03c80ef0741ffcba9c2796279d63155 GIT binary patch literal 10240 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 literal 0 HcmV?d00001 diff --git a/tests/components/backup/test_util.py b/tests/components/backup/test_util.py index a999672e7f6..229e25c312d 100644 --- a/tests/components/backup/test_util.py +++ b/tests/components/backup/test_util.py @@ -167,17 +167,37 @@ def test_validate_password_no_homeassistant() -> None: assert validate_password(mock_path, "hunter2") is False -async def test_decrypted_backup_streamer(hass: HomeAssistant) -> None: +@pytest.mark.parametrize( + ("addons", "padding_size", "decrypted_backup"), + [ + ( + [ + AddonInfo(name="Core 1", slug="core1", version="1.0.0"), + AddonInfo(name="Core 2", slug="core2", version="1.0.0"), + ], + 40960, # 4 x 10240 byte of padding + "test_backups/c0cb53bd.tar.decrypted", + ), + ( + [ + AddonInfo(name="Core 1", slug="core1", version="1.0.0"), + ], + 30720, # 3 x 10240 byte of padding + "test_backups/c0cb53bd.tar.decrypted_skip_core2", + ), + ], +) +async def test_decrypted_backup_streamer( + hass: HomeAssistant, + addons: list[AddonInfo], + padding_size: int, + decrypted_backup: str, +) -> None: """Test the decrypted backup streamer.""" - decrypted_backup_path = get_fixture_path( - "test_backups/c0cb53bd.tar.decrypted", DOMAIN - ) + decrypted_backup_path = get_fixture_path(decrypted_backup, DOMAIN) encrypted_backup_path = get_fixture_path("test_backups/c0cb53bd.tar", DOMAIN) backup = AgentBackup( - addons=[ - AddonInfo(name="Core 1", slug="core1", version="1.0.0"), - AddonInfo(name="Core 2", slug="core2", version="1.0.0"), - ], + addons=addons, backup_id="1234", date="2024-12-02T07:23:58.261875-05:00", database_included=False, @@ -189,7 +209,7 @@ async def test_decrypted_backup_streamer(hass: HomeAssistant) -> None: protected=True, size=encrypted_backup_path.stat().st_size, ) - expected_padding = b"\0" * 40960 # 4 x 10240 byte of padding + expected_padding = b"\0" * padding_size async def send_backup() -> AsyncIterator[bytes]: f = encrypted_backup_path.open("rb") @@ -325,17 +345,39 @@ async def test_decrypted_backup_streamer_wrong_password(hass: HomeAssistant) -> assert isinstance(decryptor._workers[0].error, securetar.SecureTarReadError) -async def test_encrypted_backup_streamer(hass: HomeAssistant) -> None: +@pytest.mark.parametrize( + ("addons", "padding_size", "encrypted_backup"), + [ + ( + [ + AddonInfo(name="Core 1", slug="core1", version="1.0.0"), + AddonInfo(name="Core 2", slug="core2", version="1.0.0"), + ], + 40960, # 4 x 10240 byte of padding + "test_backups/c0cb53bd.tar", + ), + ( + [ + AddonInfo(name="Core 1", slug="core1", version="1.0.0"), + ], + 30720, # 3 x 10240 byte of padding + "test_backups/c0cb53bd.tar.encrypted_skip_core2", + ), + ], +) +async def test_encrypted_backup_streamer( + hass: HomeAssistant, + addons: list[AddonInfo], + padding_size: int, + encrypted_backup: str, +) -> None: """Test the encrypted backup streamer.""" decrypted_backup_path = get_fixture_path( "test_backups/c0cb53bd.tar.decrypted", DOMAIN ) - encrypted_backup_path = get_fixture_path("test_backups/c0cb53bd.tar", DOMAIN) + encrypted_backup_path = get_fixture_path(encrypted_backup, DOMAIN) backup = AgentBackup( - addons=[ - AddonInfo(name="Core 1", slug="core1", version="1.0.0"), - AddonInfo(name="Core 2", slug="core2", version="1.0.0"), - ], + addons=addons, backup_id="1234", date="2024-12-02T07:23:58.261875-05:00", database_included=False, @@ -347,7 +389,7 @@ async def test_encrypted_backup_streamer(hass: HomeAssistant) -> None: protected=False, size=decrypted_backup_path.stat().st_size, ) - expected_padding = b"\0" * 40960 # 4 x 10240 byte of padding + expected_padding = b"\0" * padding_size async def send_backup() -> AsyncIterator[bytes]: f = decrypted_backup_path.open("rb")