[go: nahoru, domu]

Make zip_helpers.merge_zip() detect conflicts

Bug: 1428082
Change-Id: Ib88529e1eb135978fb6aa10876620496b4a1dbea
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4429430
Reviewed-by: Sam Maier <smaier@chromium.org>
Commit-Queue: Andrew Grieve <agrieve@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1131268}
diff --git a/build/zip_helpers_unittest.py b/build/zip_helpers_unittest.py
new file mode 100755
index 0000000..19000273
--- /dev/null
+++ b/build/zip_helpers_unittest.py
@@ -0,0 +1,58 @@
+#!/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()