#!/usr/bin/env python3
"""
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
"""

from unittest import TestCase
import os
from mock.mock import patch, MagicMock

from resource_management.core.logger import Logger


class TestVersionSelectUtil(TestCase):
  """
  Class that tests the method of the version_select_util.py file.
  """

  def setUp(self):
    import imp

    Logger.logger = MagicMock()

    self.test_directory = os.path.dirname(os.path.abspath(__file__))
    test_file_path = os.path.join(
      self.test_directory,
      "../../../../ambari-common/src/main/python/resource_management/libraries/functions/version_select_util.py",
    )
    with open(test_file_path, "rb") as fp:
      self.module = imp.load_module(
        "module", fp, test_file_path, (".py", "rb", imp.PY_SOURCE)
      )

  @patch("builtins.open")
  @patch("resource_management.core.shell.call")
  @patch("os.path.exists")
  @patch("resource_management.libraries.functions.stack_tools.get_stack_tool")
  def test_get_component_version_from_symlink(
    self, get_stack_tool_mock, os_path_exists_mock, call_mock, open_mock
  ):
    stack_expected_version = "2.2.1.0-2175"

    # Mock classes for reading from a file
    class MagicFile(object):
      allowed_names = set(
        [
          "hadoop-hdfs-namenode",
          "hadoop-hdfs-datanode",
          "zookeeper-server",
          "zookeeper-client",
        ]
      )

      def read(self, value):
        return (
          (value + " - " + stack_expected_version)
          if value in self.allowed_names
          else ("ERROR: Invalid package - " + value)
        )

      def __exit__(self, exc_type, exc_val, exc_tb):
        pass

      def __enter__(self):
        return self

    pass

    class MagicFile1(MagicFile):
      def read(self):
        return super(MagicFile1, self).read("hadoop-nonexistent-component-name")

    class MagicFile2(MagicFile):
      def read(self):
        return super(MagicFile2, self).read("hadoop-hdfs-namenode")

    class MagicFile3(MagicFile):
      def read(self):
        return super(MagicFile3, self).read("hadoop-hdfs-datanode")

    get_stack_tool_mock.side_effect = [
      ("hdp-select", "/usr/bin/hdp-select", "hdp-select"),
      ("hdp-select", "/usr/bin/hdp-select", "hdp-select"),
      ("hdp-select", "/usr/bin/hdp-select", "hdp-select"),
      ("hdp-select", "/usr/bin/hdp-select", "hdp-select"),
    ]
    os_path_exists_mock.side_effect = [False, True, True, True]
    open_mock.side_effect = [MagicFile1(), MagicFile2(), MagicFile3()]
    call_mock.side_effect = [
      (0, "value will come from MagicFile"),
    ] * 3

    # Missing stack name
    version = self.module.get_component_version_from_symlink(
      None, "hadoop-hdfs-datanode"
    )
    self.assertEqual(version, None)
    # Missing component name
    version = self.module.get_component_version_from_symlink("HDP", None)
    self.assertEqual(version, None)

    # Invalid stack name
    version = self.module.get_component_version_from_symlink(
      "StackDoesNotExist", "hadoop-hdfs-datanode"
    )
    self.assertEqual(version, None)
    # Invalid component name
    version = self.module.get_component_version_from_symlink(
      "HDP", "hadoop-nonexistent-component-name"
    )
    self.assertEqual(version, None)

    # Pass
    version = self.module.get_component_version_from_symlink(
      "HDP", "hadoop-hdfs-namenode"
    )
    self.assertEqual(version, stack_expected_version)
    version = self.module.get_component_version_from_symlink(
      "HDP", "hadoop-hdfs-datanode"
    )
    self.assertEqual(version, stack_expected_version)

  @patch("builtins.open")
  @patch("resource_management.core.shell.call")
  @patch("os.path.exists")
  @patch("resource_management.libraries.functions.stack_tools.get_stack_tool")
  def test_get_component_version_no_build_ids(
    self, get_stack_tool_mock, os_path_exists_mock, call_mock, open_mock
  ):
    stack_expected_version = "2.2.1.0"

    # Mock classes for reading from a file
    class MagicFile(object):
      allowed_names = set(["hive-server2", "zookeeper-server"])

      def read(self, value):
        return (
          (value + " - " + stack_expected_version)
          if value in self.allowed_names
          else ("ERROR: Invalid package - " + value)
        )

      def __exit__(self, exc_type, exc_val, exc_tb):
        pass

      def __enter__(self):
        return self

    pass

    class MagicFile1(MagicFile):
      def read(self):
        return super(MagicFile1, self).read("hive-server2")

    class MagicFile2(MagicFile):
      def read(self):
        return super(MagicFile2, self).read("zookeeper-server")

    get_stack_tool_mock.side_effect = [
      ("hdp-select", "/usr/bin/hdp-select", "hdp-select"),
      ("hdp-select", "/usr/bin/hdp-select", "hdp-select"),
    ]
    os_path_exists_mock.side_effect = [True, True]
    open_mock.side_effect = [MagicFile1(), MagicFile2()]
    call_mock.side_effect = [
      (0, "value will come from MagicFile"),
    ] * 2

    # Pass
    version = self.module.get_component_version_from_symlink("HDP", "hive-server2")
    self.assertEqual(version, stack_expected_version)
    version = self.module.get_component_version_from_symlink("HDP", "zookeeper-server")
    self.assertEqual(version, stack_expected_version)
