blob: 6192bf2d6539c11ed8f9498d2e0d57f66143bd87 [file] [log] [blame]
#!/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 copy
import os
import tempfile
from typing import MutableMapping, Optional
import unittest
import binary_size_differ
import binary_sizes
_EXAMPLE_BLOBS_BEFORE = """
{
"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": false,
"size": 16384
},
{
"merkle": "090aed4593c4f7d04a3ad80e9971c0532dd5b1d2bdf4754202cde510a88fd220",
"path": "locales/ru.pak",
"bytes": 11903,
"is_counted": true,
"size": 16384
}
]
}
"""
class BinarySizeDifferTest(unittest.TestCase):
def ChangePackageSize(
self,
packages: MutableMapping[str, binary_sizes.PackageSizes],
name: str,
compressed_increase: int,
uncompressed_increase: Optional[int] = None):
if uncompressed_increase is None:
uncompressed_increase = compressed_increase
original_package = packages[name]
new_package = binary_sizes.PackageSizes(
compressed=original_package.compressed + compressed_increase,
uncompressed=original_package.uncompressed + uncompressed_increase)
packages[name] = new_package
def testComputePackageDiffs(self):
# TODO(1309977): Disabled on Windows because Windows doesn't allow opening a
# NamedTemporaryFile by name.
if os.name == 'nt':
return
SUCCESS = 0
FAILURE = 1
ROLLER_SIZE_WARNING = 2
with tempfile.NamedTemporaryFile(mode='w') as before_file:
before_file.write(_EXAMPLE_BLOBS_BEFORE)
before_file.flush()
blobs = binary_sizes.ReadPackageBlobsJson(before_file.name)
sizes = binary_sizes.GetPackageSizes(blobs)
binary_sizes.WritePackageSizesJson(before_file.name, sizes)
# No change.
growth = binary_size_differ.ComputePackageDiffs(before_file.name,
before_file.name)
self.assertEqual(growth['status_code'], SUCCESS)
self.assertEqual(growth['compressed']['web_engine'], 0)
after_file = tempfile.NamedTemporaryFile(mode='w', delete=True)
after_file.close()
try:
# Increase a blob, but below the limit.
other_sizes = copy.deepcopy(sizes)
self.ChangePackageSize(other_sizes, 'web_engine', 8 * 1024)
binary_sizes.WritePackageSizesJson(after_file.name, other_sizes)
growth = binary_size_differ.ComputePackageDiffs(before_file.name,
after_file.name)
self.assertEqual(growth['status_code'], SUCCESS)
self.assertEqual(growth['compressed']['web_engine'], 8 * 1024)
# Increase beyond the limit (adds another 8k)
self.ChangePackageSize(other_sizes, 'web_engine', 8 * 1024 + 1)
binary_sizes.WritePackageSizesJson(after_file.name, other_sizes)
growth = binary_size_differ.ComputePackageDiffs(before_file.name,
after_file.name)
self.assertEqual(growth['status_code'], FAILURE)
self.assertEqual(growth['compressed']['web_engine'], 16 * 1024 + 1)
self.assertIn('check failed', growth['summary'])
self.assertIn(f'web_engine (compressed) grew by {16 * 1024 + 1} bytes',
growth['summary'])
# Increase beyond the limit, but compressed does not increase.
binary_sizes.WritePackageSizesJson(before_file.name, other_sizes)
self.ChangePackageSize(other_sizes,
'web_engine',
16 * 1024 + 1,
uncompressed_increase=0)
binary_sizes.WritePackageSizesJson(after_file.name, other_sizes)
growth = binary_size_differ.ComputePackageDiffs(before_file.name,
after_file.name)
self.assertEqual(growth['uncompressed']['web_engine'], SUCCESS)
self.assertEqual(growth['status_code'], SUCCESS)
self.assertEqual(growth['compressed']['web_engine'], 16 * 1024 + 1)
# Increase beyond the limit, but compressed goes down.
binary_sizes.WritePackageSizesJson(before_file.name, other_sizes)
self.ChangePackageSize(other_sizes,
'web_engine',
16 * 1024 + 1,
uncompressed_increase=-4 * 1024)
binary_sizes.WritePackageSizesJson(after_file.name, other_sizes)
growth = binary_size_differ.ComputePackageDiffs(before_file.name,
after_file.name)
self.assertEqual(growth['status_code'], SUCCESS)
self.assertEqual(growth['compressed']['web_engine'], 16 * 1024 + 1)
# Increase beyond the second limit. Fails, regardless of uncompressed.
binary_sizes.WritePackageSizesJson(before_file.name, other_sizes)
self.ChangePackageSize(other_sizes,
'web_engine',
100 * 1024 + 1,
uncompressed_increase=-4 * 1024)
binary_sizes.WritePackageSizesJson(after_file.name, other_sizes)
growth = binary_size_differ.ComputePackageDiffs(before_file.name,
after_file.name)
self.assertEqual(growth['status_code'], FAILURE)
self.assertEqual(growth['compressed']['web_engine'], 100 * 1024 + 1)
# Increase beyond the second limit, but roller authored CL.
binary_sizes.WritePackageSizesJson(before_file.name, other_sizes)
self.ChangePackageSize(other_sizes,
'web_engine',
100 * 1024 + 1,
uncompressed_increase=-4 * 1024)
binary_sizes.WritePackageSizesJson(after_file.name, other_sizes)
growth = binary_size_differ.ComputePackageDiffs(before_file.name,
after_file.name,
author='big-autoroller')
self.assertEqual(growth['status_code'], ROLLER_SIZE_WARNING)
self.assertEqual(growth['compressed']['web_engine'], 100 * 1024 + 1)
self.assertNotIn('check failed', growth['summary'])
self.assertIn('growth by an autoroller will be ignored',
growth['summary'])
self.assertIn(f'web_engine (compressed) grew by {100 * 1024 + 1} bytes',
growth['summary'])
finally:
os.remove(after_file.name)
if __name__ == '__main__':
unittest.main()