#!/usr/bin/env python3
# Copyright 2020 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Unit tests for ebuild_function.py

Default values follow the default values of ebuild (see manpage of ebuild).
https://dev.gentoo.org/~zmedico/portage/doc/man/ebuild.5.html
"""

import os
import sys
from unittest import mock

import ebuild_function

sys.path.insert(0, os.path.join(os.path.dirname(os.path.realpath(__file__)),
                                '..', '..', '..'))
# pylint: disable=wrong-import-position
from chromite.lib import cros_test_lib
# pylint: enable=wrong-import-position


class DoCommandTests(cros_test_lib.TestCase):
  """Tests of ebuild_function.do_command()."""

  def testDoins(self):
    """Check it returns doins command that contains single source file.

    doins <source_file>
    """
    ret = ebuild_function.do_command('ins', ['source'])
    self.assertEqual(ret, [['doins', 'source']])

  def testMultipleDoins(self):
    """Check it returns doins command that contains multiple source files.

    doins <source_file1> <source_file2>
    """
    ret = ebuild_function.do_command('ins', ['source1', 'source2'])
    self.assertEqual(ret, [['doins', 'source1', 'source2']])

  def testDoinsRecursive(self):
    """Check it returns recursive doins command.

    doins -r <source_file>
    """
    ret = ebuild_function.do_command('ins', ['source'], recursive=True)
    self.assertEqual(ret, [['doins', '-r', 'source']])

  def testNotDoinsRecursive(self):
    """Check "recursive" is disabled in any install_type except for "ins"."""
    ret = ebuild_function.do_command('bin', ['source'], recursive=True)
    self.assertEqual(ret, [['dobin', 'source']])

  def testDoInvalidInstall(self):
    """Check it raises InvalidInstallTypeError when install type is invalid."""
    with self.assertRaises(ebuild_function.InvalidInstallTypeError):
      ebuild_function.do_command('invalid', ['source'])

class NewCommandTests(cros_test_lib.TestCase):
  """Tests of ebuild_function.new_command()."""

  def testNewins(self):
    """Check it returns a newins command that contains single source file."""
    ret = ebuild_function.new_command('ins', ['source'], ['output'])
    self.assertEqual(ret, [['newins', 'source', 'output']])

  def testMultipleNewins(self):
    """Check it returns multiple commands when there are multiple sources."""
    ret = ebuild_function.new_command('ins', ['source1', 'source2'],
                                      ['output1', 'output2'])
    self.assertEqual(ret, [['newins', 'source1', 'output1'],
                           ['newins', 'source2', 'output2']])

  def testDifferentLengthOutput(self):
    """Check it raises error when the number of outputs is not correct.

    Make sure the number of outputs is the same as the number of sources.
    """
    with self.assertRaises(AssertionError):
      ebuild_function.new_command('ins', ['source'], ['output1', 'output2'])

  def testNewInvalidInstall(self):
    """Check it raises InvalidInstallTypeError when install type is invalid."""
    with self.assertRaises(ebuild_function.InvalidInstallTypeError):
      ebuild_function.new_command('invalid', ['source'], ['output'])


class InstallTests(cros_test_lib.TestCase):
  """Tests of ebuild_function.install()."""

  @mock.patch('ebuild_function.sym_install')
  def testCallSymInstall(self, sym_install_mock):
    """Check it calls sym_install when symlinks are specified."""
    ebuild_function.install('sym', ['source'], ['symlink'])
    self.assertTrue(sym_install_mock.called)

  @mock.patch('ebuild_function.do_command')
  def testCallDoCommand(self, do_command_mock):
    """Check it calls do_command when symlinks and outputs aren't specified."""
    ebuild_function.install('ins', ['source'])
    self.assertTrue(do_command_mock.called)

  @mock.patch('ebuild_function.new_command')
  def testCallNewCommand(self, new_command_mock):
    """Check it calls new_command when outputs are specified."""
    ebuild_function.install('ins', ['source'], ['output'])
    self.assertTrue(new_command_mock.called)


