binary_size_differ_test.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. #!/usr/bin/env vpython3
  2. # Copyright 2020 The Chromium Authors. All rights reserved.
  3. # Use of this source code is governed by a BSD-style license that can be
  4. # found in the LICENSE file.
  5. import copy
  6. import os
  7. import tempfile
  8. from typing import MutableMapping, Optional
  9. import unittest
  10. import binary_size_differ
  11. import binary_sizes
  12. from common import DIR_SOURCE_ROOT
  13. _EXAMPLE_BLOBS_BEFORE = """
  14. {
  15. "web_engine": [
  16. {
  17. "merkle": "77e876447dd2daaaab7048d646e87fe8b6d9fecef6cbfcc4af30b8fbfa50b881",
  18. "path": "locales/ta.pak",
  19. "bytes": 17916,
  20. "is_counted": true,
  21. "size": 16384
  22. },
  23. {
  24. "merkle": "5f1932b8c9fe954f3c3fdb34ab2089d2af34e5a0cef90cad41a1cd37d92234bf",
  25. "path": "lib/libEGL.so",
  26. "bytes": 226960,
  27. "is_counted": true,
  28. "size": 90112
  29. },
  30. {
  31. "merkle": "9822fc0dd95cdd1cc46b5c6632a928a6ad19b76ed0157397d82a2f908946fc34",
  32. "path": "meta.far",
  33. "bytes": 24576,
  34. "is_counted": false,
  35. "size": 16384
  36. },
  37. {
  38. "merkle": "090aed4593c4f7d04a3ad80e9971c0532dd5b1d2bdf4754202cde510a88fd220",
  39. "path": "locales/ru.pak",
  40. "bytes": 11903,
  41. "is_counted": true,
  42. "size": 16384
  43. }
  44. ]
  45. }
  46. """
  47. class BinarySizeDifferTest(unittest.TestCase):
  48. def ChangePackageSize(
  49. self,
  50. packages: MutableMapping[str, binary_sizes.PackageSizes],
  51. name: str,
  52. compressed_increase: int,
  53. uncompressed_increase: Optional[int] = None):
  54. if uncompressed_increase is None:
  55. uncompressed_increase = compressed_increase
  56. original_package = packages[name]
  57. new_package = binary_sizes.PackageSizes(
  58. compressed=original_package.compressed + compressed_increase,
  59. uncompressed=original_package.uncompressed + uncompressed_increase)
  60. packages[name] = new_package
  61. def testComputePackageDiffs(self):
  62. # TODO(1309977): Disabled on Windows because Windows doesn't allow opening a
  63. # NamedTemporaryFile by name.
  64. if os.name == 'nt':
  65. return
  66. with tempfile.NamedTemporaryFile(mode='w') as before_file:
  67. before_file.write(_EXAMPLE_BLOBS_BEFORE)
  68. before_file.flush()
  69. blobs = binary_sizes.ReadPackageBlobsJson(before_file.name)
  70. sizes = binary_sizes.GetPackageSizes(blobs)
  71. binary_sizes.WritePackageSizesJson(before_file.name, sizes)
  72. # No change.
  73. growth = binary_size_differ.ComputePackageDiffs(before_file.name,
  74. before_file.name)
  75. self.assertEqual(growth['status_code'], 0)
  76. self.assertEqual(growth['compressed']['web_engine'], 0)
  77. after_file = tempfile.NamedTemporaryFile(mode='w', delete=True)
  78. after_file.close()
  79. try:
  80. # Increase a blob, but below the limit.
  81. other_sizes = copy.deepcopy(sizes)
  82. self.ChangePackageSize(other_sizes, 'web_engine', 8 * 1024)
  83. binary_sizes.WritePackageSizesJson(after_file.name, other_sizes)
  84. growth = binary_size_differ.ComputePackageDiffs(before_file.name,
  85. after_file.name)
  86. self.assertEqual(growth['status_code'], 0)
  87. self.assertEqual(growth['compressed']['web_engine'], 8 * 1024)
  88. # Increase beyond the limit (adds another 8k)
  89. self.ChangePackageSize(other_sizes, 'web_engine', 8 * 1024 + 1)
  90. binary_sizes.WritePackageSizesJson(after_file.name, other_sizes)
  91. growth = binary_size_differ.ComputePackageDiffs(before_file.name,
  92. after_file.name)
  93. self.assertEqual(growth['status_code'], 1)
  94. self.assertEqual(growth['compressed']['web_engine'], 16 * 1024 + 1)
  95. # Increase beyond the limit, but compressed does not increase.
  96. binary_sizes.WritePackageSizesJson(before_file.name, other_sizes)
  97. self.ChangePackageSize(other_sizes,
  98. 'web_engine',
  99. 16 * 1024 + 1,
  100. uncompressed_increase=0)
  101. binary_sizes.WritePackageSizesJson(after_file.name, other_sizes)
  102. growth = binary_size_differ.ComputePackageDiffs(before_file.name,
  103. after_file.name)
  104. self.assertEqual(growth['uncompressed']['web_engine'], 0)
  105. self.assertEqual(growth['status_code'], 0)
  106. self.assertEqual(growth['compressed']['web_engine'], 16 * 1024 + 1)
  107. # Increase beyond the limit, but compressed goes down.
  108. binary_sizes.WritePackageSizesJson(before_file.name, other_sizes)
  109. self.ChangePackageSize(other_sizes,
  110. 'web_engine',
  111. 16 * 1024 + 1,
  112. uncompressed_increase=-4 * 1024)
  113. binary_sizes.WritePackageSizesJson(after_file.name, other_sizes)
  114. growth = binary_size_differ.ComputePackageDiffs(before_file.name,
  115. after_file.name)
  116. self.assertEqual(growth['status_code'], 0)
  117. self.assertEqual(growth['compressed']['web_engine'], 16 * 1024 + 1)
  118. # Increase beyond the second limit. Fails, regardless of uncompressed.
  119. binary_sizes.WritePackageSizesJson(before_file.name, other_sizes)
  120. self.ChangePackageSize(other_sizes,
  121. 'web_engine',
  122. 100 * 1024 + 1,
  123. uncompressed_increase=-4 * 1024)
  124. binary_sizes.WritePackageSizesJson(after_file.name, other_sizes)
  125. growth = binary_size_differ.ComputePackageDiffs(before_file.name,
  126. after_file.name)
  127. self.assertEqual(growth['status_code'], 1)
  128. self.assertEqual(growth['compressed']['web_engine'], 100 * 1024 + 1)
  129. finally:
  130. os.remove(after_file.name)
  131. if __name__ == '__main__':
  132. unittest.main()