File: zip_util_test.py

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (61 lines) | stat: -rwxr-xr-x 1,886 bytes parent folder | download | duplicates (10)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#!/usr/bin/env python3
# Copyright 2020 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import glob
import subprocess
import tempfile
import unittest
import zipfile

import path_util
import zip_util


def _FindZipAlign():
  # SDK does not exist on presubmit CQ bot.
  candidates = glob.glob(
      path_util.FromToolsSrcRoot(
          'third_party/android_sdk/public/build-tools/*/zipalign'))
  # Any version will do.
  return candidates[0] if candidates else None


class ZipUtilTest(unittest.TestCase):
  def testReadZipInfoExtraFieldLength(self):
    zipalign = _FindZipAlign()
    if not zipalign:
      return

    with tempfile.NamedTemporaryFile() as f:
      with zipfile.ZipFile(f, 'w') as z:
        z.writestr('a', 'a')
        z.writestr('b', 'bb')
        z.writestr('c', 'ccc')
      f.flush()
      with tempfile.NamedTemporaryFile() as f2:
        subprocess.run([zipalign, '-f', '4', f.name, f2.name], check=True)
        with zipfile.ZipFile(f2) as z:
          alignments = [
              zip_util.ReadZipInfoExtraFieldLength(z, i) for i in z.infolist()
          ]

    # Some versions of zipalign add 4 bytes when none are needed :/.
    # https://android-review.googlesource.com/c/platform/build/+/1467998/9#message-e05d1da10ab2189ddd662fcb14a8006114f8a206
    alignments = [x % 4 for x in alignments]
    self.assertEqual([1, 0, 3], alignments)

  def testMeasureApkSignatureBlock(self):
    with tempfile.NamedTemporaryFile() as f:
      with zipfile.ZipFile(f, 'w') as z:
        z.writestr('a', 'a')
      f.flush()
      with zipfile.ZipFile(f) as z:
        # It's non-trivial to sign an apk, so at least make sure the logic
        # reports 0 for an unsigned .zip.
        self.assertEqual(0, zip_util.MeasureApkSignatureBlock(z))


if __name__ == '__main__':
  unittest.main()