class OptionCmdTests(cros_test_lib.TestCase):
  """Tests of ebuild_function.option_cmd()."""

  def testInstallOption(self):
    """Check it returns appropriate options when install_type is "ins"."""
    self.assertEqual(
        ebuild_function.option_cmd('ins'),
        [['insinto', '/'], ['insopts', '-m0644']])
    self.assertEqual(
        ebuild_function.option_cmd('ins', install_path='/etc/init'),
        [['insinto', '/etc/init'], ['insopts', '-m0644']])
    self.assertEqual(
        ebuild_function.option_cmd('ins', options='-m0755'),
        [['insinto', '/'], ['insopts', '-m0755']])

  def testExecutableOption(self):
    """Check it returns appropriate options when install_type is "bin"."""
    self.assertEqual(
        ebuild_function.option_cmd('bin'),
        [['into', '/usr']])
    self.assertEqual(
        ebuild_function.option_cmd('bin', install_path='/'),
        [['into', '/']])

  def testSharedLibraryOption(self):
    """Check it returns appropriate options when install_type is "lib.so"."""
    self.assertEqual(
        ebuild_function.option_cmd('lib.so'),
        [['into', '/usr']])
    self.assertEqual(
        ebuild_function.option_cmd('lib.so', install_path='/'),
        [['into', '/']])

  def testStaticLibraryOption(self):
    """Check it returns appropriate options when install_type is "lib.a"."""
    self.assertEqual(
        ebuild_function.option_cmd('lib.a'),
        [['into', '/usr']])
    self.assertEqual(
        ebuild_function.option_cmd('lib.a', install_path='/'),
        [['into', '/']])

  def testSymlinkOption(self):
    """Check it returns appropriate options when install_type is "sym"."""
    self.assertEqual(
        ebuild_function.option_cmd('sym'),
        [])


class GenerateTests(cros_test_lib.TestCase):
  """Tests of ebuild_function.generate()."""

  def testInstall(self):
    """Check it returns doins commands when command_type isn't specified."""
    self.assertEqual(
        ebuild_function.generate(['source']),
        [['insinto', '/'], ['insopts', '-m0644'], ['doins', 'source']])
    self.assertEqual(
        ebuild_function.generate(['source'], install_path='/usr'),
        [['insinto', '/usr'], ['insopts', '-m0644'], ['doins', 'source']])
    self.assertEqual(
        ebuild_function.generate(['source'], options='-m0755'),
        [['insinto', '/'], ['insopts', '-m0755'], ['doins', 'source']])
    self.assertEqual(
        ebuild_function.generate(['source'], recursive=True),
        [['insinto', '/'], ['insopts', '-m0644'], ['doins', '-r', 'source']])
    self.assertEqual(
        ebuild_function.generate(['source'], outputs=['output']),
        [
            ['insinto', '/'],
            ['insopts', '-m0644'],
            ['newins', 'source', 'output'],
        ])

  def testExecutableInstall(self):
    """Check it returns do(s)bin commands when command_type is "executable"."""
    self.assertEqual(
        ebuild_function.generate(['source'], install_path='bin',
                                 command_type='executable'),
        [['into', '/usr'], ['dobin', 'source']])
    self.assertEqual(
        ebuild_function.generate(['source'], install_path='sbin',
                                 command_type='executable'),
        [['into', '/usr'], ['dosbin', 'source']])
    self.assertEqual(
        ebuild_function.generate(['source'], install_path='/bin',
                                 command_type='executable'),
        [['into', '/'], ['dobin', 'source']])
    self.assertEqual(
        ebuild_function.generate(['source'], install_path='bin',
                                 outputs=['output'],
                                 command_type='executable'),
        [['into', '/usr'], ['newbin', 'source', 'output']])

  def testSharedLibraryInstall(self):
    """Check it returns dolib.so when command_type is shared_library."""
    self.assertEqual(
        ebuild_function.generate(['source'], install_path='lib',
                                 command_type='shared_library'),
        [['into', '/usr'], ['dolib.so', 'source']])
    self.assertEqual(
        ebuild_function.generate(['source'], install_path='/lib',
                                 command_type='shared_library'),
        [['into', '/'], ['dolib.so', 'source']])
    self.assertEqual(
        ebuild_function.generate(['source'], install_path='lib',
                                 outputs=['output'],
                                 command_type='shared_library'),
        [['into', '/usr'], ['newlib.so', 'source', 'output']])

  def testStaticLibraryInstall(self):
    """Check it returns dolib.a commands when command_type is static_library."""
    self.assertEqual(
        ebuild_function.generate(['source'], install_path='lib',
                                 command_type='static_library'),
        [['into', '/usr'], ['dolib.a', 'source']])
    self.assertEqual(
        ebuild_function.generate(['source'], install_path='/lib',
                                 command_type='static_library'),
        [['into', '/'], ['dolib.a', 'source']])
    self.assertEqual(
        ebuild_function.generate(['source'], install_path='lib',
                                 outputs=['output'],
                                 command_type='static_library'),
        [['into', '/usr'], ['newlib.a', 'source', 'output']])

  def testSymlinkInstall(self):
    """Check it returns dosym commands when symlink is specified."""
    self.assertEqual(
        ebuild_function.generate(['source'], symlinks=['symlink']),
        [['dosym', 'source', 'symlink']])
    self.assertEqual(
        ebuild_function.generate(['source'], symlinks=['symlink'],
                                 install_path='/'),
        [['dosym', 'source', '/symlink']])

  def testUnknownTypeInstall(self):
    """Check it raises error when command_type is specified as unknown type."""
    with self.assertRaises(AssertionError):
      ebuild_function.generate(['source'], command_type='something')


if __name__ == '__main__':
  cros_test_lib.main(module=__name__)
