#!/usr/bin/env python3
# Copyright 2016 The Android Open Source Project
#
# Licensed 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.

"""Unittests for the config module."""

import os
from pathlib import Path
import shutil
import sys
import tempfile
import unittest


THIS_FILE = Path(__file__).resolve()
THIS_DIR = THIS_FILE.parent
sys.path.insert(0, str(THIS_DIR.parent))

# We have to import our local modules after the sys.path tweak.  We can't use
# relative imports because this is an executable program, not a module.
# pylint: disable=wrong-import-position
import rh.hooks
import rh.config


class PreUploadConfigTests(unittest.TestCase):
    """Tests for the PreUploadConfig class."""

    def testMissing(self):
        """Instantiating a non-existent config file should be fine."""
        rh.config.PreUploadConfig()


class FileTestCase(unittest.TestCase):
    """Helper class for tests cases to setup configuration files."""

    def setUp(self):
        self.tempdir = tempfile.mkdtemp()

    def tearDown(self):
        shutil.rmtree(self.tempdir)

    def _write_config(self, data, filename="temp.cfg"):
        """Helper to write out a config file for testing.

        Returns:
          Path to the file where the configuration was written.
        """
        path = os.path.join(self.tempdir, filename)
        with open(path, "w", encoding="utf-8") as fp:
            fp.write(data)
        return path

    def _write_local_config(self, data):
        """Helper to write out a local config file for testing."""
        return self._write_config(
            data, filename=rh.config.LocalPreUploadFile.FILENAME
        )

    def _write_global_config(self, data):
        """Helper to write out a global config file for testing."""
        return self._write_config(
            data, filename=rh.config.GlobalPreUploadFile.FILENAME
        )


class PreUploadFileTests(FileTestCase):
    """Tests for the PreUploadFile class."""

    def testEmpty(self):
        """Instantiating an empty config file should be fine."""
        path = self._write_config("")
        rh.config.PreUploadFile(path)

    def testValid(self):
        """Verify a fully valid file works."""
        path = self._write_config(
            """# This be a comment me matey.
[Hook Scripts]
name = script --with "some args"

[Builtin Hooks]
cpplint = true

[Builtin Hooks Options]
cpplint = --some 'more args'

[Options]
ignore_merged_commits = true
"""
        )
        rh.config.PreUploadFile(path)

    def testUnknownSection(self):
        """Reject unknown sections."""
        path = self._write_config("[BOOGA]")
        self.assertRaises(
            rh.config.ValidationError, rh.config.PreUploadFile, path
        )

    def testUnknownBuiltin(self):
        """Reject unknown builtin hooks."""
        path = self._write_config("[Builtin Hooks]\nbooga = borg!")
        self.assertRaises(
            rh.config.ValidationError, rh.config.PreUploadFile, path
        )

    def testEmptyCustomHook(self):
        """Reject empty custom hooks."""
        path = self._write_config("[Hook Scripts]\nbooga = \t \n")
        self.assertRaises(
            rh.config.ValidationError, rh.config.PreUploadFile, path
        )

    def testInvalidIni(self):
        """Reject invalid ini files."""
        path = self._write_config("[Hook Scripts]\n =")
        self.assertRaises(
            rh.config.ValidationError, rh.config.PreUploadFile, path
        )

    def testInvalidString(self):
        """Catch invalid string quoting."""
        path = self._write_config(
            """[Hook Scripts]
name = script --'bad-quotes
"""
        )
        self.assertRaises(
            rh.config.ValidationError, rh.config.PreUploadFile, path
        )


class LocalPreUploadFileTests(FileTestCase):
    """Test for the LocalPreUploadFile class."""

    def testInvalidSectionConfig(self):
        """Reject local config that uses invalid sections."""
        path = self._write_config(
            """[Builtin Hooks Exclude Paths]
cpplint = external/ 'test directory' ^vendor/(?!google/)
"""
        )
        self.assertRaises(
            rh.config.ValidationError, rh.config.LocalPreUploadFile, path
        )


class PreUploadSettingsTests(FileTestCase):
    """Tests for the PreUploadSettings class."""

    def testGlobalConfigs(self):
        """Verify global configs stack properly."""
        self._write_global_config(
            """[Builtin Hooks]
commit_msg_bug_field = true
commit_msg_changeid_field = true
commit_msg_test_field = false"""
        )
        self._write_local_config(
            """[Builtin Hooks]
commit_msg_bug_field = false
commit_msg_test_field = true"""
        )
        config = rh.config.PreUploadSettings(
            paths=(self.tempdir,), global_paths=(self.tempdir,)
        )
        self.assertEqual(
            config.builtin_hooks,
            ["commit_msg_changeid_field", "commit_msg_test_field"],
        )

    def testGlobalExcludeScope(self):
        """Verify exclude scope is valid for global config."""
        self._write_global_config(
            """[Builtin Hooks Exclude Paths]
cpplint = external/ 'test directory' ^vendor/(?!google/)
"""
        )
        rh.config.PreUploadSettings(global_paths=(self.tempdir,))


if __name__ == "__main__":
    unittest.main()
