133 lines
3.7 KiB
Python
Executable File
133 lines
3.7 KiB
Python
Executable File
#!/usr/bin/env vpython3
|
|
# 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 json
|
|
import os
|
|
import shutil
|
|
import tempfile
|
|
import unittest
|
|
|
|
import binary_sizes
|
|
|
|
|
|
_EXAMPLE_BLOBS = """
|
|
{
|
|
"web_engine": [
|
|
{
|
|
"merkle": "77e876447dd2daaaab7048d646e87fe8b6d9fecef6cbfcc4af30b8fbfa50b881",
|
|
"path": "locales/ta.pak",
|
|
"bytes": 17916,
|
|
"is_counted": true,
|
|
"size": 16384
|
|
},
|
|
{
|
|
"merkle": "5f1932b8c9fe954f3c3fdb34ab2089d2af34e5a0cef90cad41a1cd37d92234bf",
|
|
"path": "lib/libEGL.so",
|
|
"bytes": 226960,
|
|
"is_counted": true,
|
|
"size": 90112
|
|
},
|
|
{
|
|
"merkle": "9822fc0dd95cdd1cc46b5c6632a928a6ad19b76ed0157397d82a2f908946fc34",
|
|
"path": "meta.far",
|
|
"bytes": 24576,
|
|
"is_counted": true,
|
|
"size": 16384
|
|
},
|
|
{
|
|
"merkle": "090aed4593c4f7d04a3ad80e9971c0532dd5b1d2bdf4754202cde510a88fd220",
|
|
"path": "locales/ru.pak",
|
|
"bytes": 11903,
|
|
"is_counted": true,
|
|
"size": 16384
|
|
}
|
|
]
|
|
}
|
|
"""
|
|
|
|
|
|
class TestBinarySizes(unittest.TestCase):
|
|
tmpdir = None
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
cls.tmpdir = tempfile.mkdtemp()
|
|
|
|
@classmethod
|
|
def tearDownClass(cls):
|
|
shutil.rmtree(cls.tmpdir)
|
|
|
|
|
|
def testReadAndWritePackageBlobs(self):
|
|
# TODO(1309977): Disabled on Windows because Windows doesn't allow opening a
|
|
# NamedTemporaryFile by name.
|
|
if os.name == 'nt':
|
|
return
|
|
with tempfile.NamedTemporaryFile(mode='w') as tmp_file:
|
|
tmp_file.write(_EXAMPLE_BLOBS)
|
|
tmp_file.flush()
|
|
|
|
package_blobs = binary_sizes.ReadPackageBlobsJson(tmp_file.name)
|
|
|
|
tmp_package_file = tempfile.NamedTemporaryFile(mode='w', delete=False)
|
|
tmp_package_file.close()
|
|
try:
|
|
binary_sizes.WritePackageBlobsJson(tmp_package_file.name, package_blobs)
|
|
|
|
self.assertEqual(binary_sizes.ReadPackageBlobsJson(tmp_package_file.name),
|
|
package_blobs)
|
|
finally:
|
|
os.remove(tmp_package_file.name)
|
|
|
|
def testReadAndWritePackageSizes(self):
|
|
# TODO(1309977): Disabled on Windows because Windows doesn't allow opening a
|
|
# NamedTemporaryFile by name.
|
|
if os.name == 'nt':
|
|
return
|
|
with tempfile.NamedTemporaryFile(mode='w') as tmp_file:
|
|
tmp_file.write(_EXAMPLE_BLOBS)
|
|
tmp_file.flush()
|
|
blobs = binary_sizes.ReadPackageBlobsJson(tmp_file.name)
|
|
|
|
sizes = binary_sizes.GetPackageSizes(blobs)
|
|
|
|
new_sizes = {}
|
|
with tempfile.NamedTemporaryFile(mode='w') as tmp_file:
|
|
binary_sizes.WritePackageSizesJson(tmp_file.name, sizes)
|
|
new_sizes = binary_sizes.ReadPackageSizesJson(tmp_file.name)
|
|
self.assertEqual(new_sizes, sizes)
|
|
self.assertIn('web_engine', new_sizes)
|
|
|
|
def testGetPackageSizesUsesBlobMerklesForCount(self):
|
|
# TODO(1309977): Disabled on Windows because Windows doesn't allow opening a
|
|
# NamedTemporaryFile by name.
|
|
if os.name == 'nt':
|
|
return
|
|
blobs = json.loads(_EXAMPLE_BLOBS)
|
|
|
|
# Make a duplicate of the last blob.
|
|
last_blob = dict(blobs['web_engine'][-1])
|
|
blobs['cast_runner'] = []
|
|
last_blob['path'] = 'foo' # Give a non-sense name, but keep merkle.
|
|
|
|
# If the merkle is the same, the blob_count increases by 1.
|
|
# This effectively reduces the size of the blobs size by half.
|
|
# In both packages, despite it appearing in both and under different
|
|
# names.
|
|
blobs['cast_runner'].append(last_blob)
|
|
|
|
with tempfile.NamedTemporaryFile(mode='w') as tmp_file:
|
|
tmp_file.write(json.dumps(blobs))
|
|
tmp_file.flush()
|
|
blobs = binary_sizes.ReadPackageBlobsJson(tmp_file.name)
|
|
|
|
sizes = binary_sizes.GetPackageSizes(blobs)
|
|
|
|
self.assertEqual(sizes['cast_runner'].compressed, last_blob['size'] / 2)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|