#!/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()
