| #!/usr/bin/env python3 |
| # Copyright 2023 The Chromium Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import os |
| import pathlib |
| import shutil |
| import sys |
| import tempfile |
| import unittest |
| import zipfile |
| |
| import zip_helpers |
| |
| |
| def _make_test_zips(tmp_dir, create_conflct=False): |
| zip1 = os.path.join(tmp_dir, 'A.zip') |
| zip2 = os.path.join(tmp_dir, 'B.zip') |
| with zipfile.ZipFile(zip1, 'w') as z: |
| z.writestr('file1', 'AAAAA') |
| z.writestr('file2', 'BBBBB') |
| with zipfile.ZipFile(zip2, 'w') as z: |
| z.writestr('file2', 'ABABA' if create_conflct else 'BBBBB') |
| z.writestr('file3', 'CCCCC') |
| return zip1, zip2 |
| |
| |
| class ZipHelpersTest(unittest.TestCase): |
| def test_merge_zips__identical_file(self): |
| with tempfile.TemporaryDirectory() as tmp_dir: |
| zip1, zip2 = _make_test_zips(tmp_dir) |
| |
| merged_zip = os.path.join(tmp_dir, 'merged.zip') |
| zip_helpers.merge_zips(merged_zip, [zip1, zip2]) |
| |
| with zipfile.ZipFile(merged_zip) as z: |
| self.assertEqual(z.namelist(), ['file1', 'file2', 'file3']) |
| |
| def test_merge_zips__conflict(self): |
| with tempfile.TemporaryDirectory() as tmp_dir: |
| zip1, zip2 = _make_test_zips(tmp_dir, create_conflct=True) |
| |
| merged_zip = os.path.join(tmp_dir, 'merged.zip') |
| with self.assertRaises(Exception): |
| zip_helpers.merge_zips(merged_zip, [zip1, zip2]) |
| |
| def test_merge_zips__conflict_with_append(self): |
| with tempfile.TemporaryDirectory() as tmp_dir: |
| zip1, zip2 = _make_test_zips(tmp_dir, create_conflct=True) |
| |
| with self.assertRaises(Exception): |
| with zipfile.ZipFile(zip1, 'a') as dst_zip: |
| zip_helpers.merge_zips(dst_zip, [zip2]) |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |