# Copyright (c) 2016 The Chromium Embedded Framework Authors. All rights
# reserved. Use of this source code is governed by a BSD-style license that
# can be found in the LICENSE file.

from __future__ import absolute_import
from cef_json_builder import cef_json_builder
import datetime
import unittest


class TestCefJSONBuilder(unittest.TestCase):

  # Test CEF version number matching.
  def test_valid_version(self):
    # Old-style version numbers.
    self.assertTrue(cef_json_builder.is_valid_version('3.2704.1414.g185cd6c'))
    # New-style version numbers.
    self.assertTrue(
        cef_json_builder.is_valid_version(
            '74.0.1+g62d140e+chromium-74.0.3729.6'))
    self.assertTrue(
        cef_json_builder.is_valid_version(
            '74.0.0-master.1920+g725ed88+chromium-74.0.3729.0'))
    self.assertTrue(
        cef_json_builder.is_valid_version(
            '74.0.0-my_branch.1920+g725ed88+chromium-74.0.3729.0'))

    # Must be a completely qualified version number.
    self.assertFalse(cef_json_builder.is_valid_version(None))
    self.assertFalse(cef_json_builder.is_valid_version('foobar'))
    self.assertFalse(cef_json_builder.is_valid_version('3.2704.1414'))
    self.assertFalse(cef_json_builder.is_valid_version('74.0.1+g62d140e'))
    self.assertFalse(
        cef_json_builder.is_valid_version('74.0.0-master.1920+g725ed88'))
    self.assertFalse(
        cef_json_builder.is_valid_version('74.0.0+chromium-74.0.3729.0'))

  # Test Chromium version number matching.
  def test_valid_chromium_version(self):
    self.assertTrue(cef_json_builder.is_valid_chromium_version('74.0.3729.0'))
    self.assertTrue(cef_json_builder.is_valid_chromium_version('74.0.3729.6'))
    self.assertTrue(
        cef_json_builder.is_valid_chromium_version('100.0.59200.602'))

    # self.assertFalse(cef_json_builder.is_valid_version(None))
    self.assertFalse(cef_json_builder.is_valid_chromium_version('foobar'))
    # Must be 4 numbers.
    self.assertFalse(cef_json_builder.is_valid_chromium_version('74.0.3729'))
    self.assertFalse(cef_json_builder.is_valid_chromium_version('74.0.3729.A'))
    # 1st number is max 3 digits with no leading 0's.
    self.assertFalse(
        cef_json_builder.is_valid_chromium_version('7400.0.3729.6'))
    self.assertFalse(cef_json_builder.is_valid_chromium_version('04.0.3729.6'))
    # 2nd number is always 0.
    self.assertFalse(cef_json_builder.is_valid_chromium_version('74.1.3729.6'))
    # 3rd number is max 5 digits with no leading 0's.
    self.assertFalse(cef_json_builder.is_valid_chromium_version('74.0.0372.6'))
    self.assertFalse(
        cef_json_builder.is_valid_chromium_version('74.0.372900.6'))
    # 4rd number is max 3 digits with no leading 0's.
    self.assertFalse(
        cef_json_builder.is_valid_chromium_version('74.0.3729.6000'))
    self.assertFalse(cef_json_builder.is_valid_chromium_version('74.0.3729.06'))
    pass

  # Write builder contents to string and then read in.
  def _verify_write_read(self, builder):
    output = str(builder)
    builder2 = cef_json_builder()
    builder2.load(output)
    self.assertEqual(output, str(builder2))

  # Add a file record for testing purposes.
  def _add_test_file(self,
                     builder,
                     platform='linux32',
                     version='3.2704.1414.g185cd6c',
                     type='standard',
                     attrib_idx=0,
                     shouldfail=False):
    name = cef_json_builder.get_file_name(version, platform, type) + '.tar.gz'

    # Some random attribute information. sha1 must be different to trigger replacement.
    attribs = [{
        'date_str': '2016-05-18T22:42:15.487Z',
        'date_val': datetime.datetime(2016, 5, 18, 22, 42, 15, 487000),
        'sha1': '2d48ee05ea6385c8fe80879c98c5dd505ad4b100',
        'size': 48395610
    }, {
        'date_str': '2016-05-14T22:42:15.487Z',
        'date_val': datetime.datetime(2016, 5, 14, 22, 42, 15, 487000),
        'sha1': '2d48ee05ea6385c8fe80879c98c5dd505ad4b200',
        'size': 48395620
    }]

    # Populate the Chromium version to avoid queries.
    chromium_version = '49.0.2705.50'
    self.assertEqual(chromium_version,
                     builder.set_chromium_version(version, chromium_version))
    self.assertEqual(0, builder.get_query_count())

    result = builder.add_file(name, attribs[attrib_idx]['size'],
                              attribs[attrib_idx]['date_str'],
                              attribs[attrib_idx]['sha1'])
    # Failure should be expected when adding the same file multiple times with the same sha1.
    self.assertEqual(not shouldfail, result)

    # Return the result expected from get_files().
    return {
        'chromium_version': chromium_version,
        'sha1': attribs[attrib_idx]['sha1'],
        'name': name,
        'platform': platform,
        'last_modified': attribs[attrib_idx]['date_val'],
        'cef_version': version,
        'type': type,
        'size': attribs[attrib_idx]['size']
    }

  # Test with no file contents.
  def test_empty(self):
    builder = cef_json_builder()

    self._verify_write_read(builder)

    files = builder.get_files()
    self.assertEqual(len(files), 0)

  # Test add/get of a single file with the specified type.
  def _test_add_file(self, type):
    builder = cef_json_builder()

    expected = self._add_test_file(builder, type=type)
    self._verify_write_read(builder)

    files = builder.get_files()
    self.assertEqual(len(files), 1)
    self.assertEqual(expected, files[0])

  # Test add/get of a standard type file.
  def test_add_standard_file(self):
    self._test_add_file('standard')

  # Test add/get of a minimal type file.
  def test_add_minimal_file(self):
    self._test_add_file('minimal')

  # Test add/get of a client type file.
  def test_add_client_file(self):
    self._test_add_file('client')

  # Test add/get of a debug_symbols type file.
  def test_add_debug_symbols_file(self):
    self._test_add_file('debug_symbols')

  # Test add/get of a release_symbols type file.
  def test_add_release_symbols_file(self):
    self._test_add_file('release_symbols')

  # Test get_files() behavior with a single file.
  def test_get_files_single(self):
    # yapf: disable
    versions = (
        ('3.2704.1414.g185cd6c', '3.2704'),
        ('74.0.1+g62d140e+chromium-74.0.3729.6', '74.0'),
    )
    # yapf: enable

    for version, partial_version in versions:
      builder = cef_json_builder()

      # Specify all values just in case the defaults change.
      expected = self._add_test_file(
          builder, platform='linux32', version=version, type='standard')

      # No filter.
      files = builder.get_files()
      self.assertEqual(len(files), 1)
      self.assertEqual(expected, files[0])

      # Platform filter.
      files = builder.get_files(platform='linux32')
      self.assertEqual(len(files), 1)
      self.assertEqual(expected, files[0])
      files = builder.get_files(platform='linux64')
      self.assertEqual(len(files), 0)

      # Version filter exact.
      files = builder.get_files(version=version)
      self.assertEqual(len(files), 1)
      self.assertEqual(expected, files[0])

      # Version filter partial.
      files = builder.get_files(version=partial_version)
      self.assertEqual(len(files), 1)
      self.assertEqual(expected, files[0])
      files = builder.get_files(version='3.2623')
      self.assertEqual(len(files), 0)

      # Type filter.
      files = builder.get_files(type='standard')
      self.assertEqual(len(files), 1)
      self.assertEqual(expected, files[0])
      files = builder.get_files(type='client')
      self.assertEqual(len(files), 0)

      # All filters.
      files = builder.get_files(
          platform='linux32', version=partial_version, type='standard')
      self.assertEqual(len(files), 1)
      self.assertEqual(expected, files[0])
      files = builder.get_files(
          platform='linux32', version=partial_version, type='minimal')
      self.assertEqual(len(files), 0)
      files = builder.get_files(
          platform='linux32', version='3.2623', type='standard')
      self.assertEqual(len(files), 0)
      files = builder.get_files(
          platform='linux64', version=partial_version, type='standard')
      self.assertEqual(len(files), 0)

  # Test add/get of multiple files.
  def test_add_multiple_files(self):
    builder = cef_json_builder()

    expected = []

    platforms = cef_json_builder.get_platforms()
    versions = [
        # Old-style version numbers.
        '3.2704.1414.g185cd6c',
        '3.2704.1400.gde36543',
        # New-style version numbers.
        '74.0.1+g62d140e+chromium-74.0.3729.6'
    ]
    types = cef_json_builder.get_distrib_types()
    for platform in platforms:
      for version in versions:
        for type in types:
          expected.append(
              self._add_test_file(
                  builder, platform=platform, type=type, version=version))

    self._verify_write_read(builder)

    # No filter.
    files = builder.get_files()
    self.assertEqual(len(files), len(platforms) * len(versions) * len(types))

    # Version filter.
    for version in versions:
      files = builder.get_files(version=version)
      self.assertEqual(len(files), len(platforms) * len(types))

    # Type filter.
    files = builder.get_files(type='client')
    self.assertEqual(len(files), len(platforms) * len(versions))

    # Platform filter.
    files = builder.get_files(platform='windows32')
    self.assertEqual(len(files), len(types) * len(versions))

    # All filters.
    idx = 0
    for platform in platforms:
      for version in versions:
        for type in types:
          files = builder.get_files(
              platform=platform, type=type, version=version)
          self.assertEqual(len(files), 1)
          self.assertEqual(expected[idx], files[0])
          idx += 1

  # Test add/get/replace of multiple files.
  def test_replace_all_files(self):
    versions = ['3.2704.1414.g185cd6c', '74.0.1+g62d140e+chromium-74.0.3729.6']
    platforms = ['linux32', 'linux64']
    types = ['standard', 'minimal']

    for version in versions:
      builder = cef_json_builder()

      # Initial file versions.
      for platform in platforms:
        for type in types:
          self._add_test_file(
              builder, platform=platform, type=type, version=version)

      # No filter.
      files = builder.get_files()
      self.assertEqual(len(files), len(platforms) * len(types))

      expected = []

      # Replace all file versions (due to new sha1).
      for platform in platforms:
        for type in types:
          expected.append(
              self._add_test_file(
                  builder,
                  platform=platform,
                  type=type,
                  version=version,
                  attrib_idx=1))

      # No filter.
      files = builder.get_files()
      self.assertEqual(len(files), len(platforms) * len(types))

      # All filters.
      idx = 0
      for platform in platforms:
        for type in types:
          files = builder.get_files(
              platform=platform, type=type, version=version)
          self.assertEqual(len(files), 1)
          self.assertEqual(expected[idx], files[0])
          idx += 1

  # Test add/get/no replace of multiple files.
  def test_replace_no_files(self):
    versions = ['3.2704.1414.g185cd6c', '74.0.1+g62d140e+chromium-74.0.3729.6']
    platforms = ['linux32', 'linux64']
    types = ['standard', 'minimal']

    for version in versions:
      builder = cef_json_builder()

      # Initial file versions.
      for platform in platforms:
        for type in types:
          self._add_test_file(
              builder, platform=platform, type=type, version=version)

      # No filter.
      files = builder.get_files()
      self.assertEqual(len(files), len(platforms) * len(types))

      expected = []

      # Replace no file versions (due to same sha1).
      for platform in platforms:
        for type in types:
          expected.append(
              self._add_test_file(
                  builder,
                  platform=platform,
                  type=type,
                  version=version,
                  shouldfail=True))

      # No filter.
      files = builder.get_files()
      self.assertEqual(len(files), len(platforms) * len(types))

      # All filters.
      idx = 0
      for platform in platforms:
        for type in types:
          files = builder.get_files(
              platform=platform, type=type, version=version)
          self.assertEqual(len(files), 1)
          self.assertEqual(expected[idx], files[0])
          idx += 1

  # Test Chromium version.
  def test_chromium_version(self):
    builder = cef_json_builder()

    # For old-style CEF version numbers the Git hashes must exist but the rest
    # of the CEF version can be fake.
    # yapf: disable
    versions = (
        # Old-style version numbers.
        ('3.2704.1414.g185cd6c', '51.0.2704.47'),
        ('3.2623.9999.gb90a3be', '49.0.2623.110'),
        ('3.2623.9999.g2a6491b', '49.0.2623.87'),
        ('3.9999.9999.gab2636b', 'master'),
        # New-style version numbers.
        ('74.0.1+g62d140e+chromium-74.0.3729.6', '74.0.3729.6'),
        ('74.0.0-master.1920+g725ed88+chromium-74.0.3729.0', '74.0.3729.0'),
        ('74.0.0-my_branch.1920+g725ed88+chromium-74.0.3729.0', '74.0.3729.0'),
    )
    # yapf: enable

    # Test with no query.
    for (cef, chromium) in versions:
      self.assertFalse(builder.has_chromium_version(cef))
      # Valid version specified, so no query sent.
      self.assertEqual(chromium, builder.set_chromium_version(cef, chromium))
      self.assertEqual(chromium, builder.get_chromium_version(cef))
      self.assertTrue(builder.has_chromium_version(cef))
      # Ignore attempts to set invalid version after setting valid version.
      self.assertEqual(chromium, builder.set_chromium_version(cef, None))

    self.assertEqual(0, builder.get_query_count())
    builder.clear()

    # Test with query.
    for (cef, chromium) in versions:
      self.assertFalse(builder.has_chromium_version(cef))
      # No version known, so query sent for old-style version numbers.
      self.assertEqual(chromium, builder.get_chromium_version(cef))
      self.assertTrue(builder.has_chromium_version(cef))

    # Only old-style version numbers.
    self.assertEqual(4, builder.get_query_count())


# Program entry point.
if __name__ == '__main__':
  unittest.main()
